From 024783e852a94b2945338cb518d007ae4f8ad2b7 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 11:25:17 -0600 Subject: [PATCH 01/97] Set executable bit --- create-tree.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 create-tree.sh diff --git a/create-tree.sh b/create-tree.sh old mode 100644 new mode 100755 From 2a22b0d7fb42336c3ae94ab7385e05bcc99fe804 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 11:36:34 -0600 Subject: [PATCH 02/97] Add commit-message input, commit-sha output --- .github/workflows/verified-commit.yml | 3 +++ README.md | 1 + action.yml | 12 ++++++++++++ create-commit.sh | 26 ++++++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100755 create-commit.sh diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 968ab42..d48450b 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -26,11 +26,13 @@ jobs: dd if=/dev/urandom count=1 > myfile - name: Commit file + id: commit uses: ./ env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: path: ./myfile + commit-message: Committing ./myfile - name: Inspect environment run: | @@ -38,3 +40,4 @@ jobs: echo BASE_TREE_SHA=$BASE_TREE_SHA echo BLOB_SHA=$BLOB_SHA echo TREE_SHA=$TREE_SHA + echo COMMIT_SHA=$COMMIT_SHA diff --git a/README.md b/README.md index 05b0251..7e0473d 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: path: ./myfile + commit-message: Committing ./myfile ``` Note, the `GH_TOKEN` environment variable is required, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). diff --git a/action.yml b/action.yml index ded1313..7a65a48 100644 --- a/action.yml +++ b/action.yml @@ -4,6 +4,13 @@ inputs: path: description: Filesystem path of file to be committed required: true + commit-message: + description: Commit message to be used + required: true +outputs: + commit-sha: + description: SHA of created commit + value: ${{ steps.commit.outputs.commit-sha }} runs: using: composite steps: @@ -18,6 +25,11 @@ runs: # Create tree - shell: bash run: ./create-tree.sh + + # Create commit + - shell: bash + id: commit + run: ./create-commit.sh "${{ inputs.commit-message }}" branding: icon: git-commit color: purple diff --git a/create-commit.sh b/create-commit.sh new file mode 100755 index 0000000..a442863 --- /dev/null +++ b/create-commit.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e + +# Commit messsage +message="${1}" + +# Generate payload +payload=$( mktemp ) +jq --null-input \ + --arg tree_sha "$TREE_SHA" \ + --arg parent_sha "$HEAD_SHA" \ + --arg message "$message" \ + '{"message": $message, "tree": $tree_sha, "parents": [$parent_sha]}' > $payload + +# Create commit +response=$( curl --request POST \ + --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits \ + --header "authorization: Bearer $GH_TOKEN" \ + --header 'content-type: application/json' \ + --data @$payload ) + +# Export environment variables with object ids +echo COMMIT_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV + +# Set 'commit-sha' output +echo "::set-output name=commit-sha::$COMMIT_SHA" From 56680ba0594f7c78d12270771420ceff58e83767 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 11:38:42 -0600 Subject: [PATCH 03/97] Echo commit SHA --- .github/workflows/verified-commit.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index d48450b..7638f51 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -41,3 +41,10 @@ jobs: echo BLOB_SHA=$BLOB_SHA echo TREE_SHA=$TREE_SHA echo COMMIT_SHA=$COMMIT_SHA + + - name: Echo commit SHA + env: + MY_COMMIT_SHA: ${{ steps.commit.outputs.commit-sha }} + run: | + echo "$MY_COMMIT_SHA was created" + echo "https://github.com/$GITHUB_REPOSITORY/commit/$MY_COMMIT_SHA" From 94cf05150dc7314947b3bb56fd390d7339ffe5c8 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 11:44:46 -0600 Subject: [PATCH 04/97] Set the commit-sha output --- create-commit.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/create-commit.sh b/create-commit.sh index a442863..75f3bbd 100755 --- a/create-commit.sh +++ b/create-commit.sh @@ -19,8 +19,11 @@ response=$( curl --request POST \ --header 'content-type: application/json' \ --data @$payload ) +# Get SHA of commit +commit_sha=$( jq -r '.sha' <<< "${response}" ) + # Export environment variables with object ids -echo COMMIT_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV +echo "COMMIT_SHA=$commit_sha" >> $GITHUB_ENV # Set 'commit-sha' output -echo "::set-output name=commit-sha::$COMMIT_SHA" +echo "::set-output name=commit-sha::$commit_sha" From cc5ca35a3cfa26598739f6621d94c750ec41e486 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 12:20:17 -0600 Subject: [PATCH 05/97] Define inputs, outputs in README --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7e0473d..6459708 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,14 @@ This action is still in development and the experience is subject to change. Use ## About This action allows you to create a commit with GitHub Actions. Commits created with this aciton will be marked as _verified_. +![image](https://user-images.githubusercontent.com/27806/101197362-a2ed0980-3627-11eb-9afb-bc8b9bcd0345.png) + ## Usage In your workflow, to commit a file `./myfile`, include a step like this: ```yaml - name: Commit file - uses: swinton/commit@v0 + uses: swinton/commit@v1 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -20,4 +22,15 @@ In your workflow, to commit a file `./myfile`, include a step like this: commit-message: Committing ./myfile ``` -Note, the `GH_TOKEN` environment variable is required, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). +Note, the `GH_TOKEN` environment variable is _required_, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). + +## Inputs +The following inputs are _required_: + +- `path`: Filesystem path of file to be committed, e.g. `Add ./myfile` +- `commit-message`: Commit message to be used, e.g. `./myfile` + +## Outputs +This action provides the following outputs: + +- `commit-sha`: SHA of created commit From a2fb083c018f76f6697650543529f63a7c9015f4 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 12:34:18 -0600 Subject: [PATCH 06/97] Update ref with new commit --- .github/workflows/verified-commit.yml | 10 ++++++++++ README.md | 1 + action.yml | 8 ++++++++ update-ref.sh | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100755 update-ref.sh diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 7638f51..d65374a 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -21,6 +21,15 @@ jobs: - name: Checkout uses: actions/checkout@v2 + - name: Ensure ref exists + continue-on-error: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh api /repos/:owner/:repo/git/refs \ + --field sha="$GITHUB_SHA" \ + --field ref="refs/heads/scratch" + - name: Create file run: | dd if=/dev/urandom count=1 > myfile @@ -33,6 +42,7 @@ jobs: with: path: ./myfile commit-message: Committing ./myfile + ref: heads/scratch - name: Inspect environment run: | diff --git a/README.md b/README.md index 6459708..88d3b28 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ The following inputs are _required_: - `path`: Filesystem path of file to be committed, e.g. `Add ./myfile` - `commit-message`: Commit message to be used, e.g. `./myfile` +- `ref`: Reference to be updated with commit, e.g. `heads/production`. This reference _must_ already exist. Defaults to 'main'. ## Outputs This action provides the following outputs: diff --git a/action.yml b/action.yml index 7a65a48..691876b 100644 --- a/action.yml +++ b/action.yml @@ -7,6 +7,10 @@ inputs: commit-message: description: Commit message to be used required: true + ref: + description: Reference to be updated with commit. This reference must already exist. Defaults to 'main'. + required: false + default: heads/main outputs: commit-sha: description: SHA of created commit @@ -30,6 +34,10 @@ runs: - shell: bash id: commit run: ./create-commit.sh "${{ inputs.commit-message }}" + + # Update ref + - shell: bash + run: ./update-ref.sh "${{ inputs.ref }}" branding: icon: git-commit color: purple diff --git a/update-ref.sh b/update-ref.sh new file mode 100755 index 0000000..034eeb0 --- /dev/null +++ b/update-ref.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +# Ref to update +ref="${1}" + +# Generate payload +payload=$( mktemp ) +jq --null-input \ + --arg sha "$COMMIT_SHA" \ + '{"sha": $sha}' > $payload + +# Update ref +response=$( curl --request PATCH \ + --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/refs/$ref \ + --header "authorization: Bearer $GH_TOKEN" \ + --header "content-type: application/json" \ + --data @$payload ) From 49ecd55483f8285eaef7ff0336defab585590d93 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 12:37:17 -0600 Subject: [PATCH 07/97] Add ref input to README usage example --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 88d3b28..706fc6b 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: with: path: ./myfile commit-message: Committing ./myfile + ref: heads/my-branch ``` Note, the `GH_TOKEN` environment variable is _required_, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). From 204bbb0e147ea7ceb654d762772c7a171cf9d807 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 13:36:21 -0600 Subject: [PATCH 08/97] Default ref to repository's default branch --- .github/workflows/verified-commit.yml | 3 +- README.md | 4 +-- action.yml | 13 +++++--- functions.sh | 46 +++++++++++++++++++++++++++ get-oids.sh | 28 ---------------- inspect-ref.sh | 18 +++++++++++ update-ref.sh | 5 +-- 7 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 functions.sh delete mode 100755 get-oids.sh create mode 100755 inspect-ref.sh diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index d65374a..6a6799c 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -42,10 +42,11 @@ jobs: with: path: ./myfile commit-message: Committing ./myfile - ref: heads/scratch + ref: refs/heads/scratch - name: Inspect environment run: | + echo REF=$REF echo HEAD_SHA=$HEAD_SHA echo BASE_TREE_SHA=$BASE_TREE_SHA echo BLOB_SHA=$BLOB_SHA diff --git a/README.md b/README.md index 706fc6b..24fe9ab 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: with: path: ./myfile commit-message: Committing ./myfile - ref: heads/my-branch + ref: refs/heads/my-branch ``` Note, the `GH_TOKEN` environment variable is _required_, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). @@ -30,7 +30,7 @@ The following inputs are _required_: - `path`: Filesystem path of file to be committed, e.g. `Add ./myfile` - `commit-message`: Commit message to be used, e.g. `./myfile` -- `ref`: Reference to be updated with commit, e.g. `heads/production`. This reference _must_ already exist. Defaults to 'main'. +- `ref`: Fully qualified name of reference to be updated with commit, e.g. `refs/heads/production`. This reference _must_ already exist. Defaults to the repository's default branch ref. ## Outputs This action provides the following outputs: diff --git a/action.yml b/action.yml index 691876b..300b09e 100644 --- a/action.yml +++ b/action.yml @@ -2,15 +2,18 @@ name: Verified commit description: GitHub Action to create verified commits inputs: path: - description: Filesystem path of file to be committed + description: | + Filesystem path of file to be committed required: true commit-message: - description: Commit message to be used + description: | + Commit message to be used required: true ref: - description: Reference to be updated with commit. This reference must already exist. Defaults to 'main'. + description: | + Reference to be updated with commit. This reference must already exist. Defaults to the repository's default branch ref. required: false - default: heads/main + default: '' outputs: commit-sha: description: SHA of created commit @@ -20,7 +23,7 @@ runs: steps: # Get object ids: head commit sha, tree sha - shell: bash - run: ./get-oids.sh + run: ./inspect-ref.sh "${{ inputs.ref }}" # Create blob - shell: bash diff --git a/functions.sh b/functions.sh new file mode 100644 index 0000000..a06bcaa --- /dev/null +++ b/functions.sh @@ -0,0 +1,46 @@ +function get-default-branch-ref { + response=$( gh api graphql \ + --field owner=':owner' \ + --field repo=':repo' \ + --raw-field \ + query='query getDefaultBranchRef($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + defaultBranchRef { + name + } + } + }' + ) + + ref=$( jq -r '.data.repository.defaultBranchRef.name' <<< "${response}" ) + + echo "refs/heads/$ref" +} + +function inspect-ref { + ref="$1" + response=$( gh api graphql \ + --field owner=':owner' \ + --field repo=':repo' \ + --field ref="$ref" \ + --raw-field \ + query='query inspectRef($owner: String!, $repo: String!, $ref: String!) { + repository(owner: $owner, name: $repo) { + ref(qualifiedName: $ref) { + name + commit: target { + ... on Commit { + oid + tree { + oid + } + } + } + } + } + }' + ) + + head_sha=$( jq -r '.data.repository.ref.commit.oid' <<< "${response}" ) + tree_sha=$( jq -r '.data.repository.ref.commit.tree.oid' <<< "${response}" ) +} diff --git a/get-oids.sh b/get-oids.sh deleted file mode 100755 index bfbdb9a..0000000 --- a/get-oids.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -set -e - -# GraphQL query to get default branch ref's head commit SHA and tree SHA -response=$( gh api graphql \ - --field owner=':owner' \ - --field repo=':repo' \ - --raw-field \ - query='query repoContents($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - defaultBranchRef { - name - commit: target { - ... on Commit { - oid - tree { - oid - } - } - } - } - } - }' -) - -# Export environment variables with object ids -echo HEAD_SHA=$( jq -r '.data.repository.defaultBranchRef.commit.oid' <<< "${response}" ) >> $GITHUB_ENV -echo BASE_TREE_SHA=$( jq -r '.data.repository.defaultBranchRef.commit.tree.oid' <<< "${response}" ) >> $GITHUB_ENV diff --git a/inspect-ref.sh b/inspect-ref.sh new file mode 100755 index 0000000..851f72d --- /dev/null +++ b/inspect-ref.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +source ./functions.sh + +# Ref to inspect +ref="${1}" + +# Get default branch ref if ref is empty +[[ -z "$ref" ]] && ref=$( get-default-branch-ref ) + +# Inspect ref +inspect-ref "$ref" + +# Export environment variables with object ids +echo REF=$ref >> $GITHUB_ENV +echo HEAD_SHA=$head_sha >> $GITHUB_ENV +echo BASE_TREE_SHA=$tree_sha >> $GITHUB_ENV diff --git a/update-ref.sh b/update-ref.sh index 034eeb0..745a9ec 100755 --- a/update-ref.sh +++ b/update-ref.sh @@ -1,9 +1,6 @@ #!/bin/bash set -e -# Ref to update -ref="${1}" - # Generate payload payload=$( mktemp ) jq --null-input \ @@ -12,7 +9,7 @@ jq --null-input \ # Update ref response=$( curl --request PATCH \ - --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/refs/$ref \ + --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF \ --header "authorization: Bearer $GH_TOKEN" \ --header "content-type: application/json" \ --data @$payload ) From 704359a5c6b64507a95482ddb637a644d2c40807 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 13:57:00 -0600 Subject: [PATCH 09/97] Execute steps relative to github.action_path --- action.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/action.yml b/action.yml index 300b09e..57ec2a9 100644 --- a/action.yml +++ b/action.yml @@ -23,24 +23,24 @@ runs: steps: # Get object ids: head commit sha, tree sha - shell: bash - run: ./inspect-ref.sh "${{ inputs.ref }}" + run: ${{ github.action_path }}/inspect-ref.sh "${{ inputs.ref }}" # Create blob - shell: bash - run: ./create-blob.sh "${{ inputs.path }}" + run: ${{ github.action_path }}/create-blob.sh "${{ inputs.path }}" # Create tree - shell: bash - run: ./create-tree.sh + run: ${{ github.action_path }}/create-tree.sh # Create commit - shell: bash id: commit - run: ./create-commit.sh "${{ inputs.commit-message }}" + run: ${{ github.action_path }}/create-commit.sh "${{ inputs.commit-message }}" # Update ref - shell: bash - run: ./update-ref.sh "${{ inputs.ref }}" + run: ${{ github.action_path }}/update-ref.sh "${{ inputs.ref }}" branding: icon: git-commit color: purple From 8120bb46185fb36a5cd3c8c9063dbdbf983a7583 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 13:59:56 -0600 Subject: [PATCH 10/97] Source functions relative to github.action_path --- action.yml | 4 ++++ inspect-ref.sh | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/action.yml b/action.yml index 57ec2a9..4579159 100644 --- a/action.yml +++ b/action.yml @@ -21,6 +21,10 @@ outputs: runs: using: composite steps: + # Initialize + - shell: bash + run: source ${{ github.action_path }}/functions.sh + # Get object ids: head commit sha, tree sha - shell: bash run: ${{ github.action_path }}/inspect-ref.sh "${{ inputs.ref }}" diff --git a/inspect-ref.sh b/inspect-ref.sh index 851f72d..5e4ad28 100755 --- a/inspect-ref.sh +++ b/inspect-ref.sh @@ -1,8 +1,6 @@ #!/bin/bash set -e -source ./functions.sh - # Ref to inspect ref="${1}" From 61c08682c9b3eef9a1fe2144ca2a8ea682646291 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 14:05:51 -0600 Subject: [PATCH 11/97] Source functions.sh relatively --- action.yml | 4 ---- inspect-ref.sh | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/action.yml b/action.yml index 4579159..57ec2a9 100644 --- a/action.yml +++ b/action.yml @@ -21,10 +21,6 @@ outputs: runs: using: composite steps: - # Initialize - - shell: bash - run: source ${{ github.action_path }}/functions.sh - # Get object ids: head commit sha, tree sha - shell: bash run: ${{ github.action_path }}/inspect-ref.sh "${{ inputs.ref }}" diff --git a/inspect-ref.sh b/inspect-ref.sh index 5e4ad28..f9ed997 100755 --- a/inspect-ref.sh +++ b/inspect-ref.sh @@ -1,6 +1,8 @@ #!/bin/bash set -e +source functions.sh + # Ref to inspect ref="${1}" From eaf1f911810c58d05ba30d2169327645f9cee70f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 14:10:52 -0600 Subject: [PATCH 12/97] Source functions relative to ACTION_PATH, set by init.sh --- action.yml | 4 ++++ init.sh | 6 ++++++ inspect-ref.sh | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100755 init.sh diff --git a/action.yml b/action.yml index 57ec2a9..0886885 100644 --- a/action.yml +++ b/action.yml @@ -21,6 +21,10 @@ outputs: runs: using: composite steps: + # Initialize + - shell: bash + run: ${{ github.action_path }}/init.sh "${{ github.action_path }}" + # Get object ids: head commit sha, tree sha - shell: bash run: ${{ github.action_path }}/inspect-ref.sh "${{ inputs.ref }}" diff --git a/init.sh b/init.sh new file mode 100755 index 0000000..ba389b6 --- /dev/null +++ b/init.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e + +action_path="${1}" + +echo ACTION_PATH=$action_path >> $GITHUB_ENV diff --git a/inspect-ref.sh b/inspect-ref.sh index f9ed997..315c827 100755 --- a/inspect-ref.sh +++ b/inspect-ref.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -source functions.sh +source "${ACTION_PATH}/functions.sh" # Ref to inspect ref="${1}" From 6e0f20a837ca5e49784ea31431b7d6e241f1c964 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 14:16:59 -0600 Subject: [PATCH 13/97] Include path when creating tree --- .github/workflows/verified-commit.yml | 2 +- README.md | 4 ++-- action.yml | 4 ++-- create-tree.sh | 6 +++++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 6a6799c..6a59d68 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -40,7 +40,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - path: ./myfile + path: myfile commit-message: Committing ./myfile ref: refs/heads/scratch diff --git a/README.md b/README.md index 24fe9ab..0bd0ffb 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ Note, the `GH_TOKEN` environment variable is _required_, since commits are creat ## Inputs The following inputs are _required_: -- `path`: Filesystem path of file to be committed, e.g. `Add ./myfile` -- `commit-message`: Commit message to be used, e.g. `./myfile` +- `path`: Filesystem path of file to be committed, relative to root of repository, e.g. `myfile` +- `commit-message`: Commit message to be used, e.g. `Add ./myfile` - `ref`: Fully qualified name of reference to be updated with commit, e.g. `refs/heads/production`. This reference _must_ already exist. Defaults to the repository's default branch ref. ## Outputs diff --git a/action.yml b/action.yml index 0886885..6a03467 100644 --- a/action.yml +++ b/action.yml @@ -3,7 +3,7 @@ description: GitHub Action to create verified commits inputs: path: description: | - Filesystem path of file to be committed + Filesystem path of file to be committed, relative to root of repository required: true commit-message: description: | @@ -35,7 +35,7 @@ runs: # Create tree - shell: bash - run: ${{ github.action_path }}/create-tree.sh + run: ${{ github.action_path }}/create-tree.sh "${{ inputs.path }}" # Create commit - shell: bash diff --git a/create-tree.sh b/create-tree.sh index b78525b..2c3f6d3 100755 --- a/create-tree.sh +++ b/create-tree.sh @@ -1,12 +1,16 @@ #!/bin/bash set -e +# Path to file containing blob contents +path="${1}" + # Generate payload payload=$( mktemp ) jq --null-input \ + --arg path "$path" \ --arg blob_sha "$BLOB_SHA" \ --arg base_tree "$BASE_TREE_SHA" \ - '{"tree": [{"path": "extra", "mode": "100644", "type": "blob", "sha": $blob_sha}], "base_tree": $base_tree}' > $payload + '{"tree": [{"path": $path, "mode": "100644", "type": "blob", "sha": $blob_sha}], "base_tree": $base_tree}' > $payload # Create tree response=$( curl --request POST \ From b82b9c86f7adf724816dd50e1ec8fc932327a5b2 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 14:17:53 -0600 Subject: [PATCH 14/97] Run curl silently --- create-blob.sh | 2 +- create-commit.sh | 2 +- create-tree.sh | 2 +- update-ref.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/create-blob.sh b/create-blob.sh index 48bfde6..0f12a43 100755 --- a/create-blob.sh +++ b/create-blob.sh @@ -16,7 +16,7 @@ jq --null-input \ '{"content": $content[0], "encoding": $encoding}' > $payload # Create blob -response=$( curl --request POST \ +response=$( curl --silent --request POST \ --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/blobs \ --header "authorization: Bearer $GH_TOKEN" \ --header 'content-type: application/json' \ diff --git a/create-commit.sh b/create-commit.sh index 75f3bbd..780ef1f 100755 --- a/create-commit.sh +++ b/create-commit.sh @@ -13,7 +13,7 @@ jq --null-input \ '{"message": $message, "tree": $tree_sha, "parents": [$parent_sha]}' > $payload # Create commit -response=$( curl --request POST \ +response=$( curl --silent --request POST \ --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits \ --header "authorization: Bearer $GH_TOKEN" \ --header 'content-type: application/json' \ diff --git a/create-tree.sh b/create-tree.sh index 2c3f6d3..509169e 100755 --- a/create-tree.sh +++ b/create-tree.sh @@ -13,7 +13,7 @@ jq --null-input \ '{"tree": [{"path": $path, "mode": "100644", "type": "blob", "sha": $blob_sha}], "base_tree": $base_tree}' > $payload # Create tree -response=$( curl --request POST \ +response=$( curl --silent --request POST \ --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees \ --header "authorization: Bearer $GH_TOKEN" \ --header 'content-type: application/json' \ diff --git a/update-ref.sh b/update-ref.sh index 745a9ec..45a35c2 100755 --- a/update-ref.sh +++ b/update-ref.sh @@ -8,7 +8,7 @@ jq --null-input \ '{"sha": $sha}' > $payload # Update ref -response=$( curl --request PATCH \ +response=$( curl --silent --request PATCH \ --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF \ --header "authorization: Bearer $GH_TOKEN" \ --header "content-type: application/json" \ From acb95906a3bfbaa226cffc8b716f373f85c5a030 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 14:44:42 -0600 Subject: [PATCH 15/97] Add zen --- .github/workflows/verified-commit.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 6a59d68..4f4e209 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -28,11 +28,14 @@ jobs: run: | gh api /repos/:owner/:repo/git/refs \ --field sha="$GITHUB_SHA" \ - --field ref="refs/heads/scratch" + --field ref="refs/heads/zen" - - name: Create file + - name: Create zen + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - dd if=/dev/urandom count=1 > myfile + echo "$( gh api zen )" >> zen.txt + cat zen.txt - name: Commit file id: commit @@ -40,9 +43,9 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - path: myfile - commit-message: Committing ./myfile - ref: refs/heads/scratch + path: zen.txt + commit-message: Adding ./zen.txt + ref: refs/heads/zen - name: Inspect environment run: | From 90b041ff91a2c22aaacbf84c9c90f2ba74bbdf01 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:07:04 -0600 Subject: [PATCH 16/97] Checkout the zen ref so changes are additive --- .github/workflows/verified-commit.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 4f4e209..a5c6fa5 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -18,19 +18,21 @@ jobs: run: | echo "$GITHUB_CONTEXT" - - name: Checkout - uses: actions/checkout@v2 - - name: Ensure ref exists continue-on-error: true env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - gh api /repos/:owner/:repo/git/refs \ + gh api /repos/$GITHUB_REPOSITORY/git/refs \ --field sha="$GITHUB_SHA" \ --field ref="refs/heads/zen" - - name: Create zen + - name: Checkout + uses: actions/checkout@v2 + with: + ref: zen + + - name: Update zen.txt env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | From d2f39d31eb45390a5cb9d0876a1e41dddf365301 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:08:09 -0600 Subject: [PATCH 17/97] Modify commit message --- .github/workflows/verified-commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index a5c6fa5..66282a3 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -46,7 +46,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: path: zen.txt - commit-message: Adding ./zen.txt + commit-message: Add zen ref: refs/heads/zen - name: Inspect environment From 2e25759d5e5db9cf26681eef13cecfd261b56c5f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:08:36 -0600 Subject: [PATCH 18/97] Use argfile in place of slurpfile --- create-blob.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/create-blob.sh b/create-blob.sh index 0f12a43..34db676 100755 --- a/create-blob.sh +++ b/create-blob.sh @@ -12,8 +12,8 @@ base64 -i "${path}" | jq --raw-input '.' > $content payload=$( mktemp ) jq --null-input \ --arg encoding "base64" \ - --slurpfile content "$content" \ - '{"content": $content[0], "encoding": $encoding}' > $payload + --argfile content "$content" \ + '{"content": $content, "encoding": $encoding}' > $payload # Create blob response=$( curl --silent --request POST \ From dccda71f2c9901f37350e37b6f0c7b5e646c0efd Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:16:43 -0600 Subject: [PATCH 19/97] Do it on main --- .github/workflows/verified-commit.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml index 66282a3..38d4c33 100644 --- a/.github/workflows/verified-commit.yml +++ b/.github/workflows/verified-commit.yml @@ -18,19 +18,8 @@ jobs: run: | echo "$GITHUB_CONTEXT" - - name: Ensure ref exists - continue-on-error: true - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh api /repos/$GITHUB_REPOSITORY/git/refs \ - --field sha="$GITHUB_SHA" \ - --field ref="refs/heads/zen" - - name: Checkout uses: actions/checkout@v2 - with: - ref: zen - name: Update zen.txt env: @@ -47,7 +36,6 @@ jobs: with: path: zen.txt commit-message: Add zen - ref: refs/heads/zen - name: Inspect environment run: | From b07ae906ac068f6f7f0a7791c7fae8b384d06d17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Dec 2020 21:17:08 +0000 Subject: [PATCH 20/97] Add zen --- zen.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 zen.txt diff --git a/zen.txt b/zen.txt new file mode 100644 index 0000000..b97aa7c --- /dev/null +++ b/zen.txt @@ -0,0 +1 @@ +Approachable is better than simple. From dc335ae62b495969f49fe78076129c1e2854c219 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:27:53 -0600 Subject: [PATCH 21/97] Add debug messages to create-blob.sh --- create-blob.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/create-blob.sh b/create-blob.sh index 34db676..c142832 100755 --- a/create-blob.sh +++ b/create-blob.sh @@ -7,6 +7,7 @@ path="${1}" # Encode blob contents content=$( mktemp ) base64 -i "${path}" | jq --raw-input '.' > $content +cat $content # Generate payload payload=$( mktemp ) @@ -14,6 +15,7 @@ jq --null-input \ --arg encoding "base64" \ --argfile content "$content" \ '{"content": $content, "encoding": $encoding}' > $payload +cat $payload # Create blob response=$( curl --silent --request POST \ @@ -21,6 +23,7 @@ response=$( curl --silent --request POST \ --header "authorization: Bearer $GH_TOKEN" \ --header 'content-type: application/json' \ --data @$payload ) +echo "$response" # Export environment variables with object ids echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV From 32227a57d0976b361dfedf2dbd1048be33f9fd17 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:33:45 -0600 Subject: [PATCH 22/97] Debug: base64 output --- create-blob.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/create-blob.sh b/create-blob.sh index c142832..a1b7468 100755 --- a/create-blob.sh +++ b/create-blob.sh @@ -3,13 +3,14 @@ set -e # Path to file containing blob contents path="${1}" +base64 -i "${path}" # Encode blob contents content=$( mktemp ) base64 -i "${path}" | jq --raw-input '.' > $content cat $content -# Generate payload +# # Generate payload payload=$( mktemp ) jq --null-input \ --arg encoding "base64" \ @@ -25,5 +26,5 @@ response=$( curl --silent --request POST \ --data @$payload ) echo "$response" -# Export environment variables with object ids -echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV +# # Export environment variables with object ids +# echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV From 3c240f4112eccc7ed67987e6511647ee9148a891 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:41:06 -0600 Subject: [PATCH 23/97] Delete newlines from base64-encoded blob --- create-blob.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/create-blob.sh b/create-blob.sh index a1b7468..2afcab9 100755 --- a/create-blob.sh +++ b/create-blob.sh @@ -3,12 +3,10 @@ set -e # Path to file containing blob contents path="${1}" -base64 -i "${path}" # Encode blob contents content=$( mktemp ) -base64 -i "${path}" | jq --raw-input '.' > $content -cat $content +base64 "${path}" | tr -d '\n' | jq --raw-input '.' > $content # # Generate payload payload=$( mktemp ) @@ -16,7 +14,6 @@ jq --null-input \ --arg encoding "base64" \ --argfile content "$content" \ '{"content": $content, "encoding": $encoding}' > $payload -cat $payload # Create blob response=$( curl --silent --request POST \ @@ -24,7 +21,6 @@ response=$( curl --silent --request POST \ --header "authorization: Bearer $GH_TOKEN" \ --header 'content-type: application/json' \ --data @$payload ) -echo "$response" -# # Export environment variables with object ids -# echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV +# Export environment variables with object ids +echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV From 693bb23a267d2520468db6c7ad8ff036d9247f58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Dec 2020 21:41:54 +0000 Subject: [PATCH 24/97] Add zen --- zen.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/zen.txt b/zen.txt index b97aa7c..2b4ba07 100644 --- a/zen.txt +++ b/zen.txt @@ -1 +1,2 @@ Approachable is better than simple. +Practicality beats purity. From 2c9b98555f30f60e37245fe766fc289b65ac6005 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:50:05 -0600 Subject: [PATCH 25/97] Update README example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bd0ffb..59b512b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - path: ./myfile + path: myfile commit-message: Committing ./myfile ref: refs/heads/my-branch ``` From 3be746de37ca23b6d1ff8374c38ff206c10a5758 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 4 Dec 2020 15:53:06 -0600 Subject: [PATCH 26/97] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 59b512b..c500a27 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Commit -> Create a commit with GitHub Actions +> :white_check_mark: Create a _verified_ commit with GitHub Actions ## :warning: Warning This action is still in development and the experience is subject to change. Use at your own risk. ## About -This action allows you to create a commit with GitHub Actions. Commits created with this aciton will be marked as _verified_. +This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. ![image](https://user-images.githubusercontent.com/27806/101197362-a2ed0980-3627-11eb-9afb-bc8b9bcd0345.png) From c0fbd707c64200b146e4817950c0fb4b59df7ab6 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 13:37:00 -0600 Subject: [PATCH 27/97] Add package.json for v2 --- package.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..5ed8bf3 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "@swinton/commit", + "version": "2.0.0", + "description": "> :white_check_mark: Create a _verified_ commit with GitHub Actions", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/swinton/commit.git" + }, + "keywords": [], + "author": "Steve Winton (https://github.com/swinton)", + "license": "ISC", + "bugs": { + "url": "https://github.com/swinton/commit/issues" + }, + "homepage": "https://github.com/swinton/commit#readme" +} From 54c6f09c5f15c81ca660ec3a48fde226bf4e42a3 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 14:02:22 -0600 Subject: [PATCH 28/97] Remove README warning --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index c500a27..3fa2573 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # Commit > :white_check_mark: Create a _verified_ commit with GitHub Actions -## :warning: Warning -This action is still in development and the experience is subject to change. Use at your own risk. - ## About This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. From 5b08d3978a66ab33e01c0c50094aa05e8a083ca2 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 14:03:27 -0600 Subject: [PATCH 29/97] Define v2 behavior --- README.md | 23 ++++++++++++++++++++--- action.yml | 33 ++++----------------------------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 3fa2573..8ab798c 100644 --- a/README.md +++ b/README.md @@ -11,21 +11,38 @@ In your workflow, to commit a file `./myfile`, include a step like this: ```yaml - name: Commit file - uses: swinton/commit@v1 + uses: swinton/commit@v2 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - path: myfile + paths: | + myfile commit-message: Committing ./myfile ref: refs/heads/my-branch ``` Note, the `GH_TOKEN` environment variable is _required_, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). +To commit multiple files in a single commit, pass each file on a newline to the `paths` input: + +```yaml + - name: Commit files + uses: swinton/commit@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + paths: | + path/to/myfile1 + path/to/myfile2 + path/to/myfile3 + commit-message: Committing files + ref: refs/heads/my-branch +``` + ## Inputs The following inputs are _required_: -- `path`: Filesystem path of file to be committed, relative to root of repository, e.g. `myfile` +- `paths`: Newline-separated list of filesystems path of files to be committed, relative to root of repository, e.g.
myfile1
myfile2
...
myfileN
- `commit-message`: Commit message to be used, e.g. `Add ./myfile` - `ref`: Fully qualified name of reference to be updated with commit, e.g. `refs/heads/production`. This reference _must_ already exist. Defaults to the repository's default branch ref. diff --git a/action.yml b/action.yml index 6a03467..02afa05 100644 --- a/action.yml +++ b/action.yml @@ -1,9 +1,9 @@ name: Verified commit description: GitHub Action to create verified commits inputs: - path: + paths: description: | - Filesystem path of file to be committed, relative to root of repository + Newline-separated list of filesystems path of files to be committed, relative to root of repository required: true commit-message: description: | @@ -17,34 +17,9 @@ inputs: outputs: commit-sha: description: SHA of created commit - value: ${{ steps.commit.outputs.commit-sha }} runs: - using: composite - steps: - # Initialize - - shell: bash - run: ${{ github.action_path }}/init.sh "${{ github.action_path }}" - - # Get object ids: head commit sha, tree sha - - shell: bash - run: ${{ github.action_path }}/inspect-ref.sh "${{ inputs.ref }}" - - # Create blob - - shell: bash - run: ${{ github.action_path }}/create-blob.sh "${{ inputs.path }}" - - # Create tree - - shell: bash - run: ${{ github.action_path }}/create-tree.sh "${{ inputs.path }}" - - # Create commit - - shell: bash - id: commit - run: ${{ github.action_path }}/create-commit.sh "${{ inputs.commit-message }}" - - # Update ref - - shell: bash - run: ${{ github.action_path }}/update-ref.sh "${{ inputs.ref }}" + using: node12 + main: dist/index.js branding: icon: git-commit color: purple From 220cdcac724cf8164f8cbbccc0adac056f6c0d6f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 14:06:34 -0600 Subject: [PATCH 30/97] Add package metadata --- .gitignore | 117 ++++++++++++++++++++++++++++++++++++++++++++++ index.js | 0 package-lock.json | 14 ++++++ package.json | 10 ++-- 4 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 index.js create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 7a6353d..e3c5d61 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,118 @@ .envrc + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/index.js b/index.js new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..082c7ae --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "@swinton/commit", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@vercel/ncc": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.25.1.tgz", + "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", + "dev": true + } + } +} diff --git a/package.json b/package.json index 5ed8bf3..8d1d2f1 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "@swinton/commit", "version": "2.0.0", - "description": "> :white_check_mark: Create a _verified_ commit with GitHub Actions", + "description": "Create a verified commit with GitHub Actions", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "build": "ncc build index.js -o dist" }, "repository": { "type": "git", @@ -16,5 +17,8 @@ "bugs": { "url": "https://github.com/swinton/commit/issues" }, - "homepage": "https://github.com/swinton/commit#readme" + "homepage": "https://github.com/swinton/commit#readme", + "devDependencies": { + "@vercel/ncc": "^0.25.1" + } } From c73ed959b1674c1ce3b8a4e9b34eb4ae581c9132 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 14:06:49 -0600 Subject: [PATCH 31/97] Add v2 release workflow --- .github/workflows/release.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..aec4666 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,22 @@ +name: release v2 +on: + push: + branches: + - master +jobs: + release: + name: release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm ci + - run: npm run build + - uses: ./ + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + paths: | + dist/index.js + commit-message: Add dist/index.js + ref: refs/heads/v2 From c64522163d5dd961a41513e1473ad71997dadc66 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 14:10:08 -0600 Subject: [PATCH 32/97] Remove shell scripts --- create-blob.sh | 26 -------------------------- create-commit.sh | 29 ----------------------------- create-tree.sh | 23 ----------------------- debug.sh | 4 ---- functions.sh | 46 ---------------------------------------------- init.sh | 6 ------ inspect-ref.sh | 18 ------------------ update-ref.sh | 15 --------------- 8 files changed, 167 deletions(-) delete mode 100755 create-blob.sh delete mode 100755 create-commit.sh delete mode 100755 create-tree.sh delete mode 100755 debug.sh delete mode 100644 functions.sh delete mode 100755 init.sh delete mode 100755 inspect-ref.sh delete mode 100755 update-ref.sh diff --git a/create-blob.sh b/create-blob.sh deleted file mode 100755 index 2afcab9..0000000 --- a/create-blob.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -set -e - -# Path to file containing blob contents -path="${1}" - -# Encode blob contents -content=$( mktemp ) -base64 "${path}" | tr -d '\n' | jq --raw-input '.' > $content - -# # Generate payload -payload=$( mktemp ) -jq --null-input \ - --arg encoding "base64" \ - --argfile content "$content" \ - '{"content": $content, "encoding": $encoding}' > $payload - -# Create blob -response=$( curl --silent --request POST \ - --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/blobs \ - --header "authorization: Bearer $GH_TOKEN" \ - --header 'content-type: application/json' \ - --data @$payload ) - -# Export environment variables with object ids -echo BLOB_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV diff --git a/create-commit.sh b/create-commit.sh deleted file mode 100755 index 780ef1f..0000000 --- a/create-commit.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -set -e - -# Commit messsage -message="${1}" - -# Generate payload -payload=$( mktemp ) -jq --null-input \ - --arg tree_sha "$TREE_SHA" \ - --arg parent_sha "$HEAD_SHA" \ - --arg message "$message" \ - '{"message": $message, "tree": $tree_sha, "parents": [$parent_sha]}' > $payload - -# Create commit -response=$( curl --silent --request POST \ - --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits \ - --header "authorization: Bearer $GH_TOKEN" \ - --header 'content-type: application/json' \ - --data @$payload ) - -# Get SHA of commit -commit_sha=$( jq -r '.sha' <<< "${response}" ) - -# Export environment variables with object ids -echo "COMMIT_SHA=$commit_sha" >> $GITHUB_ENV - -# Set 'commit-sha' output -echo "::set-output name=commit-sha::$commit_sha" diff --git a/create-tree.sh b/create-tree.sh deleted file mode 100755 index 509169e..0000000 --- a/create-tree.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -# Path to file containing blob contents -path="${1}" - -# Generate payload -payload=$( mktemp ) -jq --null-input \ - --arg path "$path" \ - --arg blob_sha "$BLOB_SHA" \ - --arg base_tree "$BASE_TREE_SHA" \ - '{"tree": [{"path": $path, "mode": "100644", "type": "blob", "sha": $blob_sha}], "base_tree": $base_tree}' > $payload - -# Create tree -response=$( curl --silent --request POST \ - --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees \ - --header "authorization: Bearer $GH_TOKEN" \ - --header 'content-type: application/json' \ - --data @$payload ) - -# Export environment variables with object ids -echo TREE_SHA=$( jq -r '.sha' <<< "${response}" ) >> $GITHUB_ENV diff --git a/debug.sh b/debug.sh deleted file mode 100755 index 0d874aa..0000000 --- a/debug.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -e - -exit 0 diff --git a/functions.sh b/functions.sh deleted file mode 100644 index a06bcaa..0000000 --- a/functions.sh +++ /dev/null @@ -1,46 +0,0 @@ -function get-default-branch-ref { - response=$( gh api graphql \ - --field owner=':owner' \ - --field repo=':repo' \ - --raw-field \ - query='query getDefaultBranchRef($owner: String!, $repo: String!) { - repository(owner: $owner, name: $repo) { - defaultBranchRef { - name - } - } - }' - ) - - ref=$( jq -r '.data.repository.defaultBranchRef.name' <<< "${response}" ) - - echo "refs/heads/$ref" -} - -function inspect-ref { - ref="$1" - response=$( gh api graphql \ - --field owner=':owner' \ - --field repo=':repo' \ - --field ref="$ref" \ - --raw-field \ - query='query inspectRef($owner: String!, $repo: String!, $ref: String!) { - repository(owner: $owner, name: $repo) { - ref(qualifiedName: $ref) { - name - commit: target { - ... on Commit { - oid - tree { - oid - } - } - } - } - } - }' - ) - - head_sha=$( jq -r '.data.repository.ref.commit.oid' <<< "${response}" ) - tree_sha=$( jq -r '.data.repository.ref.commit.tree.oid' <<< "${response}" ) -} diff --git a/init.sh b/init.sh deleted file mode 100755 index ba389b6..0000000 --- a/init.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -e - -action_path="${1}" - -echo ACTION_PATH=$action_path >> $GITHUB_ENV diff --git a/inspect-ref.sh b/inspect-ref.sh deleted file mode 100755 index 315c827..0000000 --- a/inspect-ref.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -e - -source "${ACTION_PATH}/functions.sh" - -# Ref to inspect -ref="${1}" - -# Get default branch ref if ref is empty -[[ -z "$ref" ]] && ref=$( get-default-branch-ref ) - -# Inspect ref -inspect-ref "$ref" - -# Export environment variables with object ids -echo REF=$ref >> $GITHUB_ENV -echo HEAD_SHA=$head_sha >> $GITHUB_ENV -echo BASE_TREE_SHA=$tree_sha >> $GITHUB_ENV diff --git a/update-ref.sh b/update-ref.sh deleted file mode 100755 index 45a35c2..0000000 --- a/update-ref.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -# Generate payload -payload=$( mktemp ) -jq --null-input \ - --arg sha "$COMMIT_SHA" \ - '{"sha": $sha}' > $payload - -# Update ref -response=$( curl --silent --request PATCH \ - --url https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF \ - --header "authorization: Bearer $GH_TOKEN" \ - --header "content-type: application/json" \ - --data @$payload ) From 270b42354c7ec3083f14e2412b5950e5f0dd19be Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 15:45:33 -0600 Subject: [PATCH 33/97] s/master/main --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aec4666..5b71ac2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: release v2 on: push: branches: - - master + - main jobs: release: name: release From dcb7969abe63aa249e1c460698bc4aa8ea0f3737 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 15:59:33 -0600 Subject: [PATCH 34/97] Retrieve paths and other inputs --- index.js | 25 +++++++++++++++++++++++++ lib/expand.js | 12 ++++++++++++ package-lock.json | 5 +++++ package.json | 3 +++ 4 files changed, 45 insertions(+) create mode 100644 lib/expand.js diff --git a/index.js b/index.js index e69de29..f365e97 100644 --- a/index.js +++ b/index.js @@ -0,0 +1,25 @@ +const core = require('@actions/core'); + +const expand = require('./lib/expand'); + +async function setup() { + try { + // Get inputs + const paths = core.getInput('paths'); + const commitMessage = core.getInput('commit-message'); + const ref = core.getInput('ref'); + + // Expand paths to an array + const expandedPaths = expand(paths); + core.debug(`Received ${ paths.length } paths: ${ JSON.stringify(paths, null, 4) }`); + + } catch (e) { + core.setFailed(e); + } +} + +module.exports = setup + +if (require.main === module) { + setup(); +} diff --git a/lib/expand.js b/lib/expand.js new file mode 100644 index 0000000..7c4e128 --- /dev/null +++ b/lib/expand.js @@ -0,0 +1,12 @@ +function expand(paths) { + return paths + .trim() + .split("\n"); +} + +module.exports = expand; + +if (require.main === module) { + console.log(expand(`path`)); + console.log(expand(`\npath1\npath2\npath3\n`)); +} diff --git a/package-lock.json b/package-lock.json index 082c7ae..b95d6c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@actions/core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", + "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" + }, "@vercel/ncc": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.25.1.tgz", diff --git a/package.json b/package.json index 8d1d2f1..880055b 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,8 @@ "homepage": "https://github.com/swinton/commit#readme", "devDependencies": { "@vercel/ncc": "^0.25.1" + }, + "dependencies": { + "@actions/core": "^1.2.6" } } From 54a3258845080c67c90eb9d1d42a852f218a9ded Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 15:59:52 -0600 Subject: [PATCH 35/97] Rebuild dist --- dist/index.js | 510 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 510 insertions(+) create mode 100644 dist/index.js diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..58c6649 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,510 @@ +module.exports = +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 932: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +const core = __webpack_require__(186); + +const expand = __webpack_require__(361); + +async function setup() { + try { + // Get inputs + const paths = core.getInput('paths'); + const commitMessage = core.getInput('commit-message'); + const ref = core.getInput('ref'); + + // Expand paths to an array + const expandedPaths = expand(paths); + core.debug(`Received ${ paths.length } paths: ${ JSON.stringify(paths, null, 4) }`); + + } catch (e) { + core.setFailed(e); + } +} + +module.exports = setup + +if (require.main === require.cache[eval('__filename')]) { + setup(); +} + + +/***/ }), + +/***/ 361: +/***/ ((module) => { + +function expand(paths) { + return paths + .trim() + .split("\n"); +} + +module.exports = expand; + +if (false) {} + + +/***/ }), + +/***/ 351: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(278); +/** + * Commands + * + * Command Format: + * ::name key=value,key=value::message + * + * Examples: + * ::warning::This is the message + * ::set-env name=MY_VAR::some value + */ +function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); +} +exports.issueCommand = issueCommand; +function issue(name, message = '') { + issueCommand(name, {}, message); +} +exports.issue = issue; +const CMD_STRING = '::'; +class Command { + constructor(command, properties, message) { + if (!command) { + command = 'missing.command'; + } + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val = this.properties[key]; + if (val) { + if (first) { + first = false; + } + else { + cmdStr += ','; + } + cmdStr += `${key}=${escapeProperty(val)}`; + } + } + } + } + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } +} +function escapeData(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function escapeProperty(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/:/g, '%3A') + .replace(/,/g, '%2C'); +} +//# sourceMappingURL=command.js.map + +/***/ }), + +/***/ 186: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const command_1 = __webpack_require__(351); +const file_command_1 = __webpack_require__(717); +const utils_1 = __webpack_require__(278); +const os = __importStar(__webpack_require__(87)); +const path = __importStar(__webpack_require__(622)); +/** + * The code to exit an action + */ +var ExitCode; +(function (ExitCode) { + /** + * A code indicating that the action was successful + */ + ExitCode[ExitCode["Success"] = 0] = "Success"; + /** + * A code indicating that the action was a failure + */ + ExitCode[ExitCode["Failure"] = 1] = "Failure"; +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); +//----------------------------------------------------------------------- +// Variables +//----------------------------------------------------------------------- +/** + * Sets env variable for this action and future actions in the job + * @param name the name of the variable to set + * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + const delimiter = '_GitHubActionsFileCommandDelimeter_'; + const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`; + file_command_1.issueCommand('ENV', commandValue); + } + else { + command_1.issueCommand('set-env', { name }, convertedVal); + } +} +exports.exportVariable = exportVariable; +/** + * Registers a secret which will get masked from logs + * @param secret value of the secret + */ +function setSecret(secret) { + command_1.issueCommand('add-mask', {}, secret); +} +exports.setSecret = setSecret; +/** + * Prepends inputPath to the PATH (for this action and future actions) + * @param inputPath + */ +function addPath(inputPath) { + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; +} +exports.addPath = addPath; +/** + * Gets the value of an input. The value is also trimmed. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string + */ +function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + return val.trim(); +} +exports.getInput = getInput; +/** + * Sets the value of an output. + * + * @param name name of the output to set + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setOutput(name, value) { + command_1.issueCommand('set-output', { name }, value); +} +exports.setOutput = setOutput; +/** + * Enables or disables the echoing of commands into stdout for the rest of the step. + * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. + * + */ +function setCommandEcho(enabled) { + command_1.issue('echo', enabled ? 'on' : 'off'); +} +exports.setCommandEcho = setCommandEcho; +//----------------------------------------------------------------------- +// Results +//----------------------------------------------------------------------- +/** + * Sets the action status to failed. + * When the action exits it will be with an exit code of 1 + * @param message add error issue message + */ +function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); +} +exports.setFailed = setFailed; +//----------------------------------------------------------------------- +// Logging Commands +//----------------------------------------------------------------------- +/** + * Gets whether Actions Step Debug is on or not + */ +function isDebug() { + return process.env['RUNNER_DEBUG'] === '1'; +} +exports.isDebug = isDebug; +/** + * Writes debug message to user log + * @param message debug message + */ +function debug(message) { + command_1.issueCommand('debug', {}, message); +} +exports.debug = debug; +/** + * Adds an error issue + * @param message error issue message. Errors will be converted to string via toString() + */ +function error(message) { + command_1.issue('error', message instanceof Error ? message.toString() : message); +} +exports.error = error; +/** + * Adds an warning issue + * @param message warning issue message. Errors will be converted to string via toString() + */ +function warning(message) { + command_1.issue('warning', message instanceof Error ? message.toString() : message); +} +exports.warning = warning; +/** + * Writes info to log with console.log. + * @param message info message + */ +function info(message) { + process.stdout.write(message + os.EOL); +} +exports.info = info; +/** + * Begin an output group. + * + * Output until the next `groupEnd` will be foldable in this group + * + * @param name The name of the output group + */ +function startGroup(name) { + command_1.issue('group', name); +} +exports.startGroup = startGroup; +/** + * End an output group. + */ +function endGroup() { + command_1.issue('endgroup'); +} +exports.endGroup = endGroup; +/** + * Wrap an asynchronous function call in a group. + * + * Returns the same type as the function itself. + * + * @param name The name of the group + * @param fn The function to wrap in the group + */ +function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } + finally { + endGroup(); + } + return result; + }); +} +exports.group = group; +//----------------------------------------------------------------------- +// Wrapper action state +//----------------------------------------------------------------------- +/** + * Saves state for current action, the state can only be retrieved by this action's post job execution. + * + * @param name name of the state to store + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function saveState(name, value) { + command_1.issueCommand('save-state', { name }, value); +} +exports.saveState = saveState; +/** + * Gets the value of an state set by this action's main execution. + * + * @param name name of the state to get + * @returns string + */ +function getState(name) { + return process.env[`STATE_${name}`] || ''; +} +exports.getState = getState; +//# sourceMappingURL=core.js.map + +/***/ }), + +/***/ 717: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +// For internal use, subject to change. +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__webpack_require__(747)); +const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(278); +function issueCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueCommand = issueCommand; +//# sourceMappingURL=file-command.js.map + +/***/ }), + +/***/ 278: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 747: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs");; + +/***/ }), + +/***/ 87: +/***/ ((module) => { + +"use strict"; +module.exports = require("os");; + +/***/ }), + +/***/ 622: +/***/ ((module) => { + +"use strict"; +module.exports = require("path");; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __webpack_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __webpack_require__(932); +/******/ })() +; \ No newline at end of file From 5c30d627b33e43af6c277b22968459fa3c024ac6 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 16:05:44 -0600 Subject: [PATCH 36/97] Log expanded paths --- dist/index.js | 2 +- index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 58c6649..b66c0ef 100644 --- a/dist/index.js +++ b/dist/index.js @@ -18,7 +18,7 @@ async function setup() { // Expand paths to an array const expandedPaths = expand(paths); - core.debug(`Received ${ paths.length } paths: ${ JSON.stringify(paths, null, 4) }`); + core.debug(`Received ${ expandedPaths.length } paths: ${ JSON.stringify(expandedPaths, null, 4) }`); } catch (e) { core.setFailed(e); diff --git a/index.js b/index.js index f365e97..e33d456 100644 --- a/index.js +++ b/index.js @@ -11,7 +11,7 @@ async function setup() { // Expand paths to an array const expandedPaths = expand(paths); - core.debug(`Received ${ paths.length } paths: ${ JSON.stringify(paths, null, 4) }`); + core.debug(`Received ${ expandedPaths.length } paths: ${ JSON.stringify(expandedPaths, null, 4) }`); } catch (e) { core.setFailed(e); From f7ea09a69f1977e87e43afa4b67515bce756af5e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 16:20:00 -0600 Subject: [PATCH 37/97] Add support for workspace input --- action.yml | 6 +++++- index.js | 5 +++-- lib/expand.js | 10 +++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/action.yml b/action.yml index 02afa05..5925fdc 100644 --- a/action.yml +++ b/action.yml @@ -3,8 +3,12 @@ description: GitHub Action to create verified commits inputs: paths: description: | - Newline-separated list of filesystems path of files to be committed, relative to root of repository + Newline-separated list of filesystems path of files to be committed, relative to root of repository. required: true + workspace: + description: | + Base directory containing files to be committed, defaults to the GitHub workspace directory path, $GITHUB_WORKSPACE. + required: false commit-message: description: | Commit message to be used diff --git a/index.js b/index.js index e33d456..5163a06 100644 --- a/index.js +++ b/index.js @@ -6,12 +6,13 @@ async function setup() { try { // Get inputs const paths = core.getInput('paths'); + const baseDir = core.getInput('workspace'); const commitMessage = core.getInput('commit-message'); const ref = core.getInput('ref'); // Expand paths to an array - const expandedPaths = expand(paths); - core.debug(`Received ${ expandedPaths.length } paths: ${ JSON.stringify(expandedPaths, null, 4) }`); + const expandedPaths = expand(paths, { baseDir }); + core.debug(`Received ${ expandedPaths.length } paths: ${ expandedPaths.join(', ') }`); } catch (e) { core.setFailed(e); diff --git a/lib/expand.js b/lib/expand.js index 7c4e128..2363fbe 100644 --- a/lib/expand.js +++ b/lib/expand.js @@ -1,12 +1,16 @@ -function expand(paths) { +const { join } = require('path'); + +function expand(paths, options = { baseDir: process.env.GITHUB_WORKSPACE }) { + const { baseDir } = options; return paths .trim() - .split("\n"); + .split("\n") + .map(path => join(baseDir, path)); } module.exports = expand; if (require.main === module) { - console.log(expand(`path`)); + console.log(expand(`zen.txt`, { baseDir: `/home/scratch` })); console.log(expand(`\npath1\npath2\npath3\n`)); } From 7a629fb878c0f399a51af40a284ff7561251089e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 16:20:18 -0600 Subject: [PATCH 38/97] Rebuild --- dist/index.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/dist/index.js b/dist/index.js index b66c0ef..23169ed 100644 --- a/dist/index.js +++ b/dist/index.js @@ -13,12 +13,13 @@ async function setup() { try { // Get inputs const paths = core.getInput('paths'); + const baseDir = core.getInput('workspace'); const commitMessage = core.getInput('commit-message'); const ref = core.getInput('ref'); // Expand paths to an array - const expandedPaths = expand(paths); - core.debug(`Received ${ expandedPaths.length } paths: ${ JSON.stringify(expandedPaths, null, 4) }`); + const expandedPaths = expand(paths, { baseDir }); + core.debug(`Received ${ expandedPaths.length } paths: ${ expandedPaths.join(', ') }`); } catch (e) { core.setFailed(e); @@ -35,12 +36,16 @@ if (require.main === require.cache[eval('__filename')]) { /***/ }), /***/ 361: -/***/ ((module) => { +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +const { join } = __webpack_require__(622); -function expand(paths) { +function expand(paths, options = { baseDir: process.env.GITHUB_WORKSPACE }) { + const { baseDir } = options; return paths .trim() - .split("\n"); + .split("\n") + .map(path => join(baseDir, path)); } module.exports = expand; From da043dfec35df1b301aa3869f4b9cb28b65fa88f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 16:24:49 -0600 Subject: [PATCH 39/97] Provide default for workspace input --- index.js | 2 +- lib/expand.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 5163a06..e86d910 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ async function setup() { try { // Get inputs const paths = core.getInput('paths'); - const baseDir = core.getInput('workspace'); + const baseDir = core.getInput('workspace') || process.env.GITHUB_WORKSPACE; const commitMessage = core.getInput('commit-message'); const ref = core.getInput('ref'); diff --git a/lib/expand.js b/lib/expand.js index 2363fbe..a2537f9 100644 --- a/lib/expand.js +++ b/lib/expand.js @@ -1,7 +1,8 @@ const { join } = require('path'); -function expand(paths, options = { baseDir: process.env.GITHUB_WORKSPACE }) { - const { baseDir } = options; +function expand(paths, options = {}) { + const defaults = { baseDir: process.env.GITHUB_WORKSPACE }; + const { baseDir } = { ...defaults, ...options }; return paths .trim() .split("\n") From 541595445b54e2797c11c23aebdc4e0aacf48513 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 17:21:20 -0600 Subject: [PATCH 40/97] Get inputs via wrapper allowing for defaults --- action.yml | 1 + index.js | 9 +++++---- lib/input.js | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 lib/input.js diff --git a/action.yml b/action.yml index 5925fdc..b5b6e34 100644 --- a/action.yml +++ b/action.yml @@ -9,6 +9,7 @@ inputs: description: | Base directory containing files to be committed, defaults to the GitHub workspace directory path, $GITHUB_WORKSPACE. required: false + default: '' commit-message: description: | Commit message to be used diff --git a/index.js b/index.js index e86d910..fb5c18f 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,15 @@ const core = require('@actions/core'); +const getInput = require('./lib/input'); const expand = require('./lib/expand'); async function setup() { try { // Get inputs - const paths = core.getInput('paths'); - const baseDir = core.getInput('workspace') || process.env.GITHUB_WORKSPACE; - const commitMessage = core.getInput('commit-message'); - const ref = core.getInput('ref'); + const paths = getInput('paths'); + const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); + const commitMessage = getInput('commit-message'); + const ref = getInput('ref'); // Expand paths to an array const expandedPaths = expand(paths, { baseDir }); diff --git a/lib/input.js b/lib/input.js new file mode 100644 index 0000000..c2f76eb --- /dev/null +++ b/lib/input.js @@ -0,0 +1,18 @@ +const core = require('@actions/core'); + +function getInput(name, options = {}) { + const getInputDefaults = { + required: false + }; + const value = core.getInput(name, { ...getInputDefaults, ...options }); + + if (!value && options.default) { + core.debug(`${ name }: ${ options.default }`); + return options.default; + } + + core.debug(`${ name }: ${ value }`); + return value; +} + +module.exports = getInput; From e462b975f1b484271c56135eb5fd09755868615f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 7 Dec 2020 17:21:50 -0600 Subject: [PATCH 41/97] Rebuild dist --- dist/index.js | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/dist/index.js b/dist/index.js index 23169ed..0c37fb7 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7,15 +7,16 @@ module.exports = const core = __webpack_require__(186); +const getInput = __webpack_require__(657); const expand = __webpack_require__(361); async function setup() { try { // Get inputs - const paths = core.getInput('paths'); - const baseDir = core.getInput('workspace'); - const commitMessage = core.getInput('commit-message'); - const ref = core.getInput('ref'); + const paths = getInput('paths'); + const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); + const commitMessage = getInput('commit-message'); + const ref = getInput('ref'); // Expand paths to an array const expandedPaths = expand(paths, { baseDir }); @@ -40,8 +41,9 @@ if (require.main === require.cache[eval('__filename')]) { const { join } = __webpack_require__(622); -function expand(paths, options = { baseDir: process.env.GITHUB_WORKSPACE }) { - const { baseDir } = options; +function expand(paths, options = {}) { + const defaults = { baseDir: process.env.GITHUB_WORKSPACE }; + const { baseDir } = { ...defaults, ...options }; return paths .trim() .split("\n") @@ -53,6 +55,31 @@ module.exports = expand; if (false) {} +/***/ }), + +/***/ 657: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +const core = __webpack_require__(186); + +function getInput(name, options = {}) { + const getInputDefaults = { + required: false + }; + const value = core.getInput(name, { ...getInputDefaults, ...options }); + + if (!value && options.default) { + core.debug(`${ name }: ${ options.default }`); + return options.default; + } + + core.debug(`${ name }: ${ value }`); + return value; +} + +module.exports = getInput; + + /***/ }), /***/ 351: From d0e2bc7bf3146a94a8b185878a34d1a0d4ecf8f4 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 12:11:27 -0600 Subject: [PATCH 42/97] Migrate to TypeScript --- index.js => index.ts | 12 +++++------- lib/expand.js | 17 ----------------- lib/expand.ts | 16 ++++++++++++++++ lib/input.js | 18 ------------------ lib/input.ts | 18 ++++++++++++++++++ package-lock.json | 12 ++++++++++++ package.json | 8 +++++--- tsconfig.json | 6 ++++++ 8 files changed, 62 insertions(+), 45 deletions(-) rename index.js => index.ts (70%) delete mode 100644 lib/expand.js create mode 100644 lib/expand.ts delete mode 100644 lib/input.js create mode 100644 lib/input.ts create mode 100644 tsconfig.json diff --git a/index.js b/index.ts similarity index 70% rename from index.js rename to index.ts index fb5c18f..a50e191 100644 --- a/index.js +++ b/index.ts @@ -1,15 +1,15 @@ -const core = require('@actions/core'); +import * as core from '@actions/core'; -const getInput = require('./lib/input'); -const expand = require('./lib/expand'); +import getInput from './lib/input'; +import expand from './lib/expand'; -async function setup() { +export default async function setup() { try { // Get inputs const paths = getInput('paths'); const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); const commitMessage = getInput('commit-message'); - const ref = getInput('ref'); + const ref = getInput('ref', { default: null }); // Expand paths to an array const expandedPaths = expand(paths, { baseDir }); @@ -20,8 +20,6 @@ async function setup() { } } -module.exports = setup - if (require.main === module) { setup(); } diff --git a/lib/expand.js b/lib/expand.js deleted file mode 100644 index a2537f9..0000000 --- a/lib/expand.js +++ /dev/null @@ -1,17 +0,0 @@ -const { join } = require('path'); - -function expand(paths, options = {}) { - const defaults = { baseDir: process.env.GITHUB_WORKSPACE }; - const { baseDir } = { ...defaults, ...options }; - return paths - .trim() - .split("\n") - .map(path => join(baseDir, path)); -} - -module.exports = expand; - -if (require.main === module) { - console.log(expand(`zen.txt`, { baseDir: `/home/scratch` })); - console.log(expand(`\npath1\npath2\npath3\n`)); -} diff --git a/lib/expand.ts b/lib/expand.ts new file mode 100644 index 0000000..737de0b --- /dev/null +++ b/lib/expand.ts @@ -0,0 +1,16 @@ +import { basename } from "path"; + +const { join } = require('path'); + +export interface ExpandOptions { + /** Optional. Default base dir to use when expanding a set of paths. */ + baseDir?: string +}; + +export default function expand(paths: string, options: ExpandOptions = {}): Array { + const { baseDir } = options; + return paths + .trim() + .split("\n") + .map(path => join(baseDir, path)); +} diff --git a/lib/input.js b/lib/input.js deleted file mode 100644 index c2f76eb..0000000 --- a/lib/input.js +++ /dev/null @@ -1,18 +0,0 @@ -const core = require('@actions/core'); - -function getInput(name, options = {}) { - const getInputDefaults = { - required: false - }; - const value = core.getInput(name, { ...getInputDefaults, ...options }); - - if (!value && options.default) { - core.debug(`${ name }: ${ options.default }`); - return options.default; - } - - core.debug(`${ name }: ${ value }`); - return value; -} - -module.exports = getInput; diff --git a/lib/input.ts b/lib/input.ts new file mode 100644 index 0000000..e38e6bb --- /dev/null +++ b/lib/input.ts @@ -0,0 +1,18 @@ +import * as core from '@actions/core'; + +export interface InputOptions extends core.InputOptions { + /** Optional. Default value to use for an input option if the option is not set. */ + default?: string +}; + +export default function getInput(name: string, options: InputOptions = {}): string { + const value = core.getInput(name, options); + + if (!value && options.default) { + core.debug(`${ name }: ${ options.default }`); + return options.default; + } + + core.debug(`${ name }: ${ value }`); + return value; +} diff --git a/package-lock.json b/package-lock.json index b95d6c6..fec3056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,23 @@ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" }, + "@types/node": { + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true + }, "@vercel/ncc": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.25.1.tgz", "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", "dev": true + }, + "typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true } } } diff --git a/package.json b/package.json index 880055b..b4148c0 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "@swinton/commit", "version": "2.0.0", "description": "Create a verified commit with GitHub Actions", - "main": "index.js", + "main": "dist/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "ncc build index.js -o dist" + "build": "ncc build index.ts -o dist" }, "repository": { "type": "git", @@ -19,7 +19,9 @@ }, "homepage": "https://github.com/swinton/commit#readme", "devDependencies": { - "@vercel/ncc": "^0.25.1" + "@types/node": "^14.14.10", + "@vercel/ncc": "^0.25.1", + "typescript": "^4.1.2" }, "dependencies": { "@actions/core": "^1.2.6" diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..57dce1f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "es2015", + "moduleResolution": "node" + } +} From 2e91979f1ad6301b86bc47be7ca10fdc69db9336 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 12:15:09 -0600 Subject: [PATCH 43/97] Allow input values to be null (when defaulted) --- lib/input.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/input.ts b/lib/input.ts index e38e6bb..10da9d7 100644 --- a/lib/input.ts +++ b/lib/input.ts @@ -2,10 +2,10 @@ import * as core from '@actions/core'; export interface InputOptions extends core.InputOptions { /** Optional. Default value to use for an input option if the option is not set. */ - default?: string + default?: string | null }; -export default function getInput(name: string, options: InputOptions = {}): string { +export default function getInput(name: string, options: InputOptions = {}): string | null { const value = core.getInput(name, options); if (!value && options.default) { From 31945a4dd1fbe49fe9292e0bc1b0e779b96ad854 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 12:29:52 -0600 Subject: [PATCH 44/97] Declare setup's return type --- index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.ts b/index.ts index a50e191..fdcaaad 100644 --- a/index.ts +++ b/index.ts @@ -3,7 +3,7 @@ import * as core from '@actions/core'; import getInput from './lib/input'; import expand from './lib/expand'; -export default async function setup() { +export default async function setup() : Promise { try { // Get inputs const paths = getInput('paths'); From ab52b985fe731e188bc052174de1ada2a38afead Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 12:30:38 -0600 Subject: [PATCH 45/97] Rebuild dist --- dist/index.js | 220 +++++++++++++++++++++++++++++--------------------- 1 file changed, 129 insertions(+), 91 deletions(-) diff --git a/dist/index.js b/dist/index.js index 0c37fb7..5c2c72e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,91 +1,11 @@ module.exports = /******/ (() => { // webpackBootstrap +/******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 932: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -const core = __webpack_require__(186); - -const getInput = __webpack_require__(657); -const expand = __webpack_require__(361); - -async function setup() { - try { - // Get inputs - const paths = getInput('paths'); - const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); - const commitMessage = getInput('commit-message'); - const ref = getInput('ref'); - - // Expand paths to an array - const expandedPaths = expand(paths, { baseDir }); - core.debug(`Received ${ expandedPaths.length } paths: ${ expandedPaths.join(', ') }`); - - } catch (e) { - core.setFailed(e); - } -} - -module.exports = setup - -if (require.main === require.cache[eval('__filename')]) { - setup(); -} - - -/***/ }), - -/***/ 361: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -const { join } = __webpack_require__(622); - -function expand(paths, options = {}) { - const defaults = { baseDir: process.env.GITHUB_WORKSPACE }; - const { baseDir } = { ...defaults, ...options }; - return paths - .trim() - .split("\n") - .map(path => join(baseDir, path)); -} - -module.exports = expand; - -if (false) {} - - -/***/ }), - -/***/ 657: -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -const core = __webpack_require__(186); - -function getInput(name, options = {}) { - const getInputDefaults = { - required: false - }; - const value = core.getInput(name, { ...getInputDefaults, ...options }); - - if (!value && options.default) { - core.debug(`${ name }: ${ options.default }`); - return options.default; - } - - core.debug(`${ name }: ${ value }`); - return value; -} - -module.exports = getInput; - - -/***/ }), - /***/ 351: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; @@ -171,7 +91,6 @@ function escapeProperty(s) { /***/ 186: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -416,7 +335,6 @@ exports.getState = getState; /***/ 717: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; // For internal use, subject to change. var __importStar = (this && this.__importStar) || function (mod) { @@ -452,7 +370,6 @@ exports.issueCommand = issueCommand; /***/ 278: /***/ ((__unused_webpack_module, exports) => { -"use strict"; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -473,12 +390,86 @@ function toCommandValue(input) { exports.toCommandValue = toCommandValue; //# sourceMappingURL=utils.js.map +/***/ }), + +/***/ 3: +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": () => /* binding */ setup +}); + +// EXTERNAL MODULE: ./node_modules/@actions/core/lib/core.js +var core = __webpack_require__(186); +// CONCATENATED MODULE: ./lib/input.ts + +; +function getInput(name, options = {}) { + const value = core.getInput(name, options); + if (!value && options.default) { + core.debug(`${name}: ${options.default}`); + return options.default; + } + core.debug(`${name}: ${value}`); + return value; +} + +// CONCATENATED MODULE: ./lib/expand.ts +const { join } = __webpack_require__(622); +; +function expand(paths, options = {}) { + const { baseDir } = options; + return paths + .trim() + .split("\n") + .map(path => join(baseDir, path)); +} + +// CONCATENATED MODULE: ./index.ts +/* module decorator */ module = __webpack_require__.hmd(module); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + +function setup() { + return __awaiter(this, void 0, void 0, function* () { + try { + // Get inputs + const paths = getInput('paths'); + const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); + const commitMessage = getInput('commit-message'); + const ref = getInput('ref', { default: null }); + // Expand paths to an array + const expandedPaths = expand(paths, { baseDir }); + core.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); + } + catch (e) { + core.setFailed(e); + } + }); +} +if (__webpack_require__.c[__webpack_require__.s] === module) { + setup(); +} + + /***/ }), /***/ 747: /***/ ((module) => { -"use strict"; module.exports = require("fs");; /***/ }), @@ -486,7 +477,6 @@ module.exports = require("fs");; /***/ 87: /***/ ((module) => { -"use strict"; module.exports = require("os");; /***/ }), @@ -494,7 +484,6 @@ module.exports = require("os");; /***/ 622: /***/ ((module) => { -"use strict"; module.exports = require("path");; /***/ }) @@ -512,8 +501,8 @@ module.exports = require("path");; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed +/******/ id: moduleId, +/******/ loaded: false, /******/ exports: {} /******/ }; /******/ @@ -526,17 +515,66 @@ module.exports = require("path");; /******/ if(threw) delete __webpack_module_cache__[moduleId]; /******/ } /******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = __webpack_module_cache__; +/******/ /************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/harmony module decorator */ +/******/ (() => { +/******/ __webpack_require__.hmd = (module) => { +/******/ module = Object.create(module); +/******/ if (!module.children) module.children = []; +/******/ Object.defineProperty(module, 'exports', { +/******/ enumerable: true, +/******/ set: () => { +/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); +/******/ } +/******/ }); +/******/ return module; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/compat */ /******/ /******/ __webpack_require__.ab = __dirname + "/";/************************************************************************/ -/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // module cache are used so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(932); +/******/ return __webpack_require__(__webpack_require__.s = 3); /******/ })() ; \ No newline at end of file From c76982a1db4800b36dff1bfafaf41c27776c4913 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 13:24:36 -0600 Subject: [PATCH 46/97] s/setup/run --- index.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/index.ts b/index.ts index fdcaaad..ef4ace3 100644 --- a/index.ts +++ b/index.ts @@ -3,7 +3,7 @@ import * as core from '@actions/core'; import getInput from './lib/input'; import expand from './lib/expand'; -export default async function setup() : Promise { +export default async function run() : Promise { try { // Get inputs const paths = getInput('paths'); @@ -18,8 +18,6 @@ export default async function setup() : Promise { } catch (e) { core.setFailed(e); } -} +}; -if (require.main === module) { - setup(); -} +run(); From 80854e7d1cf60fef574e56c788098b3f1403a601 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 13:39:00 -0600 Subject: [PATCH 47/97] Rebuild dist --- dist/index.js | 155 ++++++++++++++++++++++++++------------------------ 1 file changed, 81 insertions(+), 74 deletions(-) diff --git a/dist/index.js b/dist/index.js index 5c2c72e..dabdea1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,11 +1,48 @@ module.exports = /******/ (() => { // webpackBootstrap -/******/ "use strict"; /******/ var __webpack_modules__ = ({ +/***/ 361: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var join = __webpack_require__(622).join; +; +function expand(paths, options) { + if (options === void 0) { options = {}; } + var baseDir = options.baseDir; + return paths + .trim() + .split("\n") + .map(function (path) { return join(baseDir, path); }); +} +exports.default = expand; + + +/***/ }), + +/***/ 657: +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var core = __webpack_require__(186); +; +null; +{ + var value = core.getInput(name, options); + if (!value && options.default) { + core.debug(name + ": " + options.default); + return options.default; + } + core.debug(name + ": " + value); + return value; +} + + +/***/ }), + /***/ 351: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; @@ -91,6 +128,7 @@ function escapeProperty(s) { /***/ 186: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -335,6 +373,7 @@ exports.getState = getState; /***/ 717: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; // For internal use, subject to change. var __importStar = (this && this.__importStar) || function (mod) { @@ -370,6 +409,7 @@ exports.issueCommand = issueCommand; /***/ 278: /***/ ((__unused_webpack_module, exports) => { +"use strict"; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -392,45 +432,19 @@ exports.toCommandValue = toCommandValue; /***/ }), -/***/ 3: -/***/ ((module, __webpack_exports__, __webpack_require__) => { +/***/ 177: +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -// ESM COMPAT FLAG +"use strict"; __webpack_require__.r(__webpack_exports__); - -// EXPORTS -__webpack_require__.d(__webpack_exports__, { - "default": () => /* binding */ setup -}); - -// EXTERNAL MODULE: ./node_modules/@actions/core/lib/core.js -var core = __webpack_require__(186); -// CONCATENATED MODULE: ./lib/input.ts - -; -function getInput(name, options = {}) { - const value = core.getInput(name, options); - if (!value && options.default) { - core.debug(`${name}: ${options.default}`); - return options.default; - } - core.debug(`${name}: ${value}`); - return value; -} - -// CONCATENATED MODULE: ./lib/expand.ts -const { join } = __webpack_require__(622); -; -function expand(paths, options = {}) { - const { baseDir } = options; - return paths - .trim() - .split("\n") - .map(path => join(baseDir, path)); -} - -// CONCATENATED MODULE: ./index.ts -/* module decorator */ module = __webpack_require__.hmd(module); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => /* binding */ run +/* harmony export */ }); +/* harmony import */ var _actions_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/* harmony import */ var _actions_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_actions_core__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _lib_input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(657); +/* harmony import */ var _lib_input__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lib_input__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _lib_expand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(361); var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -443,26 +457,25 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume -function setup() { +function run() { return __awaiter(this, void 0, void 0, function* () { try { // Get inputs - const paths = getInput('paths'); - const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); - const commitMessage = getInput('commit-message'); - const ref = getInput('ref', { default: null }); + const paths = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('paths'); + const baseDir = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('workspace', { default: process.env.GITHUB_WORKSPACE }); + const commitMessage = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('commit-message'); + const ref = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('ref', { default: null }); // Expand paths to an array - const expandedPaths = expand(paths, { baseDir }); - core.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); + const expandedPaths = _lib_expand__WEBPACK_IMPORTED_MODULE_2__(paths, { baseDir }); + _actions_core__WEBPACK_IMPORTED_MODULE_0__.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); } catch (e) { - core.setFailed(e); + _actions_core__WEBPACK_IMPORTED_MODULE_0__.setFailed(e); } }); } -if (__webpack_require__.c[__webpack_require__.s] === module) { - setup(); -} +; +run(); /***/ }), @@ -470,6 +483,7 @@ if (__webpack_require__.c[__webpack_require__.s] === module) { /***/ 747: /***/ ((module) => { +"use strict"; module.exports = require("fs");; /***/ }), @@ -477,6 +491,7 @@ module.exports = require("fs");; /***/ 87: /***/ ((module) => { +"use strict"; module.exports = require("os");; /***/ }), @@ -484,6 +499,7 @@ module.exports = require("os");; /***/ 622: /***/ ((module) => { +"use strict"; module.exports = require("path");; /***/ }) @@ -501,8 +517,8 @@ module.exports = require("path");; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { -/******/ id: moduleId, -/******/ loaded: false, +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ @@ -515,17 +531,23 @@ module.exports = require("path");; /******/ if(threw) delete __webpack_module_cache__[moduleId]; /******/ } /******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = __webpack_module_cache__; -/******/ /************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => module['default'] : +/******/ () => module; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports @@ -538,21 +560,6 @@ module.exports = require("path");; /******/ }; /******/ })(); /******/ -/******/ /* webpack/runtime/harmony module decorator */ -/******/ (() => { -/******/ __webpack_require__.hmd = (module) => { -/******/ module = Object.create(module); -/******/ if (!module.children) module.children = []; -/******/ Object.defineProperty(module, 'exports', { -/******/ enumerable: true, -/******/ set: () => { -/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); -/******/ } -/******/ }); -/******/ return module; -/******/ }; -/******/ })(); -/******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) @@ -572,9 +579,9 @@ module.exports = require("path");; /******/ /* webpack/runtime/compat */ /******/ /******/ __webpack_require__.ab = __dirname + "/";/************************************************************************/ -/******/ // module cache are used so entry inlining is disabled +/******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 3); +/******/ return __webpack_require__(177); /******/ })() ; \ No newline at end of file From e7d373957f3be254ef386f1d795c9ba9c735c4fe Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Tue, 8 Dec 2020 16:50:57 -0600 Subject: [PATCH 48/97] Rebuild dist (after cleanup) --- dist/index.js | 118 +++++++++++++++++++------------------------------- 1 file changed, 44 insertions(+), 74 deletions(-) diff --git a/dist/index.js b/dist/index.js index dabdea1..6a31f8c 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,48 +1,11 @@ module.exports = /******/ (() => { // webpackBootstrap +/******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 361: -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - -var join = __webpack_require__(622).join; -; -function expand(paths, options) { - if (options === void 0) { options = {}; } - var baseDir = options.baseDir; - return paths - .trim() - .split("\n") - .map(function (path) { return join(baseDir, path); }); -} -exports.default = expand; - - -/***/ }), - -/***/ 657: -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -var core = __webpack_require__(186); -; -null; -{ - var value = core.getInput(name, options); - if (!value && options.default) { - core.debug(name + ": " + options.default); - return options.default; - } - core.debug(name + ": " + value); - return value; -} - - -/***/ }), - /***/ 351: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; @@ -128,7 +91,6 @@ function escapeProperty(s) { /***/ 186: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -373,7 +335,6 @@ exports.getState = getState; /***/ 717: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -"use strict"; // For internal use, subject to change. var __importStar = (this && this.__importStar) || function (mod) { @@ -409,7 +370,6 @@ exports.issueCommand = issueCommand; /***/ 278: /***/ ((__unused_webpack_module, exports) => { -"use strict"; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -432,19 +392,44 @@ exports.toCommandValue = toCommandValue; /***/ }), -/***/ 177: +/***/ 3: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -"use strict"; +// ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => /* binding */ run -/* harmony export */ }); -/* harmony import */ var _actions_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); -/* harmony import */ var _actions_core__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_actions_core__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _lib_input__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(657); -/* harmony import */ var _lib_input__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_lib_input__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _lib_expand__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(361); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": () => /* binding */ run +}); + +// EXTERNAL MODULE: ./node_modules/@actions/core/lib/core.js +var core = __webpack_require__(186); +// CONCATENATED MODULE: ./lib/input.ts + +; +function getInput(name, options = {}) { + const value = core.getInput(name, options); + if (!value && options.default) { + core.debug(`${name}: ${options.default}`); + return options.default; + } + core.debug(`${name}: ${value}`); + return value; +} + +// CONCATENATED MODULE: ./lib/expand.ts +const { join } = __webpack_require__(622); +; +function expand(paths, options = {}) { + const { baseDir } = options; + return paths + .trim() + .split("\n") + .map(path => join(baseDir, path)); +} + +// CONCATENATED MODULE: ./index.ts var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -461,16 +446,16 @@ function run() { return __awaiter(this, void 0, void 0, function* () { try { // Get inputs - const paths = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('paths'); - const baseDir = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('workspace', { default: process.env.GITHUB_WORKSPACE }); - const commitMessage = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('commit-message'); - const ref = _lib_input__WEBPACK_IMPORTED_MODULE_1___default()('ref', { default: null }); + const paths = getInput('paths'); + const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); + const commitMessage = getInput('commit-message'); + const ref = getInput('ref', { default: null }); // Expand paths to an array - const expandedPaths = _lib_expand__WEBPACK_IMPORTED_MODULE_2__(paths, { baseDir }); - _actions_core__WEBPACK_IMPORTED_MODULE_0__.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); + const expandedPaths = expand(paths, { baseDir }); + core.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); } catch (e) { - _actions_core__WEBPACK_IMPORTED_MODULE_0__.setFailed(e); + core.setFailed(e); } }); } @@ -483,7 +468,6 @@ run(); /***/ 747: /***/ ((module) => { -"use strict"; module.exports = require("fs");; /***/ }), @@ -491,7 +475,6 @@ module.exports = require("fs");; /***/ 87: /***/ ((module) => { -"use strict"; module.exports = require("os");; /***/ }), @@ -499,7 +482,6 @@ module.exports = require("os");; /***/ 622: /***/ ((module) => { -"use strict"; module.exports = require("path");; /***/ }) @@ -536,18 +518,6 @@ module.exports = require("path");; /******/ } /******/ /************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => module['default'] : -/******/ () => module; -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports @@ -582,6 +552,6 @@ module.exports = require("path");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(177); +/******/ return __webpack_require__(3); /******/ })() ; \ No newline at end of file From eb927ffe957ba3d4cd86716e5148efb9b8636811 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 14:55:18 -0600 Subject: [PATCH 49/97] Implement body of create blob API as streams --- index.ts | 11 +++--- lib/create-blob-request-body-streams.ts | 51 +++++++++++++++++++++++++ lib/expand.ts | 16 -------- package-lock.json | 41 ++++++++++++++++++++ package.json | 3 +- 5 files changed, 100 insertions(+), 22 deletions(-) create mode 100644 lib/create-blob-request-body-streams.ts delete mode 100644 lib/expand.ts diff --git a/index.ts b/index.ts index ef4ace3..4f2644c 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,7 @@ import * as core from '@actions/core'; import getInput from './lib/input'; -import expand from './lib/expand'; +import getCreateBlobRequestBodyStreams from './lib/create-blob-request-body-streams'; export default async function run() : Promise { try { @@ -11,10 +11,11 @@ export default async function run() : Promise { const commitMessage = getInput('commit-message'); const ref = getInput('ref', { default: null }); - // Expand paths to an array - const expandedPaths = expand(paths, { baseDir }); - core.debug(`Received ${ expandedPaths.length } paths: ${ expandedPaths.join(', ') }`); - + // Expand paths to an array of 'create blob request body' streams + // We will use this array to efficiently stream file contents to GitHub's + // create blobs API + const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); + core.debug(`Received ${ streams.length } paths: ${ streams.join(', ') }`); } catch (e) { core.setFailed(e); } diff --git a/lib/create-blob-request-body-streams.ts b/lib/create-blob-request-body-streams.ts new file mode 100644 index 0000000..27e4118 --- /dev/null +++ b/lib/create-blob-request-body-streams.ts @@ -0,0 +1,51 @@ +const fs = require('fs'); +const { Readable, Transform } = require('stream'); +const { join } = require('path'); +const MultiStream = require('multistream'); + +/** + * Encodes chunks in a stream to base64 + */ +const base64Transformer = new Transform({ + transform(chunk, encoding, callback) { + this.push(chunk.toString('base64')); + callback(); + } +}); + +/** + * Produces a stream that conforms to the shape expected + * by the POST /repos/{owner}/{repo}/git/blobs GitHub API + * + * For example, streams produced by this class will resolve to a shape like: + * { + * "encoding": "base64", + * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" + * } + * + * See: https://docs.github.com/rest/reference/git#create-a-blob + */ +export class CreateBlobRequestBodyStream extends MultiStream { + constructor(path, opts = {}) { + super([ + Readable.from('{"encoding":"base64","content":"'), + fs.createReadStream(path).pipe(base64Transformer), + Readable.from('"}') + ], opts) + } +} + +export interface Options { + /** Optional. Default base dir to use when expanding a set of paths. */ + baseDir?: string +}; + +export default function getCreateBlobRequestBodyStreams(paths: string, options: Options = {}): Array { + const { baseDir } = options; + return paths + .trim() + .split("\n") + .map(path => join(baseDir, path)) + .filter(path => fs.existsSync(path)) + .map(path => new CreateBlobRequestBodyStream(path)) +} diff --git a/lib/expand.ts b/lib/expand.ts deleted file mode 100644 index 737de0b..0000000 --- a/lib/expand.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { basename } from "path"; - -const { join } = require('path'); - -export interface ExpandOptions { - /** Optional. Default base dir to use when expanding a set of paths. */ - baseDir?: string -}; - -export default function expand(paths: string, options: ExpandOptions = {}): Array { - const { baseDir } = options; - return paths - .trim() - .split("\n") - .map(path => join(baseDir, path)); -} diff --git a/package-lock.json b/package-lock.json index fec3056..7a06452 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,11 +21,52 @@ "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", "dev": true }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "multistream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.0.1.tgz", + "integrity": "sha512-LNPIR/LD0JUw2beGlSv4sgTSnGbZp16d/PG2rnIrYjkeCaepNmBTobuiaNQATCPiYgn+BBuQTm70UlvwRfLZ3Q==", + "requires": { + "readable-stream": "^3.6.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "typescript": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" } } } diff --git a/package.json b/package.json index b4148c0..2760d0c 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "typescript": "^4.1.2" }, "dependencies": { - "@actions/core": "^1.2.6" + "@actions/core": "^1.2.6", + "multistream": "^4.0.1" } } From a0dae3bef169a7abe77b17eb00e42d21786c72c0 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 14:57:31 -0600 Subject: [PATCH 50/97] Rebuild dist --- dist/index.js | 3938 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 3929 insertions(+), 9 deletions(-) diff --git a/dist/index.js b/dist/index.js index 6a31f8c..0271c95 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,11 +1,11 @@ module.exports = /******/ (() => { // webpackBootstrap -/******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ 351: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; @@ -91,6 +91,7 @@ function escapeProperty(s) { /***/ 186: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -335,6 +336,7 @@ exports.getState = getState; /***/ 717: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; // For internal use, subject to change. var __importStar = (this && this.__importStar) || function (mod) { @@ -370,6 +372,7 @@ exports.issueCommand = issueCommand; /***/ 278: /***/ ((__unused_webpack_module, exports) => { +"use strict"; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -392,9 +395,3854 @@ exports.toCommandValue = toCommandValue; /***/ }), -/***/ 3: +/***/ 124: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +try { + var util = __webpack_require__(669); + /* istanbul ignore next */ + if (typeof util.inherits !== 'function') throw ''; + module.exports = util.inherits; +} catch (e) { + /* istanbul ignore next */ + module.exports = __webpack_require__(544); +} + + +/***/ }), + +/***/ 544: +/***/ ((module) => { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + + +/***/ }), + +/***/ 999: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/*! multistream. MIT License. Feross Aboukhadijeh */ +var stream = __webpack_require__(642) + +function toStreams2Obj (s) { + return toStreams2(s, { objectMode: true, highWaterMark: 16 }) +} + +function toStreams2Buf (s) { + return toStreams2(s) +} + +function toStreams2 (s, opts) { + if (!s || typeof s === 'function' || s._readableState) return s + + var wrap = new stream.Readable(opts).wrap(s) + if (s.destroy) { + wrap.destroy = s.destroy.bind(s) + } + return wrap +} + +class MultiStream extends stream.Readable { + constructor (streams, opts) { + super(opts) + + this.destroyed = false + + this._drained = false + this._forwarding = false + this._current = null + this._toStreams2 = (opts && opts.objectMode) ? toStreams2Obj : toStreams2Buf + + if (typeof streams === 'function') { + this._queue = streams + } else { + this._queue = streams.map(this._toStreams2) + this._queue.forEach(stream => { + if (typeof stream !== 'function') this._attachErrorListener(stream) + }) + } + + this._next() + } + + _read () { + this._drained = true + this._forward() + } + + _forward () { + if (this._forwarding || !this._drained || !this._current) return + this._forwarding = true + + var chunk + while (this._drained && (chunk = this._current.read()) !== null) { + this._drained = this.push(chunk) + } + + this._forwarding = false + } + + destroy (err) { + if (this.destroyed) return + this.destroyed = true + + if (this._current && this._current.destroy) this._current.destroy() + if (typeof this._queue !== 'function') { + this._queue.forEach(stream => { + if (stream.destroy) stream.destroy() + }) + } + + if (err) this.emit('error', err) + this.emit('close') + } + + _next () { + this._current = null + + if (typeof this._queue === 'function') { + this._queue((err, stream) => { + if (err) return this.destroy(err) + stream = this._toStreams2(stream) + this._attachErrorListener(stream) + this._gotNextStream(stream) + }) + } else { + var stream = this._queue.shift() + if (typeof stream === 'function') { + stream = this._toStreams2(stream()) + this._attachErrorListener(stream) + } + this._gotNextStream(stream) + } + } + + _gotNextStream (stream) { + if (!stream) { + this.push(null) + this.destroy() + return + } + + this._current = stream + this._forward() + + const onReadable = () => { + this._forward() + } + + const onClose = () => { + if (!stream._readableState.ended) { + this.destroy() + } + } + + const onEnd = () => { + this._current = null + stream.removeListener('readable', onReadable) + stream.removeListener('end', onEnd) + stream.removeListener('close', onClose) + this._next() + } + + stream.on('readable', onReadable) + stream.once('end', onEnd) + stream.once('close', onClose) + } + + _attachErrorListener (stream) { + if (!stream) return + + const onError = (err) => { + stream.removeListener('error', onError) + this.destroy(err) + } + + stream.once('error', onError) + } +} + +MultiStream.obj = streams => ( + new MultiStream(streams, { objectMode: true, highWaterMark: 16 }) +) + +module.exports = MultiStream + + +/***/ }), + +/***/ 214: +/***/ ((module) => { + +"use strict"; + + +const codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error + } + + function getMessage (arg1, arg2, arg3) { + if (typeof message === 'string') { + return message + } else { + return message(arg1, arg2, arg3) + } + } + + class NodeError extends Base { + constructor (arg1, arg2, arg3) { + super(getMessage(arg1, arg2, arg3)); + } + } + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + + codes[code] = NodeError; +} + +// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + const len = expected.length; + expected = expected.map((i) => String(i)); + if (len > 2) { + return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` + + expected[len - 1]; + } else if (len === 2) { + return `one of ${thing} ${expected[0]} or ${expected[1]}`; + } else { + return `of ${thing} ${expected[0]}`; + } + } else { + return `of ${thing} ${String(expected)}`; + } +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + return str.substring(this_len - search.length, this_len) === search; +} + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"' +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + let determiner; + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + let msg; + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`; + } else { + const type = includes(name, '.') ? 'property' : 'argument'; + msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`; + } + + msg += `. Received type ${typeof actual}`; + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented' +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); + +module.exports.q = codes; + + +/***/ }), + +/***/ 359: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = __webpack_require__(433); + +var Writable = __webpack_require__(993); + +__webpack_require__(124)(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +/***/ }), + +/***/ 542: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + + +module.exports = PassThrough; + +var Transform = __webpack_require__(415); + +__webpack_require__(124)(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; + +/***/ }), + +/***/ 433: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. + + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = __webpack_require__(614).EventEmitter; + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = __webpack_require__(387); +/**/ + + +var Buffer = __webpack_require__(293).Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = __webpack_require__(669); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = __webpack_require__(746); + +var destroyImpl = __webpack_require__(49); + +var _require = __webpack_require__(948), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = __webpack_require__(214)/* .codes */ .q, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +__webpack_require__(124)(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || __webpack_require__(359); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + + this.sync = true; // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = __webpack_require__(841)/* .StringDecoder */ .s; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || __webpack_require__(359); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(err); +}; // Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. + + +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; + } else { + state.reading = false; + + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. + + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; + stream.emit('data', chunk); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = __webpack_require__(841)/* .StringDecoder */ .s; + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + + return n; +} // This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. + + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + // if we need a readable event, then we need to do some reading. + + + var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + + this._read(state.highWaterMark); + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + state.awaitDrain = 0; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. + + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var chunk = state.decoder.end(); + + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + + state.ended = true; + + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; + + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. + + +function emitReadable(stream) { + var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); + state.needReadable = false; + + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } +} + +function emitReadable_(stream) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + state.emittedReadable = false; + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + + + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. + + +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { + var len = state.length; + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) // didn't get any data, stop spinning. + break; + } + + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. + + +Readable.prototype._read = function (n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); + dest.on('unpipe', onunpipe); + + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + cleanedUp = true; // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.pause(); + } + } // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + + + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); + } // Make sure our error handler is attached before userland ones. + + + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + + dest.once('close', onclose); + + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } // tell the dest that it's being piped to + + + dest.emit('pipe', src); // start the flow if it hasn't been started already. + + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this, unpipeInfo); + return this; +}; // set up data events if they are asked for +// Ensure readable listeners eventually get something + + +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; + + if (ev === 'data') { + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); + } else if (ev === 'readable') { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + debug('on readable', state.length, state.reading); + + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + + return res; +}; + +Readable.prototype.addListener = Readable.prototype.on; + +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { + self.resume(); + } +} + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} // pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. + + +Readable.prototype.resume = function () { + var state = this._readableState; + + if (!state.flowing) { + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; + resume(this, state); + } + + state.paused = false; + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + debug('resume', state.reading); + + if (!state.reading) { + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + + if (this._readableState.flowing !== false) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + + this._readableState.paused = true; + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. + + +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = __webpack_require__(306); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = state.buffer.consume(n, state.decoder); + } + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + debug('endReadable', state.endEmitted); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = __webpack_require__(82); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} + +/***/ }), + +/***/ 415: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + + +module.exports = Transform; + +var _require$codes = __webpack_require__(214)/* .codes */ .q, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = __webpack_require__(359); + +__webpack_require__(124)(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + if (typeof options.flush === 'function') this._flush = options.flush; + } // When the writable side finishes, then flush out anything remaining. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} + +/***/ }), + +/***/ 993: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: __webpack_require__(127) +}; +/**/ + +/**/ + +var Stream = __webpack_require__(387); +/**/ + + +var Buffer = __webpack_require__(293).Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = __webpack_require__(49); + +var _require = __webpack_require__(948), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = __webpack_require__(214)/* .codes */ .q, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +__webpack_require__(124)(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || __webpack_require__(359); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called + + this.finalCalled = false; // drain event flag. + + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || __webpack_require__(359); // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. + +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. + + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; + +/***/ }), + +/***/ 306: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = __webpack_require__(80); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; + +/***/ }), + +/***/ 746: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = __webpack_require__(293), + Buffer = _require.Buffer; + +var _require2 = __webpack_require__(669), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); + +/***/ }), + +/***/ 49: +/***/ ((module) => { + +"use strict"; + // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + return this; + } // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; + +/***/ }), + +/***/ 80: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). + + +var ERR_STREAM_PREMATURE_CLOSE = __webpack_require__(214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + }; +} + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; + +/***/ }), + +/***/ 82: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var ERR_INVALID_ARG_TYPE = __webpack_require__(214)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE; + +function from(Readable, iterable, opts) { + var iterator; + + if (iterable && typeof iterable.next === 'function') { + iterator = iterable; + } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable); + + var readable = new Readable(_objectSpread({ + objectMode: true + }, opts)); // Reading boolean to protect against _read + // being called before last iteration completion. + + var reading = false; + + readable._read = function () { + if (!reading) { + reading = true; + next(); + } + }; + + function next() { + return _next2.apply(this, arguments); + } + + function _next2() { + _next2 = _asyncToGenerator(function* () { + try { + var _ref = yield iterator.next(), + value = _ref.value, + done = _ref.done; + + if (done) { + readable.push(null); + } else if (readable.push((yield value))) { + next(); + } else { + reading = false; + } + } catch (err) { + readable.destroy(err); + } + }); + return _next2.apply(this, arguments); + } + + return readable; +} + +module.exports = from; + +/***/ }), + +/***/ 989: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). + + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = __webpack_require__(214)/* .codes */ .q, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = __webpack_require__(80); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; + +/***/ }), + +/***/ 948: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var ERR_INVALID_OPT_VALUE = __webpack_require__(214)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; + +/***/ }), + +/***/ 387: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(413); + + +/***/ }), + +/***/ 642: +/***/ ((module, exports, __webpack_require__) => { + +var Stream = __webpack_require__(413); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream.Readable; + Object.assign(module.exports, Stream); + module.exports.Stream = Stream; +} else { + exports = module.exports = __webpack_require__(433); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = __webpack_require__(993); + exports.Duplex = __webpack_require__(359); + exports.Transform = __webpack_require__(415); + exports.PassThrough = __webpack_require__(542); + exports.finished = __webpack_require__(80); + exports.pipeline = __webpack_require__(989); +} + + +/***/ }), + +/***/ 867: +/***/ ((module, exports, __webpack_require__) => { + +/*! safe-buffer. MIT License. Feross Aboukhadijeh */ +/* eslint-disable node/no-deprecated-api */ +var buffer = __webpack_require__(293) +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.prototype = Object.create(Buffer.prototype) + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + + +/***/ }), + +/***/ 841: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE 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. + + + +/**/ + +var Buffer = __webpack_require__(867).Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.s = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} + +/***/ }), + +/***/ 127: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = __webpack_require__(669).deprecate; + + +/***/ }), + +/***/ 792: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +"use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); @@ -418,15 +4266,50 @@ function getInput(name, options = {}) { return value; } -// CONCATENATED MODULE: ./lib/expand.ts +// CONCATENATED MODULE: ./lib/create-blob-request-body-streams.ts +const fs = __webpack_require__(747); +const { Readable, Transform } = __webpack_require__(413); const { join } = __webpack_require__(622); +const MultiStream = __webpack_require__(999); +/** + * Encodes chunks in a stream to base64 + */ +const base64Transformer = new Transform({ + transform(chunk, encoding, callback) { + this.push(chunk.toString('base64')); + callback(); + } +}); +/** + * Produces a stream that conforms to the shape expected + * by the POST /repos/{owner}/{repo}/git/blobs GitHub API + * + * For example, streams produced by this class will resolve to a shape like: + * { + * "encoding": "base64", + * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" + * } + * + * See: https://docs.github.com/rest/reference/git#create-a-blob + */ +class CreateBlobRequestBodyStream extends MultiStream { + constructor(path, opts = {}) { + super([ + Readable.from('{"encoding":"base64","content":"'), + fs.createReadStream(path).pipe(base64Transformer), + Readable.from('"}') + ], opts); + } +} ; -function expand(paths, options = {}) { +function getCreateBlobRequestBodyStreams(paths, options = {}) { const { baseDir } = options; return paths .trim() .split("\n") - .map(path => join(baseDir, path)); + .map(path => join(baseDir, path)) + .filter(path => fs.existsSync(path)) + .map(path => new CreateBlobRequestBodyStream(path)); } // CONCATENATED MODULE: ./index.ts @@ -450,9 +4333,11 @@ function run() { const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); const commitMessage = getInput('commit-message'); const ref = getInput('ref', { default: null }); - // Expand paths to an array - const expandedPaths = expand(paths, { baseDir }); - core.debug(`Received ${expandedPaths.length} paths: ${expandedPaths.join(', ')}`); + // Expand paths to an array of 'create blob request body' streams + // We will use this array to efficiently stream file contents to GitHub's + // create blobs API + const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); + core.debug(`Received ${streams.length} paths: ${streams.join(', ')}`); } catch (e) { core.setFailed(e); @@ -463,11 +4348,28 @@ function run() { run(); +/***/ }), + +/***/ 293: +/***/ ((module) => { + +"use strict"; +module.exports = require("buffer");; + +/***/ }), + +/***/ 614: +/***/ ((module) => { + +"use strict"; +module.exports = require("events");; + /***/ }), /***/ 747: /***/ ((module) => { +"use strict"; module.exports = require("fs");; /***/ }), @@ -475,6 +4377,7 @@ module.exports = require("fs");; /***/ 87: /***/ ((module) => { +"use strict"; module.exports = require("os");; /***/ }), @@ -482,8 +4385,25 @@ module.exports = require("os");; /***/ 622: /***/ ((module) => { +"use strict"; module.exports = require("path");; +/***/ }), + +/***/ 413: +/***/ ((module) => { + +"use strict"; +module.exports = require("stream");; + +/***/ }), + +/***/ 669: +/***/ ((module) => { + +"use strict"; +module.exports = require("util");; + /***/ }) /******/ }); @@ -552,6 +4472,6 @@ module.exports = require("path");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(3); +/******/ return __webpack_require__(792); /******/ })() ; \ No newline at end of file From 12649d6fb1b07431d413d689114ee75df347dc24 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 15:22:38 -0600 Subject: [PATCH 51/97] Create blobs using Git database API --- index.ts | 15 ++++++++++++++- lib/create-blob-request-body-streams.ts | 4 ++++ lib/github-client.ts | 14 ++++++++++++++ package-lock.json | 13 +++++++++++++ package.json | 1 + 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 lib/github-client.ts diff --git a/index.ts b/index.ts index 4f2644c..0b5f0da 100644 --- a/index.ts +++ b/index.ts @@ -2,6 +2,7 @@ import * as core from '@actions/core'; import getInput from './lib/input'; import getCreateBlobRequestBodyStreams from './lib/create-blob-request-body-streams'; +import github from './lib/github-client'; export default async function run() : Promise { try { @@ -15,7 +16,19 @@ export default async function run() : Promise { // We will use this array to efficiently stream file contents to GitHub's // create blobs API const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); - core.debug(`Received ${ streams.length } paths: ${ streams.join(', ') }`); + core.debug(`Received ${ streams.length } stream${ streams.length === 1 ? '' : 's' }: ${ streams.map(stream => stream.path).join(', ') }`); + + // Create blobs using Git database API + const blobs = await Promise.all(streams.map(stream => { + github.post(`/repos/${ process.env.GITHUB_REPOSITORY }/git/blobs`, stream) + .then(response => { + return { + data: response.data, + path: stream.path + }; + }); + })); + core.debug(`Created ${ blobs.length } blob${ blobs.length === 1 ? '' : 's' }: ${ JSON.stringify(blobs, null, 4) }`); } catch (e) { core.setFailed(e); } diff --git a/lib/create-blob-request-body-streams.ts b/lib/create-blob-request-body-streams.ts index 27e4118..38697ef 100644 --- a/lib/create-blob-request-body-streams.ts +++ b/lib/create-blob-request-body-streams.ts @@ -26,12 +26,16 @@ const base64Transformer = new Transform({ * See: https://docs.github.com/rest/reference/git#create-a-blob */ export class CreateBlobRequestBodyStream extends MultiStream { + readonly path: string; + constructor(path, opts = {}) { super([ Readable.from('{"encoding":"base64","content":"'), fs.createReadStream(path).pipe(base64Transformer), Readable.from('"}') ], opts) + + this.path = path; } } diff --git a/lib/github-client.ts b/lib/github-client.ts new file mode 100644 index 0000000..6bc9c88 --- /dev/null +++ b/lib/github-client.ts @@ -0,0 +1,14 @@ +import axios from 'axios'; + +const pkg = require('../package'); + +const github = axios.create({ + baseURL: `https://api.github.com/`, + headers: { + accept: `application/vnd.github.v3+json`, + authorization: `bearer ${ process.env.GITHUB_TOKEN }`, + 'user-agent': `${ pkg.name }/${ pkg.version }` + } +}); + +export default github; diff --git a/package-lock.json b/package-lock.json index 7a06452..47be504 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,19 @@ "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", "dev": true }, + "axios": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", diff --git a/package.json b/package.json index 2760d0c..80523e1 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@actions/core": "^1.2.6", + "axios": "^0.21.0", "multistream": "^4.0.1" } } From 6895e5357f9d04443fe53e709b54597c268d6433 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 15:23:15 -0600 Subject: [PATCH 52/97] Rebuild dist --- dist/index.js | 2857 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 2754 insertions(+), 103 deletions(-) diff --git a/dist/index.js b/dist/index.js index 0271c95..c79f551 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,7 +2,7 @@ module.exports = /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ 351: +/***/ 7351: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; @@ -15,8 +15,8 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -const os = __importStar(__webpack_require__(87)); -const utils_1 = __webpack_require__(278); +const os = __importStar(__webpack_require__(2087)); +const utils_1 = __webpack_require__(5278); /** * Commands * @@ -88,7 +88,7 @@ function escapeProperty(s) { /***/ }), -/***/ 186: +/***/ 2186: /***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; @@ -110,11 +110,11 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -const command_1 = __webpack_require__(351); +const command_1 = __webpack_require__(7351); const file_command_1 = __webpack_require__(717); -const utils_1 = __webpack_require__(278); -const os = __importStar(__webpack_require__(87)); -const path = __importStar(__webpack_require__(622)); +const utils_1 = __webpack_require__(5278); +const os = __importStar(__webpack_require__(2087)); +const path = __importStar(__webpack_require__(5622)); /** * The code to exit an action */ @@ -349,9 +349,9 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ -const fs = __importStar(__webpack_require__(747)); -const os = __importStar(__webpack_require__(87)); -const utils_1 = __webpack_require__(278); +const fs = __importStar(__webpack_require__(5747)); +const os = __importStar(__webpack_require__(2087)); +const utils_1 = __webpack_require__(5278); function issueCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; if (!filePath) { @@ -369,7 +369,7 @@ exports.issueCommand = issueCommand; /***/ }), -/***/ 278: +/***/ 5278: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -395,23 +395,2568 @@ exports.toCommandValue = toCommandValue; /***/ }), -/***/ 124: +/***/ 6545: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(2618); + +/***/ }), + +/***/ 8104: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var settle = __webpack_require__(3211); +var buildFullPath = __webpack_require__(1934); +var buildURL = __webpack_require__(646); +var http = __webpack_require__(8605); +var https = __webpack_require__(7211); +var httpFollow = __webpack_require__(7707).http; +var httpsFollow = __webpack_require__(7707).https; +var url = __webpack_require__(8835); +var zlib = __webpack_require__(8761); +var pkg = __webpack_require__(696); +var createError = __webpack_require__(5226); +var enhanceError = __webpack_require__(1516); + +var isHttps = /https:?/; + +/*eslint consistent-return:0*/ +module.exports = function httpAdapter(config) { + return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) { + var resolve = function resolve(value) { + resolvePromise(value); + }; + var reject = function reject(value) { + rejectPromise(value); + }; + var data = config.data; + var headers = config.headers; + + // Set User-Agent (required by some servers) + // Only set header if it hasn't been set in config + // See https://github.com/axios/axios/issues/69 + if (!headers['User-Agent'] && !headers['user-agent']) { + headers['User-Agent'] = 'axios/' + pkg.version; + } + + if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) { + // Nothing to do... + } else if (utils.isArrayBuffer(data)) { + data = Buffer.from(new Uint8Array(data)); + } else if (utils.isString(data)) { + data = Buffer.from(data, 'utf-8'); + } else { + return reject(createError( + 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', + config + )); + } + + // Add Content-Length header if data exists + headers['Content-Length'] = data.length; + } + + // HTTP basic authentication + var auth = undefined; + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password || ''; + auth = username + ':' + password; + } + + // Parse url + var fullPath = buildFullPath(config.baseURL, config.url); + var parsed = url.parse(fullPath); + var protocol = parsed.protocol || 'http:'; + + if (!auth && parsed.auth) { + var urlAuth = parsed.auth.split(':'); + var urlUsername = urlAuth[0] || ''; + var urlPassword = urlAuth[1] || ''; + auth = urlUsername + ':' + urlPassword; + } + + if (auth) { + delete headers.Authorization; + } + + var isHttpsRequest = isHttps.test(protocol); + var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent; + + var options = { + path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), + method: config.method.toUpperCase(), + headers: headers, + agent: agent, + agents: { http: config.httpAgent, https: config.httpsAgent }, + auth: auth + }; + + if (config.socketPath) { + options.socketPath = config.socketPath; + } else { + options.hostname = parsed.hostname; + options.port = parsed.port; + } + + var proxy = config.proxy; + if (!proxy && proxy !== false) { + var proxyEnv = protocol.slice(0, -1) + '_proxy'; + var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; + if (proxyUrl) { + var parsedProxyUrl = url.parse(proxyUrl); + var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY; + var shouldProxy = true; + + if (noProxyEnv) { + var noProxy = noProxyEnv.split(',').map(function trim(s) { + return s.trim(); + }); + + shouldProxy = !noProxy.some(function proxyMatch(proxyElement) { + if (!proxyElement) { + return false; + } + if (proxyElement === '*') { + return true; + } + if (proxyElement[0] === '.' && + parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) { + return true; + } + + return parsed.hostname === proxyElement; + }); + } + + + if (shouldProxy) { + proxy = { + host: parsedProxyUrl.hostname, + port: parsedProxyUrl.port + }; + + if (parsedProxyUrl.auth) { + var proxyUrlAuth = parsedProxyUrl.auth.split(':'); + proxy.auth = { + username: proxyUrlAuth[0], + password: proxyUrlAuth[1] + }; + } + } + } + } + + if (proxy) { + options.hostname = proxy.host; + options.host = proxy.host; + options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); + options.port = proxy.port; + options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; + + // Basic proxy authorization + if (proxy.auth) { + var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); + options.headers['Proxy-Authorization'] = 'Basic ' + base64; + } + } + + var transport; + var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true); + if (config.transport) { + transport = config.transport; + } else if (config.maxRedirects === 0) { + transport = isHttpsProxy ? https : http; + } else { + if (config.maxRedirects) { + options.maxRedirects = config.maxRedirects; + } + transport = isHttpsProxy ? httpsFollow : httpFollow; + } + + if (config.maxBodyLength > -1) { + options.maxBodyLength = config.maxBodyLength; + } + + // Create the request + var req = transport.request(options, function handleResponse(res) { + if (req.aborted) return; + + // uncompress the response body transparently if required + var stream = res; + + // return the last request in case of redirects + var lastRequest = res.req || req; + + + // if no content, is HEAD request or decompress disabled we should not decompress + if (res.statusCode !== 204 && lastRequest.method !== 'HEAD' && config.decompress !== false) { + switch (res.headers['content-encoding']) { + /*eslint default-case:0*/ + case 'gzip': + case 'compress': + case 'deflate': + // add the unzipper to the body stream processing pipeline + stream = stream.pipe(zlib.createUnzip()); + + // remove the content-encoding in order to not confuse downstream operations + delete res.headers['content-encoding']; + break; + } + } + + var response = { + status: res.statusCode, + statusText: res.statusMessage, + headers: res.headers, + config: config, + request: lastRequest + }; + + if (config.responseType === 'stream') { + response.data = stream; + settle(resolve, reject, response); + } else { + var responseBuffer = []; + stream.on('data', function handleStreamData(chunk) { + responseBuffer.push(chunk); + + // make sure the content length is not over the maxContentLength if specified + if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { + stream.destroy(); + reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', + config, null, lastRequest)); + } + }); + + stream.on('error', function handleStreamError(err) { + if (req.aborted) return; + reject(enhanceError(err, config, null, lastRequest)); + }); + + stream.on('end', function handleStreamEnd() { + var responseData = Buffer.concat(responseBuffer); + if (config.responseType !== 'arraybuffer') { + responseData = responseData.toString(config.responseEncoding); + if (!config.responseEncoding || config.responseEncoding === 'utf8') { + responseData = utils.stripBOM(responseData); + } + } + + response.data = responseData; + settle(resolve, reject, response); + }); + } + }); + + // Handle errors + req.on('error', function handleRequestError(err) { + if (req.aborted && err.code !== 'ERR_FR_TOO_MANY_REDIRECTS') return; + reject(enhanceError(err, config, null, req)); + }); + + // Handle request timeout + if (config.timeout) { + // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system. + // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET. + // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up. + // And then these socket which be hang up will devoring CPU little by little. + // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect. + req.setTimeout(config.timeout, function handleRequestTimeout() { + req.abort(); + reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); + }); + } + + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (req.aborted) return; + + req.abort(); + reject(cancel); + }); + } + + // Send the request + if (utils.isStream(data)) { + data.on('error', function handleStreamError(err) { + reject(enhanceError(err, config, null, req)); + }).pipe(req); + } else { + req.end(data); + } + }); +}; + + +/***/ }), + +/***/ 3454: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var settle = __webpack_require__(3211); +var cookies = __webpack_require__(1545); +var buildURL = __webpack_require__(646); +var buildFullPath = __webpack_require__(1934); +var parseHeaders = __webpack_require__(6455); +var isURLSameOrigin = __webpack_require__(3608); +var createError = __webpack_require__(5226); + +module.exports = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + + if (utils.isFormData(requestData)) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + var fullPath = buildFullPath(config.baseURL, config.url); + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + // Listen for ready state + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(resolve, reject, response); + + // Clean up request + request = null; + }; + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(createError('Request aborted', config, 'ECONNABORTED', request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(createError('Network Error', config, null, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (config.responseType) { + try { + request.responseType = config.responseType; + } catch (e) { + // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. + // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. + if (config.responseType !== 'json') { + throw e; + } + } + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken) { + // Handle cancellation + config.cancelToken.promise.then(function onCanceled(cancel) { + if (!request) { + return; + } + + request.abort(); + reject(cancel); + // Clean up request + request = null; + }); + } + + if (!requestData) { + requestData = null; + } + + // Send the request + request.send(requestData); + }); +}; + + +/***/ }), + +/***/ 2618: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var bind = __webpack_require__(7065); +var Axios = __webpack_require__(8178); +var mergeConfig = __webpack_require__(4831); +var defaults = __webpack_require__(8190); + +/** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios + */ +function createInstance(defaultConfig) { + var context = new Axios(defaultConfig); + var instance = bind(Axios.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios.prototype, context); + + // Copy context to instance + utils.extend(instance, context); + + return instance; +} + +// Create the default instance to be exported +var axios = createInstance(defaults); + +// Expose Axios class to allow class inheritance +axios.Axios = Axios; + +// Factory for creating new instances +axios.create = function create(instanceConfig) { + return createInstance(mergeConfig(axios.defaults, instanceConfig)); +}; + +// Expose Cancel & CancelToken +axios.Cancel = __webpack_require__(8875); +axios.CancelToken = __webpack_require__(1587); +axios.isCancel = __webpack_require__(4057); + +// Expose all/spread +axios.all = function all(promises) { + return Promise.all(promises); +}; +axios.spread = __webpack_require__(4850); + +module.exports = axios; + +// Allow use of default import syntax in TypeScript +module.exports.default = axios; + + +/***/ }), + +/***/ 8875: +/***/ ((module) => { + +"use strict"; + + +/** + * A `Cancel` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ +function Cancel(message) { + this.message = message; +} + +Cancel.prototype.toString = function toString() { + return 'Cancel' + (this.message ? ': ' + this.message : ''); +}; + +Cancel.prototype.__CANCEL__ = true; + +module.exports = Cancel; + + +/***/ }), + +/***/ 1587: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var Cancel = __webpack_require__(8875); + +/** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ +function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + var resolvePromise; + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + var token = this; + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new Cancel(message); + resolvePromise(token.reason); + }); +} + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; + } +}; + +/** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ +CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; +}; + +module.exports = CancelToken; + + +/***/ }), + +/***/ 4057: +/***/ ((module) => { + +"use strict"; + + +module.exports = function isCancel(value) { + return !!(value && value.__CANCEL__); +}; + + +/***/ }), + +/***/ 8178: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var buildURL = __webpack_require__(646); +var InterceptorManager = __webpack_require__(3214); +var dispatchRequest = __webpack_require__(5062); +var mergeConfig = __webpack_require__(4831); + +/** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ +function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager(), + response: new InterceptorManager() + }; +} + +/** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ +Axios.prototype.request = function request(config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof config === 'string') { + config = arguments[1] || {}; + config.url = arguments[0]; + } else { + config = config || {}; + } + + config = mergeConfig(this.defaults, config); + + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } + + // Hook up interceptors middleware + var chain = [dispatchRequest, undefined]; + var promise = Promise.resolve(config); + + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + chain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + chain.push(interceptor.fulfilled, interceptor.rejected); + }); + + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } + + return promise; +}; + +Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); +}; + +// Provide aliases for supported request methods +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: data + })); + }; +}); + +module.exports = Axios; + + +/***/ }), + +/***/ 3214: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +function InterceptorManager() { + this.handlers = []; +} + +/** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ +InterceptorManager.prototype.use = function use(fulfilled, rejected) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected + }); + return this.handlers.length - 1; +}; + +/** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ +InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } +}; + +/** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ +InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); +}; + +module.exports = InterceptorManager; + + +/***/ }), + +/***/ 1934: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var isAbsoluteURL = __webpack_require__(1301); +var combineURLs = __webpack_require__(7189); + +/** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ +module.exports = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; +}; + + +/***/ }), + +/***/ 5226: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var enhanceError = __webpack_require__(1516); + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ +module.exports = function createError(message, config, code, request, response) { + var error = new Error(message); + return enhanceError(error, config, code, request, response); +}; + + +/***/ }), + +/***/ 5062: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var transformData = __webpack_require__(9812); +var isCancel = __webpack_require__(4057); +var defaults = __webpack_require__(8190); + +/** + * Throws a `Cancel` if cancellation has been requested. + */ +function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } +} + +/** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ +module.exports = function dispatchRequest(config) { + throwIfCancellationRequested(config); + + // Ensure headers exist + config.headers = config.headers || {}; + + // Transform request data + config.data = transformData( + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; + } + ); + + var adapter = config.adapter || defaults.adapter; + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData( + response.data, + response.headers, + config.transformResponse + ); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData( + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); + }); +}; + + +/***/ }), + +/***/ 1516: +/***/ ((module) => { + +"use strict"; + + +/** + * Update an Error with the specified config, error code, and response. + * + * @param {Error} error The error to update. + * @param {Object} config The config. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The error. + */ +module.exports = function enhanceError(error, config, code, request, response) { + error.config = config; + if (code) { + error.code = code; + } + + error.request = request; + error.response = response; + error.isAxiosError = true; + + error.toJSON = function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code + }; + }; + return error; +}; + + +/***/ }), + +/***/ 4831: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ +module.exports = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + + var valueFromConfig2Keys = ['url', 'method', 'data']; + var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; + var defaultToConfig2Keys = [ + 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', + 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', + 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', + 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', + 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' + ]; + var directMergeKeys = ['validateStatus']; + + function getMergedValue(target, source) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge(target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + function mergeDeepProperties(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + } + + utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } + }); + + utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); + + utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + config[prop] = getMergedValue(undefined, config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + utils.forEach(directMergeKeys, function merge(prop) { + if (prop in config2) { + config[prop] = getMergedValue(config1[prop], config2[prop]); + } else if (prop in config1) { + config[prop] = getMergedValue(undefined, config1[prop]); + } + }); + + var axiosKeys = valueFromConfig2Keys + .concat(mergeDeepPropertiesKeys) + .concat(defaultToConfig2Keys) + .concat(directMergeKeys); + + var otherKeys = Object + .keys(config1) + .concat(Object.keys(config2)) + .filter(function filterAxiosKeys(key) { + return axiosKeys.indexOf(key) === -1; + }); + + utils.forEach(otherKeys, mergeDeepProperties); + + return config; +}; + + +/***/ }), + +/***/ 3211: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var createError = __webpack_require__(5226); + +/** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ +module.exports = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(createError( + 'Request failed with status code ' + response.status, + response.config, + null, + response.request, + response + )); + } +}; + + +/***/ }), + +/***/ 9812: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +/** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ +module.exports = function transformData(data, headers, fns) { + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn(data, headers); + }); + + return data; +}; + + +/***/ }), + +/***/ 8190: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); +var normalizeHeaderName = __webpack_require__(6240); + +var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' +}; + +function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } +} + +function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = __webpack_require__(3454); + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = __webpack_require__(8104); + } + return adapter; +} + +var defaults = { + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + if (utils.isObject(data)) { + setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); + return JSON.stringify(data); + } + return data; + }], + + transformResponse: [function transformResponse(data) { + /*eslint no-param-reassign:0*/ + if (typeof data === 'string') { + try { + data = JSON.parse(data); + } catch (e) { /* Ignore */ } + } + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + } +}; + +defaults.headers = { + common: { + 'Accept': 'application/json, text/plain, */*' + } +}; + +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; +}); + +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + +module.exports = defaults; + + +/***/ }), + +/***/ 7065: +/***/ ((module) => { + +"use strict"; + + +module.exports = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; +}; + + +/***/ }), + +/***/ 646: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); +} + +/** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ +module.exports = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; + } + + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); + + serializedParams = parts.join('&'); + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; +}; + + +/***/ }), + +/***/ 7189: +/***/ ((module) => { + +"use strict"; + + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ +module.exports = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; +}; + + +/***/ }), + +/***/ 1545: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); + + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } + + if (utils.isString(path)) { + cookie.push('path=' + path); + } + + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } + + if (secure === true) { + cookie.push('secure'); + } + + document.cookie = cookie.join('; '); + }, + + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : + + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() +); + + +/***/ }), + +/***/ 1301: +/***/ ((module) => { + +"use strict"; + + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +module.exports = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); +}; + + +/***/ }), + +/***/ 3608: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +module.exports = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() +); + + +/***/ }), + +/***/ 6240: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +module.exports = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; + } + }); +}; + + +/***/ }), + +/***/ 6455: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var utils = __webpack_require__(328); + +// Headers whose duplicates are ignored by node +// c.f. https://nodejs.org/api/http.html#http_message_headers +var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' +]; + +/** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object + */ +module.exports = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; + + if (!headers) { return parsed; } + + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); + + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); + + return parsed; +}; + + +/***/ }), + +/***/ 4850: +/***/ ((module) => { + +"use strict"; + + +/** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ +module.exports = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; +}; + + +/***/ }), + +/***/ 328: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +var bind = __webpack_require__(7065); + +/*global toString:true*/ + +// utils is a library of generic helper functions non-specific to axios + +var toString = Object.prototype.toString; + +/** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ +function isArray(val) { + return toString.call(val) === '[object Array]'; +} + +/** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ +function isUndefined(val) { + return typeof val === 'undefined'; +} + +/** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ +function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); +} + +/** + * Determine if a value is an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ +function isArrayBuffer(val) { + return toString.call(val) === '[object ArrayBuffer]'; +} + +/** + * Determine if a value is a FormData + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ +function isFormData(val) { + return (typeof FormData !== 'undefined') && (val instanceof FormData); +} + +/** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ +function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); + } + return result; +} + +/** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ +function isString(val) { + return typeof val === 'string'; +} + +/** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ +function isNumber(val) { + return typeof val === 'number'; +} + +/** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ +function isObject(val) { + return val !== null && typeof val === 'object'; +} + +/** + * Determine if a value is a plain Object + * + * @param {Object} val The value to test + * @return {boolean} True if value is a plain Object, otherwise false + */ +function isPlainObject(val) { + if (toString.call(val) !== '[object Object]') { + return false; + } + + var prototype = Object.getPrototypeOf(val); + return prototype === null || prototype === Object.prototype; +} + +/** + * Determine if a value is a Date + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ +function isDate(val) { + return toString.call(val) === '[object Date]'; +} + +/** + * Determine if a value is a File + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ +function isFile(val) { + return toString.call(val) === '[object File]'; +} + +/** + * Determine if a value is a Blob + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ +function isBlob(val) { + return toString.call(val) === '[object Blob]'; +} + +/** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ +function isFunction(val) { + return toString.call(val) === '[object Function]'; +} + +/** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ +function isStream(val) { + return isObject(val) && isFunction(val.pipe); +} + +/** + * Determine if a value is a URLSearchParams object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ +function isURLSearchParams(val) { + return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; +} + +/** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ +function trim(str) { + return str.replace(/^\s*/, '').replace(/\s*$/, ''); +} + +/** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ +function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); +} + +/** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ +function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } +} + +/** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ +function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (isPlainObject(result[key]) && isPlainObject(val)) { + result[key] = merge(result[key], val); + } else if (isPlainObject(val)) { + result[key] = merge({}, val); + } else if (isArray(val)) { + result[key] = val.slice(); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; +} + +/** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ +function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; +} + +/** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ +function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; +} + +module.exports = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM +}; + + +/***/ }), + +/***/ 1133: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var debug; +try { + /* eslint global-require: off */ + debug = __webpack_require__(9975)("follow-redirects"); +} +catch (error) { + debug = function () { /* */ }; +} +module.exports = debug; + + +/***/ }), + +/***/ 7707: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var url = __webpack_require__(8835); +var URL = url.URL; +var http = __webpack_require__(8605); +var https = __webpack_require__(7211); +var Writable = __webpack_require__(2413).Writable; +var assert = __webpack_require__(2357); +var debug = __webpack_require__(1133); + +// Create handlers that pass events from native requests +var eventHandlers = Object.create(null); +["abort", "aborted", "connect", "error", "socket", "timeout"].forEach(function (event) { + eventHandlers[event] = function (arg1, arg2, arg3) { + this._redirectable.emit(event, arg1, arg2, arg3); + }; +}); + +// Error types with codes +var RedirectionError = createErrorType( + "ERR_FR_REDIRECTION_FAILURE", + "" +); +var TooManyRedirectsError = createErrorType( + "ERR_FR_TOO_MANY_REDIRECTS", + "Maximum number of redirects exceeded" +); +var MaxBodyLengthExceededError = createErrorType( + "ERR_FR_MAX_BODY_LENGTH_EXCEEDED", + "Request body larger than maxBodyLength limit" +); +var WriteAfterEndError = createErrorType( + "ERR_STREAM_WRITE_AFTER_END", + "write after end" +); + +// An HTTP(S) request that can be redirected +function RedirectableRequest(options, responseCallback) { + // Initialize the request + Writable.call(this); + this._sanitizeOptions(options); + this._options = options; + this._ended = false; + this._ending = false; + this._redirectCount = 0; + this._redirects = []; + this._requestBodyLength = 0; + this._requestBodyBuffers = []; + + // Attach a callback if passed + if (responseCallback) { + this.on("response", responseCallback); + } + + // React to responses of native requests + var self = this; + this._onNativeResponse = function (response) { + self._processResponse(response); + }; + + // Perform the first request + this._performRequest(); +} +RedirectableRequest.prototype = Object.create(Writable.prototype); + +// Writes buffered data to the current native request +RedirectableRequest.prototype.write = function (data, encoding, callback) { + // Writing is not allowed if end has been called + if (this._ending) { + throw new WriteAfterEndError(); + } + + // Validate input and shift parameters if necessary + if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) { + throw new TypeError("data should be a string, Buffer or Uint8Array"); + } + if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } + + // Ignore empty buffers, since writing them doesn't invoke the callback + // https://github.com/nodejs/node/issues/22066 + if (data.length === 0) { + if (callback) { + callback(); + } + return; + } + // Only write when we don't exceed the maximum body length + if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { + this._requestBodyLength += data.length; + this._requestBodyBuffers.push({ data: data, encoding: encoding }); + this._currentRequest.write(data, encoding, callback); + } + // Error when we exceed the maximum body length + else { + this.emit("error", new MaxBodyLengthExceededError()); + this.abort(); + } +}; + +// Ends the current native request +RedirectableRequest.prototype.end = function (data, encoding, callback) { + // Shift parameters if necessary + if (typeof data === "function") { + callback = data; + data = encoding = null; + } + else if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } + + // Write data if needed and end + if (!data) { + this._ended = this._ending = true; + this._currentRequest.end(null, null, callback); + } + else { + var self = this; + var currentRequest = this._currentRequest; + this.write(data, encoding, function () { + self._ended = true; + currentRequest.end(null, null, callback); + }); + this._ending = true; + } +}; + +// Sets a header value on the current native request +RedirectableRequest.prototype.setHeader = function (name, value) { + this._options.headers[name] = value; + this._currentRequest.setHeader(name, value); +}; + +// Clears a header value on the current native request +RedirectableRequest.prototype.removeHeader = function (name) { + delete this._options.headers[name]; + this._currentRequest.removeHeader(name); +}; + +// Global timeout for all underlying requests +RedirectableRequest.prototype.setTimeout = function (msecs, callback) { + if (callback) { + this.once("timeout", callback); + } + + if (this.socket) { + startTimer(this, msecs); + } + else { + var self = this; + this._currentRequest.once("socket", function () { + startTimer(self, msecs); + }); + } + + this.once("response", clearTimer); + this.once("error", clearTimer); + + return this; +}; + +function startTimer(request, msecs) { + clearTimeout(request._timeout); + request._timeout = setTimeout(function () { + request.emit("timeout"); + }, msecs); +} + +function clearTimer() { + clearTimeout(this._timeout); +} + +// Proxy all other public ClientRequest methods +[ + "abort", "flushHeaders", "getHeader", + "setNoDelay", "setSocketKeepAlive", +].forEach(function (method) { + RedirectableRequest.prototype[method] = function (a, b) { + return this._currentRequest[method](a, b); + }; +}); + +// Proxy all public ClientRequest properties +["aborted", "connection", "socket"].forEach(function (property) { + Object.defineProperty(RedirectableRequest.prototype, property, { + get: function () { return this._currentRequest[property]; }, + }); +}); + +RedirectableRequest.prototype._sanitizeOptions = function (options) { + // Ensure headers are always present + if (!options.headers) { + options.headers = {}; + } + + // Since http.request treats host as an alias of hostname, + // but the url module interprets host as hostname plus port, + // eliminate the host property to avoid confusion. + if (options.host) { + // Use hostname if set, because it has precedence + if (!options.hostname) { + options.hostname = options.host; + } + delete options.host; + } + + // Complete the URL object when necessary + if (!options.pathname && options.path) { + var searchPos = options.path.indexOf("?"); + if (searchPos < 0) { + options.pathname = options.path; + } + else { + options.pathname = options.path.substring(0, searchPos); + options.search = options.path.substring(searchPos); + } + } +}; + + +// Executes the next native request (initial or redirect) +RedirectableRequest.prototype._performRequest = function () { + // Load the native protocol + var protocol = this._options.protocol; + var nativeProtocol = this._options.nativeProtocols[protocol]; + if (!nativeProtocol) { + this.emit("error", new TypeError("Unsupported protocol " + protocol)); + return; + } + + // If specified, use the agent corresponding to the protocol + // (HTTP and HTTPS use different types of agents) + if (this._options.agents) { + var scheme = protocol.substr(0, protocol.length - 1); + this._options.agent = this._options.agents[scheme]; + } + + // Create the native request + var request = this._currentRequest = + nativeProtocol.request(this._options, this._onNativeResponse); + this._currentUrl = url.format(this._options); + + // Set up event handlers + request._redirectable = this; + for (var event in eventHandlers) { + /* istanbul ignore else */ + if (event) { + request.on(event, eventHandlers[event]); + } + } + + // End a redirected request + // (The first request must be ended explicitly with RedirectableRequest#end) + if (this._isRedirect) { + // Write the request entity and end. + var i = 0; + var self = this; + var buffers = this._requestBodyBuffers; + (function writeNext(error) { + // Only write if this request has not been redirected yet + /* istanbul ignore else */ + if (request === self._currentRequest) { + // Report any write errors + /* istanbul ignore if */ + if (error) { + self.emit("error", error); + } + // Write the next buffer if there are still left + else if (i < buffers.length) { + var buffer = buffers[i++]; + /* istanbul ignore else */ + if (!request.finished) { + request.write(buffer.data, buffer.encoding, writeNext); + } + } + // End the request if `end` has been called on us + else if (self._ended) { + request.end(); + } + } + }()); + } +}; + +// Processes a response from the current native request +RedirectableRequest.prototype._processResponse = function (response) { + // Store the redirected response + var statusCode = response.statusCode; + if (this._options.trackRedirects) { + this._redirects.push({ + url: this._currentUrl, + headers: response.headers, + statusCode: statusCode, + }); + } + + // RFC7231§6.4: The 3xx (Redirection) class of status code indicates + // that further action needs to be taken by the user agent in order to + // fulfill the request. If a Location header field is provided, + // the user agent MAY automatically redirect its request to the URI + // referenced by the Location field value, + // even if the specific status code is not understood. + var location = response.headers.location; + if (location && this._options.followRedirects !== false && + statusCode >= 300 && statusCode < 400) { + // Abort the current request + this._currentRequest.removeAllListeners(); + this._currentRequest.on("error", noop); + this._currentRequest.abort(); + // Discard the remainder of the response to avoid waiting for data + response.destroy(); + + // RFC7231§6.4: A client SHOULD detect and intervene + // in cyclical redirections (i.e., "infinite" redirection loops). + if (++this._redirectCount > this._options.maxRedirects) { + this.emit("error", new TooManyRedirectsError()); + return; + } + + // RFC7231§6.4: Automatic redirection needs to done with + // care for methods not known to be safe, […] + // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change + // the request method from POST to GET for the subsequent request. + if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" || + // RFC7231§6.4.4: The 303 (See Other) status code indicates that + // the server is redirecting the user agent to a different resource […] + // A user agent can perform a retrieval request targeting that URI + // (a GET or HEAD request if using HTTP) […] + (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) { + this._options.method = "GET"; + // Drop a possible entity and headers related to it + this._requestBodyBuffers = []; + removeMatchingHeaders(/^content-/i, this._options.headers); + } + + // Drop the Host header, as the redirect might lead to a different host + var previousHostName = removeMatchingHeaders(/^host$/i, this._options.headers) || + url.parse(this._currentUrl).hostname; + + // Create the redirected request + var redirectUrl = url.resolve(this._currentUrl, location); + debug("redirecting to", redirectUrl); + this._isRedirect = true; + var redirectUrlParts = url.parse(redirectUrl); + Object.assign(this._options, redirectUrlParts); + + // Drop the Authorization header if redirecting to another host + if (redirectUrlParts.hostname !== previousHostName) { + removeMatchingHeaders(/^authorization$/i, this._options.headers); + } + + // Evaluate the beforeRedirect callback + if (typeof this._options.beforeRedirect === "function") { + var responseDetails = { headers: response.headers }; + try { + this._options.beforeRedirect.call(null, this._options, responseDetails); + } + catch (err) { + this.emit("error", err); + return; + } + this._sanitizeOptions(this._options); + } + + // Perform the redirected request + try { + this._performRequest(); + } + catch (cause) { + var error = new RedirectionError("Redirected request failed: " + cause.message); + error.cause = cause; + this.emit("error", error); + } + } + else { + // The response is not a redirect; return it as-is + response.responseUrl = this._currentUrl; + response.redirects = this._redirects; + this.emit("response", response); + + // Clean up + this._requestBodyBuffers = []; + } +}; + +// Wraps the key/value object of protocols with redirect functionality +function wrap(protocols) { + // Default settings + var exports = { + maxRedirects: 21, + maxBodyLength: 10 * 1024 * 1024, + }; + + // Wrap each protocol + var nativeProtocols = {}; + Object.keys(protocols).forEach(function (scheme) { + var protocol = scheme + ":"; + var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; + var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); + + // Executes a request, following redirects + wrappedProtocol.request = function (input, options, callback) { + // Parse parameters + if (typeof input === "string") { + var urlStr = input; + try { + input = urlToOptions(new URL(urlStr)); + } + catch (err) { + /* istanbul ignore next */ + input = url.parse(urlStr); + } + } + else if (URL && (input instanceof URL)) { + input = urlToOptions(input); + } + else { + callback = options; + options = input; + input = { protocol: protocol }; + } + if (typeof options === "function") { + callback = options; + options = null; + } + + // Set defaults + options = Object.assign({ + maxRedirects: exports.maxRedirects, + maxBodyLength: exports.maxBodyLength, + }, input, options); + options.nativeProtocols = nativeProtocols; + + assert.equal(options.protocol, protocol, "protocol mismatch"); + debug("options", options); + return new RedirectableRequest(options, callback); + }; + + // Executes a GET request, following redirects + wrappedProtocol.get = function (input, options, callback) { + var request = wrappedProtocol.request(input, options, callback); + request.end(); + return request; + }; + }); + return exports; +} + +/* istanbul ignore next */ +function noop() { /* empty */ } + +// from https://github.com/nodejs/node/blob/master/lib/internal/url.js +function urlToOptions(urlObject) { + var options = { + protocol: urlObject.protocol, + hostname: urlObject.hostname.startsWith("[") ? + /* istanbul ignore next */ + urlObject.hostname.slice(1, -1) : + urlObject.hostname, + hash: urlObject.hash, + search: urlObject.search, + pathname: urlObject.pathname, + path: urlObject.pathname + urlObject.search, + href: urlObject.href, + }; + if (urlObject.port !== "") { + options.port = Number(urlObject.port); + } + return options; +} + +function removeMatchingHeaders(regex, headers) { + var lastValue; + for (var header in headers) { + if (regex.test(header)) { + lastValue = headers[header]; + delete headers[header]; + } + } + return lastValue; +} + +function createErrorType(code, defaultMessage) { + function CustomError(message) { + Error.captureStackTrace(this, this.constructor); + this.message = message || defaultMessage; + } + CustomError.prototype = new Error(); + CustomError.prototype.constructor = CustomError; + CustomError.prototype.name = "Error [" + code + "]"; + CustomError.prototype.code = code; + return CustomError; +} + +// Exports +module.exports = wrap({ http: http, https: https }); +module.exports.wrap = wrap; + + +/***/ }), + +/***/ 4124: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { try { - var util = __webpack_require__(669); + var util = __webpack_require__(1669); /* istanbul ignore next */ if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(544); + module.exports = __webpack_require__(8544); } /***/ }), -/***/ 544: +/***/ 8544: /***/ ((module) => { if (typeof Object.create === 'function') { @@ -445,11 +2990,11 @@ if (typeof Object.create === 'function') { /***/ }), -/***/ 999: +/***/ 7999: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /*! multistream. MIT License. Feross Aboukhadijeh */ -var stream = __webpack_require__(642) +var stream = __webpack_require__(1642) function toStreams2Obj (s) { return toStreams2(s, { objectMode: true, highWaterMark: 16 }) @@ -598,7 +3143,7 @@ module.exports = MultiStream /***/ }), -/***/ 214: +/***/ 7214: /***/ ((module) => { "use strict"; @@ -722,7 +3267,7 @@ module.exports.q = codes; /***/ }), -/***/ 359: +/***/ 1359: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -767,11 +3312,11 @@ var objectKeys = Object.keys || function (obj) { module.exports = Duplex; -var Readable = __webpack_require__(433); +var Readable = __webpack_require__(1433); -var Writable = __webpack_require__(993); +var Writable = __webpack_require__(6993); -__webpack_require__(124)(Duplex, Readable); +__webpack_require__(4124)(Duplex, Readable); { // Allow the keys array to be GC'ed. @@ -868,7 +3413,7 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { /***/ }), -/***/ 542: +/***/ 1542: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -899,9 +3444,9 @@ Object.defineProperty(Duplex.prototype, 'destroyed', { module.exports = PassThrough; -var Transform = __webpack_require__(415); +var Transform = __webpack_require__(4415); -__webpack_require__(124)(PassThrough, Transform); +__webpack_require__(4124)(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); @@ -914,7 +3459,7 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { /***/ }), -/***/ 433: +/***/ 1433: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -949,7 +3494,7 @@ var Duplex; Readable.ReadableState = ReadableState; /**/ -var EE = __webpack_require__(614).EventEmitter; +var EE = __webpack_require__(8614).EventEmitter; var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; @@ -959,11 +3504,11 @@ var EElistenerCount = function EElistenerCount(emitter, type) { /**/ -var Stream = __webpack_require__(387); +var Stream = __webpack_require__(2387); /**/ -var Buffer = __webpack_require__(293).Buffer; +var Buffer = __webpack_require__(4293).Buffer; var OurUint8Array = global.Uint8Array || function () {}; @@ -977,7 +3522,7 @@ function _isUint8Array(obj) { /**/ -var debugUtil = __webpack_require__(669); +var debugUtil = __webpack_require__(1669); var debug; @@ -989,14 +3534,14 @@ if (debugUtil && debugUtil.debuglog) { /**/ -var BufferList = __webpack_require__(746); +var BufferList = __webpack_require__(2746); -var destroyImpl = __webpack_require__(49); +var destroyImpl = __webpack_require__(7049); -var _require = __webpack_require__(948), +var _require = __webpack_require__(9948), getHighWaterMark = _require.getHighWaterMark; -var _require$codes = __webpack_require__(214)/* .codes */ .q, +var _require$codes = __webpack_require__(7214)/* .codes */ .q, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, @@ -1007,7 +3552,7 @@ var StringDecoder; var createReadableStreamAsyncIterator; var from; -__webpack_require__(124)(Readable, Stream); +__webpack_require__(4124)(Readable, Stream); var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; @@ -1024,7 +3569,7 @@ function prependListener(emitter, event, fn) { } function ReadableState(options, stream, isDuplex) { - Duplex = Duplex || __webpack_require__(359); + Duplex = Duplex || __webpack_require__(1359); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different @@ -1080,14 +3625,14 @@ function ReadableState(options, stream, isDuplex) { this.encoding = null; if (options.encoding) { - if (!StringDecoder) StringDecoder = __webpack_require__(841)/* .StringDecoder */ .s; + if (!StringDecoder) StringDecoder = __webpack_require__(4841)/* .StringDecoder */ .s; this.decoder = new StringDecoder(options.encoding); this.encoding = options.encoding; } } function Readable(options) { - Duplex = Duplex || __webpack_require__(359); + Duplex = Duplex || __webpack_require__(1359); if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside // the ReadableState constructor, at least with V8 6.5 @@ -1242,7 +3787,7 @@ Readable.prototype.isPaused = function () { Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = __webpack_require__(841)/* .StringDecoder */ .s; + if (!StringDecoder) StringDecoder = __webpack_require__(4841)/* .StringDecoder */ .s; var decoder = new StringDecoder(enc); this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 @@ -1926,7 +4471,7 @@ Readable.prototype.wrap = function (stream) { if (typeof Symbol === 'function') { Readable.prototype[Symbol.asyncIterator] = function () { if (createReadableStreamAsyncIterator === undefined) { - createReadableStreamAsyncIterator = __webpack_require__(306); + createReadableStreamAsyncIterator = __webpack_require__(3306); } return createReadableStreamAsyncIterator(this); @@ -2028,7 +4573,7 @@ function endReadableNT(state, stream) { if (typeof Symbol === 'function') { Readable.from = function (iterable, opts) { if (from === undefined) { - from = __webpack_require__(82); + from = __webpack_require__(9082); } return from(Readable, iterable, opts); @@ -2045,7 +4590,7 @@ function indexOf(xs, x) { /***/ }), -/***/ 415: +/***/ 4415: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -2114,15 +4659,15 @@ function indexOf(xs, x) { module.exports = Transform; -var _require$codes = __webpack_require__(214)/* .codes */ .q, +var _require$codes = __webpack_require__(7214)/* .codes */ .q, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; -var Duplex = __webpack_require__(359); +var Duplex = __webpack_require__(1359); -__webpack_require__(124)(Transform, Duplex); +__webpack_require__(4124)(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; @@ -2253,7 +4798,7 @@ function done(stream, er, data) { /***/ }), -/***/ 993: +/***/ 6993: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -2316,17 +4861,17 @@ Writable.WritableState = WritableState; /**/ var internalUtil = { - deprecate: __webpack_require__(127) + deprecate: __webpack_require__(7127) }; /**/ /**/ -var Stream = __webpack_require__(387); +var Stream = __webpack_require__(2387); /**/ -var Buffer = __webpack_require__(293).Buffer; +var Buffer = __webpack_require__(4293).Buffer; var OurUint8Array = global.Uint8Array || function () {}; @@ -2338,12 +4883,12 @@ function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -var destroyImpl = __webpack_require__(49); +var destroyImpl = __webpack_require__(7049); -var _require = __webpack_require__(948), +var _require = __webpack_require__(9948), getHighWaterMark = _require.getHighWaterMark; -var _require$codes = __webpack_require__(214)/* .codes */ .q, +var _require$codes = __webpack_require__(7214)/* .codes */ .q, ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, @@ -2355,12 +4900,12 @@ var _require$codes = __webpack_require__(214)/* .codes */ .q, var errorOrDestroy = destroyImpl.errorOrDestroy; -__webpack_require__(124)(Writable, Stream); +__webpack_require__(4124)(Writable, Stream); function nop() {} function WritableState(options, stream, isDuplex) { - Duplex = Duplex || __webpack_require__(359); + Duplex = Duplex || __webpack_require__(1359); options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different @@ -2486,7 +5031,7 @@ if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.protot } function Writable(options) { - Duplex = Duplex || __webpack_require__(359); // Writable ctor is applied to Duplexes, too. + Duplex = Duplex || __webpack_require__(1359); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` // would return false, as no `_writableState` property is attached. // Trying to use the custom `instanceof` for Writable here will also break the @@ -2957,7 +5502,7 @@ Writable.prototype._destroy = function (err, cb) { /***/ }), -/***/ 306: +/***/ 3306: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -2967,7 +5512,7 @@ var _Object$setPrototypeO; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var finished = __webpack_require__(80); +var finished = __webpack_require__(6080); var kLastResolve = Symbol('lastResolve'); var kLastReject = Symbol('lastReject'); @@ -3171,7 +5716,7 @@ module.exports = createReadableStreamAsyncIterator; /***/ }), -/***/ 746: +/***/ 2746: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -3189,10 +5734,10 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -var _require = __webpack_require__(293), +var _require = __webpack_require__(4293), Buffer = _require.Buffer; -var _require2 = __webpack_require__(669), +var _require2 = __webpack_require__(1669), inspect = _require2.inspect; var custom = inspect && inspect.custom || 'inspect'; @@ -3388,7 +5933,7 @@ function () { /***/ }), -/***/ 49: +/***/ 7049: /***/ ((module) => { "use strict"; @@ -3500,7 +6045,7 @@ module.exports = { /***/ }), -/***/ 80: +/***/ 6080: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -3508,7 +6053,7 @@ module.exports = { // permission from the author, Mathias Buus (@mafintosh). -var ERR_STREAM_PREMATURE_CLOSE = __webpack_require__(214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE; +var ERR_STREAM_PREMATURE_CLOSE = __webpack_require__(7214)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE; function once(callback) { var called = false; @@ -3611,7 +6156,7 @@ module.exports = eos; /***/ }), -/***/ 82: +/***/ 9082: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -3627,7 +6172,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var ERR_INVALID_ARG_TYPE = __webpack_require__(214)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE; +var ERR_INVALID_ARG_TYPE = __webpack_require__(7214)/* .codes.ERR_INVALID_ARG_TYPE */ .q.ERR_INVALID_ARG_TYPE; function from(Readable, iterable, opts) { var iterator; @@ -3682,7 +6227,7 @@ module.exports = from; /***/ }), -/***/ 989: +/***/ 6989: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; @@ -3701,7 +6246,7 @@ function once(callback) { }; } -var _require$codes = __webpack_require__(214)/* .codes */ .q, +var _require$codes = __webpack_require__(7214)/* .codes */ .q, ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; @@ -3720,7 +6265,7 @@ function destroyer(stream, reading, writing, callback) { stream.on('close', function () { closed = true; }); - if (eos === undefined) eos = __webpack_require__(80); + if (eos === undefined) eos = __webpack_require__(6080); eos(stream, { readable: reading, writable: writing @@ -3786,13 +6331,13 @@ module.exports = pipeline; /***/ }), -/***/ 948: +/***/ 9948: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -var ERR_INVALID_OPT_VALUE = __webpack_require__(214)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE; +var ERR_INVALID_OPT_VALUE = __webpack_require__(7214)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE; function highWaterMarkFrom(options, isDuplex, duplexKey) { return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; @@ -3820,43 +6365,43 @@ module.exports = { /***/ }), -/***/ 387: +/***/ 2387: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -module.exports = __webpack_require__(413); +module.exports = __webpack_require__(2413); /***/ }), -/***/ 642: +/***/ 1642: /***/ ((module, exports, __webpack_require__) => { -var Stream = __webpack_require__(413); +var Stream = __webpack_require__(2413); if (process.env.READABLE_STREAM === 'disable' && Stream) { module.exports = Stream.Readable; Object.assign(module.exports, Stream); module.exports.Stream = Stream; } else { - exports = module.exports = __webpack_require__(433); + exports = module.exports = __webpack_require__(1433); exports.Stream = Stream || exports; exports.Readable = exports; - exports.Writable = __webpack_require__(993); - exports.Duplex = __webpack_require__(359); - exports.Transform = __webpack_require__(415); - exports.PassThrough = __webpack_require__(542); - exports.finished = __webpack_require__(80); - exports.pipeline = __webpack_require__(989); + exports.Writable = __webpack_require__(6993); + exports.Duplex = __webpack_require__(1359); + exports.Transform = __webpack_require__(4415); + exports.PassThrough = __webpack_require__(1542); + exports.finished = __webpack_require__(6080); + exports.pipeline = __webpack_require__(6989); } /***/ }), -/***/ 867: +/***/ 1867: /***/ ((module, exports, __webpack_require__) => { /*! safe-buffer. MIT License. Feross Aboukhadijeh */ /* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(293) +var buffer = __webpack_require__(4293) var Buffer = buffer.Buffer // alternative to using Object.keys for old browsers @@ -3923,7 +6468,7 @@ SafeBuffer.allocUnsafeSlow = function (size) { /***/ }), -/***/ 841: +/***/ 4841: /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use strict"; @@ -3952,7 +6497,7 @@ SafeBuffer.allocUnsafeSlow = function (size) { /**/ -var Buffer = __webpack_require__(867).Buffer; +var Buffer = __webpack_require__(1867).Buffer; /**/ var isEncoding = Buffer.isEncoding || function (encoding) { @@ -4226,7 +6771,7 @@ function simpleEnd(buf) { /***/ }), -/***/ 127: +/***/ 7127: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { @@ -4234,12 +6779,12 @@ function simpleEnd(buf) { * For Node.js, simply re-export the core `util.deprecate` function. */ -module.exports = __webpack_require__(669).deprecate; +module.exports = __webpack_require__(1669).deprecate; /***/ }), -/***/ 792: +/***/ 345: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -4252,7 +6797,7 @@ __webpack_require__.d(__webpack_exports__, { }); // EXTERNAL MODULE: ./node_modules/@actions/core/lib/core.js -var core = __webpack_require__(186); +var core = __webpack_require__(2186); // CONCATENATED MODULE: ./lib/input.ts ; @@ -4267,10 +6812,10 @@ function getInput(name, options = {}) { } // CONCATENATED MODULE: ./lib/create-blob-request-body-streams.ts -const fs = __webpack_require__(747); -const { Readable, Transform } = __webpack_require__(413); -const { join } = __webpack_require__(622); -const MultiStream = __webpack_require__(999); +const fs = __webpack_require__(5747); +const { Readable, Transform } = __webpack_require__(2413); +const { join } = __webpack_require__(5622); +const MultiStream = __webpack_require__(7999); /** * Encodes chunks in a stream to base64 */ @@ -4299,6 +6844,7 @@ class CreateBlobRequestBodyStream extends MultiStream { fs.createReadStream(path).pipe(base64Transformer), Readable.from('"}') ], opts); + this.path = path; } } ; @@ -4312,6 +6858,23 @@ function getCreateBlobRequestBodyStreams(paths, options = {}) { .map(path => new CreateBlobRequestBodyStream(path)); } +// EXTERNAL MODULE: ./node_modules/axios/index.js +var axios = __webpack_require__(6545); +var axios_default = /*#__PURE__*/__webpack_require__.n(axios); + +// CONCATENATED MODULE: ./lib/github-client.ts + +const pkg = __webpack_require__(306); +const github = axios_default().create({ + baseURL: `https://api.github.com/`, + headers: { + accept: `application/vnd.github.v3+json`, + authorization: `bearer ${process.env.GITHUB_TOKEN}`, + 'user-agent': `${pkg.name}/${pkg.version}` + } +}); +/* harmony default export */ const github_client = (github); + // CONCATENATED MODULE: ./index.ts var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -4325,6 +6888,7 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume + function run() { return __awaiter(this, void 0, void 0, function* () { try { @@ -4337,7 +6901,18 @@ function run() { // We will use this array to efficiently stream file contents to GitHub's // create blobs API const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); - core.debug(`Received ${streams.length} paths: ${streams.join(', ')}`); + core.debug(`Received ${streams.length} stream${streams.length === 1 ? '' : 's'}: ${streams.map(stream => stream.path).join(', ')}`); + // Create blobs using Git database API + const blobs = yield Promise.all(streams.map(stream => { + github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream) + .then(response => { + return { + data: response.data, + path: stream.path + }; + }); + })); + core.debug(`Created ${blobs.length} blob${blobs.length === 1 ? '' : 's'}: ${JSON.stringify(blobs, null, 4)}`); } catch (e) { core.setFailed(e); @@ -4350,7 +6925,39 @@ run(); /***/ }), -/***/ 293: +/***/ 9975: +/***/ ((module) => { + +module.exports = eval("require")("debug"); + + +/***/ }), + +/***/ 696: +/***/ ((module) => { + +"use strict"; +module.exports = JSON.parse("{\"_from\":\"axios\",\"_id\":\"axios@0.21.0\",\"_inBundle\":false,\"_integrity\":\"sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==\",\"_location\":\"/axios\",\"_phantomChildren\":{},\"_requested\":{\"type\":\"tag\",\"registry\":true,\"raw\":\"axios\",\"name\":\"axios\",\"escapedName\":\"axios\",\"rawSpec\":\"\",\"saveSpec\":null,\"fetchSpec\":\"latest\"},\"_requiredBy\":[\"#USER\",\"/\"],\"_resolved\":\"https://registry.npmjs.org/axios/-/axios-0.21.0.tgz\",\"_shasum\":\"26df088803a2350dff2c27f96fef99fe49442aca\",\"_spec\":\"axios\",\"_where\":\"/Users/swinton/GitHub/swinton/verified-commit\",\"author\":{\"name\":\"Matt Zabriskie\"},\"browser\":{\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},\"bugs\":{\"url\":\"https://github.com/axios/axios/issues\"},\"bundleDependencies\":false,\"bundlesize\":[{\"path\":\"./dist/axios.min.js\",\"threshold\":\"5kB\"}],\"dependencies\":{\"follow-redirects\":\"^1.10.0\"},\"deprecated\":false,\"description\":\"Promise based HTTP client for the browser and node.js\",\"devDependencies\":{\"bundlesize\":\"^0.17.0\",\"coveralls\":\"^3.0.0\",\"es6-promise\":\"^4.2.4\",\"grunt\":\"^1.0.2\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^20.1.0\",\"grunt-karma\":\"^2.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^1.0.18\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",\"karma\":\"^1.3.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-coverage\":\"^1.1.1\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-opera-launcher\":\"^1.0.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^1.2.0\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.7\",\"karma-webpack\":\"^1.7.0\",\"load-grunt-tasks\":\"^3.5.2\",\"minimist\":\"^1.2.0\",\"mocha\":\"^5.2.0\",\"sinon\":\"^4.5.0\",\"typescript\":\"^2.8.1\",\"url-search-params\":\"^0.10.0\",\"webpack\":\"^1.13.1\",\"webpack-dev-server\":\"^1.14.1\"},\"homepage\":\"https://github.com/axios/axios\",\"jsdelivr\":\"dist/axios.min.js\",\"keywords\":[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],\"license\":\"MIT\",\"main\":\"index.js\",\"name\":\"axios\",\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/axios/axios.git\"},\"scripts\":{\"build\":\"NODE_ENV=production grunt build\",\"coveralls\":\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",\"examples\":\"node ./examples/server.js\",\"fix\":\"eslint --fix lib/**/*.js\",\"postversion\":\"git push && git push --tags\",\"preversion\":\"npm test\",\"start\":\"node ./sandbox/server.js\",\"test\":\"grunt test && bundlesize\",\"version\":\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\"},\"typings\":\"./index.d.ts\",\"unpkg\":\"dist/axios.min.js\",\"version\":\"0.21.0\"}"); + +/***/ }), + +/***/ 306: +/***/ ((module) => { + +"use strict"; +module.exports = JSON.parse("{\"name\":\"@swinton/commit\",\"version\":\"2.0.0\",\"description\":\"Create a verified commit with GitHub Actions\",\"main\":\"dist/index.js\",\"scripts\":{\"test\":\"echo \\\"Error: no test specified\\\" && exit 1\",\"build\":\"ncc build index.ts -o dist\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/swinton/commit.git\"},\"keywords\":[],\"author\":\"Steve Winton (https://github.com/swinton)\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/swinton/commit/issues\"},\"homepage\":\"https://github.com/swinton/commit#readme\",\"devDependencies\":{\"@types/node\":\"^14.14.10\",\"@vercel/ncc\":\"^0.25.1\",\"typescript\":\"^4.1.2\"},\"dependencies\":{\"@actions/core\":\"^1.2.6\",\"axios\":\"^0.21.0\",\"multistream\":\"^4.0.1\"}}"); + +/***/ }), + +/***/ 2357: +/***/ ((module) => { + +"use strict"; +module.exports = require("assert");; + +/***/ }), + +/***/ 4293: /***/ ((module) => { "use strict"; @@ -4358,7 +6965,7 @@ module.exports = require("buffer");; /***/ }), -/***/ 614: +/***/ 8614: /***/ ((module) => { "use strict"; @@ -4366,7 +6973,7 @@ module.exports = require("events");; /***/ }), -/***/ 747: +/***/ 5747: /***/ ((module) => { "use strict"; @@ -4374,7 +6981,23 @@ module.exports = require("fs");; /***/ }), -/***/ 87: +/***/ 8605: +/***/ ((module) => { + +"use strict"; +module.exports = require("http");; + +/***/ }), + +/***/ 7211: +/***/ ((module) => { + +"use strict"; +module.exports = require("https");; + +/***/ }), + +/***/ 2087: /***/ ((module) => { "use strict"; @@ -4382,7 +7005,7 @@ module.exports = require("os");; /***/ }), -/***/ 622: +/***/ 5622: /***/ ((module) => { "use strict"; @@ -4390,7 +7013,7 @@ module.exports = require("path");; /***/ }), -/***/ 413: +/***/ 2413: /***/ ((module) => { "use strict"; @@ -4398,12 +7021,28 @@ module.exports = require("stream");; /***/ }), -/***/ 669: +/***/ 8835: +/***/ ((module) => { + +"use strict"; +module.exports = require("url");; + +/***/ }), + +/***/ 1669: /***/ ((module) => { "use strict"; module.exports = require("util");; +/***/ }), + +/***/ 8761: +/***/ ((module) => { + +"use strict"; +module.exports = require("zlib");; + /***/ }) /******/ }); @@ -4438,6 +7077,18 @@ module.exports = require("util");; /******/ } /******/ /************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => module['default'] : +/******/ () => module; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports @@ -4472,6 +7123,6 @@ module.exports = require("util");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(792); +/******/ return __webpack_require__(345); /******/ })() ; \ No newline at end of file From 740dc9b332d84857440d5212894e377cfe88e859 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 15:26:25 -0600 Subject: [PATCH 53/97] Prefer GH_TOKEN over GITHUB_TOKEN --- lib/github-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/github-client.ts b/lib/github-client.ts index 6bc9c88..66c320a 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -6,7 +6,7 @@ const github = axios.create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, - authorization: `bearer ${ process.env.GITHUB_TOKEN }`, + authorization: `bearer ${ process.env.GH_TOKEN }`, 'user-agent': `${ pkg.name }/${ pkg.version }` } }); From 11d5919417879a944df272507261f5dfb5e2db72 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 15:26:46 -0600 Subject: [PATCH 54/97] Rebuild dist --- dist/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index c79f551..b00e0fa 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6869,7 +6869,7 @@ const github = axios_default().create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, - authorization: `bearer ${process.env.GITHUB_TOKEN}`, + authorization: `bearer ${process.env.GH_TOKEN}`, 'user-agent': `${pkg.name}/${pkg.version}` } }); From 3d0074add33ff2eb048eaa68e2ecce5c9a0be886 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 16:31:23 -0600 Subject: [PATCH 55/97] Gather blobs created --- index.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/index.ts b/index.ts index 0b5f0da..9fc8f6c 100644 --- a/index.ts +++ b/index.ts @@ -19,15 +19,14 @@ export default async function run() : Promise { core.debug(`Received ${ streams.length } stream${ streams.length === 1 ? '' : 's' }: ${ streams.map(stream => stream.path).join(', ') }`); // Create blobs using Git database API - const blobs = await Promise.all(streams.map(stream => { - github.post(`/repos/${ process.env.GITHUB_REPOSITORY }/git/blobs`, stream) - .then(response => { - return { - data: response.data, - path: stream.path - }; - }); - })); + let blobs: {sha: string, path: string}[] = []; + for await (let stream of streams) { + const response = await github.post(`/repos/${ process.env.GITHUB_REPOSITORY }/git/blobs`, stream); + blobs.push({ + path: stream.path, + sha: response.data.sha + }); + } core.debug(`Created ${ blobs.length } blob${ blobs.length === 1 ? '' : 's' }: ${ JSON.stringify(blobs, null, 4) }`); } catch (e) { core.setFailed(e); From 0e6c05a6da90a26dde4368e685e8149bd0d1caa3 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 16:31:55 -0600 Subject: [PATCH 56/97] Add start script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 80523e1..60d87f0 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Create a verified commit with GitHub Actions", "main": "dist/index.js", "scripts": { + "start": "node dist/index.js", "test": "echo \"Error: no test specified\" && exit 1", "build": "ncc build index.ts -o dist" }, From 5572fb9f588099ca84861199e00a6151d5de1eed Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Wed, 9 Dec 2020 16:32:24 -0600 Subject: [PATCH 57/97] Rebuild dist --- dist/index.js | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/dist/index.js b/dist/index.js index b00e0fa..99b13b3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6885,11 +6885,19 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; +var __asyncValues = (undefined && undefined.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; function run() { + var e_1, _a; return __awaiter(this, void 0, void 0, function* () { try { // Get inputs @@ -6903,15 +6911,24 @@ function run() { const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); core.debug(`Received ${streams.length} stream${streams.length === 1 ? '' : 's'}: ${streams.map(stream => stream.path).join(', ')}`); // Create blobs using Git database API - const blobs = yield Promise.all(streams.map(stream => { - github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream) - .then(response => { - return { - data: response.data, - path: stream.path - }; - }); - })); + let blobs = []; + try { + for (var streams_1 = __asyncValues(streams), streams_1_1; streams_1_1 = yield streams_1.next(), !streams_1_1.done;) { + let stream = streams_1_1.value; + const response = yield github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream); + blobs.push({ + path: stream.path, + sha: response.data.sha + }); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (streams_1_1 && !streams_1_1.done && (_a = streams_1.return)) yield _a.call(streams_1); + } + finally { if (e_1) throw e_1.error; } + } core.debug(`Created ${blobs.length} blob${blobs.length === 1 ? '' : 's'}: ${JSON.stringify(blobs, null, 4)}`); } catch (e) { @@ -6945,7 +6962,7 @@ module.exports = JSON.parse("{\"_from\":\"axios\",\"_id\":\"axios@0.21.0\",\"_in /***/ ((module) => { "use strict"; -module.exports = JSON.parse("{\"name\":\"@swinton/commit\",\"version\":\"2.0.0\",\"description\":\"Create a verified commit with GitHub Actions\",\"main\":\"dist/index.js\",\"scripts\":{\"test\":\"echo \\\"Error: no test specified\\\" && exit 1\",\"build\":\"ncc build index.ts -o dist\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/swinton/commit.git\"},\"keywords\":[],\"author\":\"Steve Winton (https://github.com/swinton)\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/swinton/commit/issues\"},\"homepage\":\"https://github.com/swinton/commit#readme\",\"devDependencies\":{\"@types/node\":\"^14.14.10\",\"@vercel/ncc\":\"^0.25.1\",\"typescript\":\"^4.1.2\"},\"dependencies\":{\"@actions/core\":\"^1.2.6\",\"axios\":\"^0.21.0\",\"multistream\":\"^4.0.1\"}}"); +module.exports = JSON.parse("{\"name\":\"@swinton/commit\",\"version\":\"2.0.0\",\"description\":\"Create a verified commit with GitHub Actions\",\"main\":\"dist/index.js\",\"scripts\":{\"start\":\"node dist/index.js\",\"test\":\"echo \\\"Error: no test specified\\\" && exit 1\",\"build\":\"ncc build index.ts -o dist\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/swinton/commit.git\"},\"keywords\":[],\"author\":\"Steve Winton (https://github.com/swinton)\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/swinton/commit/issues\"},\"homepage\":\"https://github.com/swinton/commit#readme\",\"devDependencies\":{\"@types/node\":\"^14.14.10\",\"@vercel/ncc\":\"^0.25.1\",\"typescript\":\"^4.1.2\"},\"dependencies\":{\"@actions/core\":\"^1.2.6\",\"axios\":\"^0.21.0\",\"multistream\":\"^4.0.1\"}}"); /***/ }), From 506fde34d8f0a0ebcfdeb3ead845b16454a54d42 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 13:53:32 -0600 Subject: [PATCH 58/97] Add CI, just a single compilation check for now --- .github/workflows/ci.yml | 17 +++++++++++++++++ package.json | 1 + 2 files changed, 18 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b3294cd --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: test +on: + push: + branches: + - main + pull_request: + branches: + - main +jobs: + test: + name: test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm ci + - run: npm run lint diff --git a/package.json b/package.json index 60d87f0..85c4f30 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "dist/index.js", "scripts": { "start": "node dist/index.js", + "lint": "tsc --noEmit", "test": "echo \"Error: no test specified\" && exit 1", "build": "ncc build index.ts -o dist" }, From 19469c9fddbb9e7b5e5dab392eed8593cff84c5e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:07:42 -0600 Subject: [PATCH 59/97] Enforce prettier code style --- .eslintignore | 1 + .eslintrc.js | 22 + package-lock.json | 1206 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 8 +- 4 files changed, 1236 insertions(+), 1 deletion(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..53c37a1 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..3139d9b --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", // Specifies the ESLint parser + extends: [ + "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin + "prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + "plugin:prettier/recommended", // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. + ], + parserOptions: { + ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features + sourceType: "module", // Allows for the use of imports + }, + rules: { + // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs + // e.g. "@typescript-eslint/explicit-function-return-type": "off", + }, + env: { + es6: true, + node: true, + jest: true, + }, +}; diff --git a/package-lock.json b/package-lock.json index 47be504..48e8c63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,18 +9,264 @@ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.6.tgz", "integrity": "sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==" }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, "@types/node": { "version": "14.14.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.1.tgz", + "integrity": "sha512-QRLDSvIPeI1pz5tVuurD+cStNR4sle4avtHhxA+2uyixWGFjKzJ+EaFVRW6dA/jOgjV5DTAjOxboQkRDE8cRlQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.9.1", + "@typescript-eslint/scope-manager": "4.9.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.1.tgz", + "integrity": "sha512-c3k/xJqk0exLFs+cWSJxIjqLYwdHCuLWhnpnikmPQD2+NGAx9KjLYlBDcSI81EArh9FDYSL6dslAUSwILeWOxg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.1.tgz", + "integrity": "sha512-Gv2VpqiomvQ2v4UL+dXlQcZ8zCX4eTkoIW+1aGVWT6yTO+6jbxsw7yQl2z2pPl/4B9qa5JXeIbhJpONKjXIy3g==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.1.tgz", + "integrity": "sha512-sa4L9yUfD/1sg9Kl8OxPxvpUcqxKXRjBeZxBuZSSV1v13hjfEJkn84n0An2hN8oLQ1PmEl2uA6FkI07idXeFgQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/visitor-keys": "4.9.1" + } + }, + "@typescript-eslint/types": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.9.1.tgz", + "integrity": "sha512-fjkT+tXR13ks6Le7JiEdagnwEFc49IkOyys7ueWQ4O8k4quKPwPJudrwlVOJCUQhXo45PrfIvIarcrEjFTNwUA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.9.1.tgz", + "integrity": "sha512-bzP8vqwX6Vgmvs81bPtCkLtM/Skh36NE6unu6tsDeU/ZFoYthlTXbBmpIrvosgiDKlWTfb2ZpPELHH89aQjeQw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/visitor-keys": "4.9.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.9.1.tgz", + "integrity": "sha512-9gspzc6UqLQHd7lXQS7oWs+hrYggspv/rk6zzEMhCbYwPE/sF7oxo7GAjkS35Tdlt7wguIG+ViWCPtVZHz/ybQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.1", + "eslint-visitor-keys": "^2.0.0" + } + }, "@vercel/ncc": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.25.1.tgz", "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", "dev": true }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "axios": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", @@ -29,16 +275,650 @@ "follow-redirects": "^1.10.0" } }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", + "integrity": "sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz", + "integrity": "sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "dev": true + }, "follow-redirects": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "multistream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.0.1.tgz", @@ -47,6 +927,101 @@ "readable-stream": "^3.6.0" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -57,11 +1032,119 @@ "util-deprecate": "^1.0.1" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -70,16 +1153,139 @@ "safe-buffer": "~5.2.0" } }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typescript": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/package.json b/package.json index 85c4f30..6efb65e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "dist/index.js", "scripts": { "start": "node dist/index.js", - "lint": "tsc --noEmit", + "lint": "tsc --noEmit && eslint '*/**/*.{js,ts,tsx}'", "test": "echo \"Error: no test specified\" && exit 1", "build": "ncc build index.ts -o dist" }, @@ -22,7 +22,13 @@ "homepage": "https://github.com/swinton/commit#readme", "devDependencies": { "@types/node": "^14.14.10", + "@typescript-eslint/eslint-plugin": "^4.9.1", + "@typescript-eslint/parser": "^4.9.1", "@vercel/ncc": "^0.25.1", + "eslint": "^7.15.0", + "eslint-config-prettier": "^7.0.0", + "eslint-plugin-prettier": "^3.2.0", + "prettier": "^2.2.1", "typescript": "^4.1.2" }, "dependencies": { From 6e0f919a3717d3a29d99355d1c64a591f58d8ee4 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:08:46 -0600 Subject: [PATCH 60/97] Conform to prettier style --- README.md | 2 + index.ts | 57 ++++++++++++++++++------- lib/create-blob-request-body-streams.ts | 44 +++++++++++-------- lib/github-client.ts | 11 ++--- lib/input.ts | 15 ++++--- 5 files changed, 84 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 8ab798c..093edf1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Commit > :white_check_mark: Create a _verified_ commit with GitHub Actions +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) + ## About This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. diff --git a/index.ts b/index.ts index 9fc8f6c..85d21e3 100644 --- a/index.ts +++ b/index.ts @@ -1,36 +1,61 @@ -import * as core from '@actions/core'; +import * as core from "@actions/core"; -import getInput from './lib/input'; -import getCreateBlobRequestBodyStreams from './lib/create-blob-request-body-streams'; -import github from './lib/github-client'; +import getInput from "./lib/input"; +import getCreateBlobRequestBodyStreams from "./lib/create-blob-request-body-streams"; +import github from "./lib/github-client"; -export default async function run() : Promise { +export default async function run(): Promise { try { // Get inputs - const paths = getInput('paths'); - const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); - const commitMessage = getInput('commit-message'); - const ref = getInput('ref', { default: null }); + const paths = getInput("paths"); + const baseDir = getInput("workspace", { + default: process.env.GITHUB_WORKSPACE, + }); + const commitMessage = getInput("commit-message"); + const ref = getInput("ref", { default: null }); // Expand paths to an array of 'create blob request body' streams // We will use this array to efficiently stream file contents to GitHub's // create blobs API const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); - core.debug(`Received ${ streams.length } stream${ streams.length === 1 ? '' : 's' }: ${ streams.map(stream => stream.path).join(', ') }`); + core.debug( + `Received ${streams.length} stream${ + streams.length === 1 ? "" : "s" + }: ${streams.map((stream) => stream.path).join(", ")}` + ); // Create blobs using Git database API - let blobs: {sha: string, path: string}[] = []; - for await (let stream of streams) { - const response = await github.post(`/repos/${ process.env.GITHUB_REPOSITORY }/git/blobs`, stream); + const blobs: { sha: string; path: string }[] = []; + for await (const stream of streams) { + const response = await github.post( + `/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, + stream + ); blobs.push({ path: stream.path, - sha: response.data.sha + sha: response.data.sha, }); } - core.debug(`Created ${ blobs.length } blob${ blobs.length === 1 ? '' : 's' }: ${ JSON.stringify(blobs, null, 4) }`); + core.debug( + `Created ${blobs.length} blob${ + blobs.length === 1 ? "" : "s" + }: ${JSON.stringify(blobs, null, 4)}` + ); + + // TODO + // Create tree + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + + // TODO + // Create commit + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + + // TODO + // Update ref + // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF } catch (e) { core.setFailed(e); } -}; +} run(); diff --git a/lib/create-blob-request-body-streams.ts b/lib/create-blob-request-body-streams.ts index 38697ef..29ee564 100644 --- a/lib/create-blob-request-body-streams.ts +++ b/lib/create-blob-request-body-streams.ts @@ -1,16 +1,16 @@ -const fs = require('fs'); -const { Readable, Transform } = require('stream'); -const { join } = require('path'); -const MultiStream = require('multistream'); +import * as fs from "fs"; +import { Readable, Transform } from "stream"; +import { join } from "path"; +import * as MultiStream from "multistream"; /** * Encodes chunks in a stream to base64 */ const base64Transformer = new Transform({ transform(chunk, encoding, callback) { - this.push(chunk.toString('base64')); + this.push(chunk.toString("base64")); callback(); - } + }, }); /** @@ -28,12 +28,17 @@ const base64Transformer = new Transform({ export class CreateBlobRequestBodyStream extends MultiStream { readonly path: string; - constructor(path, opts = {}) { - super([ - Readable.from('{"encoding":"base64","content":"'), - fs.createReadStream(path).pipe(base64Transformer), - Readable.from('"}') - ], opts) + constructor(path: string, opts = {}) { + // Produces the JSON body as a stream, so that we don't have to read ( + // potentially very large) files into memory + super( + [ + Readable.from('{"encoding":"base64","content":"'), + fs.createReadStream(path).pipe(base64Transformer), + Readable.from('"}'), + ], + opts + ); this.path = path; } @@ -41,15 +46,18 @@ export class CreateBlobRequestBodyStream extends MultiStream { export interface Options { /** Optional. Default base dir to use when expanding a set of paths. */ - baseDir?: string -}; + baseDir?: string; +} -export default function getCreateBlobRequestBodyStreams(paths: string, options: Options = {}): Array { +export default function getCreateBlobRequestBodyStreams( + paths: string, + options: Options = {} +): Array { const { baseDir } = options; return paths .trim() .split("\n") - .map(path => join(baseDir, path)) - .filter(path => fs.existsSync(path)) - .map(path => new CreateBlobRequestBodyStream(path)) + .map((path) => join(baseDir, path)) + .filter((path) => fs.existsSync(path)) + .map((path) => new CreateBlobRequestBodyStream(path)); } diff --git a/lib/github-client.ts b/lib/github-client.ts index 66c320a..ba6eaaa 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,14 +1,15 @@ -import axios from 'axios'; +import axios from "axios"; -const pkg = require('../package'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const pkg = require("../package"); const github = axios.create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, - authorization: `bearer ${ process.env.GH_TOKEN }`, - 'user-agent': `${ pkg.name }/${ pkg.version }` - } + authorization: `bearer ${process.env.GH_TOKEN}`, + "user-agent": `${pkg.name}/${pkg.version}`, + }, }); export default github; diff --git a/lib/input.ts b/lib/input.ts index 10da9d7..48de2d3 100644 --- a/lib/input.ts +++ b/lib/input.ts @@ -1,18 +1,21 @@ -import * as core from '@actions/core'; +import * as core from "@actions/core"; export interface InputOptions extends core.InputOptions { /** Optional. Default value to use for an input option if the option is not set. */ - default?: string | null -}; + default?: string | null; +} -export default function getInput(name: string, options: InputOptions = {}): string | null { +export default function getInput( + name: string, + options: InputOptions = {} +): string | null { const value = core.getInput(name, options); if (!value && options.default) { - core.debug(`${ name }: ${ options.default }`); + core.debug(`${name}: ${options.default}`); return options.default; } - core.debug(`${ name }: ${ value }`); + core.debug(`${name}: ${value}`); return value; } From ce8d08f73bb8ed56c0c56083973f90fc46dd917f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:09:23 -0600 Subject: [PATCH 61/97] Rebuild dist --- dist/index.js | 1250 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1212 insertions(+), 38 deletions(-) diff --git a/dist/index.js b/dist/index.js index 99b13b3..63c0f9d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2417,6 +2417,837 @@ module.exports = { }; +/***/ }), + +/***/ 8222: +/***/ ((module, exports, __webpack_require__) => { + +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); +exports.destroy = (() => { + let warned = false; + + return () => { + if (!warned) { + warned = true; + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + }; +})(); + +/** + * Colors. + */ + +exports.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' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (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 + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.debug()` when available. + * No-op when `console.debug` is not a "function". + * If `console.debug` is not available, falls back + * to `console.log`. + * + * @api public + */ +exports.log = console.debug || console.log || (() => {}); + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = __webpack_require__(6243)(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; + + +/***/ }), + +/***/ 6243: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = __webpack_require__(900); + createDebug.destroy = destroy; + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release. + + Object.defineProperty(debug, 'enabled', { + enumerable: true, + configurable: false, + get: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride, + set: v => { + enableOverride = v; + } + }); + + // Env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + return debug; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + /** + * XXX DO NOT USE. This is a temporary stub function. + * XXX It WILL be removed in the next major release. + */ + function destroy() { + console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'); + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +module.exports = setup; + + +/***/ }), + +/***/ 8237: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = __webpack_require__(8222); +} else { + module.exports = __webpack_require__(5332); +} + + +/***/ }), + +/***/ 5332: +/***/ ((module, exports, __webpack_require__) => { + +/** + * Module dependencies. + */ + +const tty = __webpack_require__(3867); +const util = __webpack_require__(1669); + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util.deprecate( + () => {}, + 'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.' +); + +/** + * Colors. + */ + +exports.colors = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = __webpack_require__(9318); + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + 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 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty.isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util.format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = __webpack_require__(6243)(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; + + /***/ }), /***/ 1133: @@ -2425,7 +3256,7 @@ module.exports = { var debug; try { /* eslint global-require: off */ - debug = __webpack_require__(9975)("follow-redirects"); + debug = __webpack_require__(8237)("follow-redirects"); } catch (error) { debug = function () { /* */ }; @@ -2938,6 +3769,22 @@ module.exports = wrap({ http: http, https: https }); module.exports.wrap = wrap; +/***/ }), + +/***/ 1621: +/***/ ((module) => { + +"use strict"; + +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; + + /***/ }), /***/ 4124: @@ -2988,6 +3835,175 @@ if (typeof Object.create === 'function') { } +/***/ }), + +/***/ 900: +/***/ ((module) => { + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + 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( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + + /***/ }), /***/ 7999: @@ -6769,6 +7785,145 @@ function simpleEnd(buf) { return buf && buf.length ? this.write(buf) : ''; } +/***/ }), + +/***/ 9318: +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + +const os = __webpack_require__(2087); +const hasFlag = __webpack_require__(1621); + +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} + +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + const min = forceColor ? 1 : 0; + + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + if (env.TERM === 'dumb') { + return min; + } + + return min; +} + +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); +} + +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; + + /***/ }), /***/ 7127: @@ -6800,7 +7955,6 @@ __webpack_require__.d(__webpack_exports__, { var core = __webpack_require__(2186); // CONCATENATED MODULE: ./lib/input.ts -; function getInput(name, options = {}) { const value = core.getInput(name, options); if (!value && options.default) { @@ -6811,19 +7965,27 @@ function getInput(name, options = {}) { return value; } +// EXTERNAL MODULE: external "fs" +var external_fs_ = __webpack_require__(5747); +// EXTERNAL MODULE: external "stream" +var external_stream_ = __webpack_require__(2413); +// EXTERNAL MODULE: external "path" +var external_path_ = __webpack_require__(5622); +// EXTERNAL MODULE: ./node_modules/multistream/index.js +var multistream = __webpack_require__(7999); // CONCATENATED MODULE: ./lib/create-blob-request-body-streams.ts -const fs = __webpack_require__(5747); -const { Readable, Transform } = __webpack_require__(2413); -const { join } = __webpack_require__(5622); -const MultiStream = __webpack_require__(7999); + + + + /** * Encodes chunks in a stream to base64 */ -const base64Transformer = new Transform({ +const base64Transformer = new external_stream_.Transform({ transform(chunk, encoding, callback) { - this.push(chunk.toString('base64')); + this.push(chunk.toString("base64")); callback(); - } + }, }); /** * Produces a stream that conforms to the shape expected @@ -6837,25 +7999,26 @@ const base64Transformer = new Transform({ * * See: https://docs.github.com/rest/reference/git#create-a-blob */ -class CreateBlobRequestBodyStream extends MultiStream { +class CreateBlobRequestBodyStream extends multistream { constructor(path, opts = {}) { + // Produces the JSON body as a stream, so that we don't have to read ( + // potentially very large) files into memory super([ - Readable.from('{"encoding":"base64","content":"'), - fs.createReadStream(path).pipe(base64Transformer), - Readable.from('"}') + external_stream_.Readable.from('{"encoding":"base64","content":"'), + external_fs_.createReadStream(path).pipe(base64Transformer), + external_stream_.Readable.from('"}'), ], opts); this.path = path; } } -; function getCreateBlobRequestBodyStreams(paths, options = {}) { const { baseDir } = options; return paths .trim() .split("\n") - .map(path => join(baseDir, path)) - .filter(path => fs.existsSync(path)) - .map(path => new CreateBlobRequestBodyStream(path)); + .map((path) => (0,external_path_.join)(baseDir, path)) + .filter((path) => external_fs_.existsSync(path)) + .map((path) => new CreateBlobRequestBodyStream(path)); } // EXTERNAL MODULE: ./node_modules/axios/index.js @@ -6864,14 +8027,15 @@ var axios_default = /*#__PURE__*/__webpack_require__.n(axios); // CONCATENATED MODULE: ./lib/github-client.ts +// eslint-disable-next-line @typescript-eslint/no-var-requires const pkg = __webpack_require__(306); const github = axios_default().create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, authorization: `bearer ${process.env.GH_TOKEN}`, - 'user-agent': `${pkg.name}/${pkg.version}` - } + "user-agent": `${pkg.name}/${pkg.version}`, + }, }); /* harmony default export */ const github_client = (github); @@ -6901,24 +8065,26 @@ function run() { return __awaiter(this, void 0, void 0, function* () { try { // Get inputs - const paths = getInput('paths'); - const baseDir = getInput('workspace', { default: process.env.GITHUB_WORKSPACE }); - const commitMessage = getInput('commit-message'); - const ref = getInput('ref', { default: null }); + const paths = getInput("paths"); + const baseDir = getInput("workspace", { + default: process.env.GITHUB_WORKSPACE, + }); + const commitMessage = getInput("commit-message"); + const ref = getInput("ref", { default: null }); // Expand paths to an array of 'create blob request body' streams // We will use this array to efficiently stream file contents to GitHub's // create blobs API const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); - core.debug(`Received ${streams.length} stream${streams.length === 1 ? '' : 's'}: ${streams.map(stream => stream.path).join(', ')}`); + core.debug(`Received ${streams.length} stream${streams.length === 1 ? "" : "s"}: ${streams.map((stream) => stream.path).join(", ")}`); // Create blobs using Git database API - let blobs = []; + const blobs = []; try { for (var streams_1 = __asyncValues(streams), streams_1_1; streams_1_1 = yield streams_1.next(), !streams_1_1.done;) { - let stream = streams_1_1.value; + const stream = streams_1_1.value; const response = yield github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream); blobs.push({ path: stream.path, - sha: response.data.sha + sha: response.data.sha, }); } } @@ -6929,25 +8095,25 @@ function run() { } finally { if (e_1) throw e_1.error; } } - core.debug(`Created ${blobs.length} blob${blobs.length === 1 ? '' : 's'}: ${JSON.stringify(blobs, null, 4)}`); + core.debug(`Created ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${JSON.stringify(blobs, null, 4)}`); + // TODO + // Create tree + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + // TODO + // Create commit + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + // TODO + // Update ref + // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF } catch (e) { core.setFailed(e); } }); } -; run(); -/***/ }), - -/***/ 9975: -/***/ ((module) => { - -module.exports = eval("require")("debug"); - - /***/ }), /***/ 696: @@ -6962,7 +8128,7 @@ module.exports = JSON.parse("{\"_from\":\"axios\",\"_id\":\"axios@0.21.0\",\"_in /***/ ((module) => { "use strict"; -module.exports = JSON.parse("{\"name\":\"@swinton/commit\",\"version\":\"2.0.0\",\"description\":\"Create a verified commit with GitHub Actions\",\"main\":\"dist/index.js\",\"scripts\":{\"start\":\"node dist/index.js\",\"test\":\"echo \\\"Error: no test specified\\\" && exit 1\",\"build\":\"ncc build index.ts -o dist\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/swinton/commit.git\"},\"keywords\":[],\"author\":\"Steve Winton (https://github.com/swinton)\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/swinton/commit/issues\"},\"homepage\":\"https://github.com/swinton/commit#readme\",\"devDependencies\":{\"@types/node\":\"^14.14.10\",\"@vercel/ncc\":\"^0.25.1\",\"typescript\":\"^4.1.2\"},\"dependencies\":{\"@actions/core\":\"^1.2.6\",\"axios\":\"^0.21.0\",\"multistream\":\"^4.0.1\"}}"); +module.exports = JSON.parse("{\"name\":\"@swinton/commit\",\"version\":\"2.0.0\",\"description\":\"Create a verified commit with GitHub Actions\",\"main\":\"dist/index.js\",\"scripts\":{\"start\":\"node dist/index.js\",\"lint\":\"tsc --noEmit && eslint '*/**/*.{js,ts,tsx}'\",\"test\":\"echo \\\"Error: no test specified\\\" && exit 1\",\"build\":\"ncc build index.ts -o dist\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/swinton/commit.git\"},\"keywords\":[],\"author\":\"Steve Winton (https://github.com/swinton)\",\"license\":\"ISC\",\"bugs\":{\"url\":\"https://github.com/swinton/commit/issues\"},\"homepage\":\"https://github.com/swinton/commit#readme\",\"devDependencies\":{\"@types/node\":\"^14.14.10\",\"@typescript-eslint/eslint-plugin\":\"^4.9.1\",\"@typescript-eslint/parser\":\"^4.9.1\",\"@vercel/ncc\":\"^0.25.1\",\"eslint\":\"^7.15.0\",\"eslint-config-prettier\":\"^7.0.0\",\"eslint-plugin-prettier\":\"^3.2.0\",\"prettier\":\"^2.2.1\",\"typescript\":\"^4.1.2\"},\"dependencies\":{\"@actions/core\":\"^1.2.6\",\"axios\":\"^0.21.0\",\"multistream\":\"^4.0.1\"}}"); /***/ }), @@ -7038,6 +8204,14 @@ module.exports = require("stream");; /***/ }), +/***/ 3867: +/***/ ((module) => { + +"use strict"; +module.exports = require("tty");; + +/***/ }), + /***/ 8835: /***/ ((module) => { From af73f135ebe1a6a983516ec23b32cb90058accab Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:19:14 -0600 Subject: [PATCH 62/97] Rename paths input as 'files' --- .github/workflows/release.yml | 2 +- README.md | 8 ++++---- action.yml | 4 ++-- index.ts | 10 +++++----- lib/create-blob-request-body-streams.ts | 20 ++++++++++---------- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5b71ac2..bcc38cf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - paths: | + files: | dist/index.js commit-message: Add dist/index.js ref: refs/heads/v2 diff --git a/README.md b/README.md index 093edf1..440ee33 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - paths: | + files: | myfile commit-message: Committing ./myfile ref: refs/heads/my-branch @@ -25,7 +25,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: Note, the `GH_TOKEN` environment variable is _required_, since commits are created using GitHub's [Git Database API](https://docs.github.com/rest/reference/git). -To commit multiple files in a single commit, pass each file on a newline to the `paths` input: +To commit multiple files in a single commit, pass each file on a newline to the `files` input: ```yaml - name: Commit files @@ -33,7 +33,7 @@ To commit multiple files in a single commit, pass each file on a newline to the env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - paths: | + files: | path/to/myfile1 path/to/myfile2 path/to/myfile3 @@ -44,7 +44,7 @@ To commit multiple files in a single commit, pass each file on a newline to the ## Inputs The following inputs are _required_: -- `paths`: Newline-separated list of filesystems path of files to be committed, relative to root of repository, e.g.
myfile1
myfile2
...
myfileN
+- `files`: Newline-separated list of files to be committed, relative to root of repository, e.g.
myfile1
myfile2
...
myfileN
- `commit-message`: Commit message to be used, e.g. `Add ./myfile` - `ref`: Fully qualified name of reference to be updated with commit, e.g. `refs/heads/production`. This reference _must_ already exist. Defaults to the repository's default branch ref. diff --git a/action.yml b/action.yml index b5b6e34..78105f1 100644 --- a/action.yml +++ b/action.yml @@ -1,9 +1,9 @@ name: Verified commit description: GitHub Action to create verified commits inputs: - paths: + files: description: | - Newline-separated list of filesystems path of files to be committed, relative to root of repository. + Newline-separated list of files to be committed, relative to root of repository. required: true workspace: description: | diff --git a/index.ts b/index.ts index 85d21e3..4c673e8 100644 --- a/index.ts +++ b/index.ts @@ -7,21 +7,21 @@ import github from "./lib/github-client"; export default async function run(): Promise { try { // Get inputs - const paths = getInput("paths"); + const files = getInput("files"); const baseDir = getInput("workspace", { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); const ref = getInput("ref", { default: null }); - // Expand paths to an array of 'create blob request body' streams + // Expand files to an array of 'create blob request body' streams // We will use this array to efficiently stream file contents to GitHub's // create blobs API - const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); + const streams = getCreateBlobRequestBodyStreams(files, { baseDir }); core.debug( `Received ${streams.length} stream${ streams.length === 1 ? "" : "s" - }: ${streams.map((stream) => stream.path).join(", ")}` + }: ${streams.map((stream) => stream.absoluteFilePath).join(", ")}` ); // Create blobs using Git database API @@ -32,7 +32,7 @@ export default async function run(): Promise { stream ); blobs.push({ - path: stream.path, + path: stream.absoluteFilePath, sha: response.data.sha, }); } diff --git a/lib/create-blob-request-body-streams.ts b/lib/create-blob-request-body-streams.ts index 29ee564..595e0a8 100644 --- a/lib/create-blob-request-body-streams.ts +++ b/lib/create-blob-request-body-streams.ts @@ -26,38 +26,38 @@ const base64Transformer = new Transform({ * See: https://docs.github.com/rest/reference/git#create-a-blob */ export class CreateBlobRequestBodyStream extends MultiStream { - readonly path: string; + readonly absoluteFilePath: string; - constructor(path: string, opts = {}) { + constructor(absoluteFilePath: string, opts = {}) { // Produces the JSON body as a stream, so that we don't have to read ( // potentially very large) files into memory super( [ Readable.from('{"encoding":"base64","content":"'), - fs.createReadStream(path).pipe(base64Transformer), + fs.createReadStream(absoluteFilePath).pipe(base64Transformer), Readable.from('"}'), ], opts ); - this.path = path; + this.absoluteFilePath = absoluteFilePath; } } export interface Options { - /** Optional. Default base dir to use when expanding a set of paths. */ + /** Optional. Default base dir to use when expanding a set of files. */ baseDir?: string; } export default function getCreateBlobRequestBodyStreams( - paths: string, + files: string, options: Options = {} ): Array { const { baseDir } = options; - return paths + return files .trim() .split("\n") - .map((path) => join(baseDir, path)) - .filter((path) => fs.existsSync(path)) - .map((path) => new CreateBlobRequestBodyStream(path)); + .map((file) => join(baseDir, file)) + .filter((file) => fs.existsSync(file)) + .map((file) => new CreateBlobRequestBodyStream(file)); } From 62e15b46ebd9976cbed5781037bdbdafbe8c9ce9 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:19:33 -0600 Subject: [PATCH 63/97] Rebuild dist --- dist/index.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dist/index.js b/dist/index.js index 63c0f9d..ab09c89 100644 --- a/dist/index.js +++ b/dist/index.js @@ -8000,25 +8000,25 @@ const base64Transformer = new external_stream_.Transform({ * See: https://docs.github.com/rest/reference/git#create-a-blob */ class CreateBlobRequestBodyStream extends multistream { - constructor(path, opts = {}) { + constructor(absoluteFilePath, opts = {}) { // Produces the JSON body as a stream, so that we don't have to read ( // potentially very large) files into memory super([ external_stream_.Readable.from('{"encoding":"base64","content":"'), - external_fs_.createReadStream(path).pipe(base64Transformer), + external_fs_.createReadStream(absoluteFilePath).pipe(base64Transformer), external_stream_.Readable.from('"}'), ], opts); - this.path = path; + this.absoluteFilePath = absoluteFilePath; } } -function getCreateBlobRequestBodyStreams(paths, options = {}) { +function getCreateBlobRequestBodyStreams(files, options = {}) { const { baseDir } = options; - return paths + return files .trim() .split("\n") - .map((path) => (0,external_path_.join)(baseDir, path)) - .filter((path) => external_fs_.existsSync(path)) - .map((path) => new CreateBlobRequestBodyStream(path)); + .map((file) => (0,external_path_.join)(baseDir, file)) + .filter((file) => external_fs_.existsSync(file)) + .map((file) => new CreateBlobRequestBodyStream(file)); } // EXTERNAL MODULE: ./node_modules/axios/index.js @@ -8065,17 +8065,17 @@ function run() { return __awaiter(this, void 0, void 0, function* () { try { // Get inputs - const paths = getInput("paths"); + const files = getInput("files"); const baseDir = getInput("workspace", { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); const ref = getInput("ref", { default: null }); - // Expand paths to an array of 'create blob request body' streams + // Expand files to an array of 'create blob request body' streams // We will use this array to efficiently stream file contents to GitHub's // create blobs API - const streams = getCreateBlobRequestBodyStreams(paths, { baseDir }); - core.debug(`Received ${streams.length} stream${streams.length === 1 ? "" : "s"}: ${streams.map((stream) => stream.path).join(", ")}`); + const streams = getCreateBlobRequestBodyStreams(files, { baseDir }); + core.debug(`Received ${streams.length} stream${streams.length === 1 ? "" : "s"}: ${streams.map((stream) => stream.absoluteFilePath).join(", ")}`); // Create blobs using Git database API const blobs = []; try { @@ -8083,7 +8083,7 @@ function run() { const stream = streams_1_1.value; const response = yield github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream); blobs.push({ - path: stream.path, + path: stream.absoluteFilePath, sha: response.data.sha, }); } From efcda804189285b87b66e19a5c56b1241a6c9a3e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:51:38 -0600 Subject: [PATCH 64/97] Refactor: Blob class encapsulates Blob functionality --- index.ts | 33 +++-------- lib/blob.ts | 77 +++++++++++++++++++++++++ lib/create-blob-request-body-streams.ts | 63 -------------------- lib/resource.ts | 9 +++ 4 files changed, 95 insertions(+), 87 deletions(-) create mode 100644 lib/blob.ts delete mode 100644 lib/create-blob-request-body-streams.ts create mode 100644 lib/resource.ts diff --git a/index.ts b/index.ts index 4c673e8..834971a 100644 --- a/index.ts +++ b/index.ts @@ -1,7 +1,7 @@ import * as core from "@actions/core"; import getInput from "./lib/input"; -import getCreateBlobRequestBodyStreams from "./lib/create-blob-request-body-streams"; +import { getBlobsFromFiles } from "./lib/blob"; import github from "./lib/github-client"; export default async function run(): Promise { @@ -14,33 +14,18 @@ export default async function run(): Promise { const commitMessage = getInput("commit-message"); const ref = getInput("ref", { default: null }); - // Expand files to an array of 'create blob request body' streams - // We will use this array to efficiently stream file contents to GitHub's - // create blobs API - const streams = getCreateBlobRequestBodyStreams(files, { baseDir }); + // Expand files to an array of "blobs", which will be created on GitHub via the create blob API + const blobs = getBlobsFromFiles(files, { baseDir }); core.debug( - `Received ${streams.length} stream${ - streams.length === 1 ? "" : "s" - }: ${streams.map((stream) => stream.absoluteFilePath).join(", ")}` + `Received ${blobs.length} blob${ + blobs.length === 1 ? "" : "s" + }: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}` ); - // Create blobs using Git database API - const blobs: { sha: string; path: string }[] = []; - for await (const stream of streams) { - const response = await github.post( - `/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, - stream - ); - blobs.push({ - path: stream.absoluteFilePath, - sha: response.data.sha, - }); + // Save all the blobs, on GitHub + for await (const blob of blobs) { + await blob.save(); } - core.debug( - `Created ${blobs.length} blob${ - blobs.length === 1 ? "" : "s" - }: ${JSON.stringify(blobs, null, 4)}` - ); // TODO // Create tree diff --git a/lib/blob.ts b/lib/blob.ts new file mode 100644 index 0000000..7d7d86a --- /dev/null +++ b/lib/blob.ts @@ -0,0 +1,77 @@ +import * as fs from "fs"; +import { Readable, Transform } from "stream"; +import { join } from "path"; +import * as core from "@actions/core"; +import * as MultiStream from "multistream"; +import Resource from "./resource"; + +/** + * Encodes chunks in a stream to base64 + */ +const base64Transformer = new Transform({ + transform(chunk, encoding, callback) { + this.push(chunk.toString("base64")); + callback(); + }, +}); + +export class Blob extends Resource { + readonly absoluteFilePath: string; + sha: string; + + constructor(readonly baseDir: string, readonly file: string) { + super(); + this.absoluteFilePath = join(baseDir, file); + // Reject files that don't exist + if (!fs.existsSync(this.absoluteFilePath)) { + throw new Error(`File does not exist: ${this.absoluteFilePath}.`); + } + } + + /** + * Produces a stream that conforms to the shape expected + * by the POST /repos/{owner}/{repo}/git/blobs GitHub API + * + * For example, streams produced by this class will resolve to a shape like: + * { + * "encoding": "base64", + * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" + * } + * + * See: https://docs.github.com/rest/reference/git#create-a-blob + */ + get stream(): Readable { + // Produces the JSON body as a stream, so that we don't have to read ( + // potentially very large) files into memory + return new MultiStream([ + Readable.from('{"encoding":"base64","content":"'), + fs.createReadStream(this.absoluteFilePath).pipe(base64Transformer), + Readable.from('"}'), + ]); + } + + async save(): Promise { + const response = await this.github.post( + `/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, + this.stream + ); + this.sha = response.data.sha; + core.debug(`Sha for blob ${this.file}: ${this.sha}.`); + } +} + +export interface Options { + /** Optional. Default base dir to use when expanding a set of files. */ + baseDir?: string; +} + +export function getBlobsFromFiles( + files: string, + options: Options = {} +): Blob[] { + const { baseDir } = options; + return files + .trim() + .split("\n") + .map((file) => new Blob(baseDir, file)); +} diff --git a/lib/create-blob-request-body-streams.ts b/lib/create-blob-request-body-streams.ts deleted file mode 100644 index 595e0a8..0000000 --- a/lib/create-blob-request-body-streams.ts +++ /dev/null @@ -1,63 +0,0 @@ -import * as fs from "fs"; -import { Readable, Transform } from "stream"; -import { join } from "path"; -import * as MultiStream from "multistream"; - -/** - * Encodes chunks in a stream to base64 - */ -const base64Transformer = new Transform({ - transform(chunk, encoding, callback) { - this.push(chunk.toString("base64")); - callback(); - }, -}); - -/** - * Produces a stream that conforms to the shape expected - * by the POST /repos/{owner}/{repo}/git/blobs GitHub API - * - * For example, streams produced by this class will resolve to a shape like: - * { - * "encoding": "base64", - * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" - * } - * - * See: https://docs.github.com/rest/reference/git#create-a-blob - */ -export class CreateBlobRequestBodyStream extends MultiStream { - readonly absoluteFilePath: string; - - constructor(absoluteFilePath: string, opts = {}) { - // Produces the JSON body as a stream, so that we don't have to read ( - // potentially very large) files into memory - super( - [ - Readable.from('{"encoding":"base64","content":"'), - fs.createReadStream(absoluteFilePath).pipe(base64Transformer), - Readable.from('"}'), - ], - opts - ); - - this.absoluteFilePath = absoluteFilePath; - } -} - -export interface Options { - /** Optional. Default base dir to use when expanding a set of files. */ - baseDir?: string; -} - -export default function getCreateBlobRequestBodyStreams( - files: string, - options: Options = {} -): Array { - const { baseDir } = options; - return files - .trim() - .split("\n") - .map((file) => join(baseDir, file)) - .filter((file) => fs.existsSync(file)) - .map((file) => new CreateBlobRequestBodyStream(file)); -} diff --git a/lib/resource.ts b/lib/resource.ts new file mode 100644 index 0000000..36c8216 --- /dev/null +++ b/lib/resource.ts @@ -0,0 +1,9 @@ +import { AxiosInstance } from "axios"; +import github from "./github-client"; + +export default class Resource { + protected github: AxiosInstance; + constructor() { + this.github = github; + } +} From d97b989f79f4f007125bea3a83f60bb53165aba9 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 14:52:27 -0600 Subject: [PATCH 65/97] Rebuild dist --- dist/index.js | 148 +++++++++++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 62 deletions(-) diff --git a/dist/index.js b/dist/index.js index ab09c89..9b2cfce 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7939,7 +7939,7 @@ module.exports = __webpack_require__(1669).deprecate; /***/ }), -/***/ 345: +/***/ 130: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -7973,7 +7973,44 @@ var external_stream_ = __webpack_require__(2413); var external_path_ = __webpack_require__(5622); // EXTERNAL MODULE: ./node_modules/multistream/index.js var multistream = __webpack_require__(7999); -// CONCATENATED MODULE: ./lib/create-blob-request-body-streams.ts +// EXTERNAL MODULE: ./node_modules/axios/index.js +var axios = __webpack_require__(6545); +var axios_default = /*#__PURE__*/__webpack_require__.n(axios); + +// CONCATENATED MODULE: ./lib/github-client.ts + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const pkg = __webpack_require__(306); +const github = axios_default().create({ + baseURL: `https://api.github.com/`, + headers: { + accept: `application/vnd.github.v3+json`, + authorization: `bearer ${process.env.GH_TOKEN}`, + "user-agent": `${pkg.name}/${pkg.version}`, + }, +}); +/* harmony default export */ const github_client = (github); + +// CONCATENATED MODULE: ./lib/resource.ts + +class Resource { + constructor() { + this.github = github_client; + } +} + +// CONCATENATED MODULE: ./lib/blob.ts +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + @@ -7987,60 +8024,56 @@ const base64Transformer = new external_stream_.Transform({ callback(); }, }); -/** - * Produces a stream that conforms to the shape expected - * by the POST /repos/{owner}/{repo}/git/blobs GitHub API - * - * For example, streams produced by this class will resolve to a shape like: - * { - * "encoding": "base64", - * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" - * } - * - * See: https://docs.github.com/rest/reference/git#create-a-blob - */ -class CreateBlobRequestBodyStream extends multistream { - constructor(absoluteFilePath, opts = {}) { +class Blob extends Resource { + constructor(baseDir, file) { + super(); + this.baseDir = baseDir; + this.file = file; + this.absoluteFilePath = (0,external_path_.join)(baseDir, file); + // Reject files that don't exist + if (!external_fs_.existsSync(this.absoluteFilePath)) { + throw new Error(`File does not exist: ${this.absoluteFilePath}.`); + } + } + /** + * Produces a stream that conforms to the shape expected + * by the POST /repos/{owner}/{repo}/git/blobs GitHub API + * + * For example, streams produced by this class will resolve to a shape like: + * { + * "encoding": "base64", + * "content": "SGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLg==" + * } + * + * See: https://docs.github.com/rest/reference/git#create-a-blob + */ + get stream() { // Produces the JSON body as a stream, so that we don't have to read ( // potentially very large) files into memory - super([ + return new multistream([ external_stream_.Readable.from('{"encoding":"base64","content":"'), - external_fs_.createReadStream(absoluteFilePath).pipe(base64Transformer), + external_fs_.createReadStream(this.absoluteFilePath).pipe(base64Transformer), external_stream_.Readable.from('"}'), - ], opts); - this.absoluteFilePath = absoluteFilePath; + ]); + } + save() { + return __awaiter(this, void 0, void 0, function* () { + const response = yield this.github.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, this.stream); + this.sha = response.data.sha; + core.debug(`Sha for blob ${this.file}: ${this.sha}.`); + }); } } -function getCreateBlobRequestBodyStreams(files, options = {}) { +function getBlobsFromFiles(files, options = {}) { const { baseDir } = options; return files .trim() .split("\n") - .map((file) => (0,external_path_.join)(baseDir, file)) - .filter((file) => external_fs_.existsSync(file)) - .map((file) => new CreateBlobRequestBodyStream(file)); + .map((file) => new Blob(baseDir, file)); } -// EXTERNAL MODULE: ./node_modules/axios/index.js -var axios = __webpack_require__(6545); -var axios_default = /*#__PURE__*/__webpack_require__.n(axios); - -// CONCATENATED MODULE: ./lib/github-client.ts - -// eslint-disable-next-line @typescript-eslint/no-var-requires -const pkg = __webpack_require__(306); -const github = axios_default().create({ - baseURL: `https://api.github.com/`, - headers: { - accept: `application/vnd.github.v3+json`, - authorization: `bearer ${process.env.GH_TOKEN}`, - "user-agent": `${pkg.name}/${pkg.version}`, - }, -}); -/* harmony default export */ const github_client = (github); - // CONCATENATED MODULE: ./index.ts -var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { +var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -8059,10 +8092,9 @@ var __asyncValues = (undefined && undefined.__asyncValues) || function (o) { - function run() { var e_1, _a; - return __awaiter(this, void 0, void 0, function* () { + return index_awaiter(this, void 0, void 0, function* () { try { // Get inputs const files = getInput("files"); @@ -8071,31 +8103,23 @@ function run() { }); const commitMessage = getInput("commit-message"); const ref = getInput("ref", { default: null }); - // Expand files to an array of 'create blob request body' streams - // We will use this array to efficiently stream file contents to GitHub's - // create blobs API - const streams = getCreateBlobRequestBodyStreams(files, { baseDir }); - core.debug(`Received ${streams.length} stream${streams.length === 1 ? "" : "s"}: ${streams.map((stream) => stream.absoluteFilePath).join(", ")}`); - // Create blobs using Git database API - const blobs = []; + // Expand files to an array of "blobs", which will be created on GitHub via the create blob API + const blobs = getBlobsFromFiles(files, { baseDir }); + core.debug(`Received ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}`); try { - for (var streams_1 = __asyncValues(streams), streams_1_1; streams_1_1 = yield streams_1.next(), !streams_1_1.done;) { - const stream = streams_1_1.value; - const response = yield github_client.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, stream); - blobs.push({ - path: stream.absoluteFilePath, - sha: response.data.sha, - }); + // Save all the blobs, on GitHub + for (var blobs_1 = __asyncValues(blobs), blobs_1_1; blobs_1_1 = yield blobs_1.next(), !blobs_1_1.done;) { + const blob = blobs_1_1.value; + yield blob.save(); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { - if (streams_1_1 && !streams_1_1.done && (_a = streams_1.return)) yield _a.call(streams_1); + if (blobs_1_1 && !blobs_1_1.done && (_a = blobs_1.return)) yield _a.call(blobs_1); } finally { if (e_1) throw e_1.error; } } - core.debug(`Created ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${JSON.stringify(blobs, null, 4)}`); // TODO // Create tree // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees @@ -8314,6 +8338,6 @@ module.exports = require("zlib");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(345); +/******/ return __webpack_require__(130); /******/ })() ; \ No newline at end of file From 0339582a9aa9608376d26a871bb5e4f16d3bb809 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 16:45:10 -0600 Subject: [PATCH 66/97] Add mode property to blobs --- lib/blob.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/blob.ts b/lib/blob.ts index 7d7d86a..043fa84 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -17,6 +17,7 @@ const base64Transformer = new Transform({ export class Blob extends Resource { readonly absoluteFilePath: string; + readonly mode: string; sha: string; constructor(readonly baseDir: string, readonly file: string) { @@ -26,6 +27,8 @@ export class Blob extends Resource { if (!fs.existsSync(this.absoluteFilePath)) { throw new Error(`File does not exist: ${this.absoluteFilePath}.`); } + // Set the file's mode, this should be represented as an octal string + this.mode = fs.statSync(this.absoluteFilePath).mode.toString(8); } /** From 99750e93ecbafe35b67f491a3d91987880a024fc Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 17:12:45 -0600 Subject: [PATCH 67/97] Load repository to get default branch ref --- index.ts | 22 +++++++++++----------- lib/blob.ts | 13 ++++++++++--- lib/repo.ts | 17 +++++++++++++++++ lib/resource.ts | 9 ++++++++- lib/tree.ts | 22 ++++++++++++++++++++++ 5 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 lib/repo.ts create mode 100644 lib/tree.ts diff --git a/index.ts b/index.ts index 834971a..c51df34 100644 --- a/index.ts +++ b/index.ts @@ -1,35 +1,35 @@ import * as core from "@actions/core"; import getInput from "./lib/input"; +import { Repo } from "./lib/repo"; import { getBlobsFromFiles } from "./lib/blob"; -import github from "./lib/github-client"; +import { Tree } from "./lib/tree"; export default async function run(): Promise { try { + // Get repo + const repo = new Repo(process.env.GITHUB_REPOSITORY); + await repo.load(); + // Get inputs const files = getInput("files"); const baseDir = getInput("workspace", { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); - const ref = getInput("ref", { default: null }); + const ref = getInput("ref", { default: repo.defaultBranchRef }); // Expand files to an array of "blobs", which will be created on GitHub via the create blob API - const blobs = getBlobsFromFiles(files, { baseDir }); + const blobs = getBlobsFromFiles(repo, files, { baseDir }); core.debug( `Received ${blobs.length} blob${ blobs.length === 1 ? "" : "s" }: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}` ); - // Save all the blobs, on GitHub - for await (const blob of blobs) { - await blob.save(); - } - - // TODO - // Create tree - // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + // Create a tree + const tree: Tree = new Tree(repo, blobs); + await tree.save(); // TODO // Create commit diff --git a/lib/blob.ts b/lib/blob.ts index 043fa84..6dd57da 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -4,6 +4,7 @@ import { join } from "path"; import * as core from "@actions/core"; import * as MultiStream from "multistream"; import Resource from "./resource"; +import { Repo } from "./repo"; /** * Encodes chunks in a stream to base64 @@ -16,11 +17,16 @@ const base64Transformer = new Transform({ }); export class Blob extends Resource { + readonly type: string = "blob"; readonly absoluteFilePath: string; readonly mode: string; sha: string; - constructor(readonly baseDir: string, readonly file: string) { + constructor( + readonly repo: Repo, + readonly baseDir: string, + readonly file: string + ) { super(); this.absoluteFilePath = join(baseDir, file); // Reject files that don't exist @@ -55,7 +61,7 @@ export class Blob extends Resource { async save(): Promise { const response = await this.github.post( - `/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, + `/repos/${this.repo.nameWithOwner}/git/blobs`, this.stream ); this.sha = response.data.sha; @@ -69,6 +75,7 @@ export interface Options { } export function getBlobsFromFiles( + repo: Repo, files: string, options: Options = {} ): Blob[] { @@ -76,5 +83,5 @@ export function getBlobsFromFiles( return files .trim() .split("\n") - .map((file) => new Blob(baseDir, file)); + .map((file) => new Blob(repo, baseDir, file)); } diff --git a/lib/repo.ts b/lib/repo.ts new file mode 100644 index 0000000..9075804 --- /dev/null +++ b/lib/repo.ts @@ -0,0 +1,17 @@ +import Resource from "./resource"; + +export class Repo extends Resource { + defaultBranchRef: string; + constructor(readonly nameWithOwner: string) { + super(); + } + + async save(): Promise { + throw new Error("Not implemented"); + } + + async load(): Promise { + const response = await this.github.get(`/repos/${this.nameWithOwner}`); + this.defaultBranchRef = response.data.default_branch; + } +} diff --git a/lib/resource.ts b/lib/resource.ts index 36c8216..aefa65b 100644 --- a/lib/resource.ts +++ b/lib/resource.ts @@ -1,9 +1,16 @@ import { AxiosInstance } from "axios"; import github from "./github-client"; -export default class Resource { +export interface Saveable { + save(): Promise; +} + +export default abstract class Resource implements Saveable { protected github: AxiosInstance; + private route: string; constructor() { this.github = github; } + + abstract save(): Promise; } diff --git a/lib/tree.ts b/lib/tree.ts new file mode 100644 index 0000000..7d31e1e --- /dev/null +++ b/lib/tree.ts @@ -0,0 +1,22 @@ +import Resource from "./resource"; + +import { Repo } from "./repo"; +import { Blob } from "./blob"; + +export class Tree extends Resource { + blobs: Blob[]; + constructor(repo: Repo, blobs: Blob[]) { + super(); + this.blobs = blobs; + } + + async save(): Promise { + // Save all the blobs + for await (const blob of this.blobs) { + await blob.save(); + } + + // Save the tree + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + } +} From 947186c0abd8b3077716da55a4ed7bbe5f8dcfac Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 17:13:59 -0600 Subject: [PATCH 68/97] Rebuild dist --- dist/index.js | 136 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 98 insertions(+), 38 deletions(-) diff --git a/dist/index.js b/dist/index.js index 9b2cfce..a95302d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7939,7 +7939,7 @@ module.exports = __webpack_require__(1669).deprecate; /***/ }), -/***/ 130: +/***/ 9598: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -7965,14 +7965,6 @@ function getInput(name, options = {}) { return value; } -// EXTERNAL MODULE: external "fs" -var external_fs_ = __webpack_require__(5747); -// EXTERNAL MODULE: external "stream" -var external_stream_ = __webpack_require__(2413); -// EXTERNAL MODULE: external "path" -var external_path_ = __webpack_require__(5622); -// EXTERNAL MODULE: ./node_modules/multistream/index.js -var multistream = __webpack_require__(7999); // EXTERNAL MODULE: ./node_modules/axios/index.js var axios = __webpack_require__(6545); var axios_default = /*#__PURE__*/__webpack_require__.n(axios); @@ -7999,7 +7991,7 @@ class Resource { } } -// CONCATENATED MODULE: ./lib/blob.ts +// CONCATENATED MODULE: ./lib/repo.ts var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -8010,6 +8002,43 @@ var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _argume }); }; +class Repo extends Resource { + constructor(nameWithOwner) { + super(); + this.nameWithOwner = nameWithOwner; + } + save() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error("Not implemented"); + }); + } + load() { + return __awaiter(this, void 0, void 0, function* () { + const response = yield this.github.get(`/repos/${this.nameWithOwner}`); + this.defaultBranchRef = response.data.default_branch; + }); + } +} + +// EXTERNAL MODULE: external "fs" +var external_fs_ = __webpack_require__(5747); +// EXTERNAL MODULE: external "stream" +var external_stream_ = __webpack_require__(2413); +// EXTERNAL MODULE: external "path" +var external_path_ = __webpack_require__(5622); +// EXTERNAL MODULE: ./node_modules/multistream/index.js +var multistream = __webpack_require__(7999); +// CONCATENATED MODULE: ./lib/blob.ts +var blob_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + @@ -8025,15 +8054,19 @@ const base64Transformer = new external_stream_.Transform({ }, }); class Blob extends Resource { - constructor(baseDir, file) { + constructor(repo, baseDir, file) { super(); + this.repo = repo; this.baseDir = baseDir; this.file = file; + this.type = "blob"; this.absoluteFilePath = (0,external_path_.join)(baseDir, file); // Reject files that don't exist if (!external_fs_.existsSync(this.absoluteFilePath)) { throw new Error(`File does not exist: ${this.absoluteFilePath}.`); } + // Set the file's mode, this should be represented as an octal string + this.mode = external_fs_.statSync(this.absoluteFilePath).mode.toString(8); } /** * Produces a stream that conforms to the shape expected @@ -8057,23 +8090,23 @@ class Blob extends Resource { ]); } save() { - return __awaiter(this, void 0, void 0, function* () { - const response = yield this.github.post(`/repos/${process.env.GITHUB_REPOSITORY}/git/blobs`, this.stream); + return blob_awaiter(this, void 0, void 0, function* () { + const response = yield this.github.post(`/repos/${this.repo.nameWithOwner}/git/blobs`, this.stream); this.sha = response.data.sha; core.debug(`Sha for blob ${this.file}: ${this.sha}.`); }); } } -function getBlobsFromFiles(files, options = {}) { +function getBlobsFromFiles(repo, files, options = {}) { const { baseDir } = options; return files .trim() .split("\n") - .map((file) => new Blob(baseDir, file)); + .map((file) => new Blob(repo, baseDir, file)); } -// CONCATENATED MODULE: ./index.ts -var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { +// CONCATENATED MODULE: ./lib/tree.ts +var tree_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } @@ -8090,39 +8123,66 @@ var __asyncValues = (undefined && undefined.__asyncValues) || function (o) { function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } }; +class Tree extends Resource { + constructor(repo, blobs) { + super(); + this.blobs = blobs; + } + save() { + var e_1, _a; + return tree_awaiter(this, void 0, void 0, function* () { + try { + // Save all the blobs + for (var _b = __asyncValues(this.blobs), _c; _c = yield _b.next(), !_c.done;) { + const blob = _c.value; + yield blob.save(); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) yield _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + }); + } +} + +// CONCATENATED MODULE: ./index.ts +var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + function run() { - var e_1, _a; return index_awaiter(this, void 0, void 0, function* () { try { + // Get repo + const repo = new Repo(process.env.GITHUB_REPOSITORY); + yield repo.load(); // Get inputs const files = getInput("files"); const baseDir = getInput("workspace", { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); - const ref = getInput("ref", { default: null }); + const ref = getInput("ref", { default: repo.defaultBranchRef }); // Expand files to an array of "blobs", which will be created on GitHub via the create blob API - const blobs = getBlobsFromFiles(files, { baseDir }); + const blobs = getBlobsFromFiles(repo, files, { baseDir }); core.debug(`Received ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}`); - try { - // Save all the blobs, on GitHub - for (var blobs_1 = __asyncValues(blobs), blobs_1_1; blobs_1_1 = yield blobs_1.next(), !blobs_1_1.done;) { - const blob = blobs_1_1.value; - yield blob.save(); - } - } - catch (e_1_1) { e_1 = { error: e_1_1 }; } - finally { - try { - if (blobs_1_1 && !blobs_1_1.done && (_a = blobs_1.return)) yield _a.call(blobs_1); - } - finally { if (e_1) throw e_1.error; } - } - // TODO - // Create tree - // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + // Create a tree + const tree = new Tree(repo, blobs); + yield tree.save(); // TODO // Create commit // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits @@ -8338,6 +8398,6 @@ module.exports = require("zlib");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(130); +/******/ return __webpack_require__(9598); /******/ })() ; \ No newline at end of file From 5b60278e1f63a957f316521e65b57f6a1b90bbdd Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 18:59:20 -0600 Subject: [PATCH 69/97] Give debug capabilities to Resource --- lib/blob.ts | 3 +-- lib/resource.ts | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/blob.ts b/lib/blob.ts index 6dd57da..a5be7db 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -1,7 +1,6 @@ import * as fs from "fs"; import { Readable, Transform } from "stream"; import { join } from "path"; -import * as core from "@actions/core"; import * as MultiStream from "multistream"; import Resource from "./resource"; import { Repo } from "./repo"; @@ -65,7 +64,7 @@ export class Blob extends Resource { this.stream ); this.sha = response.data.sha; - core.debug(`Sha for blob ${this.file}: ${this.sha}.`); + this.debug(`Sha for blob ${this.file}: ${this.sha}.`); } } diff --git a/lib/resource.ts b/lib/resource.ts index aefa65b..d4dc7bd 100644 --- a/lib/resource.ts +++ b/lib/resource.ts @@ -1,4 +1,6 @@ -import { AxiosInstance } from "axios"; +import { AxiosInstance, AxiosResponse } from "axios"; +import * as core from "@actions/core"; + import github from "./github-client"; export interface Saveable { @@ -6,9 +8,11 @@ export interface Saveable { } export default abstract class Resource implements Saveable { + protected debug: (message: string) => void; protected github: AxiosInstance; private route: string; constructor() { + this.debug = core.debug; this.github = github; } From bf2c50808a496e74cbb7ac52986dcddb388e8280 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 19:17:08 -0600 Subject: [PATCH 70/97] Load ref details --- index.ts | 9 ++++++++- lib/ref.ts | 38 ++++++++++++++++++++++++++++++++++++++ lib/repo.ts | 5 +++++ lib/resource.ts | 11 +++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 lib/ref.ts diff --git a/index.ts b/index.ts index c51df34..8b319e7 100644 --- a/index.ts +++ b/index.ts @@ -2,6 +2,7 @@ import * as core from "@actions/core"; import getInput from "./lib/input"; import { Repo } from "./lib/repo"; +import { Ref } from "./lib/ref"; import { getBlobsFromFiles } from "./lib/blob"; import { Tree } from "./lib/tree"; @@ -17,7 +18,13 @@ export default async function run(): Promise { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); - const ref = getInput("ref", { default: repo.defaultBranchRef }); + + // Load ref details + const ref = new Ref( + repo, + getInput("ref", { default: repo.defaultBranchRef }) + ); + await ref.load(); // Expand files to an array of "blobs", which will be created on GitHub via the create blob API const blobs = getBlobsFromFiles(repo, files, { baseDir }); diff --git a/lib/ref.ts b/lib/ref.ts new file mode 100644 index 0000000..67cdba6 --- /dev/null +++ b/lib/ref.ts @@ -0,0 +1,38 @@ +import Resource from "./resource"; +import { Repo } from "./repo"; + +export class Ref extends Resource { + private prefix: string; + private commitOid: string; + private treeOid: string; + constructor(readonly repo: Repo, readonly ref: string) { + super(); + } + + async save(): Promise { + throw new Error("Not implemented"); + } + + async load(): Promise { + const response = await this.graphql( + `query inspectRef($owner: String!, $name: String!, $ref: String!) { + repository(owner: $owner, name: $name) { + ref(qualifiedName: $ref) { + name + prefix + commit: target { + ... on Commit { + oid + tree { + oid + } + } + } + } + } + }`, + { owner: this.repo.owner, name: this.repo.name, ref: this.ref } + ); + this.debug(JSON.stringify(response.data, null, 4)); + } +} diff --git a/lib/repo.ts b/lib/repo.ts index 9075804..fa198b9 100644 --- a/lib/repo.ts +++ b/lib/repo.ts @@ -1,9 +1,14 @@ import Resource from "./resource"; export class Repo extends Resource { + readonly owner: string; + readonly name: string; defaultBranchRef: string; constructor(readonly nameWithOwner: string) { super(); + const [owner, name] = this.nameWithOwner.split("/"); + this.owner = owner; + this.name = name; } async save(): Promise { diff --git a/lib/resource.ts b/lib/resource.ts index d4dc7bd..4f65260 100644 --- a/lib/resource.ts +++ b/lib/resource.ts @@ -16,5 +16,16 @@ export default abstract class Resource implements Saveable { this.github = github; } + protected graphql( + query: string, + variables: Record + ): Promise> { + const body: Record = { + query, + variables, + }; + return this.github.post(`/graphql`, body); + } + abstract save(): Promise; } From 920f082cdaa5fee55a86645856c74cc5fa0bc284 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 19:48:29 -0600 Subject: [PATCH 71/97] Extract and preserve ref details --- lib/ref.ts | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/ref.ts b/lib/ref.ts index 67cdba6..22ef931 100644 --- a/lib/ref.ts +++ b/lib/ref.ts @@ -3,6 +3,7 @@ import { Repo } from "./repo"; export class Ref extends Resource { private prefix: string; + private name: string; private commitOid: string; private treeOid: string; constructor(readonly repo: Repo, readonly ref: string) { @@ -13,7 +14,28 @@ export class Ref extends Resource { throw new Error("Not implemented"); } + get fullyQualifiedName(): string { + return this.prefix + this.name; + } + async load(): Promise { + type ResponseShape = { + data: { + repository: { + ref: { + name: string; + prefix: string; + commit: { + oid: string; + tree: { + oid: string; + }; + }; + }; + }; + }; + }; + const response = await this.graphql( `query inspectRef($owner: String!, $name: String!, $ref: String!) { repository(owner: $owner, name: $name) { @@ -33,6 +55,12 @@ export class Ref extends Resource { }`, { owner: this.repo.owner, name: this.repo.name, ref: this.ref } ); - this.debug(JSON.stringify(response.data, null, 4)); + this.name = (response.data as ResponseShape).data.repository.ref.name; + this.prefix = (response.data as ResponseShape).data.repository.ref.prefix; + this.commitOid = (response.data as ResponseShape).data.repository.ref.commit.oid; + this.treeOid = (response.data as ResponseShape).data.repository.ref.commit.tree.oid; + this.debug( + `Ref: ${this.fullyQualifiedName}, prefix: ${this.prefix}, commitOid: ${this.commitOid}, treeOid: ${this.treeOid}` + ); } } From 8f66d9170a6398224ebabd55dabcbf23e3cd8297 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 19:49:39 -0600 Subject: [PATCH 72/97] Rebuild dist --- dist/index.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/dist/index.js b/dist/index.js index a95302d..8b2470b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7939,7 +7939,7 @@ module.exports = __webpack_require__(1669).deprecate; /***/ }), -/***/ 9598: +/***/ 6028: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -7985,10 +7985,19 @@ const github = axios_default().create({ // CONCATENATED MODULE: ./lib/resource.ts + class Resource { constructor() { + this.debug = core.debug; this.github = github_client; } + graphql(query, variables) { + const body = { + query, + variables, + }; + return this.github.post(`/graphql`, body); + } } // CONCATENATED MODULE: ./lib/repo.ts @@ -8006,6 +8015,9 @@ class Repo extends Resource { constructor(nameWithOwner) { super(); this.nameWithOwner = nameWithOwner; + const [owner, name] = this.nameWithOwner.split("/"); + this.owner = owner; + this.name = name; } save() { return __awaiter(this, void 0, void 0, function* () { @@ -8020,6 +8032,58 @@ class Repo extends Resource { } } +// CONCATENATED MODULE: ./lib/ref.ts +var ref_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +class Ref extends Resource { + constructor(repo, ref) { + super(); + this.repo = repo; + this.ref = ref; + } + save() { + return ref_awaiter(this, void 0, void 0, function* () { + throw new Error("Not implemented"); + }); + } + get fullyQualifiedName() { + return this.prefix + this.name; + } + load() { + return ref_awaiter(this, void 0, void 0, function* () { + const response = yield this.graphql(`query inspectRef($owner: String!, $name: String!, $ref: String!) { + repository(owner: $owner, name: $name) { + ref(qualifiedName: $ref) { + name + prefix + commit: target { + ... on Commit { + oid + tree { + oid + } + } + } + } + } + }`, { owner: this.repo.owner, name: this.repo.name, ref: this.ref }); + this.name = response.data.data.repository.ref.name; + this.prefix = response.data.data.repository.ref.prefix; + this.commitOid = response.data.data.repository.ref.commit.oid; + this.treeOid = response.data.data.repository.ref.commit.tree.oid; + this.debug(`Ref: ${this.fullyQualifiedName}, prefix: ${this.prefix}, commitOid: ${this.commitOid}, treeOid: ${this.treeOid}`); + }); + } +} + // EXTERNAL MODULE: external "fs" var external_fs_ = __webpack_require__(5747); // EXTERNAL MODULE: external "stream" @@ -8043,7 +8107,6 @@ var blob_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arg - /** * Encodes chunks in a stream to base64 */ @@ -8093,7 +8156,7 @@ class Blob extends Resource { return blob_awaiter(this, void 0, void 0, function* () { const response = yield this.github.post(`/repos/${this.repo.nameWithOwner}/git/blobs`, this.stream); this.sha = response.data.sha; - core.debug(`Sha for blob ${this.file}: ${this.sha}.`); + this.debug(`Sha for blob ${this.file}: ${this.sha}.`); }); } } @@ -8164,6 +8227,7 @@ var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _ar + function run() { return index_awaiter(this, void 0, void 0, function* () { try { @@ -8176,7 +8240,9 @@ function run() { default: process.env.GITHUB_WORKSPACE, }); const commitMessage = getInput("commit-message"); - const ref = getInput("ref", { default: repo.defaultBranchRef }); + // Load ref details + const ref = new Ref(repo, getInput("ref", { default: repo.defaultBranchRef })); + yield ref.load(); // Expand files to an array of "blobs", which will be created on GitHub via the create blob API const blobs = getBlobsFromFiles(repo, files, { baseDir }); core.debug(`Received ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}`); @@ -8398,6 +8464,6 @@ module.exports = require("zlib");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(9598); +/******/ return __webpack_require__(6028); /******/ })() ; \ No newline at end of file From 7cfb32f5df613decf9d7cad1512234dcb3902dcd Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 20:06:07 -0600 Subject: [PATCH 73/97] Save the tree --- index.ts | 2 +- lib/blob.ts | 4 ++++ lib/ref.ts | 9 +++++---- lib/tree.ts | 27 ++++++++++++++++++++++++--- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/index.ts b/index.ts index 8b319e7..d7c7ca2 100644 --- a/index.ts +++ b/index.ts @@ -35,7 +35,7 @@ export default async function run(): Promise { ); // Create a tree - const tree: Tree = new Tree(repo, blobs); + const tree: Tree = new Tree(repo, blobs, ref.treeOid); await tree.save(); // TODO diff --git a/lib/blob.ts b/lib/blob.ts index a5be7db..5674a45 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -58,6 +58,10 @@ export class Blob extends Resource { ]); } + get path(): string { + return this.file; + } + async save(): Promise { const response = await this.github.post( `/repos/${this.repo.nameWithOwner}/git/blobs`, diff --git a/lib/ref.ts b/lib/ref.ts index 22ef931..ece7994 100644 --- a/lib/ref.ts +++ b/lib/ref.ts @@ -2,10 +2,11 @@ import Resource from "./resource"; import { Repo } from "./repo"; export class Ref extends Resource { - private prefix: string; - private name: string; - private commitOid: string; - private treeOid: string; + prefix: string; + name: string; + commitOid: string; + treeOid: string; + constructor(readonly repo: Repo, readonly ref: string) { super(); } diff --git a/lib/tree.ts b/lib/tree.ts index 7d31e1e..b3b1046 100644 --- a/lib/tree.ts +++ b/lib/tree.ts @@ -4,10 +4,14 @@ import { Repo } from "./repo"; import { Blob } from "./blob"; export class Tree extends Resource { - blobs: Blob[]; - constructor(repo: Repo, blobs: Blob[]) { + sha: string; + + constructor( + readonly repo: Repo, + readonly blobs: Blob[], + readonly parentOid?: string + ) { super(); - this.blobs = blobs; } async save(): Promise { @@ -18,5 +22,22 @@ export class Tree extends Resource { // Save the tree // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + const response = await this.github.post( + `repos/${this.repo.nameWithOwner}/git/trees`, + { + tree: this.blobs.map((blob) => { + return { + path: blob.path, + mode: blob.mode, + type: blob.type, + sha: blob.sha, + }; + }), + base_tree: this.parentOid, + } + ); + + this.sha = response.data.sha; + this.debug(`Tree: ${this.sha}`); } } From 97a05ff4c2c95484d2f849e416c30c41d260a610 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 20:06:24 -0600 Subject: [PATCH 74/97] Rebuild dist --- dist/index.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 8b2470b..1b0f1b3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -8152,6 +8152,9 @@ class Blob extends Resource { external_stream_.Readable.from('"}'), ]); } + get path() { + return this.file; + } save() { return blob_awaiter(this, void 0, void 0, function* () { const response = yield this.github.post(`/repos/${this.repo.nameWithOwner}/git/blobs`, this.stream); @@ -8187,9 +8190,11 @@ var __asyncValues = (undefined && undefined.__asyncValues) || function (o) { }; class Tree extends Resource { - constructor(repo, blobs) { + constructor(repo, blobs, parentOid) { super(); + this.repo = repo; this.blobs = blobs; + this.parentOid = parentOid; } save() { var e_1, _a; @@ -8208,6 +8213,21 @@ class Tree extends Resource { } finally { if (e_1) throw e_1.error; } } + // Save the tree + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/trees + const response = yield this.github.post(`repos/${this.repo.nameWithOwner}/git/trees`, { + tree: this.blobs.map((blob) => { + return { + path: blob.path, + mode: blob.mode, + type: blob.type, + sha: blob.sha, + }; + }), + base_tree: this.parentOid, + }); + this.sha = response.data.sha; + this.debug(`Tree: ${this.sha}`); }); } } @@ -8247,7 +8267,7 @@ function run() { const blobs = getBlobsFromFiles(repo, files, { baseDir }); core.debug(`Received ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}`); // Create a tree - const tree = new Tree(repo, blobs); + const tree = new Tree(repo, blobs, ref.treeOid); yield tree.save(); // TODO // Create commit From 6f45116287ecf0dda42f9a6ac9fe6274c3877c6c Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 20:19:07 -0600 Subject: [PATCH 75/97] Create commit --- index.ts | 11 ++++++++--- lib/commit.ts | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 lib/commit.ts diff --git a/index.ts b/index.ts index d7c7ca2..d824f55 100644 --- a/index.ts +++ b/index.ts @@ -5,6 +5,7 @@ import { Repo } from "./lib/repo"; import { Ref } from "./lib/ref"; import { getBlobsFromFiles } from "./lib/blob"; import { Tree } from "./lib/tree"; +import { Commit } from "./lib/commit"; export default async function run(): Promise { try { @@ -36,11 +37,15 @@ export default async function run(): Promise { // Create a tree const tree: Tree = new Tree(repo, blobs, ref.treeOid); - await tree.save(); - // TODO // Create commit - // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + const commit: Commit = new Commit(repo, tree, commitMessage, [ + ref.commitOid, + ]); + await commit.save(); + + // Set commit sha output + core.setOutput("commit-sha", commit.sha); // TODO // Update ref diff --git a/lib/commit.ts b/lib/commit.ts new file mode 100644 index 0000000..9dac567 --- /dev/null +++ b/lib/commit.ts @@ -0,0 +1,34 @@ +import Resource from "./resource"; +import { Repo } from "./repo"; +import { Tree } from "./tree"; + +export class Commit extends Resource { + sha: string; + constructor( + readonly repo: Repo, + readonly tree: Tree, + readonly message: string, + readonly parents: string[] + ) { + super(); + } + + async save(): Promise { + // Save the tree first + await this.tree.save(); + + // Save the commit + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + const response = await this.github.post( + `/repos/${this.repo.nameWithOwner}/git/commits`, + { + message: this.message, + tree: this.tree.sha, + parents: this.parents, + } + ); + + this.sha = response.data.sha; + this.debug(`Commit: ${this.sha}`); + } +} From e6a63edf28117e93317b5886d4a88ced156e003f Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Thu, 10 Dec 2020 20:19:43 -0600 Subject: [PATCH 76/97] Rebuild dist --- dist/index.js | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/dist/index.js b/dist/index.js index 1b0f1b3..d40bb3c 100644 --- a/dist/index.js +++ b/dist/index.js @@ -7939,7 +7939,7 @@ module.exports = __webpack_require__(1669).deprecate; /***/ }), -/***/ 6028: +/***/ 5627: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -8232,6 +8232,42 @@ class Tree extends Resource { } } +// CONCATENATED MODULE: ./lib/commit.ts +var commit_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +class Commit extends Resource { + constructor(repo, tree, message, parents) { + super(); + this.repo = repo; + this.tree = tree; + this.message = message; + this.parents = parents; + } + save() { + return commit_awaiter(this, void 0, void 0, function* () { + // Save the tree first + yield this.tree.save(); + // Save the commit + // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + const response = yield this.github.post(`/repos/${this.repo.nameWithOwner}/git/commits`, { + message: this.message, + tree: this.tree.sha, + parents: this.parents, + }); + this.sha = response.data.sha; + this.debug(`Commit: ${this.sha}`); + }); + } +} + // CONCATENATED MODULE: ./index.ts var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } @@ -8248,6 +8284,7 @@ var index_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _ar + function run() { return index_awaiter(this, void 0, void 0, function* () { try { @@ -8268,10 +8305,13 @@ function run() { core.debug(`Received ${blobs.length} blob${blobs.length === 1 ? "" : "s"}: ${blobs.map((blob) => blob.absoluteFilePath).join(", ")}`); // Create a tree const tree = new Tree(repo, blobs, ref.treeOid); - yield tree.save(); - // TODO // Create commit - // Via: POST https://api.github.com/repos/$GITHUB_REPOSITORY/git/commits + const commit = new Commit(repo, tree, commitMessage, [ + ref.commitOid, + ]); + yield commit.save(); + // Set commit sha output + core.setOutput("commit-sha", commit.sha); // TODO // Update ref // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF @@ -8484,6 +8524,6 @@ module.exports = require("zlib");; /******/ // module exports must be returned from runtime so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ return __webpack_require__(6028); +/******/ return __webpack_require__(5627); /******/ })() ; \ No newline at end of file From 1ee70feaaad919d229faeba33be0f325f6a1afaa Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:05:39 -0600 Subject: [PATCH 77/97] Update ref to point at new commit sha --- index.ts | 5 ++--- lib/ref.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/index.ts b/index.ts index d824f55..b4520a8 100644 --- a/index.ts +++ b/index.ts @@ -47,9 +47,8 @@ export default async function run(): Promise { // Set commit sha output core.setOutput("commit-sha", commit.sha); - // TODO - // Update ref - // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF + // Update ref to point at new commit sha + await ref.update(commit.sha); } catch (e) { core.setFailed(e); } diff --git a/lib/ref.ts b/lib/ref.ts index ece7994..2018394 100644 --- a/lib/ref.ts +++ b/lib/ref.ts @@ -64,4 +64,13 @@ export class Ref extends Resource { `Ref: ${this.fullyQualifiedName}, prefix: ${this.prefix}, commitOid: ${this.commitOid}, treeOid: ${this.treeOid}` ); } + + async update(sha: string): Promise { + // Update ref + // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF + await this.github.patch( + `/repos/${this.repo.nameWithOwner}/git/${this.fullyQualifiedName}`, + { sha } + ); + } } From 72e01b3411c51f6f16f1a3dcff38b758ea0d2a67 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:08:02 -0600 Subject: [PATCH 78/97] Rebuild dist --- dist/index.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dist/index.js b/dist/index.js index d40bb3c..6f60dda 100644 --- a/dist/index.js +++ b/dist/index.js @@ -8082,6 +8082,13 @@ class Ref extends Resource { this.debug(`Ref: ${this.fullyQualifiedName}, prefix: ${this.prefix}, commitOid: ${this.commitOid}, treeOid: ${this.treeOid}`); }); } + update(sha) { + return ref_awaiter(this, void 0, void 0, function* () { + // Update ref + // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF + yield this.github.patch(`/repos/${this.repo.nameWithOwner}/git/${this.fullyQualifiedName}`, { sha }); + }); + } } // EXTERNAL MODULE: external "fs" @@ -8312,9 +8319,8 @@ function run() { yield commit.save(); // Set commit sha output core.setOutput("commit-sha", commit.sha); - // TODO - // Update ref - // Via: PATCH https://api.github.com/repos/$GITHUB_REPOSITORY/git/$REF + // Update ref to point at new commit sha + yield ref.update(commit.sha); } catch (e) { core.setFailed(e); From 53ae48adf0d6523bc65a929233d8a2febda3c51c Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:13:46 -0600 Subject: [PATCH 79/97] Release to v2.x --- .github/workflows/release.yml | 13 ++++++++++++- README.md | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bcc38cf..7285635 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,17 @@ jobs: name: release runs-on: ubuntu-latest steps: + - name: Ensure v2.x exists + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + export SHA=$( gh api \ + /repos/$GITHUB_REPOSITORY/git/refs/heads/main \ + | jq --raw-output '.object.sha' ) + gh api /repos/$GITHUB_REPOSITORY/git/refs \ + --field sha="$SHA" \ + --field ref="refs/heads/v2.x" - uses: actions/checkout@v2 - uses: actions/setup-node@v1 - run: npm ci @@ -19,4 +30,4 @@ jobs: files: | dist/index.js commit-message: Add dist/index.js - ref: refs/heads/v2 + ref: refs/heads/v2.x diff --git a/README.md b/README.md index 440ee33..1e94d9d 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ In your workflow, to commit a file `./myfile`, include a step like this: ```yaml - name: Commit file - uses: swinton/commit@v2 + uses: swinton/commit@v2.x env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -29,7 +29,7 @@ To commit multiple files in a single commit, pass each file on a newline to the ```yaml - name: Commit files - uses: swinton/commit@v2 + uses: swinton/commit@v2.x env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 544e609c397afd0b40e02e846f903b77edd3fe10 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:13:59 -0600 Subject: [PATCH 80/97] Remove demo workflow --- .github/workflows/verified-commit.yml | 54 --------------------------- 1 file changed, 54 deletions(-) delete mode 100644 .github/workflows/verified-commit.yml diff --git a/.github/workflows/verified-commit.yml b/.github/workflows/verified-commit.yml deleted file mode 100644 index 38d4c33..0000000 --- a/.github/workflows/verified-commit.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Verified Commit Demo - -# npx trigger-repository-dispatch --nwo=swinton/verified-commit --event-type=demo -on: - workflow_dispatch: - repository_dispatch: - types: [demo] - -jobs: - demo: - name: Demo - runs-on: ubuntu-latest - steps: - - - name: Context - env: - GITHUB_CONTEXT: ${{ toJson(github) }} - run: | - echo "$GITHUB_CONTEXT" - - - name: Checkout - uses: actions/checkout@v2 - - - name: Update zen.txt - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - echo "$( gh api zen )" >> zen.txt - cat zen.txt - - - name: Commit file - id: commit - uses: ./ - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - path: zen.txt - commit-message: Add zen - - - name: Inspect environment - run: | - echo REF=$REF - echo HEAD_SHA=$HEAD_SHA - echo BASE_TREE_SHA=$BASE_TREE_SHA - echo BLOB_SHA=$BLOB_SHA - echo TREE_SHA=$TREE_SHA - echo COMMIT_SHA=$COMMIT_SHA - - - name: Echo commit SHA - env: - MY_COMMIT_SHA: ${{ steps.commit.outputs.commit-sha }} - run: | - echo "$MY_COMMIT_SHA was created" - echo "https://github.com/$GITHUB_REPOSITORY/commit/$MY_COMMIT_SHA" From a665d0120e03bf8a7c66c0b9101115aeea75e4fc Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:19:27 -0600 Subject: [PATCH 81/97] Remove redundant route property from Resource --- lib/resource.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/resource.ts b/lib/resource.ts index 4f65260..558961f 100644 --- a/lib/resource.ts +++ b/lib/resource.ts @@ -10,7 +10,6 @@ export interface Saveable { export default abstract class Resource implements Saveable { protected debug: (message: string) => void; protected github: AxiosInstance; - private route: string; constructor() { this.debug = core.debug; this.github = github; From f44c8a44606a7a67df900dab60ba1ed7b2097f1e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 10:24:00 -0600 Subject: [PATCH 82/97] Add missing newline character --- .eslintignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintignore b/.eslintignore index 53c37a1..1521c8b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1 @@ -dist \ No newline at end of file +dist From 1a4a6b364742de9d198e52781033b3f5e0815320 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Fri, 11 Dec 2020 14:59:11 -0600 Subject: [PATCH 83/97] Debug: release workflow --- .github/workflows/release.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7285635..56dce7e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,10 @@ on: push: branches: - main + + # Trigger release manually + workflow_dispatch: + jobs: release: name: release @@ -18,7 +22,7 @@ jobs: | jq --raw-output '.object.sha' ) gh api /repos/$GITHUB_REPOSITORY/git/refs \ --field sha="$SHA" \ - --field ref="refs/heads/v2.x" + --field ref="refs/heads/staging/v2.x" - uses: actions/checkout@v2 - uses: actions/setup-node@v1 - run: npm ci @@ -30,4 +34,8 @@ jobs: files: | dist/index.js commit-message: Add dist/index.js - ref: refs/heads/v2.x + ref: refs/heads/staging/v2.x + - uses: actions/upload-artifact@v2 + with: + name: build + path: dist/index.js From 7a0ef50161392c686b93f3b3a21bce4084bc49a1 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 12 Dec 2020 12:43:33 -0600 Subject: [PATCH 84/97] Setup test framework --- .github/workflows/ci.yml | 1 + jest.config.js | 9 + package-lock.json | 4782 ++++++++++++++++++++++++++++++++++++-- package.json | 5 +- tests/blob.test.ts | 3 + tsconfig.json | 3 +- 6 files changed, 4632 insertions(+), 171 deletions(-) create mode 100644 jest.config.js create mode 100644 tests/blob.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b3294cd..1343324 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,3 +15,4 @@ jobs: - uses: actions/setup-node@v1 - run: npm ci - run: npm run lint + - run: npm run test diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..5944457 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + moduleFileExtensions: ["js", "ts"], + testEnvironment: "node", + testMatch: ["**/*.test.ts"], + transform: { + "^.+\\.ts$": "ts-jest" + }, + verbose: true +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 48e8c63..afc8b84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,179 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", + "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -48,6 +215,183 @@ } } }, + "@babel/parser": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", + "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", + "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, "@eslint/eslintrc": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", @@ -74,6 +418,225 @@ } } }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -100,67 +663,202 @@ "fastq": "^1.6.0" } }, - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } }, - "@types/node": { - "version": "14.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", - "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", - "dev": true + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } }, - "@typescript-eslint/eslint-plugin": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.1.tgz", - "integrity": "sha512-QRLDSvIPeI1pz5tVuurD+cStNR4sle4avtHhxA+2uyixWGFjKzJ+EaFVRW6dA/jOgjV5DTAjOxboQkRDE8cRlQ==", + "@types/babel__core": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", + "integrity": "sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.9.1", - "@typescript-eslint/scope-manager": "4.9.1", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "@typescript-eslint/experimental-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.1.tgz", - "integrity": "sha512-c3k/xJqk0exLFs+cWSJxIjqLYwdHCuLWhnpnikmPQD2+NGAx9KjLYlBDcSI81EArh9FDYSL6dslAUSwILeWOxg==", + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.9.1", - "@typescript-eslint/types": "4.9.1", - "@typescript-eslint/typescript-estree": "4.9.1", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@babel/types": "^7.0.0" } }, - "@typescript-eslint/parser": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.1.tgz", - "integrity": "sha512-Gv2VpqiomvQ2v4UL+dXlQcZ8zCX4eTkoIW+1aGVWT6yTO+6jbxsw7yQl2z2pPl/4B9qa5JXeIbhJpONKjXIy3g==", + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.9.1", - "@typescript-eslint/types": "4.9.1", - "@typescript-eslint/typescript-estree": "4.9.1", - "debug": "^4.1.1" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@typescript-eslint/scope-manager": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.1.tgz", - "integrity": "sha512-sa4L9yUfD/1sg9Kl8OxPxvpUcqxKXRjBeZxBuZSSV1v13hjfEJkn84n0An2hN8oLQ1PmEl2uA6FkI07idXeFgQ==", + "@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.9.1", - "@typescript-eslint/visitor-keys": "4.9.1" + "@babel/types": "^7.3.0" + } + }, + "@types/graceful-fs": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", + "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.19", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", + "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/node": { + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/prettier": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.11", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", + "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.9.1.tgz", + "integrity": "sha512-QRLDSvIPeI1pz5tVuurD+cStNR4sle4avtHhxA+2uyixWGFjKzJ+EaFVRW6dA/jOgjV5DTAjOxboQkRDE8cRlQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.9.1", + "@typescript-eslint/scope-manager": "4.9.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.9.1.tgz", + "integrity": "sha512-c3k/xJqk0exLFs+cWSJxIjqLYwdHCuLWhnpnikmPQD2+NGAx9KjLYlBDcSI81EArh9FDYSL6dslAUSwILeWOxg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.9.1.tgz", + "integrity": "sha512-Gv2VpqiomvQ2v4UL+dXlQcZ8zCX4eTkoIW+1aGVWT6yTO+6jbxsw7yQl2z2pPl/4B9qa5JXeIbhJpONKjXIy3g==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.9.1", + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/typescript-estree": "4.9.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.9.1.tgz", + "integrity": "sha512-sa4L9yUfD/1sg9Kl8OxPxvpUcqxKXRjBeZxBuZSSV1v13hjfEJkn84n0An2hN8oLQ1PmEl2uA6FkI07idXeFgQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.9.1", + "@typescript-eslint/visitor-keys": "4.9.1" } }, "@typescript-eslint/types": { @@ -201,18 +899,40 @@ "integrity": "sha512-dGecC5+1wLof1MQpey4+6i2KZv4Sfs6WfXkl9KfO32GED4ZPiKxRfvtGPjbjZv0IbqMl6CxtcV1RotXYfd5SSA==", "dev": true }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -231,6 +951,23 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -246,6 +983,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -255,18 +1002,87 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "axios": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", @@ -275,12 +1091,147 @@ "follow-redirects": "^1.10.0" } }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", + "integrity": "sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -300,12 +1251,80 @@ "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -357,36 +1376,222 @@ } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "debug": { @@ -398,12 +1603,95 @@ "ms": "2.1.2" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -422,12 +1710,54 @@ "esutils": "^2.0.2" } }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -437,12 +1767,75 @@ "ansi-colors": "^4.1.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", @@ -615,71 +2008,356 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -701,18 +2379,105 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", + "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -759,82 +2524,974 @@ "slash": "^3.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "function-bind": "^1.1.1" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "is-number": { + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -851,6 +3508,64 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -863,6 +3578,51 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -873,12 +3633,39 @@ "type-check": "~0.4.0" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -888,6 +3675,59 @@ "yallist": "^4.0.0" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -904,6 +3744,27 @@ "picomatch": "^2.0.5" } }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -913,6 +3774,39 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -927,12 +3821,168 @@ "readable-stream": "^3.6.0" } }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -942,6 +3992,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -956,6 +4015,42 @@ "word-wrap": "^1.2.3" } }, + "p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -965,6 +4060,36 @@ "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -977,18 +4102,54 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -1010,18 +4171,125 @@ "fast-diff": "^1.1.2" } }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "react-is": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1032,18 +4300,175 @@ "util-deprecate": "^1.0.1" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -1059,6 +4484,12 @@ "glob": "^7.1.3" } }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, "run-parallel": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", @@ -1070,6 +4501,171 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -1079,6 +4675,35 @@ "lru-cache": "^6.0.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1094,6 +4719,25 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1111,12 +4755,287 @@ "is-fullwidth-code-point": "^2.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -1162,6 +5081,24 @@ "ansi-regex": "^5.0.0" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1177,6 +5114,39 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -1189,12 +5159,83 @@ "string-width": "^3.0.0" } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1204,6 +5245,53 @@ "is-number": "^7.0.0" } }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-jest": { + "version": "26.4.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.4.tgz", + "integrity": "sha512-3lFWKbLxJm34QxyVNNCgXX1u4o/RV0myvA2y2Bxm46iGIjKlaY0own9gIckbjZJPn+WaJEnfPPJ20HHGpoq4yg==", + "dev": true, + "requires": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -1219,6 +5307,21 @@ "tslib": "^1.8.1" } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -1228,18 +5331,85 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -1249,17 +5419,135 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, "v8-compile-cache": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, + "v8-to-istanbul": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz", + "integrity": "sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1269,23 +5557,179 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/package.json b/package.json index 6efb65e..1598e80 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "node dist/index.js", "lint": "tsc --noEmit && eslint '*/**/*.{js,ts,tsx}'", - "test": "echo \"Error: no test specified\" && exit 1", + "test": "jest", "build": "ncc build index.ts -o dist" }, "repository": { @@ -21,6 +21,7 @@ }, "homepage": "https://github.com/swinton/commit#readme", "devDependencies": { + "@types/jest": "^26.0.19", "@types/node": "^14.14.10", "@typescript-eslint/eslint-plugin": "^4.9.1", "@typescript-eslint/parser": "^4.9.1", @@ -28,7 +29,9 @@ "eslint": "^7.15.0", "eslint-config-prettier": "^7.0.0", "eslint-plugin-prettier": "^3.2.0", + "jest": "^26.6.3", "prettier": "^2.2.1", + "ts-jest": "^26.4.4", "typescript": "^4.1.2" }, "dependencies": { diff --git a/tests/blob.test.ts b/tests/blob.test.ts new file mode 100644 index 0000000..4e78808 --- /dev/null +++ b/tests/blob.test.ts @@ -0,0 +1,3 @@ +test("that we can run tests", () => { + expect(1 + 1).toBe(2); +}); diff --git a/tsconfig.json b/tsconfig.json index 57dce1f..e0089e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "es2015", - "moduleResolution": "node" + "moduleResolution": "node", + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ } } From 195f18300a32f953af5955e72705d7565e49b329 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 12 Dec 2020 12:45:09 -0600 Subject: [PATCH 85/97] Fix whitespace in jest.config.js --- jest.config.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jest.config.js b/jest.config.js index 5944457..f8c9193 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,7 +3,7 @@ module.exports = { testEnvironment: "node", testMatch: ["**/*.test.ts"], transform: { - "^.+\\.ts$": "ts-jest" + "^.+\\.ts$": "ts-jest", }, - verbose: true -}; \ No newline at end of file + verbose: true, +}; From 321b4f8b39feae3c4d0d4d9298c39a6d292aa995 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 12 Dec 2020 16:34:44 -0600 Subject: [PATCH 86/97] Encode base64 using base64-stream --- lib/blob.ts | 15 +++------------ package-lock.json | 5 +++++ package.json | 1 + 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/blob.ts b/lib/blob.ts index 5674a45..351013d 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -1,20 +1,11 @@ import * as fs from "fs"; -import { Readable, Transform } from "stream"; +import { Readable } from "stream"; import { join } from "path"; +import { Base64Encode } from "base64-stream"; import * as MultiStream from "multistream"; import Resource from "./resource"; import { Repo } from "./repo"; -/** - * Encodes chunks in a stream to base64 - */ -const base64Transformer = new Transform({ - transform(chunk, encoding, callback) { - this.push(chunk.toString("base64")); - callback(); - }, -}); - export class Blob extends Resource { readonly type: string = "blob"; readonly absoluteFilePath: string; @@ -53,7 +44,7 @@ export class Blob extends Resource { // potentially very large) files into memory return new MultiStream([ Readable.from('{"encoding":"base64","content":"'), - fs.createReadStream(this.absoluteFilePath).pipe(base64Transformer), + fs.createReadStream(this.absoluteFilePath).pipe(new Base64Encode()), Readable.from('"}'), ]); } diff --git a/package-lock.json b/package-lock.json index afc8b84..36922dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1223,6 +1223,11 @@ } } }, + "base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", diff --git a/package.json b/package.json index 1598e80..928d59a 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "dependencies": { "@actions/core": "^1.2.6", "axios": "^0.21.0", + "base64-stream": "^1.0.0", "multistream": "^4.0.1" } } From f4fc869f2b106c8a4d2b6e84813fb1228eca4a96 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sun, 13 Dec 2020 15:36:43 -0600 Subject: [PATCH 87/97] Test blob features --- jest.config.js | 1 + jest.setup.js | 1 + lib/blob.ts | 12 +++++++----- lib/github-client.ts | 3 ++- package-lock.json | 35 +++++++++++++++++++++++++++++++++++ package.json | 1 + tests/blob.test.ts | 34 ++++++++++++++++++++++++++++++++-- tests/fixtures/zen.txt | 1 + 8 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 jest.setup.js create mode 100644 tests/fixtures/zen.txt diff --git a/jest.config.js b/jest.config.js index f8c9193..1775ad0 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,6 @@ module.exports = { moduleFileExtensions: ["js", "ts"], + setupFilesAfterEnv: ["./jest.setup.js"], testEnvironment: "node", testMatch: ["**/*.test.ts"], transform: { diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 0000000..3b4b79b --- /dev/null +++ b/jest.setup.js @@ -0,0 +1 @@ +jest.setTimeout(5000); diff --git a/lib/blob.ts b/lib/blob.ts index 351013d..5eb7f0a 100644 --- a/lib/blob.ts +++ b/lib/blob.ts @@ -2,7 +2,7 @@ import * as fs from "fs"; import { Readable } from "stream"; import { join } from "path"; import { Base64Encode } from "base64-stream"; -import * as MultiStream from "multistream"; +import MultiStream from "multistream"; import Resource from "./resource"; import { Repo } from "./repo"; @@ -40,13 +40,15 @@ export class Blob extends Resource { * See: https://docs.github.com/rest/reference/git#create-a-blob */ get stream(): Readable { - // Produces the JSON body as a stream, so that we don't have to read ( - // potentially very large) files into memory - return new MultiStream([ + const streams: Readable[] = [ Readable.from('{"encoding":"base64","content":"'), fs.createReadStream(this.absoluteFilePath).pipe(new Base64Encode()), Readable.from('"}'), - ]); + ]; + + // Produces the JSON body as a stream, so that we don't have to read ( + // potentially very large) files into memory + return new MultiStream(streams); } get path(): string { diff --git a/lib/github-client.ts b/lib/github-client.ts index ba6eaaa..eb1be16 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,7 +1,8 @@ +import { join } from "path"; import axios from "axios"; // eslint-disable-next-line @typescript-eslint/no-var-requires -const pkg = require("../package"); +const pkg = require(join(__dirname, "..", "package.json")); const github = axios.create({ baseURL: `https://api.github.com/`, diff --git a/package-lock.json b/package-lock.json index 36922dc..64cf7d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3727,6 +3727,41 @@ "object-visit": "^1.0.0" } }, + "memory-streams": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", + "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", + "dev": true, + "requires": { + "readable-stream": "~1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", diff --git a/package.json b/package.json index 928d59a..cd35db5 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "eslint-config-prettier": "^7.0.0", "eslint-plugin-prettier": "^3.2.0", "jest": "^26.6.3", + "memory-streams": "^0.1.3", "prettier": "^2.2.1", "ts-jest": "^26.4.4", "typescript": "^4.1.2" diff --git a/tests/blob.test.ts b/tests/blob.test.ts index 4e78808..b46fd83 100644 --- a/tests/blob.test.ts +++ b/tests/blob.test.ts @@ -1,3 +1,33 @@ -test("that we can run tests", () => { - expect(1 + 1).toBe(2); +import { finished } from "stream"; +import { promisify } from "util"; +import streams from "memory-streams"; + +import { Repo } from "../lib/repo"; +import { Blob } from "../lib/blob"; + +describe("Blob", () => { + let repo: Repo; + let blob: Blob; + + beforeEach(() => { + repo = new Repo("foo/bar"); + blob = new Blob(repo, __dirname, "fixtures/zen.txt"); + }); + + test("mode", () => { + expect(blob.mode).toBe("100644"); + }); + + test("path", () => { + expect(blob.path).toBe("fixtures/zen.txt"); + }); + + test("stream", async () => { + const source = blob.stream; + const dest = new streams.WritableStream(); + await promisify(finished)(source.pipe(dest)); + expect(dest.toString()).toBe( + '{"encoding":"base64","content":"S2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4K"}' + ); + }); }); diff --git a/tests/fixtures/zen.txt b/tests/fixtures/zen.txt new file mode 100644 index 0000000..e2c03f1 --- /dev/null +++ b/tests/fixtures/zen.txt @@ -0,0 +1 @@ +Keep it logically awesome. From 20c4d5ba83fd1088882dc8722c8046ccc6830247 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sun, 13 Dec 2020 16:06:05 -0600 Subject: [PATCH 88/97] Test blob stream with a large file --- package-lock.json | 142 +- package.json | 2 +- tests/blob.test.ts | 20 +- tests/fixtures/blob.payload.json | 4 + tests/fixtures/blob.txt | 4998 ++++++++++++++++++++++++++++++ tests/fixtures/zen.txt | 1 - 6 files changed, 5124 insertions(+), 43 deletions(-) create mode 100644 tests/fixtures/blob.payload.json create mode 100644 tests/fixtures/blob.txt delete mode 100644 tests/fixtures/zen.txt diff --git a/package-lock.json b/package-lock.json index 64cf7d6..ae38dbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -933,6 +933,16 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1422,6 +1432,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -1556,6 +1572,12 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -1679,6 +1701,22 @@ } } }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2704,6 +2742,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2860,6 +2904,18 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3727,41 +3783,6 @@ "object-visit": "^1.0.0" } }, - "memory-streams": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", - "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", - "dev": true, - "requires": { - "readable-stream": "~1.0.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4085,6 +4106,15 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -5199,6 +5229,39 @@ "string-width": "^3.0.0" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz", + "integrity": "sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w==", + "dev": true, + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -5410,6 +5473,15 @@ "set-value": "^2.0.1" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", diff --git a/package.json b/package.json index cd35db5..03ee3d7 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,8 @@ "eslint-config-prettier": "^7.0.0", "eslint-plugin-prettier": "^3.2.0", "jest": "^26.6.3", - "memory-streams": "^0.1.3", "prettier": "^2.2.1", + "tempy": "^1.0.0", "ts-jest": "^26.4.4", "typescript": "^4.1.2" }, diff --git a/tests/blob.test.ts b/tests/blob.test.ts index b46fd83..4f73f89 100644 --- a/tests/blob.test.ts +++ b/tests/blob.test.ts @@ -1,6 +1,8 @@ +import fs from "fs"; +import { join } from "path"; import { finished } from "stream"; import { promisify } from "util"; -import streams from "memory-streams"; +import tempy from "tempy"; import { Repo } from "../lib/repo"; import { Blob } from "../lib/blob"; @@ -11,7 +13,7 @@ describe("Blob", () => { beforeEach(() => { repo = new Repo("foo/bar"); - blob = new Blob(repo, __dirname, "fixtures/zen.txt"); + blob = new Blob(repo, __dirname, "fixtures/blob.txt"); }); test("mode", () => { @@ -19,15 +21,21 @@ describe("Blob", () => { }); test("path", () => { - expect(blob.path).toBe("fixtures/zen.txt"); + expect(blob.path).toBe("fixtures/blob.txt"); }); test("stream", async () => { const source = blob.stream; - const dest = new streams.WritableStream(); + const dest = fs.createWriteStream(tempy.file({ extension: "json" })); await promisify(finished)(source.pipe(dest)); - expect(dest.toString()).toBe( - '{"encoding":"base64","content":"S2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4K"}' + expect( + JSON.parse(fs.readFileSync(dest.path.toString()).toString()) + ).toEqual( + JSON.parse( + fs + .readFileSync(join(__dirname, "fixtures", "blob.payload.json")) + .toString() + ) ); }); }); diff --git a/tests/fixtures/blob.payload.json b/tests/fixtures/blob.payload.json new file mode 100644 index 0000000..f70d3e3 --- /dev/null +++ b/tests/fixtures/blob.payload.json @@ -0,0 +1,4 @@ +{ + "content": "S2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRW5jb3VyYWdlIGZsb3cuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRGVzaWduIGZvciBmYWlsdXJlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRW5jb3VyYWdlIGZsb3cuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuCkVuY291cmFnZSBmbG93LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uClNwZWFrIGxpa2UgYSBodW1hbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRGVzaWduIGZvciBmYWlsdXJlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRGVzaWduIGZvciBmYWlsdXJlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkVuY291cmFnZSBmbG93LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRW5jb3VyYWdlIGZsb3cuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpEZXNpZ24gZm9yIGZhaWx1cmUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkVuY291cmFnZSBmbG93LgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClNwZWFrIGxpa2UgYSBodW1hbi4KRGVzaWduIGZvciBmYWlsdXJlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpTcGVhayBsaWtlIGEgaHVtYW4uCkRlc2lnbiBmb3IgZmFpbHVyZS4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClNwZWFrIGxpa2UgYSBodW1hbi4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkRlc2lnbiBmb3IgZmFpbHVyZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRW5jb3VyYWdlIGZsb3cuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KRW5jb3VyYWdlIGZsb3cuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClNwZWFrIGxpa2UgYSBodW1hbi4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkVuY291cmFnZSBmbG93LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuCkVuY291cmFnZSBmbG93LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KRGVzaWduIGZvciBmYWlsdXJlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpFbmNvdXJhZ2UgZmxvdy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkFwcHJvYWNoYWJsZSBpcyBiZXR0ZXIgdGhhbiBzaW1wbGUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpEZXNpZ24gZm9yIGZhaWx1cmUuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpEZXNpZ24gZm9yIGZhaWx1cmUuClNwZWFrIGxpa2UgYSBodW1hbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpTcGVhayBsaWtlIGEgaHVtYW4uCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KRGVzaWduIGZvciBmYWlsdXJlLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpTcGVhayBsaWtlIGEgaHVtYW4uCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRW5jb3VyYWdlIGZsb3cuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KTWluZCB5b3VyIHdvcmRzLCB0aGV5IGFyZSBpbXBvcnRhbnQuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpFbmNvdXJhZ2UgZmxvdy4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkVuY291cmFnZSBmbG93LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpQcmFjdGljYWxpdHkgYmVhdHMgcHVyaXR5LgpFbmNvdXJhZ2UgZmxvdy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KS2VlcCBpdCBsb2dpY2FsbHkgYXdlc29tZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KRGVzaWduIGZvciBmYWlsdXJlLgpTcGVhayBsaWtlIGEgaHVtYW4uClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClNwZWFrIGxpa2UgYSBodW1hbi4KRW5jb3VyYWdlIGZsb3cuCkl0J3Mgbm90IGZ1bGx5IHNoaXBwZWQgdW50aWwgaXQncyBmYXN0LgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpIYWxmIG1lYXN1cmVzIGFyZSBhcyBiYWQgYXMgbm90aGluZyBhdCBhbGwuCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpEZXNpZ24gZm9yIGZhaWx1cmUuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuCkZhdm9yIGZvY3VzIG92ZXIgZmVhdHVyZXMuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KQXBwcm9hY2hhYmxlIGlzIGJldHRlciB0aGFuIHNpbXBsZS4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KRW5jb3VyYWdlIGZsb3cuClByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KSGFsZiBtZWFzdXJlcyBhcmUgYXMgYmFkIGFzIG5vdGhpbmcgYXQgYWxsLgpFbmNvdXJhZ2UgZmxvdy4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpTcGVhayBsaWtlIGEgaHVtYW4uCk5vbi1ibG9ja2luZyBpcyBiZXR0ZXIgdGhhbiBibG9ja2luZy4KU3BlYWsgbGlrZSBhIGh1bWFuLgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpBbnl0aGluZyBhZGRlZCBkaWx1dGVzIGV2ZXJ5dGhpbmcgZWxzZS4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KRGVzaWduIGZvciBmYWlsdXJlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkVuY291cmFnZSBmbG93LgpEZXNpZ24gZm9yIGZhaWx1cmUuCkRlc2lnbiBmb3IgZmFpbHVyZS4KU3BlYWsgbGlrZSBhIGh1bWFuLgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpLZWVwIGl0IGxvZ2ljYWxseSBhd2Vzb21lLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KQW55dGhpbmcgYWRkZWQgZGlsdXRlcyBldmVyeXRoaW5nIGVsc2UuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBdm9pZCBhZG1pbmlzdHJhdGl2ZSBkaXN0cmFjdGlvbi4KUHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpBcHByb2FjaGFibGUgaXMgYmV0dGVyIHRoYW4gc2ltcGxlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpFbmNvdXJhZ2UgZmxvdy4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgpTcGVhayBsaWtlIGEgaHVtYW4uClNwZWFrIGxpa2UgYSBodW1hbi4KQXZvaWQgYWRtaW5pc3RyYXRpdmUgZGlzdHJhY3Rpb24uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCktlZXAgaXQgbG9naWNhbGx5IGF3ZXNvbWUuCkVuY291cmFnZSBmbG93LgpJdCdzIG5vdCBmdWxseSBzaGlwcGVkIHVudGlsIGl0J3MgZmFzdC4KRmF2b3IgZm9jdXMgb3ZlciBmZWF0dXJlcy4KUmVzcG9uc2l2ZSBpcyBiZXR0ZXIgdGhhbiBmYXN0LgpGYXZvciBmb2N1cyBvdmVyIGZlYXR1cmVzLgpNaW5kIHlvdXIgd29yZHMsIHRoZXkgYXJlIGltcG9ydGFudC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCk1pbmQgeW91ciB3b3JkcywgdGhleSBhcmUgaW1wb3J0YW50LgpTcGVhayBsaWtlIGEgaHVtYW4uCkFueXRoaW5nIGFkZGVkIGRpbHV0ZXMgZXZlcnl0aGluZyBlbHNlLgpSZXNwb25zaXZlIGlzIGJldHRlciB0aGFuIGZhc3QuCkF2b2lkIGFkbWluaXN0cmF0aXZlIGRpc3RyYWN0aW9uLgpOb24tYmxvY2tpbmcgaXMgYmV0dGVyIHRoYW4gYmxvY2tpbmcuClJlc3BvbnNpdmUgaXMgYmV0dGVyIHRoYW4gZmFzdC4KSXQncyBub3QgZnVsbHkgc2hpcHBlZCB1bnRpbCBpdCdzIGZhc3QuCkhhbGYgbWVhc3VyZXMgYXJlIGFzIGJhZCBhcyBub3RoaW5nIGF0IGFsbC4KTm9uLWJsb2NraW5nIGlzIGJldHRlciB0aGFuIGJsb2NraW5nLgo=", + "encoding": "base64" +} diff --git a/tests/fixtures/blob.txt b/tests/fixtures/blob.txt new file mode 100644 index 0000000..2c187bb --- /dev/null +++ b/tests/fixtures/blob.txt @@ -0,0 +1,4998 @@ +Keep it logically awesome. +Mind your words, they are important. +Keep it logically awesome. +Non-blocking is better than blocking. +Responsive is better than fast. +Favor focus over features. +Keep it logically awesome. +Approachable is better than simple. +Responsive is better than fast. +Keep it logically awesome. +Approachable is better than simple. +Encourage flow. +Speak like a human. +Anything added dilutes everything else. +Practicality beats purity. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Approachable is better than simple. +Avoid administrative distraction. +Approachable is better than simple. +Encourage flow. +Practicality beats purity. +Approachable is better than simple. +Avoid administrative distraction. +Non-blocking is better than blocking. +Favor focus over features. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Design for failure. +Responsive is better than fast. +Keep it logically awesome. +Design for failure. +Non-blocking is better than blocking. +Responsive is better than fast. +Mind your words, they are important. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Responsive is better than fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Encourage flow. +Anything added dilutes everything else. +Speak like a human. +Non-blocking is better than blocking. +Practicality beats purity. +Favor focus over features. +Mind your words, they are important. +It's not fully shipped until it's fast. +Encourage flow. +It's not fully shipped until it's fast. +Speak like a human. +Keep it logically awesome. +Design for failure. +Responsive is better than fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Design for failure. +Avoid administrative distraction. +Design for failure. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Avoid administrative distraction. +Anything added dilutes everything else. +Encourage flow. +Avoid administrative distraction. +Encourage flow. +Approachable is better than simple. +Anything added dilutes everything else. +Anything added dilutes everything else. +Responsive is better than fast. +Design for failure. +Speak like a human. +Practicality beats purity. +Avoid administrative distraction. +Responsive is better than fast. +It's not fully shipped until it's fast. +Favor focus over features. +Approachable is better than simple. +It's not fully shipped until it's fast. +Keep it logically awesome. +Encourage flow. +Keep it logically awesome. +Responsive is better than fast. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Mind your words, they are important. +Practicality beats purity. +Mind your words, they are important. +Favor focus over features. +Keep it logically awesome. +Anything added dilutes everything else. +Speak like a human. +It's not fully shipped until it's fast. +Mind your words, they are important. +Keep it logically awesome. +Speak like a human. +Encourage flow. +Favor focus over features. +Practicality beats purity. +Half measures are as bad as nothing at all. +Speak like a human. +It's not fully shipped until it's fast. +Mind your words, they are important. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Responsive is better than fast. +Speak like a human. +Favor focus over features. +Approachable is better than simple. +Keep it logically awesome. +Favor focus over features. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Anything added dilutes everything else. +Keep it logically awesome. +Mind your words, they are important. +Responsive is better than fast. +Design for failure. +Keep it logically awesome. +Mind your words, they are important. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +Practicality beats purity. +Favor focus over features. +Keep it logically awesome. +Favor focus over features. +Keep it logically awesome. +Anything added dilutes everything else. +Practicality beats purity. +Mind your words, they are important. +Anything added dilutes everything else. +Speak like a human. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Design for failure. +Non-blocking is better than blocking. +Encourage flow. +Practicality beats purity. +Favor focus over features. +Approachable is better than simple. +Favor focus over features. +Approachable is better than simple. +Anything added dilutes everything else. +Practicality beats purity. +Responsive is better than fast. +Avoid administrative distraction. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Speak like a human. +Keep it logically awesome. +Non-blocking is better than blocking. +Speak like a human. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Design for failure. +Speak like a human. +Approachable is better than simple. +Design for failure. +Encourage flow. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Responsive is better than fast. +Responsive is better than fast. +Mind your words, they are important. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +Favor focus over features. +Keep it logically awesome. +Avoid administrative distraction. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Design for failure. +Design for failure. +Encourage flow. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Speak like a human. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Design for failure. +Favor focus over features. +Anything added dilutes everything else. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Design for failure. +Keep it logically awesome. +Anything added dilutes everything else. +Avoid administrative distraction. +Practicality beats purity. +Approachable is better than simple. +Approachable is better than simple. +Anything added dilutes everything else. +Avoid administrative distraction. +Keep it logically awesome. +Responsive is better than fast. +Non-blocking is better than blocking. +Encourage flow. +Mind your words, they are important. +Speak like a human. +Practicality beats purity. +Approachable is better than simple. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Mind your words, they are important. +Design for failure. +Responsive is better than fast. +Approachable is better than simple. +Design for failure. +Encourage flow. +Practicality beats purity. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Speak like a human. +Avoid administrative distraction. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Encourage flow. +Anything added dilutes everything else. +Speak like a human. +Practicality beats purity. +Speak like a human. +It's not fully shipped until it's fast. +Favor focus over features. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Responsive is better than fast. +Design for failure. +Approachable is better than simple. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Speak like a human. +Approachable is better than simple. +Responsive is better than fast. +Design for failure. +Design for failure. +Favor focus over features. +Non-blocking is better than blocking. +Speak like a human. +Mind your words, they are important. +Design for failure. +Half measures are as bad as nothing at all. +Practicality beats purity. +Practicality beats purity. +Keep it logically awesome. +Encourage flow. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Encourage flow. +Mind your words, they are important. +Keep it logically awesome. +Practicality beats purity. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Favor focus over features. +It's not fully shipped until it's fast. +Favor focus over features. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Design for failure. +Non-blocking is better than blocking. +Mind your words, they are important. +Practicality beats purity. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Approachable is better than simple. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +Practicality beats purity. +Encourage flow. +Half measures are as bad as nothing at all. +Favor focus over features. +Mind your words, they are important. +Speak like a human. +Practicality beats purity. +Anything added dilutes everything else. +Avoid administrative distraction. +Keep it logically awesome. +Responsive is better than fast. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Favor focus over features. +Non-blocking is better than blocking. +Mind your words, they are important. +Approachable is better than simple. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Encourage flow. +Mind your words, they are important. +Approachable is better than simple. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +Responsive is better than fast. +Approachable is better than simple. +Anything added dilutes everything else. +Encourage flow. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Favor focus over features. +Design for failure. +Avoid administrative distraction. +Design for failure. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Practicality beats purity. +Encourage flow. +Favor focus over features. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Practicality beats purity. +Anything added dilutes everything else. +Design for failure. +Non-blocking is better than blocking. +Keep it logically awesome. +Favor focus over features. +Responsive is better than fast. +Mind your words, they are important. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Practicality beats purity. +Half measures are as bad as nothing at all. +Approachable is better than simple. +It's not fully shipped until it's fast. +Responsive is better than fast. +Keep it logically awesome. +Mind your words, they are important. +Responsive is better than fast. +Keep it logically awesome. +Approachable is better than simple. +Non-blocking is better than blocking. +Design for failure. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Practicality beats purity. +Keep it logically awesome. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Favor focus over features. +Practicality beats purity. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Anything added dilutes everything else. +Mind your words, they are important. +Keep it logically awesome. +Avoid administrative distraction. +Speak like a human. +Approachable is better than simple. +Non-blocking is better than blocking. +Speak like a human. +Mind your words, they are important. +Design for failure. +Anything added dilutes everything else. +Practicality beats purity. +It's not fully shipped until it's fast. +Speak like a human. +Anything added dilutes everything else. +Avoid administrative distraction. +Non-blocking is better than blocking. +Avoid administrative distraction. +Non-blocking is better than blocking. +Avoid administrative distraction. +Practicality beats purity. +Speak like a human. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Speak like a human. +Non-blocking is better than blocking. +Speak like a human. +Keep it logically awesome. +Mind your words, they are important. +Non-blocking is better than blocking. +Mind your words, they are important. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Design for failure. +Design for failure. +Favor focus over features. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Favor focus over features. +It's not fully shipped until it's fast. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Non-blocking is better than blocking. +Favor focus over features. +Anything added dilutes everything else. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Responsive is better than fast. +Design for failure. +Design for failure. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Design for failure. +Design for failure. +Encourage flow. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Practicality beats purity. +Non-blocking is better than blocking. +Practicality beats purity. +It's not fully shipped until it's fast. +Mind your words, they are important. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Design for failure. +Encourage flow. +Non-blocking is better than blocking. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Practicality beats purity. +Speak like a human. +Practicality beats purity. +Responsive is better than fast. +Speak like a human. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Design for failure. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Favor focus over features. +Non-blocking is better than blocking. +Speak like a human. +Encourage flow. +Anything added dilutes everything else. +Favor focus over features. +It's not fully shipped until it's fast. +Responsive is better than fast. +Responsive is better than fast. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Design for failure. +Design for failure. +Mind your words, they are important. +Keep it logically awesome. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Mind your words, they are important. +Responsive is better than fast. +Mind your words, they are important. +Speak like a human. +Practicality beats purity. +Approachable is better than simple. +Practicality beats purity. +Keep it logically awesome. +Responsive is better than fast. +Anything added dilutes everything else. +Keep it logically awesome. +Non-blocking is better than blocking. +Favor focus over features. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Practicality beats purity. +Practicality beats purity. +Non-blocking is better than blocking. +Design for failure. +Speak like a human. +Avoid administrative distraction. +Design for failure. +Avoid administrative distraction. +Favor focus over features. +Half measures are as bad as nothing at all. +Design for failure. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Design for failure. +Responsive is better than fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Design for failure. +Mind your words, they are important. +Mind your words, they are important. +Non-blocking is better than blocking. +Speak like a human. +Favor focus over features. +Non-blocking is better than blocking. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Design for failure. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Encourage flow. +Favor focus over features. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Mind your words, they are important. +Responsive is better than fast. +Avoid administrative distraction. +Speak like a human. +Keep it logically awesome. +Responsive is better than fast. +Encourage flow. +It's not fully shipped until it's fast. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +Keep it logically awesome. +Mind your words, they are important. +Speak like a human. +Favor focus over features. +Design for failure. +Encourage flow. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Encourage flow. +Responsive is better than fast. +Design for failure. +Favor focus over features. +Practicality beats purity. +Anything added dilutes everything else. +Mind your words, they are important. +Design for failure. +Responsive is better than fast. +Avoid administrative distraction. +Practicality beats purity. +Responsive is better than fast. +Keep it logically awesome. +Non-blocking is better than blocking. +Practicality beats purity. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Practicality beats purity. +Avoid administrative distraction. +Mind your words, they are important. +Favor focus over features. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Design for failure. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Speak like a human. +Non-blocking is better than blocking. +Design for failure. +Anything added dilutes everything else. +Encourage flow. +Keep it logically awesome. +Speak like a human. +It's not fully shipped until it's fast. +Keep it logically awesome. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Practicality beats purity. +Anything added dilutes everything else. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Avoid administrative distraction. +Mind your words, they are important. +Speak like a human. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Favor focus over features. +Responsive is better than fast. +Responsive is better than fast. +Mind your words, they are important. +Avoid administrative distraction. +Design for failure. +Speak like a human. +Favor focus over features. +Encourage flow. +Encourage flow. +Avoid administrative distraction. +Non-blocking is better than blocking. +Mind your words, they are important. +Encourage flow. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Practicality beats purity. +Keep it logically awesome. +Responsive is better than fast. +Favor focus over features. +It's not fully shipped until it's fast. +Favor focus over features. +Speak like a human. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Approachable is better than simple. +Avoid administrative distraction. +Avoid administrative distraction. +Responsive is better than fast. +Encourage flow. +Keep it logically awesome. +Responsive is better than fast. +Responsive is better than fast. +Responsive is better than fast. +Mind your words, they are important. +Approachable is better than simple. +Practicality beats purity. +Anything added dilutes everything else. +Keep it logically awesome. +Practicality beats purity. +Responsive is better than fast. +Approachable is better than simple. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Practicality beats purity. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Speak like a human. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Approachable is better than simple. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Speak like a human. +Non-blocking is better than blocking. +Practicality beats purity. +Favor focus over features. +Favor focus over features. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Favor focus over features. +It's not fully shipped until it's fast. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Responsive is better than fast. +Practicality beats purity. +Favor focus over features. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Approachable is better than simple. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Favor focus over features. +Design for failure. +Mind your words, they are important. +Favor focus over features. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Speak like a human. +Favor focus over features. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Anything added dilutes everything else. +Keep it logically awesome. +Practicality beats purity. +Favor focus over features. +Avoid administrative distraction. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Responsive is better than fast. +Anything added dilutes everything else. +Practicality beats purity. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Anything added dilutes everything else. +Responsive is better than fast. +Design for failure. +Mind your words, they are important. +Approachable is better than simple. +Encourage flow. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Mind your words, they are important. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Non-blocking is better than blocking. +Encourage flow. +Mind your words, they are important. +Practicality beats purity. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Favor focus over features. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Avoid administrative distraction. +Practicality beats purity. +Speak like a human. +Keep it logically awesome. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Favor focus over features. +Approachable is better than simple. +Non-blocking is better than blocking. +Encourage flow. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Mind your words, they are important. +Keep it logically awesome. +Favor focus over features. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Responsive is better than fast. +Keep it logically awesome. +Encourage flow. +Encourage flow. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Responsive is better than fast. +Avoid administrative distraction. +Responsive is better than fast. +Practicality beats purity. +Keep it logically awesome. +Approachable is better than simple. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Approachable is better than simple. +Responsive is better than fast. +Keep it logically awesome. +Keep it logically awesome. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Non-blocking is better than blocking. +Practicality beats purity. +Encourage flow. +Mind your words, they are important. +Responsive is better than fast. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Encourage flow. +Design for failure. +Favor focus over features. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Speak like a human. +Speak like a human. +Speak like a human. +Favor focus over features. +Encourage flow. +Speak like a human. +Mind your words, they are important. +Responsive is better than fast. +Practicality beats purity. +Mind your words, they are important. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Mind your words, they are important. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Anything added dilutes everything else. +Favor focus over features. +Responsive is better than fast. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Avoid administrative distraction. +Responsive is better than fast. +Non-blocking is better than blocking. +Design for failure. +Non-blocking is better than blocking. +Practicality beats purity. +Favor focus over features. +Design for failure. +Design for failure. +Favor focus over features. +Responsive is better than fast. +It's not fully shipped until it's fast. +Design for failure. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Non-blocking is better than blocking. +Favor focus over features. +Practicality beats purity. +Mind your words, they are important. +Anything added dilutes everything else. +Favor focus over features. +Encourage flow. +Speak like a human. +Favor focus over features. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Approachable is better than simple. +Speak like a human. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Design for failure. +Anything added dilutes everything else. +Favor focus over features. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Responsive is better than fast. +Practicality beats purity. +Approachable is better than simple. +Mind your words, they are important. +Speak like a human. +Approachable is better than simple. +Speak like a human. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Responsive is better than fast. +Anything added dilutes everything else. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Design for failure. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Favor focus over features. +Approachable is better than simple. +Anything added dilutes everything else. +Keep it logically awesome. +Design for failure. +Speak like a human. +Keep it logically awesome. +Mind your words, they are important. +Design for failure. +Approachable is better than simple. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Keep it logically awesome. +Practicality beats purity. +Mind your words, they are important. +Encourage flow. +Favor focus over features. +Responsive is better than fast. +Encourage flow. +Practicality beats purity. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Mind your words, they are important. +Design for failure. +Anything added dilutes everything else. +Keep it logically awesome. +Practicality beats purity. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Avoid administrative distraction. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Encourage flow. +Favor focus over features. +Non-blocking is better than blocking. +Practicality beats purity. +Practicality beats purity. +Encourage flow. +Non-blocking is better than blocking. +Avoid administrative distraction. +Responsive is better than fast. +Anything added dilutes everything else. +Responsive is better than fast. +Keep it logically awesome. +Speak like a human. +Mind your words, they are important. +Responsive is better than fast. +Non-blocking is better than blocking. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Anything added dilutes everything else. +Design for failure. +Speak like a human. +Responsive is better than fast. +It's not fully shipped until it's fast. +Speak like a human. +Encourage flow. +Keep it logically awesome. +Keep it logically awesome. +Practicality beats purity. +Anything added dilutes everything else. +Mind your words, they are important. +Practicality beats purity. +Anything added dilutes everything else. +Keep it logically awesome. +Non-blocking is better than blocking. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +Approachable is better than simple. +Favor focus over features. +Keep it logically awesome. +Approachable is better than simple. +Favor focus over features. +Practicality beats purity. +Favor focus over features. +Approachable is better than simple. +Responsive is better than fast. +Anything added dilutes everything else. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Encourage flow. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Design for failure. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Speak like a human. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Mind your words, they are important. +Keep it logically awesome. +Non-blocking is better than blocking. +Design for failure. +Practicality beats purity. +Practicality beats purity. +Encourage flow. +Responsive is better than fast. +Design for failure. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +Design for failure. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Responsive is better than fast. +Responsive is better than fast. +Approachable is better than simple. +Keep it logically awesome. +Non-blocking is better than blocking. +Keep it logically awesome. +Responsive is better than fast. +Non-blocking is better than blocking. +Approachable is better than simple. +Design for failure. +Design for failure. +Responsive is better than fast. +Design for failure. +Avoid administrative distraction. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Speak like a human. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Design for failure. +Design for failure. +Speak like a human. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Approachable is better than simple. +Practicality beats purity. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Encourage flow. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Non-blocking is better than blocking. +Responsive is better than fast. +Mind your words, they are important. +Encourage flow. +Practicality beats purity. +Speak like a human. +Keep it logically awesome. +Practicality beats purity. +Encourage flow. +Design for failure. +Practicality beats purity. +Responsive is better than fast. +Speak like a human. +Design for failure. +Keep it logically awesome. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +It's not fully shipped until it's fast. +Responsive is better than fast. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Encourage flow. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Speak like a human. +Speak like a human. +Non-blocking is better than blocking. +Responsive is better than fast. +Mind your words, they are important. +Practicality beats purity. +Design for failure. +Avoid administrative distraction. +Speak like a human. +Speak like a human. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Approachable is better than simple. +Design for failure. +Favor focus over features. +Design for failure. +Anything added dilutes everything else. +Anything added dilutes everything else. +Keep it logically awesome. +It's not fully shipped until it's fast. +Approachable is better than simple. +Practicality beats purity. +Favor focus over features. +Approachable is better than simple. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Favor focus over features. +Approachable is better than simple. +Avoid administrative distraction. +Design for failure. +Speak like a human. +Design for failure. +Responsive is better than fast. +Speak like a human. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Encourage flow. +Responsive is better than fast. +Mind your words, they are important. +Speak like a human. +Keep it logically awesome. +Responsive is better than fast. +Approachable is better than simple. +Encourage flow. +Design for failure. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Practicality beats purity. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Design for failure. +Speak like a human. +Responsive is better than fast. +Speak like a human. +Responsive is better than fast. +Practicality beats purity. +Avoid administrative distraction. +Favor focus over features. +Responsive is better than fast. +Mind your words, they are important. +Mind your words, they are important. +Approachable is better than simple. +Encourage flow. +Favor focus over features. +Avoid administrative distraction. +Mind your words, they are important. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Keep it logically awesome. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Mind your words, they are important. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Avoid administrative distraction. +Approachable is better than simple. +Mind your words, they are important. +Favor focus over features. +Encourage flow. +Practicality beats purity. +It's not fully shipped until it's fast. +Practicality beats purity. +Design for failure. +Speak like a human. +Practicality beats purity. +Responsive is better than fast. +Anything added dilutes everything else. +Practicality beats purity. +It's not fully shipped until it's fast. +Practicality beats purity. +Speak like a human. +Encourage flow. +Favor focus over features. +Half measures are as bad as nothing at all. +Design for failure. +Mind your words, they are important. +Responsive is better than fast. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Design for failure. +Favor focus over features. +Encourage flow. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +Mind your words, they are important. +Design for failure. +Half measures are as bad as nothing at all. +Encourage flow. +Mind your words, they are important. +Design for failure. +Favor focus over features. +Favor focus over features. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Favor focus over features. +Design for failure. +Mind your words, they are important. +Anything added dilutes everything else. +Speak like a human. +Favor focus over features. +Speak like a human. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Mind your words, they are important. +Encourage flow. +Practicality beats purity. +Anything added dilutes everything else. +Responsive is better than fast. +Approachable is better than simple. +Non-blocking is better than blocking. +Design for failure. +Design for failure. +Encourage flow. +Responsive is better than fast. +Avoid administrative distraction. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +Speak like a human. +Speak like a human. +Keep it logically awesome. +Keep it logically awesome. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Avoid administrative distraction. +Anything added dilutes everything else. +Approachable is better than simple. +Speak like a human. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Approachable is better than simple. +Speak like a human. +Encourage flow. +Approachable is better than simple. +Favor focus over features. +Approachable is better than simple. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Responsive is better than fast. +Mind your words, they are important. +Speak like a human. +Responsive is better than fast. +Keep it logically awesome. +Speak like a human. +Favor focus over features. +Encourage flow. +Approachable is better than simple. +Practicality beats purity. +Mind your words, they are important. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Design for failure. +Mind your words, they are important. +Design for failure. +Favor focus over features. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Keep it logically awesome. +Non-blocking is better than blocking. +Responsive is better than fast. +Practicality beats purity. +Mind your words, they are important. +Design for failure. +Speak like a human. +Mind your words, they are important. +Responsive is better than fast. +Approachable is better than simple. +Responsive is better than fast. +Practicality beats purity. +Non-blocking is better than blocking. +Practicality beats purity. +Keep it logically awesome. +It's not fully shipped until it's fast. +Approachable is better than simple. +Design for failure. +Non-blocking is better than blocking. +Responsive is better than fast. +Encourage flow. +Favor focus over features. +Responsive is better than fast. +Non-blocking is better than blocking. +Design for failure. +Mind your words, they are important. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Mind your words, they are important. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Practicality beats purity. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Favor focus over features. +Keep it logically awesome. +Practicality beats purity. +Anything added dilutes everything else. +Practicality beats purity. +Favor focus over features. +Encourage flow. +Anything added dilutes everything else. +Design for failure. +Avoid administrative distraction. +Encourage flow. +Responsive is better than fast. +Speak like a human. +Design for failure. +Favor focus over features. +Mind your words, they are important. +Responsive is better than fast. +Keep it logically awesome. +Favor focus over features. +Anything added dilutes everything else. +Design for failure. +Responsive is better than fast. +Practicality beats purity. +Half measures are as bad as nothing at all. +Design for failure. +Encourage flow. +Practicality beats purity. +Approachable is better than simple. +Responsive is better than fast. +Speak like a human. +Avoid administrative distraction. +Encourage flow. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Favor focus over features. +It's not fully shipped until it's fast. +Responsive is better than fast. +Practicality beats purity. +Design for failure. +Practicality beats purity. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Practicality beats purity. +Approachable is better than simple. +Anything added dilutes everything else. +Anything added dilutes everything else. +Speak like a human. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Practicality beats purity. +Responsive is better than fast. +Avoid administrative distraction. +Anything added dilutes everything else. +Responsive is better than fast. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Anything added dilutes everything else. +Avoid administrative distraction. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Practicality beats purity. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Practicality beats purity. +Responsive is better than fast. +Mind your words, they are important. +Design for failure. +Non-blocking is better than blocking. +Encourage flow. +Practicality beats purity. +Anything added dilutes everything else. +Encourage flow. +Non-blocking is better than blocking. +Keep it logically awesome. +Non-blocking is better than blocking. +Keep it logically awesome. +Responsive is better than fast. +Avoid administrative distraction. +Anything added dilutes everything else. +Approachable is better than simple. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Design for failure. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Approachable is better than simple. +Avoid administrative distraction. +Encourage flow. +Practicality beats purity. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Encourage flow. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Non-blocking is better than blocking. +Responsive is better than fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Favor focus over features. +Responsive is better than fast. +Speak like a human. +Keep it logically awesome. +Speak like a human. +Design for failure. +Non-blocking is better than blocking. +Approachable is better than simple. +Practicality beats purity. +Design for failure. +Avoid administrative distraction. +Avoid administrative distraction. +Approachable is better than simple. +It's not fully shipped until it's fast. +Encourage flow. +Responsive is better than fast. +Non-blocking is better than blocking. +Favor focus over features. +Favor focus over features. +Approachable is better than simple. +Anything added dilutes everything else. +Practicality beats purity. +Approachable is better than simple. +Responsive is better than fast. +Responsive is better than fast. +Practicality beats purity. +Favor focus over features. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +It's not fully shipped until it's fast. +Favor focus over features. +Keep it logically awesome. +Practicality beats purity. +Speak like a human. +Encourage flow. +Approachable is better than simple. +Approachable is better than simple. +Responsive is better than fast. +Responsive is better than fast. +Responsive is better than fast. +Non-blocking is better than blocking. +Design for failure. +Speak like a human. +Avoid administrative distraction. +Practicality beats purity. +Keep it logically awesome. +Responsive is better than fast. +Avoid administrative distraction. +Keep it logically awesome. +Avoid administrative distraction. +Mind your words, they are important. +Encourage flow. +Design for failure. +Favor focus over features. +Speak like a human. +Mind your words, they are important. +Speak like a human. +Encourage flow. +Favor focus over features. +Responsive is better than fast. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Keep it logically awesome. +Non-blocking is better than blocking. +Design for failure. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Practicality beats purity. +Approachable is better than simple. +Responsive is better than fast. +Design for failure. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Encourage flow. +Speak like a human. +Design for failure. +Keep it logically awesome. +Approachable is better than simple. +Favor focus over features. +It's not fully shipped until it's fast. +Mind your words, they are important. +Responsive is better than fast. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +Encourage flow. +Keep it logically awesome. +Practicality beats purity. +Speak like a human. +Encourage flow. +Encourage flow. +Responsive is better than fast. +Encourage flow. +Mind your words, they are important. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Approachable is better than simple. +It's not fully shipped until it's fast. +Mind your words, they are important. +Keep it logically awesome. +Design for failure. +Approachable is better than simple. +Keep it logically awesome. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Mind your words, they are important. +Design for failure. +Practicality beats purity. +Responsive is better than fast. +Practicality beats purity. +Practicality beats purity. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Practicality beats purity. +It's not fully shipped until it's fast. +Design for failure. +Approachable is better than simple. +Approachable is better than simple. +Design for failure. +Keep it logically awesome. +Keep it logically awesome. +Speak like a human. +Keep it logically awesome. +Keep it logically awesome. +Approachable is better than simple. +Keep it logically awesome. +Design for failure. +Avoid administrative distraction. +Encourage flow. +Mind your words, they are important. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Keep it logically awesome. +Encourage flow. +Practicality beats purity. +Avoid administrative distraction. +Design for failure. +Practicality beats purity. +Speak like a human. +It's not fully shipped until it's fast. +Favor focus over features. +Half measures are as bad as nothing at all. +Favor focus over features. +Practicality beats purity. +Anything added dilutes everything else. +Design for failure. +Responsive is better than fast. +Anything added dilutes everything else. +Speak like a human. +Avoid administrative distraction. +Keep it logically awesome. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Mind your words, they are important. +It's not fully shipped until it's fast. +Favor focus over features. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +Encourage flow. +Keep it logically awesome. +Design for failure. +Anything added dilutes everything else. +Practicality beats purity. +Speak like a human. +Avoid administrative distraction. +Approachable is better than simple. +Favor focus over features. +Approachable is better than simple. +Keep it logically awesome. +Favor focus over features. +Keep it logically awesome. +Design for failure. +Mind your words, they are important. +Avoid administrative distraction. +Anything added dilutes everything else. +Design for failure. +Avoid administrative distraction. +Encourage flow. +Speak like a human. +Mind your words, they are important. +Anything added dilutes everything else. +Practicality beats purity. +Design for failure. +Speak like a human. +Practicality beats purity. +Encourage flow. +Approachable is better than simple. +Design for failure. +Encourage flow. +Responsive is better than fast. +Speak like a human. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Encourage flow. +It's not fully shipped until it's fast. +Favor focus over features. +Avoid administrative distraction. +Practicality beats purity. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Practicality beats purity. +Responsive is better than fast. +Approachable is better than simple. +Approachable is better than simple. +Non-blocking is better than blocking. +Mind your words, they are important. +It's not fully shipped until it's fast. +Responsive is better than fast. +Encourage flow. +Approachable is better than simple. +Non-blocking is better than blocking. +Practicality beats purity. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Favor focus over features. +Speak like a human. +Keep it logically awesome. +Encourage flow. +Design for failure. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +Encourage flow. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Design for failure. +Approachable is better than simple. +Design for failure. +Encourage flow. +Encourage flow. +Speak like a human. +Keep it logically awesome. +Non-blocking is better than blocking. +Encourage flow. +Anything added dilutes everything else. +Favor focus over features. +Practicality beats purity. +Mind your words, they are important. +Non-blocking is better than blocking. +Responsive is better than fast. +Encourage flow. +Responsive is better than fast. +Responsive is better than fast. +Anything added dilutes everything else. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Keep it logically awesome. +Avoid administrative distraction. +Favor focus over features. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Mind your words, they are important. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Practicality beats purity. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Encourage flow. +Anything added dilutes everything else. +Anything added dilutes everything else. +Favor focus over features. +Speak like a human. +Favor focus over features. +Encourage flow. +Keep it logically awesome. +Speak like a human. +Anything added dilutes everything else. +Approachable is better than simple. +Keep it logically awesome. +Mind your words, they are important. +Anything added dilutes everything else. +Mind your words, they are important. +Responsive is better than fast. +Practicality beats purity. +Half measures are as bad as nothing at all. +Encourage flow. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Favor focus over features. +Practicality beats purity. +Favor focus over features. +Responsive is better than fast. +Favor focus over features. +Approachable is better than simple. +Encourage flow. +Design for failure. +It's not fully shipped until it's fast. +Encourage flow. +Keep it logically awesome. +It's not fully shipped until it's fast. +Responsive is better than fast. +Speak like a human. +Avoid administrative distraction. +Practicality beats purity. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Responsive is better than fast. +Speak like a human. +Approachable is better than simple. +Encourage flow. +Practicality beats purity. +Avoid administrative distraction. +Encourage flow. +Approachable is better than simple. +Keep it logically awesome. +Favor focus over features. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Anything added dilutes everything else. +Encourage flow. +Responsive is better than fast. +Keep it logically awesome. +Keep it logically awesome. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Favor focus over features. +Keep it logically awesome. +Encourage flow. +Approachable is better than simple. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Favor focus over features. +Keep it logically awesome. +Responsive is better than fast. +Avoid administrative distraction. +Avoid administrative distraction. +Avoid administrative distraction. +Avoid administrative distraction. +Practicality beats purity. +Favor focus over features. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Keep it logically awesome. +Mind your words, they are important. +Design for failure. +Design for failure. +Encourage flow. +Encourage flow. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +Non-blocking is better than blocking. +Encourage flow. +Approachable is better than simple. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Anything added dilutes everything else. +Favor focus over features. +Keep it logically awesome. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Design for failure. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Speak like a human. +Approachable is better than simple. +Speak like a human. +Encourage flow. +Non-blocking is better than blocking. +Approachable is better than simple. +Practicality beats purity. +Favor focus over features. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Keep it logically awesome. +Approachable is better than simple. +Mind your words, they are important. +Avoid administrative distraction. +Keep it logically awesome. +Approachable is better than simple. +Responsive is better than fast. +Avoid administrative distraction. +Practicality beats purity. +Mind your words, they are important. +Favor focus over features. +Keep it logically awesome. +Approachable is better than simple. +Keep it logically awesome. +Non-blocking is better than blocking. +Practicality beats purity. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Favor focus over features. +Avoid administrative distraction. +Design for failure. +Responsive is better than fast. +Practicality beats purity. +Speak like a human. +Anything added dilutes everything else. +Mind your words, they are important. +It's not fully shipped until it's fast. +Responsive is better than fast. +Non-blocking is better than blocking. +Favor focus over features. +Avoid administrative distraction. +Encourage flow. +Design for failure. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Speak like a human. +Favor focus over features. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Practicality beats purity. +Design for failure. +Avoid administrative distraction. +Design for failure. +Anything added dilutes everything else. +Speak like a human. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Keep it logically awesome. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Speak like a human. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Favor focus over features. +Non-blocking is better than blocking. +Favor focus over features. +Approachable is better than simple. +Encourage flow. +Design for failure. +Anything added dilutes everything else. +Avoid administrative distraction. +Favor focus over features. +Anything added dilutes everything else. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Favor focus over features. +Keep it logically awesome. +Keep it logically awesome. +Anything added dilutes everything else. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Encourage flow. +Keep it logically awesome. +Non-blocking is better than blocking. +Avoid administrative distraction. +Keep it logically awesome. +Mind your words, they are important. +Non-blocking is better than blocking. +Favor focus over features. +Keep it logically awesome. +Non-blocking is better than blocking. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +Avoid administrative distraction. +Speak like a human. +Encourage flow. +Avoid administrative distraction. +Responsive is better than fast. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +Favor focus over features. +Non-blocking is better than blocking. +Mind your words, they are important. +Speak like a human. +Favor focus over features. +Encourage flow. +Favor focus over features. +Avoid administrative distraction. +Design for failure. +Anything added dilutes everything else. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Speak like a human. +Encourage flow. +Encourage flow. +It's not fully shipped until it's fast. +Mind your words, they are important. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Approachable is better than simple. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Approachable is better than simple. +Anything added dilutes everything else. +Favor focus over features. +Non-blocking is better than blocking. +Keep it logically awesome. +Favor focus over features. +Design for failure. +Design for failure. +Speak like a human. +Encourage flow. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Keep it logically awesome. +Anything added dilutes everything else. +Mind your words, they are important. +Mind your words, they are important. +Favor focus over features. +Responsive is better than fast. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Encourage flow. +Encourage flow. +Encourage flow. +Keep it logically awesome. +Approachable is better than simple. +Approachable is better than simple. +Speak like a human. +Approachable is better than simple. +Responsive is better than fast. +Approachable is better than simple. +Encourage flow. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Encourage flow. +Encourage flow. +Approachable is better than simple. +Approachable is better than simple. +It's not fully shipped until it's fast. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Responsive is better than fast. +Non-blocking is better than blocking. +Practicality beats purity. +Speak like a human. +It's not fully shipped until it's fast. +Speak like a human. +Design for failure. +Practicality beats purity. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Mind your words, they are important. +Anything added dilutes everything else. +Responsive is better than fast. +Anything added dilutes everything else. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Keep it logically awesome. +Responsive is better than fast. +Encourage flow. +Favor focus over features. +Non-blocking is better than blocking. +Favor focus over features. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Encourage flow. +Encourage flow. +Responsive is better than fast. +Responsive is better than fast. +Speak like a human. +Avoid administrative distraction. +Favor focus over features. +Design for failure. +Encourage flow. +Keep it logically awesome. +Practicality beats purity. +Approachable is better than simple. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Encourage flow. +Practicality beats purity. +Favor focus over features. +Favor focus over features. +Practicality beats purity. +Practicality beats purity. +Design for failure. +It's not fully shipped until it's fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Favor focus over features. +Anything added dilutes everything else. +Mind your words, they are important. +Favor focus over features. +Anything added dilutes everything else. +Practicality beats purity. +It's not fully shipped until it's fast. +Design for failure. +Non-blocking is better than blocking. +Avoid administrative distraction. +Favor focus over features. +Avoid administrative distraction. +Avoid administrative distraction. +Approachable is better than simple. +Keep it logically awesome. +Avoid administrative distraction. +Practicality beats purity. +It's not fully shipped until it's fast. +Mind your words, they are important. +Design for failure. +Keep it logically awesome. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Design for failure. +Encourage flow. +Avoid administrative distraction. +Speak like a human. +Favor focus over features. +It's not fully shipped until it's fast. +Keep it logically awesome. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Speak like a human. +Mind your words, they are important. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Favor focus over features. +Practicality beats purity. +Speak like a human. +Mind your words, they are important. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Mind your words, they are important. +Practicality beats purity. +Approachable is better than simple. +Practicality beats purity. +Avoid administrative distraction. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Responsive is better than fast. +Design for failure. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Favor focus over features. +Favor focus over features. +Speak like a human. +Speak like a human. +It's not fully shipped until it's fast. +Design for failure. +Speak like a human. +Favor focus over features. +Approachable is better than simple. +Avoid administrative distraction. +Favor focus over features. +Non-blocking is better than blocking. +Keep it logically awesome. +Favor focus over features. +Encourage flow. +Keep it logically awesome. +Encourage flow. +Encourage flow. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +It's not fully shipped until it's fast. +Responsive is better than fast. +Mind your words, they are important. +Keep it logically awesome. +Avoid administrative distraction. +Responsive is better than fast. +Non-blocking is better than blocking. +Encourage flow. +Approachable is better than simple. +Anything added dilutes everything else. +Encourage flow. +Mind your words, they are important. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Mind your words, they are important. +Favor focus over features. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Speak like a human. +Avoid administrative distraction. +Design for failure. +Responsive is better than fast. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Approachable is better than simple. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Practicality beats purity. +Responsive is better than fast. +Practicality beats purity. +Design for failure. +Favor focus over features. +Responsive is better than fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Responsive is better than fast. +Keep it logically awesome. +Practicality beats purity. +Design for failure. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Approachable is better than simple. +Design for failure. +Responsive is better than fast. +Design for failure. +Design for failure. +Anything added dilutes everything else. +Favor focus over features. +Avoid administrative distraction. +Practicality beats purity. +Responsive is better than fast. +Encourage flow. +Encourage flow. +Anything added dilutes everything else. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +Design for failure. +Mind your words, they are important. +Anything added dilutes everything else. +Keep it logically awesome. +Non-blocking is better than blocking. +Keep it logically awesome. +Avoid administrative distraction. +Avoid administrative distraction. +Keep it logically awesome. +Approachable is better than simple. +Mind your words, they are important. +Avoid administrative distraction. +Non-blocking is better than blocking. +Speak like a human. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Favor focus over features. +Keep it logically awesome. +Non-blocking is better than blocking. +Avoid administrative distraction. +Keep it logically awesome. +Anything added dilutes everything else. +Keep it logically awesome. +It's not fully shipped until it's fast. +Favor focus over features. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Design for failure. +Approachable is better than simple. +Favor focus over features. +Mind your words, they are important. +Practicality beats purity. +Half measures are as bad as nothing at all. +Favor focus over features. +Mind your words, they are important. +Design for failure. +Avoid administrative distraction. +Non-blocking is better than blocking. +Practicality beats purity. +Design for failure. +Favor focus over features. +Responsive is better than fast. +Non-blocking is better than blocking. +Favor focus over features. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Encourage flow. +Practicality beats purity. +Avoid administrative distraction. +Encourage flow. +Responsive is better than fast. +Practicality beats purity. +Encourage flow. +Non-blocking is better than blocking. +Approachable is better than simple. +Encourage flow. +Encourage flow. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Non-blocking is better than blocking. +Keep it logically awesome. +Responsive is better than fast. +Speak like a human. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Responsive is better than fast. +Mind your words, they are important. +Non-blocking is better than blocking. +Approachable is better than simple. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +Mind your words, they are important. +Responsive is better than fast. +Design for failure. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Approachable is better than simple. +Speak like a human. +Practicality beats purity. +Design for failure. +Encourage flow. +Design for failure. +Keep it logically awesome. +Favor focus over features. +Practicality beats purity. +Favor focus over features. +Anything added dilutes everything else. +Favor focus over features. +Design for failure. +It's not fully shipped until it's fast. +Encourage flow. +Anything added dilutes everything else. +Anything added dilutes everything else. +Speak like a human. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Responsive is better than fast. +Design for failure. +Speak like a human. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Design for failure. +Responsive is better than fast. +Design for failure. +Responsive is better than fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Mind your words, they are important. +Avoid administrative distraction. +Approachable is better than simple. +Keep it logically awesome. +Approachable is better than simple. +Design for failure. +Keep it logically awesome. +Non-blocking is better than blocking. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Encourage flow. +Anything added dilutes everything else. +Mind your words, they are important. +Non-blocking is better than blocking. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Design for failure. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Practicality beats purity. +Design for failure. +Encourage flow. +Non-blocking is better than blocking. +Avoid administrative distraction. +Avoid administrative distraction. +Favor focus over features. +Mind your words, they are important. +Non-blocking is better than blocking. +Avoid administrative distraction. +Encourage flow. +Mind your words, they are important. +Practicality beats purity. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Favor focus over features. +Speak like a human. +It's not fully shipped until it's fast. +Design for failure. +Keep it logically awesome. +Non-blocking is better than blocking. +Responsive is better than fast. +Responsive is better than fast. +Non-blocking is better than blocking. +Avoid administrative distraction. +Favor focus over features. +Design for failure. +Encourage flow. +Encourage flow. +Favor focus over features. +Practicality beats purity. +Design for failure. +Mind your words, they are important. +Encourage flow. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Encourage flow. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Keep it logically awesome. +Design for failure. +Anything added dilutes everything else. +Responsive is better than fast. +Encourage flow. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Encourage flow. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Anything added dilutes everything else. +Practicality beats purity. +Keep it logically awesome. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +It's not fully shipped until it's fast. +Favor focus over features. +Keep it logically awesome. +Speak like a human. +Anything added dilutes everything else. +Approachable is better than simple. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Favor focus over features. +Keep it logically awesome. +Practicality beats purity. +Avoid administrative distraction. +Mind your words, they are important. +Design for failure. +Mind your words, they are important. +Encourage flow. +Non-blocking is better than blocking. +Favor focus over features. +Favor focus over features. +Mind your words, they are important. +Responsive is better than fast. +Keep it logically awesome. +Design for failure. +Responsive is better than fast. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Design for failure. +Design for failure. +Approachable is better than simple. +Responsive is better than fast. +Speak like a human. +Favor focus over features. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Design for failure. +Keep it logically awesome. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Keep it logically awesome. +Speak like a human. +Practicality beats purity. +Favor focus over features. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Speak like a human. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Approachable is better than simple. +Design for failure. +Mind your words, they are important. +Anything added dilutes everything else. +Favor focus over features. +It's not fully shipped until it's fast. +Practicality beats purity. +Avoid administrative distraction. +Speak like a human. +Responsive is better than fast. +Encourage flow. +Responsive is better than fast. +It's not fully shipped until it's fast. +Design for failure. +Keep it logically awesome. +Favor focus over features. +Approachable is better than simple. +Design for failure. +Anything added dilutes everything else. +Approachable is better than simple. +Mind your words, they are important. +Speak like a human. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Encourage flow. +Responsive is better than fast. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Speak like a human. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Encourage flow. +Anything added dilutes everything else. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Avoid administrative distraction. +Speak like a human. +Practicality beats purity. +Encourage flow. +Practicality beats purity. +It's not fully shipped until it's fast. +Responsive is better than fast. +Design for failure. +Non-blocking is better than blocking. +Responsive is better than fast. +Responsive is better than fast. +Practicality beats purity. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Responsive is better than fast. +Favor focus over features. +Mind your words, they are important. +Design for failure. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Favor focus over features. +Mind your words, they are important. +Responsive is better than fast. +Speak like a human. +Design for failure. +Non-blocking is better than blocking. +Responsive is better than fast. +Mind your words, they are important. +Avoid administrative distraction. +Design for failure. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Practicality beats purity. +Design for failure. +It's not fully shipped until it's fast. +Design for failure. +Anything added dilutes everything else. +Encourage flow. +Approachable is better than simple. +Favor focus over features. +Design for failure. +Mind your words, they are important. +Keep it logically awesome. +Practicality beats purity. +Approachable is better than simple. +Design for failure. +Design for failure. +Approachable is better than simple. +Encourage flow. +Favor focus over features. +Practicality beats purity. +Favor focus over features. +Responsive is better than fast. +Anything added dilutes everything else. +Approachable is better than simple. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Encourage flow. +It's not fully shipped until it's fast. +Favor focus over features. +Practicality beats purity. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Mind your words, they are important. +Approachable is better than simple. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +Favor focus over features. +Keep it logically awesome. +Speak like a human. +Keep it logically awesome. +Mind your words, they are important. +Anything added dilutes everything else. +Design for failure. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Responsive is better than fast. +It's not fully shipped until it's fast. +Encourage flow. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Approachable is better than simple. +Practicality beats purity. +Design for failure. +Anything added dilutes everything else. +Responsive is better than fast. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Mind your words, they are important. +Non-blocking is better than blocking. +Avoid administrative distraction. +Anything added dilutes everything else. +Approachable is better than simple. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Favor focus over features. +Mind your words, they are important. +It's not fully shipped until it's fast. +Keep it logically awesome. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Mind your words, they are important. +Favor focus over features. +Practicality beats purity. +Avoid administrative distraction. +Mind your words, they are important. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Responsive is better than fast. +Anything added dilutes everything else. +Favor focus over features. +Encourage flow. +Design for failure. +Keep it logically awesome. +Encourage flow. +Non-blocking is better than blocking. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Practicality beats purity. +Anything added dilutes everything else. +Responsive is better than fast. +Approachable is better than simple. +Mind your words, they are important. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Favor focus over features. +Practicality beats purity. +Avoid administrative distraction. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Non-blocking is better than blocking. +Encourage flow. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +Approachable is better than simple. +Favor focus over features. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Approachable is better than simple. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Design for failure. +Approachable is better than simple. +Design for failure. +Half measures are as bad as nothing at all. +Encourage flow. +Responsive is better than fast. +Responsive is better than fast. +Keep it logically awesome. +Avoid administrative distraction. +Approachable is better than simple. +Mind your words, they are important. +Speak like a human. +Responsive is better than fast. +Keep it logically awesome. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Non-blocking is better than blocking. +Responsive is better than fast. +It's not fully shipped until it's fast. +Responsive is better than fast. +Favor focus over features. +Approachable is better than simple. +Speak like a human. +Responsive is better than fast. +Mind your words, they are important. +Mind your words, they are important. +It's not fully shipped until it's fast. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Mind your words, they are important. +Keep it logically awesome. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Speak like a human. +Avoid administrative distraction. +Mind your words, they are important. +Non-blocking is better than blocking. +Practicality beats purity. +Favor focus over features. +Approachable is better than simple. +Favor focus over features. +Avoid administrative distraction. +Responsive is better than fast. +Design for failure. +It's not fully shipped until it's fast. +Keep it logically awesome. +Responsive is better than fast. +Keep it logically awesome. +Mind your words, they are important. +Responsive is better than fast. +Favor focus over features. +Mind your words, they are important. +Design for failure. +Responsive is better than fast. +Speak like a human. +Responsive is better than fast. +Speak like a human. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Favor focus over features. +Practicality beats purity. +Speak like a human. +Avoid administrative distraction. +Favor focus over features. +Keep it logically awesome. +Keep it logically awesome. +Approachable is better than simple. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Keep it logically awesome. +Keep it logically awesome. +Keep it logically awesome. +Speak like a human. +Mind your words, they are important. +Design for failure. +Non-blocking is better than blocking. +Responsive is better than fast. +Practicality beats purity. +Non-blocking is better than blocking. +Mind your words, they are important. +Non-blocking is better than blocking. +Mind your words, they are important. +Design for failure. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Speak like a human. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Favor focus over features. +Speak like a human. +Responsive is better than fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Favor focus over features. +Encourage flow. +Approachable is better than simple. +Favor focus over features. +Practicality beats purity. +Speak like a human. +It's not fully shipped until it's fast. +Mind your words, they are important. +Practicality beats purity. +Approachable is better than simple. +Speak like a human. +Practicality beats purity. +Favor focus over features. +Responsive is better than fast. +Approachable is better than simple. +Speak like a human. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Approachable is better than simple. +It's not fully shipped until it's fast. +Speak like a human. +Favor focus over features. +Anything added dilutes everything else. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Approachable is better than simple. +Anything added dilutes everything else. +Design for failure. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Practicality beats purity. +Speak like a human. +Keep it logically awesome. +Encourage flow. +Avoid administrative distraction. +Mind your words, they are important. +Encourage flow. +Responsive is better than fast. +Encourage flow. +Anything added dilutes everything else. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Responsive is better than fast. +Favor focus over features. +Favor focus over features. +Practicality beats purity. +Practicality beats purity. +Speak like a human. +Design for failure. +It's not fully shipped until it's fast. +Design for failure. +Approachable is better than simple. +Keep it logically awesome. +It's not fully shipped until it's fast. +Mind your words, they are important. +Practicality beats purity. +Anything added dilutes everything else. +Design for failure. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Design for failure. +Design for failure. +Encourage flow. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Keep it logically awesome. +Favor focus over features. +Keep it logically awesome. +Design for failure. +Responsive is better than fast. +Anything added dilutes everything else. +Mind your words, they are important. +Favor focus over features. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Mind your words, they are important. +Practicality beats purity. +Keep it logically awesome. +Encourage flow. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Design for failure. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Speak like a human. +Favor focus over features. +Avoid administrative distraction. +Encourage flow. +Design for failure. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +Mind your words, they are important. +Speak like a human. +Half measures are as bad as nothing at all. +Practicality beats purity. +Responsive is better than fast. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Practicality beats purity. +Approachable is better than simple. +Encourage flow. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Speak like a human. +Mind your words, they are important. +Responsive is better than fast. +Approachable is better than simple. +Speak like a human. +Design for failure. +Anything added dilutes everything else. +Keep it logically awesome. +Non-blocking is better than blocking. +Avoid administrative distraction. +Encourage flow. +Design for failure. +Mind your words, they are important. +Design for failure. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Keep it logically awesome. +Encourage flow. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +It's not fully shipped until it's fast. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Design for failure. +Keep it logically awesome. +Keep it logically awesome. +Favor focus over features. +Practicality beats purity. +Half measures are as bad as nothing at all. +Favor focus over features. +Non-blocking is better than blocking. +Mind your words, they are important. +Approachable is better than simple. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Speak like a human. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Keep it logically awesome. +Practicality beats purity. +It's not fully shipped until it's fast. +Favor focus over features. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +Approachable is better than simple. +Encourage flow. +Anything added dilutes everything else. +Speak like a human. +Favor focus over features. +Practicality beats purity. +It's not fully shipped until it's fast. +Responsive is better than fast. +Practicality beats purity. +Approachable is better than simple. +Anything added dilutes everything else. +Anything added dilutes everything else. +Keep it logically awesome. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Design for failure. +Practicality beats purity. +Half measures are as bad as nothing at all. +Design for failure. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Speak like a human. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Mind your words, they are important. +Anything added dilutes everything else. +Responsive is better than fast. +Encourage flow. +Favor focus over features. +Keep it logically awesome. +Keep it logically awesome. +Favor focus over features. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Speak like a human. +It's not fully shipped until it's fast. +Favor focus over features. +Anything added dilutes everything else. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Speak like a human. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Design for failure. +Favor focus over features. +Encourage flow. +Encourage flow. +Encourage flow. +Non-blocking is better than blocking. +Avoid administrative distraction. +Mind your words, they are important. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Approachable is better than simple. +Approachable is better than simple. +Encourage flow. +Encourage flow. +Practicality beats purity. +Non-blocking is better than blocking. +Mind your words, they are important. +It's not fully shipped until it's fast. +Encourage flow. +Responsive is better than fast. +Responsive is better than fast. +Encourage flow. +Practicality beats purity. +Speak like a human. +Responsive is better than fast. +Keep it logically awesome. +Keep it logically awesome. +Avoid administrative distraction. +Avoid administrative distraction. +Design for failure. +Anything added dilutes everything else. +Avoid administrative distraction. +Mind your words, they are important. +Speak like a human. +Keep it logically awesome. +Approachable is better than simple. +It's not fully shipped until it's fast. +Responsive is better than fast. +Encourage flow. +Design for failure. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Speak like a human. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Approachable is better than simple. +Favor focus over features. +Practicality beats purity. +Anything added dilutes everything else. +Speak like a human. +Mind your words, they are important. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Approachable is better than simple. +Practicality beats purity. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Design for failure. +Encourage flow. +Favor focus over features. +Encourage flow. +Encourage flow. +Approachable is better than simple. +Avoid administrative distraction. +Design for failure. +Favor focus over features. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Practicality beats purity. +Encourage flow. +Practicality beats purity. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Keep it logically awesome. +Keep it logically awesome. +Design for failure. +Favor focus over features. +Encourage flow. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Favor focus over features. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Keep it logically awesome. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Encourage flow. +Avoid administrative distraction. +Practicality beats purity. +Keep it logically awesome. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +Anything added dilutes everything else. +Speak like a human. +Keep it logically awesome. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Non-blocking is better than blocking. +Practicality beats purity. +Favor focus over features. +Keep it logically awesome. +Keep it logically awesome. +Design for failure. +Mind your words, they are important. +Responsive is better than fast. +Responsive is better than fast. +Favor focus over features. +Speak like a human. +Mind your words, they are important. +It's not fully shipped until it's fast. +Design for failure. +Approachable is better than simple. +Approachable is better than simple. +Non-blocking is better than blocking. +Design for failure. +Practicality beats purity. +Anything added dilutes everything else. +Favor focus over features. +Encourage flow. +It's not fully shipped until it's fast. +Practicality beats purity. +Approachable is better than simple. +Mind your words, they are important. +Favor focus over features. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Mind your words, they are important. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Encourage flow. +Favor focus over features. +Favor focus over features. +Mind your words, they are important. +Anything added dilutes everything else. +Avoid administrative distraction. +Encourage flow. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Speak like a human. +Speak like a human. +Encourage flow. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Design for failure. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Practicality beats purity. +Responsive is better than fast. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Practicality beats purity. +Responsive is better than fast. +Practicality beats purity. +Design for failure. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +Encourage flow. +Avoid administrative distraction. +Responsive is better than fast. +Practicality beats purity. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Approachable is better than simple. +Non-blocking is better than blocking. +Favor focus over features. +Approachable is better than simple. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Encourage flow. +Mind your words, they are important. +Non-blocking is better than blocking. +Approachable is better than simple. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Practicality beats purity. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +Approachable is better than simple. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Favor focus over features. +Non-blocking is better than blocking. +Approachable is better than simple. +Design for failure. +Approachable is better than simple. +Mind your words, they are important. +Keep it logically awesome. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Approachable is better than simple. +Mind your words, they are important. +Speak like a human. +Mind your words, they are important. +It's not fully shipped until it's fast. +Design for failure. +Anything added dilutes everything else. +Mind your words, they are important. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Mind your words, they are important. +Anything added dilutes everything else. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Mind your words, they are important. +Favor focus over features. +Design for failure. +Half measures are as bad as nothing at all. +Encourage flow. +Approachable is better than simple. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +Mind your words, they are important. +Favor focus over features. +Speak like a human. +Favor focus over features. +Design for failure. +Design for failure. +Speak like a human. +Speak like a human. +Design for failure. +Speak like a human. +Anything added dilutes everything else. +Avoid administrative distraction. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Design for failure. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Speak like a human. +Responsive is better than fast. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Favor focus over features. +Design for failure. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Favor focus over features. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Anything added dilutes everything else. +Speak like a human. +Practicality beats purity. +Encourage flow. +Responsive is better than fast. +Design for failure. +It's not fully shipped until it's fast. +Approachable is better than simple. +Keep it logically awesome. +It's not fully shipped until it's fast. +Favor focus over features. +Anything added dilutes everything else. +Speak like a human. +Practicality beats purity. +Design for failure. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Anything added dilutes everything else. +Speak like a human. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Speak like a human. +Non-blocking is better than blocking. +Speak like a human. +Avoid administrative distraction. +Non-blocking is better than blocking. +Approachable is better than simple. +Anything added dilutes everything else. +Favor focus over features. +It's not fully shipped until it's fast. +Favor focus over features. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Design for failure. +Design for failure. +Speak like a human. +Approachable is better than simple. +Responsive is better than fast. +It's not fully shipped until it's fast. +Speak like a human. +Encourage flow. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Approachable is better than simple. +Favor focus over features. +Anything added dilutes everything else. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Anything added dilutes everything else. +Design for failure. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Design for failure. +Encourage flow. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Avoid administrative distraction. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Speak like a human. +Design for failure. +Keep it logically awesome. +Keep it logically awesome. +Responsive is better than fast. +Speak like a human. +Design for failure. +Mind your words, they are important. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Speak like a human. +Approachable is better than simple. +Speak like a human. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Practicality beats purity. +It's not fully shipped until it's fast. +Approachable is better than simple. +Anything added dilutes everything else. +Speak like a human. +Mind your words, they are important. +Encourage flow. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Practicality beats purity. +Design for failure. +Speak like a human. +Mind your words, they are important. +Speak like a human. +Favor focus over features. +Non-blocking is better than blocking. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Approachable is better than simple. +Anything added dilutes everything else. +Encourage flow. +Keep it logically awesome. +Keep it logically awesome. +Anything added dilutes everything else. +Keep it logically awesome. +Speak like a human. +Anything added dilutes everything else. +Design for failure. +Practicality beats purity. +Mind your words, they are important. +Speak like a human. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Keep it logically awesome. +Non-blocking is better than blocking. +Responsive is better than fast. +Responsive is better than fast. +Keep it logically awesome. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Design for failure. +Approachable is better than simple. +Design for failure. +Mind your words, they are important. +Practicality beats purity. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +Favor focus over features. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Keep it logically awesome. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Approachable is better than simple. +Avoid administrative distraction. +Mind your words, they are important. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Favor focus over features. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Mind your words, they are important. +Design for failure. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Approachable is better than simple. +Anything added dilutes everything else. +Practicality beats purity. +Mind your words, they are important. +Speak like a human. +Keep it logically awesome. +Design for failure. +Encourage flow. +Encourage flow. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Keep it logically awesome. +Favor focus over features. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +Practicality beats purity. +Avoid administrative distraction. +Approachable is better than simple. +Mind your words, they are important. +Keep it logically awesome. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Avoid administrative distraction. +Anything added dilutes everything else. +Approachable is better than simple. +Speak like a human. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Avoid administrative distraction. +Responsive is better than fast. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Responsive is better than fast. +Speak like a human. +Keep it logically awesome. +Speak like a human. +Responsive is better than fast. +Non-blocking is better than blocking. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Practicality beats purity. +Non-blocking is better than blocking. +Approachable is better than simple. +Responsive is better than fast. +Speak like a human. +Keep it logically awesome. +Mind your words, they are important. +Non-blocking is better than blocking. +Design for failure. +Anything added dilutes everything else. +Speak like a human. +Encourage flow. +Non-blocking is better than blocking. +Encourage flow. +Mind your words, they are important. +It's not fully shipped until it's fast. +Approachable is better than simple. +Responsive is better than fast. +Speak like a human. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Responsive is better than fast. +Avoid administrative distraction. +Practicality beats purity. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Approachable is better than simple. +Approachable is better than simple. +Mind your words, they are important. +Practicality beats purity. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Avoid administrative distraction. +Practicality beats purity. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Practicality beats purity. +Avoid administrative distraction. +Responsive is better than fast. +It's not fully shipped until it's fast. +Mind your words, they are important. +Anything added dilutes everything else. +Mind your words, they are important. +Mind your words, they are important. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Design for failure. +Design for failure. +Half measures are as bad as nothing at all. +Speak like a human. +Approachable is better than simple. +Approachable is better than simple. +Practicality beats purity. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +Keep it logically awesome. +Favor focus over features. +Anything added dilutes everything else. +Anything added dilutes everything else. +Encourage flow. +Approachable is better than simple. +Approachable is better than simple. +Responsive is better than fast. +Practicality beats purity. +Encourage flow. +Encourage flow. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +Practicality beats purity. +Speak like a human. +Favor focus over features. +Half measures are as bad as nothing at all. +Practicality beats purity. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Practicality beats purity. +Anything added dilutes everything else. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Speak like a human. +Mind your words, they are important. +Encourage flow. +Avoid administrative distraction. +Favor focus over features. +It's not fully shipped until it's fast. +Favor focus over features. +Responsive is better than fast. +Approachable is better than simple. +Encourage flow. +Speak like a human. +Mind your words, they are important. +Non-blocking is better than blocking. +Responsive is better than fast. +Design for failure. +Responsive is better than fast. +Practicality beats purity. +Keep it logically awesome. +Mind your words, they are important. +Avoid administrative distraction. +Anything added dilutes everything else. +Anything added dilutes everything else. +Anything added dilutes everything else. +Favor focus over features. +Responsive is better than fast. +Non-blocking is better than blocking. +Favor focus over features. +Approachable is better than simple. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Responsive is better than fast. +Approachable is better than simple. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Keep it logically awesome. +Design for failure. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Approachable is better than simple. +Speak like a human. +Encourage flow. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Practicality beats purity. +Half measures are as bad as nothing at all. +Design for failure. +Half measures are as bad as nothing at all. +Encourage flow. +Speak like a human. +Keep it logically awesome. +Responsive is better than fast. +It's not fully shipped until it's fast. +Design for failure. +Approachable is better than simple. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Practicality beats purity. +Practicality beats purity. +Speak like a human. +Approachable is better than simple. +Mind your words, they are important. +Encourage flow. +Design for failure. +Speak like a human. +Avoid administrative distraction. +Approachable is better than simple. +Non-blocking is better than blocking. +Speak like a human. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Speak like a human. +Responsive is better than fast. +Avoid administrative distraction. +Practicality beats purity. +Mind your words, they are important. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Favor focus over features. +Practicality beats purity. +Speak like a human. +Keep it logically awesome. +Avoid administrative distraction. +Speak like a human. +It's not fully shipped until it's fast. +Practicality beats purity. +Avoid administrative distraction. +Mind your words, they are important. +It's not fully shipped until it's fast. +Favor focus over features. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Encourage flow. +Encourage flow. +Speak like a human. +Avoid administrative distraction. +Practicality beats purity. +Approachable is better than simple. +Anything added dilutes everything else. +Favor focus over features. +Mind your words, they are important. +Avoid administrative distraction. +Mind your words, they are important. +Practicality beats purity. +Design for failure. +Responsive is better than fast. +Anything added dilutes everything else. +Approachable is better than simple. +Speak like a human. +Approachable is better than simple. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Approachable is better than simple. +Favor focus over features. +Encourage flow. +Mind your words, they are important. +Responsive is better than fast. +Design for failure. +Non-blocking is better than blocking. +Favor focus over features. +Speak like a human. +Keep it logically awesome. +Practicality beats purity. +Mind your words, they are important. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Avoid administrative distraction. +Favor focus over features. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +It's not fully shipped until it's fast. +Speak like a human. +Keep it logically awesome. +Practicality beats purity. +It's not fully shipped until it's fast. +Practicality beats purity. +Keep it logically awesome. +Approachable is better than simple. +It's not fully shipped until it's fast. +Mind your words, they are important. +Avoid administrative distraction. +Responsive is better than fast. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Design for failure. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +Avoid administrative distraction. +Speak like a human. +Responsive is better than fast. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Anything added dilutes everything else. +Speak like a human. +Encourage flow. +Responsive is better than fast. +Keep it logically awesome. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Favor focus over features. +Approachable is better than simple. +Avoid administrative distraction. +Practicality beats purity. +Mind your words, they are important. +Mind your words, they are important. +It's not fully shipped until it's fast. +Encourage flow. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Avoid administrative distraction. +Approachable is better than simple. +It's not fully shipped until it's fast. +Encourage flow. +Speak like a human. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Speak like a human. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Avoid administrative distraction. +Responsive is better than fast. +Non-blocking is better than blocking. +Design for failure. +Favor focus over features. +Design for failure. +Avoid administrative distraction. +Anything added dilutes everything else. +Favor focus over features. +It's not fully shipped until it's fast. +Mind your words, they are important. +Encourage flow. +Responsive is better than fast. +Speak like a human. +Anything added dilutes everything else. +Speak like a human. +Mind your words, they are important. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Approachable is better than simple. +Speak like a human. +Keep it logically awesome. +Responsive is better than fast. +It's not fully shipped until it's fast. +Design for failure. +Mind your words, they are important. +Speak like a human. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Design for failure. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Practicality beats purity. +Favor focus over features. +Non-blocking is better than blocking. +Approachable is better than simple. +Practicality beats purity. +Design for failure. +Design for failure. +Design for failure. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Mind your words, they are important. +It's not fully shipped until it's fast. +Practicality beats purity. +Non-blocking is better than blocking. +Favor focus over features. +Encourage flow. +Favor focus over features. +Keep it logically awesome. +Avoid administrative distraction. +Speak like a human. +Encourage flow. +Design for failure. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Keep it logically awesome. +Favor focus over features. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Responsive is better than fast. +Anything added dilutes everything else. +Anything added dilutes everything else. +Favor focus over features. +Approachable is better than simple. +It's not fully shipped until it's fast. +Encourage flow. +Practicality beats purity. +Responsive is better than fast. +Practicality beats purity. +Speak like a human. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Speak like a human. +Anything added dilutes everything else. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Approachable is better than simple. +Encourage flow. +Half measures are as bad as nothing at all. +Design for failure. +Half measures are as bad as nothing at all. +Favor focus over features. +Favor focus over features. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Speak like a human. +Keep it logically awesome. +Design for failure. +Practicality beats purity. +Speak like a human. +Avoid administrative distraction. +Speak like a human. +Encourage flow. +Anything added dilutes everything else. +Mind your words, they are important. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Practicality beats purity. +Practicality beats purity. +Speak like a human. +Non-blocking is better than blocking. +Favor focus over features. +Mind your words, they are important. +Mind your words, they are important. +Encourage flow. +Mind your words, they are important. +Favor focus over features. +Anything added dilutes everything else. +Approachable is better than simple. +Encourage flow. +Practicality beats purity. +Anything added dilutes everything else. +Practicality beats purity. +Favor focus over features. +Anything added dilutes everything else. +Avoid administrative distraction. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Approachable is better than simple. +Keep it logically awesome. +Mind your words, they are important. +It's not fully shipped until it's fast. +Speak like a human. +Keep it logically awesome. +Design for failure. +Design for failure. +Speak like a human. +Approachable is better than simple. +Non-blocking is better than blocking. +Responsive is better than fast. +Non-blocking is better than blocking. +Encourage flow. +Avoid administrative distraction. +Mind your words, they are important. +Avoid administrative distraction. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Mind your words, they are important. +Keep it logically awesome. +Speak like a human. +Keep it logically awesome. +Design for failure. +Practicality beats purity. +Speak like a human. +Responsive is better than fast. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Encourage flow. +Favor focus over features. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Speak like a human. +Speak like a human. +Responsive is better than fast. +Keep it logically awesome. +Avoid administrative distraction. +Non-blocking is better than blocking. +Favor focus over features. +Speak like a human. +Approachable is better than simple. +Encourage flow. +Approachable is better than simple. +Anything added dilutes everything else. +Favor focus over features. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Mind your words, they are important. +Favor focus over features. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +Practicality beats purity. +Favor focus over features. +Anything added dilutes everything else. +Practicality beats purity. +Encourage flow. +Speak like a human. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Practicality beats purity. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Keep it logically awesome. +Avoid administrative distraction. +Encourage flow. +Half measures are as bad as nothing at all. +Practicality beats purity. +Design for failure. +Avoid administrative distraction. +Favor focus over features. +Favor focus over features. +Practicality beats purity. +Practicality beats purity. +Non-blocking is better than blocking. +Approachable is better than simple. +Responsive is better than fast. +Favor focus over features. +Approachable is better than simple. +Favor focus over features. +It's not fully shipped until it's fast. +Keep it logically awesome. +Design for failure. +Favor focus over features. +Avoid administrative distraction. +Speak like a human. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Design for failure. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Favor focus over features. +Non-blocking is better than blocking. +Practicality beats purity. +Encourage flow. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Responsive is better than fast. +It's not fully shipped until it's fast. +Favor focus over features. +Favor focus over features. +Non-blocking is better than blocking. +Keep it logically awesome. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Practicality beats purity. +Non-blocking is better than blocking. +Practicality beats purity. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Favor focus over features. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Keep it logically awesome. +Responsive is better than fast. +Anything added dilutes everything else. +Encourage flow. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Approachable is better than simple. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Favor focus over features. +Approachable is better than simple. +It's not fully shipped until it's fast. +Design for failure. +Speak like a human. +Practicality beats purity. +Speak like a human. +Practicality beats purity. +Approachable is better than simple. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Avoid administrative distraction. +Encourage flow. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Favor focus over features. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Avoid administrative distraction. +Design for failure. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Practicality beats purity. +It's not fully shipped until it's fast. +Encourage flow. +Mind your words, they are important. +Non-blocking is better than blocking. +Favor focus over features. +Encourage flow. +Favor focus over features. +Practicality beats purity. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Anything added dilutes everything else. +Favor focus over features. +Responsive is better than fast. +Encourage flow. +Approachable is better than simple. +Design for failure. +Encourage flow. +Design for failure. +Practicality beats purity. +Responsive is better than fast. +Encourage flow. +Avoid administrative distraction. +Practicality beats purity. +Mind your words, they are important. +Speak like a human. +Practicality beats purity. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Anything added dilutes everything else. +Encourage flow. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Favor focus over features. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Approachable is better than simple. +Mind your words, they are important. +Mind your words, they are important. +Responsive is better than fast. +Avoid administrative distraction. +Approachable is better than simple. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Approachable is better than simple. +Approachable is better than simple. +Speak like a human. +Avoid administrative distraction. +Encourage flow. +Approachable is better than simple. +Speak like a human. +Encourage flow. +Speak like a human. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Keep it logically awesome. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Speak like a human. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Responsive is better than fast. +Anything added dilutes everything else. +Practicality beats purity. +Encourage flow. +Anything added dilutes everything else. +Encourage flow. +Mind your words, they are important. +Responsive is better than fast. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Speak like a human. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Keep it logically awesome. +Mind your words, they are important. +Approachable is better than simple. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Keep it logically awesome. +Responsive is better than fast. +Favor focus over features. +Practicality beats purity. +Design for failure. +Favor focus over features. +Practicality beats purity. +Favor focus over features. +Design for failure. +Anything added dilutes everything else. +Approachable is better than simple. +Speak like a human. +Approachable is better than simple. +Non-blocking is better than blocking. +Responsive is better than fast. +Practicality beats purity. +Practicality beats purity. +Avoid administrative distraction. +Encourage flow. +Practicality beats purity. +Keep it logically awesome. +Approachable is better than simple. +Approachable is better than simple. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Mind your words, they are important. +Responsive is better than fast. +It's not fully shipped until it's fast. +Practicality beats purity. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Mind your words, they are important. +Practicality beats purity. +Approachable is better than simple. +It's not fully shipped until it's fast. +Practicality beats purity. +Mind your words, they are important. +Avoid administrative distraction. +Favor focus over features. +Design for failure. +Responsive is better than fast. +Responsive is better than fast. +Favor focus over features. +Keep it logically awesome. +Speak like a human. +Keep it logically awesome. +Speak like a human. +Half measures are as bad as nothing at all. +Design for failure. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Favor focus over features. +Speak like a human. +Speak like a human. +Anything added dilutes everything else. +Encourage flow. +Encourage flow. +Encourage flow. +Anything added dilutes everything else. +Anything added dilutes everything else. +Avoid administrative distraction. +Non-blocking is better than blocking. +Avoid administrative distraction. +Mind your words, they are important. +Avoid administrative distraction. +Approachable is better than simple. +Keep it logically awesome. +Design for failure. +Anything added dilutes everything else. +Mind your words, they are important. +Design for failure. +Mind your words, they are important. +Speak like a human. +Responsive is better than fast. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Speak like a human. +Avoid administrative distraction. +Favor focus over features. +Practicality beats purity. +Anything added dilutes everything else. +Speak like a human. +Favor focus over features. +Encourage flow. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Practicality beats purity. +Speak like a human. +Speak like a human. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Favor focus over features. +Approachable is better than simple. +Approachable is better than simple. +Responsive is better than fast. +Non-blocking is better than blocking. +Favor focus over features. +Encourage flow. +Mind your words, they are important. +It's not fully shipped until it's fast. +Speak like a human. +It's not fully shipped until it's fast. +Speak like a human. +Design for failure. +Design for failure. +Responsive is better than fast. +Responsive is better than fast. +Speak like a human. +Anything added dilutes everything else. +Anything added dilutes everything else. +Encourage flow. +Design for failure. +Keep it logically awesome. +Avoid administrative distraction. +Speak like a human. +Favor focus over features. +Responsive is better than fast. +Responsive is better than fast. +Approachable is better than simple. +Mind your words, they are important. +Avoid administrative distraction. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Avoid administrative distraction. +Anything added dilutes everything else. +Favor focus over features. +Encourage flow. +Avoid administrative distraction. +Encourage flow. +Favor focus over features. +Non-blocking is better than blocking. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Keep it logically awesome. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Design for failure. +Favor focus over features. +Practicality beats purity. +Avoid administrative distraction. +Speak like a human. +Approachable is better than simple. +Avoid administrative distraction. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Design for failure. +Speak like a human. +Favor focus over features. +Responsive is better than fast. +Design for failure. +Responsive is better than fast. +Keep it logically awesome. +Favor focus over features. +Non-blocking is better than blocking. +Responsive is better than fast. +Approachable is better than simple. +Responsive is better than fast. +Responsive is better than fast. +Avoid administrative distraction. +Non-blocking is better than blocking. +Favor focus over features. +Responsive is better than fast. +Keep it logically awesome. +Keep it logically awesome. +Keep it logically awesome. +It's not fully shipped until it's fast. +Mind your words, they are important. +Encourage flow. +Avoid administrative distraction. +Keep it logically awesome. +Mind your words, they are important. +Design for failure. +Responsive is better than fast. +Keep it logically awesome. +Encourage flow. +It's not fully shipped until it's fast. +Responsive is better than fast. +Mind your words, they are important. +Responsive is better than fast. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Mind your words, they are important. +Speak like a human. +Responsive is better than fast. +Responsive is better than fast. +Design for failure. +Design for failure. +Avoid administrative distraction. +Design for failure. +Non-blocking is better than blocking. +Keep it logically awesome. +Encourage flow. +Design for failure. +Keep it logically awesome. +Favor focus over features. +Design for failure. +Keep it logically awesome. +Responsive is better than fast. +Responsive is better than fast. +Favor focus over features. +Design for failure. +Keep it logically awesome. +Encourage flow. +Speak like a human. +Approachable is better than simple. +Keep it logically awesome. +Non-blocking is better than blocking. +Approachable is better than simple. +It's not fully shipped until it's fast. +Practicality beats purity. +Keep it logically awesome. +Encourage flow. +Keep it logically awesome. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Keep it logically awesome. +Anything added dilutes everything else. +Anything added dilutes everything else. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Keep it logically awesome. +Favor focus over features. +Responsive is better than fast. +Speak like a human. +Practicality beats purity. +Avoid administrative distraction. +Mind your words, they are important. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Encourage flow. +Anything added dilutes everything else. +Encourage flow. +Keep it logically awesome. +Avoid administrative distraction. +Approachable is better than simple. +Practicality beats purity. +Favor focus over features. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Favor focus over features. +Anything added dilutes everything else. +Anything added dilutes everything else. +Speak like a human. +Encourage flow. +Speak like a human. +Approachable is better than simple. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Speak like a human. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Speak like a human. +Approachable is better than simple. +Non-blocking is better than blocking. +Approachable is better than simple. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Approachable is better than simple. +It's not fully shipped until it's fast. +Practicality beats purity. +It's not fully shipped until it's fast. +Keep it logically awesome. +Keep it logically awesome. +Avoid administrative distraction. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Speak like a human. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Anything added dilutes everything else. +Avoid administrative distraction. +Keep it logically awesome. +Encourage flow. +Encourage flow. +Keep it logically awesome. +Responsive is better than fast. +It's not fully shipped until it's fast. +Mind your words, they are important. +Practicality beats purity. +Favor focus over features. +Mind your words, they are important. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Practicality beats purity. +Speak like a human. +Non-blocking is better than blocking. +Approachable is better than simple. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Design for failure. +Mind your words, they are important. +Design for failure. +Approachable is better than simple. +Practicality beats purity. +Practicality beats purity. +Speak like a human. +Non-blocking is better than blocking. +Design for failure. +Speak like a human. +It's not fully shipped until it's fast. +Approachable is better than simple. +Mind your words, they are important. +Approachable is better than simple. +Avoid administrative distraction. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Approachable is better than simple. +Responsive is better than fast. +Responsive is better than fast. +Approachable is better than simple. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Favor focus over features. +Non-blocking is better than blocking. +Keep it logically awesome. +Approachable is better than simple. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Mind your words, they are important. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Design for failure. +Responsive is better than fast. +Practicality beats purity. +Mind your words, they are important. +Design for failure. +Practicality beats purity. +Design for failure. +Approachable is better than simple. +Keep it logically awesome. +Encourage flow. +Approachable is better than simple. +Speak like a human. +Anything added dilutes everything else. +Design for failure. +Mind your words, they are important. +Practicality beats purity. +Speak like a human. +Approachable is better than simple. +Approachable is better than simple. +Approachable is better than simple. +Avoid administrative distraction. +Design for failure. +Avoid administrative distraction. +Mind your words, they are important. +Responsive is better than fast. +Design for failure. +Keep it logically awesome. +Design for failure. +Keep it logically awesome. +Encourage flow. +Non-blocking is better than blocking. +Keep it logically awesome. +It's not fully shipped until it's fast. +Avoid administrative distraction. +Responsive is better than fast. +Anything added dilutes everything else. +Half measures are as bad as nothing at all. +Encourage flow. +Avoid administrative distraction. +Favor focus over features. +Speak like a human. +Avoid administrative distraction. +Avoid administrative distraction. +Approachable is better than simple. +Avoid administrative distraction. +Encourage flow. +Favor focus over features. +Avoid administrative distraction. +Favor focus over features. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Approachable is better than simple. +Speak like a human. +Responsive is better than fast. +Avoid administrative distraction. +Favor focus over features. +Favor focus over features. +Favor focus over features. +Encourage flow. +Half measures are as bad as nothing at all. +Design for failure. +Mind your words, they are important. +It's not fully shipped until it's fast. +Encourage flow. +Non-blocking is better than blocking. +Keep it logically awesome. +Anything added dilutes everything else. +Design for failure. +Anything added dilutes everything else. +Anything added dilutes everything else. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Encourage flow. +It's not fully shipped until it's fast. +Speak like a human. +Keep it logically awesome. +Design for failure. +Anything added dilutes everything else. +Practicality beats purity. +Mind your words, they are important. +Approachable is better than simple. +Approachable is better than simple. +Mind your words, they are important. +Avoid administrative distraction. +Keep it logically awesome. +Anything added dilutes everything else. +Responsive is better than fast. +Responsive is better than fast. +Design for failure. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Speak like a human. +Non-blocking is better than blocking. +Mind your words, they are important. +Anything added dilutes everything else. +Anything added dilutes everything else. +Practicality beats purity. +Responsive is better than fast. +It's not fully shipped until it's fast. +Design for failure. +Favor focus over features. +Responsive is better than fast. +Mind your words, they are important. +Practicality beats purity. +Responsive is better than fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Responsive is better than fast. +Speak like a human. +Avoid administrative distraction. +Mind your words, they are important. +Design for failure. +Practicality beats purity. +Anything added dilutes everything else. +Anything added dilutes everything else. +Mind your words, they are important. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Approachable is better than simple. +Avoid administrative distraction. +Design for failure. +Practicality beats purity. +Practicality beats purity. +Keep it logically awesome. +Keep it logically awesome. +Responsive is better than fast. +Design for failure. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Practicality beats purity. +Design for failure. +Speak like a human. +Half measures are as bad as nothing at all. +It's not fully shipped until it's fast. +Design for failure. +It's not fully shipped until it's fast. +Practicality beats purity. +It's not fully shipped until it's fast. +Practicality beats purity. +Favor focus over features. +Speak like a human. +It's not fully shipped until it's fast. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Practicality beats purity. +Approachable is better than simple. +Anything added dilutes everything else. +Mind your words, they are important. +Keep it logically awesome. +Approachable is better than simple. +Avoid administrative distraction. +Encourage flow. +Anything added dilutes everything else. +Responsive is better than fast. +Responsive is better than fast. +Design for failure. +It's not fully shipped until it's fast. +Encourage flow. +Speak like a human. +Keep it logically awesome. +Keep it logically awesome. +Mind your words, they are important. +Mind your words, they are important. +Design for failure. +Design for failure. +Encourage flow. +Design for failure. +Avoid administrative distraction. +Non-blocking is better than blocking. +Encourage flow. +Non-blocking is better than blocking. +Approachable is better than simple. +It's not fully shipped until it's fast. +Keep it logically awesome. +Practicality beats purity. +Keep it logically awesome. +Design for failure. +Avoid administrative distraction. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Design for failure. +Avoid administrative distraction. +Encourage flow. +Speak like a human. +Design for failure. +Anything added dilutes everything else. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Favor focus over features. +Avoid administrative distraction. +Mind your words, they are important. +Responsive is better than fast. +Speak like a human. +Design for failure. +Avoid administrative distraction. +Mind your words, they are important. +Mind your words, they are important. +Responsive is better than fast. +Half measures are as bad as nothing at all. +Approachable is better than simple. +Avoid administrative distraction. +Avoid administrative distraction. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Anything added dilutes everything else. +Speak like a human. +Design for failure. +Design for failure. +Encourage flow. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Speak like a human. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Avoid administrative distraction. +Encourage flow. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Favor focus over features. +Favor focus over features. +It's not fully shipped until it's fast. +Design for failure. +Keep it logically awesome. +Non-blocking is better than blocking. +Avoid administrative distraction. +Encourage flow. +Speak like a human. +Encourage flow. +Approachable is better than simple. +Encourage flow. +Design for failure. +Non-blocking is better than blocking. +Non-blocking is better than blocking. +Mind your words, they are important. +Design for failure. +Approachable is better than simple. +Avoid administrative distraction. +Favor focus over features. +Keep it logically awesome. +Approachable is better than simple. +Non-blocking is better than blocking. +Half measures are as bad as nothing at all. +Responsive is better than fast. +Speak like a human. +Mind your words, they are important. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +It's not fully shipped until it's fast. +Favor focus over features. +Non-blocking is better than blocking. +Favor focus over features. +Practicality beats purity. +Approachable is better than simple. +Practicality beats purity. +Half measures are as bad as nothing at all. +Speak like a human. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Keep it logically awesome. +Keep it logically awesome. +Mind your words, they are important. +Non-blocking is better than blocking. +It's not fully shipped until it's fast. +Practicality beats purity. +Responsive is better than fast. +Keep it logically awesome. +It's not fully shipped until it's fast. +Keep it logically awesome. +Non-blocking is better than blocking. +Keep it logically awesome. +Practicality beats purity. +Practicality beats purity. +Encourage flow. +Keep it logically awesome. +Non-blocking is better than blocking. +Practicality beats purity. +Avoid administrative distraction. +Speak like a human. +Favor focus over features. +Anything added dilutes everything else. +Design for failure. +It's not fully shipped until it's fast. +Mind your words, they are important. +Encourage flow. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Avoid administrative distraction. +Approachable is better than simple. +Anything added dilutes everything else. +Keep it logically awesome. +Keep it logically awesome. +Speak like a human. +Half measures are as bad as nothing at all. +Favor focus over features. +Encourage flow. +Non-blocking is better than blocking. +Encourage flow. +Keep it logically awesome. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Design for failure. +It's not fully shipped until it's fast. +Mind your words, they are important. +Speak like a human. +Speak like a human. +Avoid administrative distraction. +Approachable is better than simple. +Speak like a human. +Mind your words, they are important. +Speak like a human. +Encourage flow. +It's not fully shipped until it's fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Responsive is better than fast. +Favor focus over features. +Encourage flow. +Responsive is better than fast. +Favor focus over features. +Favor focus over features. +Practicality beats purity. +Encourage flow. +Mind your words, they are important. +Keep it logically awesome. +Avoid administrative distraction. +Mind your words, they are important. +Design for failure. +Approachable is better than simple. +Encourage flow. +Practicality beats purity. +Favor focus over features. +Avoid administrative distraction. +Keep it logically awesome. +Design for failure. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Practicality beats purity. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Approachable is better than simple. +Favor focus over features. +Design for failure. +Keep it logically awesome. +Anything added dilutes everything else. +Practicality beats purity. +Non-blocking is better than blocking. +Favor focus over features. +Half measures are as bad as nothing at all. +Avoid administrative distraction. +Encourage flow. +Half measures are as bad as nothing at all. +Favor focus over features. +Favor focus over features. +Favor focus over features. +Encourage flow. +Speak like a human. +Design for failure. +It's not fully shipped until it's fast. +Favor focus over features. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Keep it logically awesome. +Responsive is better than fast. +Approachable is better than simple. +Responsive is better than fast. +Responsive is better than fast. +Approachable is better than simple. +Design for failure. +Half measures are as bad as nothing at all. +Speak like a human. +Speak like a human. +Encourage flow. +Responsive is better than fast. +Mind your words, they are important. +Non-blocking is better than blocking. +Keep it logically awesome. +Keep it logically awesome. +Mind your words, they are important. +Half measures are as bad as nothing at all. +Mind your words, they are important. +Favor focus over features. +Design for failure. +Speak like a human. +Practicality beats purity. +Favor focus over features. +Responsive is better than fast. +Speak like a human. +Keep it logically awesome. +Design for failure. +Half measures are as bad as nothing at all. +Speak like a human. +Encourage flow. +Design for failure. +Responsive is better than fast. +Mind your words, they are important. +Avoid administrative distraction. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. +Design for failure. +Encourage flow. +Encourage flow. +Practicality beats purity. +Favor focus over features. +Favor focus over features. +It's not fully shipped until it's fast. +Speak like a human. +Favor focus over features. +Keep it logically awesome. +Non-blocking is better than blocking. +Anything added dilutes everything else. +It's not fully shipped until it's fast. +Keep it logically awesome. +Approachable is better than simple. +Responsive is better than fast. +Practicality beats purity. +It's not fully shipped until it's fast. +Practicality beats purity. +Practicality beats purity. +Mind your words, they are important. +It's not fully shipped until it's fast. +Responsive is better than fast. +Favor focus over features. +Encourage flow. +Keep it logically awesome. +Design for failure. +Practicality beats purity. +Approachable is better than simple. +Avoid administrative distraction. +Practicality beats purity. +Non-blocking is better than blocking. +Mind your words, they are important. +Mind your words, they are important. +Mind your words, they are important. +Responsive is better than fast. +Favor focus over features. +It's not fully shipped until it's fast. +Approachable is better than simple. +Keep it logically awesome. +It's not fully shipped until it's fast. +Mind your words, they are important. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Favor focus over features. +Mind your words, they are important. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Encourage flow. +It's not fully shipped until it's fast. +Favor focus over features. +Encourage flow. +Keep it logically awesome. +Avoid administrative distraction. +It's not fully shipped until it's fast. +Favor focus over features. +Mind your words, they are important. +It's not fully shipped until it's fast. +Approachable is better than simple. +Keep it logically awesome. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Practicality beats purity. +Encourage flow. +Anything added dilutes everything else. +Speak like a human. +Keep it logically awesome. +Practicality beats purity. +Favor focus over features. +Anything added dilutes everything else. +Practicality beats purity. +Responsive is better than fast. +Design for failure. +Speak like a human. +Practicality beats purity. +It's not fully shipped until it's fast. +Design for failure. +Design for failure. +Practicality beats purity. +Speak like a human. +Mind your words, they are important. +Anything added dilutes everything else. +Speak like a human. +Encourage flow. +It's not fully shipped until it's fast. +Keep it logically awesome. +Half measures are as bad as nothing at all. +Anything added dilutes everything else. +Design for failure. +Practicality beats purity. +Favor focus over features. +Favor focus over features. +Responsive is better than fast. +Approachable is better than simple. +Half measures are as bad as nothing at all. +Encourage flow. +Encourage flow. +Practicality beats purity. +Half measures are as bad as nothing at all. +Half measures are as bad as nothing at all. +Encourage flow. +Practicality beats purity. +Speak like a human. +Speak like a human. +Non-blocking is better than blocking. +Speak like a human. +It's not fully shipped until it's fast. +Responsive is better than fast. +Design for failure. +Avoid administrative distraction. +Anything added dilutes everything else. +Favor focus over features. +Design for failure. +Approachable is better than simple. +Approachable is better than simple. +Mind your words, they are important. +It's not fully shipped until it's fast. +Encourage flow. +Design for failure. +Design for failure. +Speak like a human. +Approachable is better than simple. +Keep it logically awesome. +Mind your words, they are important. +Anything added dilutes everything else. +Responsive is better than fast. +Responsive is better than fast. +Avoid administrative distraction. +Practicality beats purity. +Responsive is better than fast. +Approachable is better than simple. +Non-blocking is better than blocking. +Avoid administrative distraction. +Encourage flow. +Non-blocking is better than blocking. +Speak like a human. +Speak like a human. +Avoid administrative distraction. +Anything added dilutes everything else. +Non-blocking is better than blocking. +Keep it logically awesome. +Keep it logically awesome. +Encourage flow. +It's not fully shipped until it's fast. +Favor focus over features. +Responsive is better than fast. +Favor focus over features. +Mind your words, they are important. +It's not fully shipped until it's fast. +Mind your words, they are important. +Speak like a human. +Anything added dilutes everything else. +Responsive is better than fast. +Avoid administrative distraction. +Non-blocking is better than blocking. +Responsive is better than fast. +It's not fully shipped until it's fast. +Half measures are as bad as nothing at all. +Non-blocking is better than blocking. diff --git a/tests/fixtures/zen.txt b/tests/fixtures/zen.txt deleted file mode 100644 index e2c03f1..0000000 --- a/tests/fixtures/zen.txt +++ /dev/null @@ -1 +0,0 @@ -Keep it logically awesome. From c903894680f948840378df2760d2098efc4ff7bc Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sun, 13 Dec 2020 20:13:33 -0600 Subject: [PATCH 89/97] Use pkginfo for package info --- lib/github-client.ts | 7 +++---- package-lock.json | 5 +++++ package.json | 3 ++- tests/github-client.test.ts | 8 ++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 tests/github-client.test.ts diff --git a/lib/github-client.ts b/lib/github-client.ts index eb1be16..13517dc 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,15 +1,14 @@ -import { join } from "path"; import axios from "axios"; +import pkginfo from "pkginfo"; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const pkg = require(join(__dirname, "..", "package.json")); +pkginfo(module, "name", "version"); const github = axios.create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, authorization: `bearer ${process.env.GH_TOKEN}`, - "user-agent": `${pkg.name}/${pkg.version}`, + "user-agent": `${module.exports.name}/${module.exports.version}`, }, }); diff --git a/package-lock.json b/package-lock.json index ae38dbb..248d4bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4214,6 +4214,11 @@ "find-up": "^4.0.0" } }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", diff --git a/package.json b/package.json index 03ee3d7..efc416e 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@actions/core": "^1.2.6", "axios": "^0.21.0", "base64-stream": "^1.0.0", - "multistream": "^4.0.1" + "multistream": "^4.0.1", + "pkginfo": "^0.4.1" } } diff --git a/tests/github-client.test.ts b/tests/github-client.test.ts new file mode 100644 index 0000000..2d28c64 --- /dev/null +++ b/tests/github-client.test.ts @@ -0,0 +1,8 @@ +import github from "../lib/github-client"; + +describe("github-client", () => { + test("user-agent", () => { + const ua = github.defaults.headers["user-agent"]; + expect(ua).toMatch(/^@swinton\/commit\/\d+\.\d+\.\d+$/); + }); +}); From 54cfd96d22767e2896f97cbea99b941fdc12aba8 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sun, 13 Dec 2020 20:20:00 -0600 Subject: [PATCH 90/97] Revert "Use pkginfo for package info" --- lib/github-client.ts | 7 ++++--- package-lock.json | 5 ----- package.json | 3 +-- tests/github-client.test.ts | 8 -------- 4 files changed, 5 insertions(+), 18 deletions(-) delete mode 100644 tests/github-client.test.ts diff --git a/lib/github-client.ts b/lib/github-client.ts index 13517dc..eb1be16 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,14 +1,15 @@ +import { join } from "path"; import axios from "axios"; -import pkginfo from "pkginfo"; -pkginfo(module, "name", "version"); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const pkg = require(join(__dirname, "..", "package.json")); const github = axios.create({ baseURL: `https://api.github.com/`, headers: { accept: `application/vnd.github.v3+json`, authorization: `bearer ${process.env.GH_TOKEN}`, - "user-agent": `${module.exports.name}/${module.exports.version}`, + "user-agent": `${pkg.name}/${pkg.version}`, }, }); diff --git a/package-lock.json b/package-lock.json index 248d4bf..ae38dbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4214,11 +4214,6 @@ "find-up": "^4.0.0" } }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", diff --git a/package.json b/package.json index efc416e..03ee3d7 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "@actions/core": "^1.2.6", "axios": "^0.21.0", "base64-stream": "^1.0.0", - "multistream": "^4.0.1", - "pkginfo": "^0.4.1" + "multistream": "^4.0.1" } } diff --git a/tests/github-client.test.ts b/tests/github-client.test.ts deleted file mode 100644 index 2d28c64..0000000 --- a/tests/github-client.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import github from "../lib/github-client"; - -describe("github-client", () => { - test("user-agent", () => { - const ua = github.defaults.headers["user-agent"]; - expect(ua).toMatch(/^@swinton\/commit\/\d+\.\d+\.\d+$/); - }); -}); From 9c3738c0a684bef6e3f7449a934f4b6828205f4a Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sun, 13 Dec 2020 20:22:06 -0600 Subject: [PATCH 91/97] Add tests for github-client --- tests/github-client.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/github-client.test.ts diff --git a/tests/github-client.test.ts b/tests/github-client.test.ts new file mode 100644 index 0000000..2d28c64 --- /dev/null +++ b/tests/github-client.test.ts @@ -0,0 +1,8 @@ +import github from "../lib/github-client"; + +describe("github-client", () => { + test("user-agent", () => { + const ua = github.defaults.headers["user-agent"]; + expect(ua).toMatch(/^@swinton\/commit\/\d+\.\d+\.\d+$/); + }); +}); From 82c004f8d7502dcfd4420b6ea88cfe2302f07b9e Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 14 Dec 2020 09:22:05 -0600 Subject: [PATCH 92/97] Load package.json via require --- lib/github-client.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/github-client.ts b/lib/github-client.ts index eb1be16..89b4458 100644 --- a/lib/github-client.ts +++ b/lib/github-client.ts @@ -1,8 +1,7 @@ -import { join } from "path"; import axios from "axios"; // eslint-disable-next-line @typescript-eslint/no-var-requires -const pkg = require(join(__dirname, "..", "package.json")); +const pkg = require("../package.json"); const github = axios.create({ baseURL: `https://api.github.com/`, From 63011a7501642d8737eb5ec1c01256ce4fcf1dca Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Mon, 14 Dec 2020 09:34:01 -0600 Subject: [PATCH 93/97] Push releases directly to v2.x --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56dce7e..2a18008 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: | jq --raw-output '.object.sha' ) gh api /repos/$GITHUB_REPOSITORY/git/refs \ --field sha="$SHA" \ - --field ref="refs/heads/staging/v2.x" + --field ref="refs/heads/v2.x" - uses: actions/checkout@v2 - uses: actions/setup-node@v1 - run: npm ci @@ -34,7 +34,7 @@ jobs: files: | dist/index.js commit-message: Add dist/index.js - ref: refs/heads/staging/v2.x + ref: refs/heads/v2.x - uses: actions/upload-artifact@v2 with: name: build From 162761bc72f03149258be7d070af9af4c7d5e4e3 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 19 Dec 2020 10:24:33 -0600 Subject: [PATCH 94/97] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1e94d9d..929d948 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Commit > :white_check_mark: Create a _verified_ commit with GitHub Actions -[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) + ![](https://github.com/swinton/commit/workflows/test/badge.svg) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) ## About This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. From 1c358026cd5a13e5a8ff90b929d428f5c05c4a5d Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 19 Dec 2020 10:25:28 -0600 Subject: [PATCH 95/97] Rename workflow --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1343324..4c4b4f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: test +name: tests on: push: branches: From 2e724f5cf0015352d37f78fca972d6bc31ad7248 Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 19 Dec 2020 10:25:54 -0600 Subject: [PATCH 96/97] s/test/tests --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 929d948..b9646ab 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Commit > :white_check_mark: Create a _verified_ commit with GitHub Actions - ![](https://github.com/swinton/commit/workflows/test/badge.svg) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) + ![](https://github.com/swinton/commit/workflows/tests/badge.svg) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) ## About This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. From 07ba6b410f70dbb593c4f3ab77b5dc84f3a9dc4c Mon Sep 17 00:00:00 2001 From: Steve Winton Date: Sat, 19 Dec 2020 22:37:39 -0600 Subject: [PATCH 97/97] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9646ab..05269ca 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## About This action allows you to create a commit with GitHub Actions. Commits created with this actions will be marked as _verified_. -![image](https://user-images.githubusercontent.com/27806/101197362-a2ed0980-3627-11eb-9afb-bc8b9bcd0345.png) +![image](https://user-images.githubusercontent.com/27806/102705224-ab118f80-424a-11eb-94c5-ab7396ccba13.png) ## Usage In your workflow, to commit a file `./myfile`, include a step like this: