Skip to content

fix(ci): pin test-wasm-browsers' timeout and retry-wrapper shape in ci_wiring - #440

Merged
rubenhensen merged 2 commits into
mainfrom
dobby/issue-432-wasm-browser-ci-timeout
Sep 10, 2026
Merged

rubenhensen merged 2 commits into
mainfrom
dobby/issue-432-wasm-browser-ci-timeout

Conversation

@dobby-coder

@dobby-coder dobby-coder Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

Resolves the implementation half of #416, part of #247. Closes #432.

CI status

Test workspace (pg-core) is red because the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper fails — on purpose, see below. Test workspace (pg-pkg), Test workspace (pg-cli) and Test workspace (cryptify) show red alongside it, but that's test's matrix (crate: [pg-core, pg-pkg, pg-cli, pg-ffi, cryptify]) fail-fast cancelling the other legs the moment pg-core goes red — each job log ends mid-compile with ##[error]The operation was canceled., not a test that ran and failed. pg-ffi finished compiling before the cancellation reached it, which is why that one leg still shows green. None of the four are required checks: only the two Wire compat contexts are (scripts/ruleset-drift.sh reads the ruleset back and confirms that set). There's nothing left to fix from this container — the one real failure is the pin, and it stays red until a maintainer applies the workflow patch below, since dobby-coder has no workflows: write.

What this PR does

test-wasm-browsers is wrapped in nick-fields/retry@v3 with retry_on: error and a 20-minute per-attempt timeout, and its command: input carries a literal backslash (--\${{ matrix.browser }}). Both are defects #416 found and settled:

  • The retry is inverted. A timeout is not error in that action's taxonomy, so max_attempts: 2 never engaged on the only failure shape this job has hit — three wedged safari sessions on 2026-09-03, ~22 minutes each with ~17 minutes of total silence. Meanwhile a genuine non-zero exit does get retried, hiding a real failure behind a second roll.
  • The backslash only worked because the action handed its command: string to a shell that stripped it before wasm-pack ever saw it.

Since dobby-coder has no workflows: write, .github/workflows/build.yml isn't touched by this PR. This PR adds the pin: the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper in pg-core/tests/ci_wiring.rs, asserting against test-wasm-browsers' job block:

  1. it carries a job-level timeout-minutes
  2. no step uses nick-fields/retry
  3. the test step is the bare, backslash-free run: wasm-pack test --release --headless --${{ matrix.browser }} ./pg-wasm
  4. all three browsers (chrome, firefox, safari) stay in the matrix

These assertions are RED on this branch, on purpose, until the workflow half below is applied — same shape as #429/#438.

The workflow patch (a maintainer applies this)

A one-paste gh api -X PUT command that applies this directly to this PR's branch (no checkout needed) is in this comment — also posted on #432 per @rubenhensen's amendment there.

Replace the whole test-wasm-browsers job (currently build.yml:81-107) with:

  test-wasm-browsers:
    name: Run wasm tests in browsers
    strategy:
      matrix:
        include:
          - browser: chrome
            os: ubuntu-latest
          - browser: firefox
            os: ubuntu-latest
          - browser: safari
            os: macos-latest
    runs-on: ${{ matrix.os }}
    # The suite is 16 tests and finishes in ~25s; a passing job is 2-6 minutes,
    # almost all of it `cargo install wasm-pack` and the release build. 12
    # minutes is ~2x the slowest observed success. The previous budget was 20
    # minutes inside a `nick-fields/retry` wrapper, which on 2026-09-03 turned
    # three wedged safari sessions into ~22-minute jobs with ~17 minutes of
    # silence each (#416).
    timeout-minutes: 12
    env:
      # ~6x the slowest single test (~5s). This is a per-test timer running
      # inside the browser page, so it does NOT bound a wedged safaridriver
      # session -- that is what `timeout-minutes` above is for. It was 120,
      # which is both 24x the slowest test and, at 16 tests, a 32-minute
      # worst case that the job budget could never reach.
      WASM_BINDGEN_TEST_TIMEOUT: 30
    steps:
      - uses: actions/checkout@v4
      - name: Install
        run: cargo install wasm-pack
      - if: ${{ matrix.browser == 'firefox' }}
        run: sudo apt update && sudo apt install firefox
      # A plain `run:`, not `nick-fields/retry`. The wrapper retried genuine
      # non-zero exits (hiding a real failure behind a second roll) and did
      # NOT retry a timeout, which is the only shape this job has ever hit
      # -- `retry_on: error` excludes timeouts, so `max_attempts: 2` never
      # engaged. Dropping it also removes the literal backslash the action
      # input required (`--\${{ matrix.browser }}`), which survived into the
      # resolved command and only worked because a shell stripped it.
      - name: Run wasm-pack browser tests
        run: wasm-pack test --release --headless --${{ matrix.browser }} ./pg-wasm

Three substantive changes: timeout-minutes: 12 at job level, WASM_BINDGEN_TEST_TIMEOUT 120 → 30, and the retry action replaced by a bare run: with the backslash gone. The matrix, runs-on, checkout, cargo install wasm-pack and the firefox apt step are unchanged. no_workflow_step_captures_dollar_question_mark still passes against it — no step here captures $?.

Verification

cargo test --manifest-path pg-core/Cargo.toml --features test,rust,stream --test ci_wiring:

  • On this branch (unpatched build.yml): 15/16 pass, the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper fails as expected (no job-level timeout-minutes yet).
  • Against a local, uncommitted copy of build.yml with the patch above applied: all 16 pass, nothing else broke.

Checked each assertion is neither fail-open nor fail-closed-for-the-wrong-reason, against the same local patched copy:

  • delete timeout-minutes: 12 → assertion 1 (job-level timeout) goes red
  • restore it, re-add a nick-fields/retry@v3 step → assertion 2 (no retry wrapper) goes red
  • restore it, put the backslash back in --\${{ matrix.browser }} → assertion 3 (bare run, no backslash) goes red
  • restore it, drop the safari matrix entry → assertion 4 (all three browsers) goes red

One thing this caught along the way: the patch's own explanatory comments mention nick-fields/retry by name in prose (e.g. "not nick-fields/retry"), so a naive job.contains("nick-fields/retry") check false-reds even after the correct patch lands. Assertion 2 checks for the literal uses: nick-fields/retry invocation instead.

After verifying, the local workflow edit was fully reverted — git diff --name-only origin/main...HEAD -- .github/workflows/ prints nothing; no .github/workflows/ changes are part of this PR.

cargo fmt/cargo clippy (--features test,rust,stream -- -D warnings) pass clean on pg-core.

Explicitly out of scope, per #432: filing an issue when this job goes red — deferred to the fleet-wide issue-filing convergence question (#416).

Done when

  • .github/workflows/build.yml on main carries the job exactly as in the patch above (maintainer action)
  • The four assertions exist in pg-core/tests/ci_wiring.rs
  • A Run wasm tests in browsers run on main is green on all three legs after the patch lands

Reviewed by dobby: code-comments rule (only rule in force) and Review Dobby 2 findings, over the full PR diff (pg-core/tests/ci_wiring.rs) — pg-core built clean, cargo fmt --check and cargo clippy --features test,rust,stream -- -D warnings pass, cargo test --test ci_wiring independently reproduced 15/16 passing with the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper failing at line 1028 exactly as documented — approve.
Attention: pg-core/tests/ci_wiring.rs:1028 — that failing assertion is RED by design (dobby-coder lacks workflows: write) pending a maintainer applying the build.yml patch already posted on this PR and on #432; independently reverified against a local patched copy (16/16 pass), then reverted. No PR Dobby action needed.

…i_wiring

The `nick-fields/retry@v3` wrapper around `test-wasm-browsers` inverted its
own failure handling: `retry_on: error` never retries a timeout, the only
failure shape this job has actually hit (three wedged safari sessions on
2026-09-03, ~22 minutes each with ~17 of silence), while it does retry a
genuine non-zero exit that should just have been reported. Its `command:`
input also carried a literal backslash (`--\${{ matrix.browser }}`) that
only worked because the action handed the string to a shell that stripped
it.

`dobby-coder` has no `workflows: write`, so the fix -- a job-level
`timeout-minutes: 12`, `WASM_BINDGEN_TEST_TIMEOUT` 120 -> 30, and the
wrapper replaced by a bare `run:` with the backslash gone -- is posted as
a comment on #432 for a maintainer to apply, not pushed here.

Adds `the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper` to
pg-core/tests/ci_wiring.rs: the job carries a job-level `timeout-minutes`,
no step uses `nick-fields/retry`, the test command is the bare,
backslash-free `run:` line, and all three browsers stay in the matrix.
Verified locally against a scratch copy of the patch: the four checks pass
once applied, and each goes red on its own when the corresponding half of
the regression is reintroduced (timeout removed, retry wrapper restored,
backslash restored, safari dropped from the matrix).

This assertion is red on this branch until the workflow patch lands, same
shape as #429/#438.

Part of #247. Implements #416's decisions for #432.
@dobby-coder
dobby-coder Bot requested a review from rubenhensen September 10, 2026 07:51
@dobby-coder

dobby-coder Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Workflow patch for test-wasm-browsers (.github/workflows/build.yml)

dobby-coder has no workflows: write and cannot push this file, so it's written out in full here for a maintainer to apply — see #440's "CI status" for why the PR's Test workspace (pg-core) check is red until this lands. Applies to dobby/issue-432-wasm-browser-ci-timeout (PR #440), no checkout needed.

Replaces the whole test-wasm-browsers job (currently build.yml:81-107) with:

  test-wasm-browsers:
    name: Run wasm tests in browsers
    strategy:
      matrix:
        include:
          - browser: chrome
            os: ubuntu-latest
          - browser: firefox
            os: ubuntu-latest
          - browser: safari
            os: macos-latest
    runs-on: ${{ matrix.os }}
    # The suite is 16 tests and finishes in ~25s; a passing job is 2-6 minutes,
    # almost all of it `cargo install wasm-pack` and the release build. 12
    # minutes is ~2x the slowest observed success. The previous budget was 20
    # minutes inside a `nick-fields/retry` wrapper, which on 2026-09-03 turned
    # three wedged safari sessions into ~22-minute jobs with ~17 minutes of
    # silence each (#416).
    timeout-minutes: 12
    env:
      # ~6x the slowest single test (~5s). This is a per-test timer running
      # inside the browser page, so it does NOT bound a wedged safaridriver
      # session -- that is what `timeout-minutes` above is for. It was 120,
      # which is both 24x the slowest test and, at 16 tests, a 32-minute
      # worst case that the job budget could never reach.
      WASM_BINDGEN_TEST_TIMEOUT: 30
    steps:
      - uses: actions/checkout@v4
      - name: Install
        run: cargo install wasm-pack
      - if: ${{ matrix.browser == 'firefox' }}
        run: sudo apt update && sudo apt install firefox
      # A plain `run:`, not `nick-fields/retry`. The wrapper retried genuine
      # non-zero exits (hiding a real failure behind a second roll) and did
      # NOT retry a timeout, which is the only shape this job has ever hit
      # -- `retry_on: error` excludes timeouts, so `max_attempts: 2` never
      # engaged. Dropping it also removes the literal backslash the action
      # input required (`--\${{ matrix.browser }}`), which survived into the
      # resolved command and only worked because a shell stripped it.
      - name: Run wasm-pack browser tests
        run: wasm-pack test --release --headless --${{ matrix.browser }} ./pg-wasm

Three substantive changes: timeout-minutes: 12 at job level, WASM_BINDGEN_TEST_TIMEOUT 120 → 30, and the retry action replaced by a bare run: with the backslash gone. The matrix, runs-on, checkout, cargo install wasm-pack and the firefox apt step are unchanged.

Verified locally (applied uncommitted, reverted after): with this patch, cargo test --manifest-path pg-core/Cargo.toml --features test,rust,stream --test ci_wiring goes 16/16, including the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper, which is red without it.

One command applies it directly to the PR branch, no checkout needed:

gh api -X PUT repos/encryption4all/postguard/contents/.github/workflows/build.yml -f branch=dobby/issue-432-wasm-browser-ci-timeout -f message="ci: honest timeout and no retry-wrapper for test-wasm-browsers (#416)" -f sha="35336471dbc70abbca7ac0f220c43646f8852006" -f content=b246CiAgcHVzaDoKICAgIGJyYW5jaGVzOgogICAgICAtIG1haW4KICBwdWxsX3JlcXVlc3Q6CiAgICAjIGBlZGl0ZWRgIGluY2x1ZGVkIGZvciBiYXNlIHJldGFyZ2V0cyAoZS5nLiBhIHN0YWNrZWQgUFIncyBiYXNlIG1lcmdpbmcpOgogICAgIyBwYXRocy1maWx0ZXIncyB2ZXJkaWN0IGRlcGVuZHMgb24gdGhlIGJhc2UsIGFuZCB3aXRob3V0IGBlZGl0ZWRgIGEgc3RhbGUKICAgICMgdmVyZGljdCBzdGF5cyBhdHRhY2hlZCB0byB0aGUgdW5jaGFuZ2VkIGhlYWQgc2hhLgogICAgdHlwZXM6IFtvcGVuZWQsIHN5bmNocm9uaXplLCByZW9wZW5lZCwgZWRpdGVkXQogICAgYnJhbmNoZXM6CiAgICAgIC0gbWFpbgogIHdvcmtmbG93X2Rpc3BhdGNoOgoKbmFtZTogQ29udGludW91cyBpbnRlZ3JhdGlvbgoKam9iczoKICAjIHNvbmFycXViZToKICAjICAgbmFtZTogU29uYXJRdWJlCiAgIyAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAjICAgY29udGludWUtb24tZXJyb3I6IHRydWUKICAjICAgc3RlcHM6CiAgIyAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgIyAgICAgICB3aXRoOgogICMgICAgICAgICBmZXRjaC1kZXB0aDogMCAgIyBTaGFsbG93IGNsb25lcyBzaG91bGQgYmUgZGlzYWJsZWQgZm9yIGEgYmV0dGVyIHJlbGV2YW5jeSBvZiBhbmFseXNpcwogICMgICAgIC0gbmFtZTogU29uYXJRdWJlIFNjYW4KICAjICAgICAgIHVzZXM6IFNvbmFyU291cmNlL3NvbmFycXViZS1zY2FuLWFjdGlvbkB2NgogICMgICAgICAgZW52OgogICMgICAgICAgICBTT05BUl9UT0tFTjogJHt7IHNlY3JldHMuU09OQVJfVE9LRU4gfX0KICAjIFRoZSBtYXRyaXgga2V5cyBvbiB0aGUgY3JhdGUgZGlyZWN0b3J5IHJhdGhlciB0aGFuIGEgYHBnLWAgc3VmZml4LCBiZWNhdXNlCiAgIyBgY3J5cHRpZnlgIGRvZXMgbm90IGNhcnJ5IHRoYXQgcHJlZml4LiBUaGlzIHJlbmFtZXMgdGhlIGNoZWNrIGNvbnRleHRzIGZyb20KICAjIGBUZXN0IHdvcmtzcGFjZSAoY29yZSlgIHRvIGBUZXN0IHdvcmtzcGFjZSAocGctY29yZSlgOyBub3RoaW5nIHJlcXVpcmVkCiAgIyBwb2ludHMgYXQgdGhlbSB0b2RheSAob25seSB0aGUgdHdvIGBXaXJlIGNvbXBhdGAgY29udGV4dHMgYXJlIHJlcXVpcmVkKSwgYnV0CiAgIyBhIHJ1bGVzZXQgYWRkZWQgbGF0ZXIgbXVzdCB1c2UgdGhlIG5ldyBuYW1lcy4KICB0ZXN0OgogICAgbmFtZTogVGVzdCB3b3Jrc3BhY2UKICAgIHN0cmF0ZWd5OgogICAgICBtYXRyaXg6CiAgICAgICAgY3JhdGU6IFtwZy1jb3JlLCBwZy1wa2csIHBnLWNsaSwgcGctZmZpLCBjcnlwdGlmeV0KICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIHN0ZXBzOgogICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgLSB1c2VzOiBkdG9sbmF5L3J1c3QtdG9vbGNoYWluQHN0YWJsZQogICAgICAtIGlmOiAke3sgbWF0cml4LmNyYXRlID09ICdwZy1jb3JlJyB9fQogICAgICAgIHJ1bjogY2FyZ28gdGVzdCAtLW1hbmlmZXN0LXBhdGggcGctY29yZS9DYXJnby50b21sIC0tZmVhdHVyZXMgdGVzdCxydXN0LHN0cmVhbQogICAgICAjIGNyeXB0aWZ5IGRlY2xhcmVzIG5vIGZlYXR1cmVzIG9mIGl0cyBvd24sIHNvIGAtLWFsbC10YXJnZXRzYCAod2hhdCBpdHMKICAgICAgIyBvd24gQ0kgcmFuKSBpcyB0aGUgZXF1aXZhbGVudCBpbnZvY2F0aW9uLgogICAgICAtIGlmOiAke3sgbWF0cml4LmNyYXRlID09ICdjcnlwdGlmeScgfX0KICAgICAgICBydW46IGNhcmdvIHRlc3QgLS1tYW5pZmVzdC1wYXRoIGNyeXB0aWZ5L0NhcmdvLnRvbWwgLS1hbGwtdGFyZ2V0cwogICAgICAtIGlmOiAke3sgbWF0cml4LmNyYXRlICE9ICdwZy1jb3JlJyAmJiBtYXRyaXguY3JhdGUgIT0gJ2NyeXB0aWZ5JyB9fQogICAgICAgIHJ1bjogY2FyZ28gdGVzdCAtLW1hbmlmZXN0LXBhdGggJHt7IG1hdHJpeC5jcmF0ZSB9fS9DYXJnby50b21sIC0tYWxsLWZlYXR1cmVzCgogIGZvcm1hdDoKICAgIG5hbWU6IEZvcm1hdCB3b3Jrc3BhY2UKICAgIHN0cmF0ZWd5OgogICAgICBtYXRyaXg6CiAgICAgICAgY3JhdGU6IFtwZy1jb3JlLCBwZy1wa2csIHBnLWNsaSwgcGctZmZpLCBjcnlwdGlmeV0KICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIHN0ZXBzOgogICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgLSB1c2VzOiBkdG9sbmF5L3J1c3QtdG9vbGNoYWluQHN0YWJsZQogICAgICAtIHJ1bjogY2FyZ28gZm10IC0tbWFuaWZlc3QtcGF0aCAke3sgbWF0cml4LmNyYXRlIH19L0NhcmdvLnRvbWwgLS1hbGwgLS0gLS1jaGVjawoKICBjbGlwcHk6CiAgICBuYW1lOiBDbGlwcHkgd29ya3NwYWNlCiAgICBzdHJhdGVneToKICAgICAgbWF0cml4OgogICAgICAgIGNyYXRlOiBbcGctY29yZSwgcGctcGtnLCBwZy1jbGksIHBnLWZmaSwgY3J5cHRpZnldCiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICBzdGVwczoKICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgIC0gdXNlczogZHRvbG5heS9ydXN0LXRvb2xjaGFpbkBzdGFibGUKICAgICAgICB3aXRoOgogICAgICAgICAgY29tcG9uZW50czogY2xpcHB5CiAgICAgIC0gaWY6ICR7eyBtYXRyaXguY3JhdGUgPT0gJ3BnLWNvcmUnIH19CiAgICAgICAgcnVuOiBjYXJnbyBjbGlwcHkgLS1tYW5pZmVzdC1wYXRoIHBnLWNvcmUvQ2FyZ28udG9tbCAtLWFsbC10YXJnZXRzIC0tZmVhdHVyZXMgdGVzdCxydXN0LHN0cmVhbSAtLSAtRCB3YXJuaW5ncwogICAgICAtIGlmOiAke3sgbWF0cml4LmNyYXRlID09ICdjcnlwdGlmeScgfX0KICAgICAgICBydW46IGNhcmdvIGNsaXBweSAtLW1hbmlmZXN0LXBhdGggY3J5cHRpZnkvQ2FyZ28udG9tbCAtLWFsbC10YXJnZXRzIC0tIC1EIHdhcm5pbmdzCiAgICAgIC0gaWY6ICR7eyBtYXRyaXguY3JhdGUgIT0gJ3BnLWNvcmUnICYmIG1hdHJpeC5jcmF0ZSAhPSAnY3J5cHRpZnknIH19CiAgICAgICAgcnVuOiBjYXJnbyBjbGlwcHkgLS1tYW5pZmVzdC1wYXRoICR7eyBtYXRyaXguY3JhdGUgfX0vQ2FyZ28udG9tbCAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzCgogIHRlc3Qtd2FzbS1icm93c2VyczoKICAgIG5hbWU6IFJ1biB3YXNtIHRlc3RzIGluIGJyb3dzZXJzCiAgICBzdHJhdGVneToKICAgICAgbWF0cml4OgogICAgICAgIGluY2x1ZGU6CiAgICAgICAgICAtIGJyb3dzZXI6IGNocm9tZQogICAgICAgICAgICBvczogdWJ1bnR1LWxhdGVzdAogICAgICAgICAgLSBicm93c2VyOiBmaXJlZm94CiAgICAgICAgICAgIG9zOiB1YnVudHUtbGF0ZXN0CiAgICAgICAgICAtIGJyb3dzZXI6IHNhZmFyaQogICAgICAgICAgICBvczogbWFjb3MtbGF0ZXN0CiAgICBydW5zLW9uOiAke3sgbWF0cml4Lm9zIH19CiAgICAjIFRoZSBzdWl0ZSBpcyAxNiB0ZXN0cyBhbmQgZmluaXNoZXMgaW4gfjI1czsgYSBwYXNzaW5nIGpvYiBpcyAyLTYgbWludXRlcywKICAgICMgYWxtb3N0IGFsbCBvZiBpdCBgY2FyZ28gaW5zdGFsbCB3YXNtLXBhY2tgIGFuZCB0aGUgcmVsZWFzZSBidWlsZC4gMTIKICAgICMgbWludXRlcyBpcyB+MnggdGhlIHNsb3dlc3Qgb2JzZXJ2ZWQgc3VjY2Vzcy4gVGhlIHByZXZpb3VzIGJ1ZGdldCB3YXMgMjAKICAgICMgbWludXRlcyBpbnNpZGUgYSBgbmljay1maWVsZHMvcmV0cnlgIHdyYXBwZXIsIHdoaWNoIG9uIDIwMjYtMDktMDMgdHVybmVkCiAgICAjIHRocmVlIHdlZGdlZCBzYWZhcmkgc2Vzc2lvbnMgaW50byB+MjItbWludXRlIGpvYnMgd2l0aCB+MTcgbWludXRlcyBvZgogICAgIyBzaWxlbmNlIGVhY2ggKCM0MTYpLgogICAgdGltZW91dC1taW51dGVzOiAxMgogICAgZW52OgogICAgICAjIH42eCB0aGUgc2xvd2VzdCBzaW5nbGUgdGVzdCAofjVzKS4gVGhpcyBpcyBhIHBlci10ZXN0IHRpbWVyIHJ1bm5pbmcKICAgICAgIyBpbnNpZGUgdGhlIGJyb3dzZXIgcGFnZSwgc28gaXQgZG9lcyBOT1QgYm91bmQgYSB3ZWRnZWQgc2FmYXJpZHJpdmVyCiAgICAgICMgc2Vzc2lvbiAtLSB0aGF0IGlzIHdoYXQgYHRpbWVvdXQtbWludXRlc2AgYWJvdmUgaXMgZm9yLiBJdCB3YXMgMTIwLAogICAgICAjIHdoaWNoIGlzIGJvdGggMjR4IHRoZSBzbG93ZXN0IHRlc3QgYW5kLCBhdCAxNiB0ZXN0cywgYSAzMi1taW51dGUKICAgICAgIyB3b3JzdCBjYXNlIHRoYXQgdGhlIGpvYiBidWRnZXQgY291bGQgbmV2ZXIgcmVhY2guCiAgICAgIFdBU01fQklOREdFTl9URVNUX1RJTUVPVVQ6IDMwCiAgICBzdGVwczoKICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgIC0gbmFtZTogSW5zdGFsbAogICAgICAgIHJ1bjogY2FyZ28gaW5zdGFsbCB3YXNtLXBhY2sKICAgICAgLSBpZjogJHt7IG1hdHJpeC5icm93c2VyID09ICdmaXJlZm94JyB9fQogICAgICAgIHJ1bjogc3VkbyBhcHQgdXBkYXRlICYmIHN1ZG8gYXB0IGluc3RhbGwgZmlyZWZveAogICAgICAjIEEgcGxhaW4gYHJ1bjpgLCBub3QgYG5pY2stZmllbGRzL3JldHJ5YC4gVGhlIHdyYXBwZXIgcmV0cmllZCBnZW51aW5lCiAgICAgICMgbm9uLXplcm8gZXhpdHMgKGhpZGluZyBhIHJlYWwgZmFpbHVyZSBiZWhpbmQgYSBzZWNvbmQgcm9sbCkgYW5kIGRpZAogICAgICAjIE5PVCByZXRyeSBhIHRpbWVvdXQsIHdoaWNoIGlzIHRoZSBvbmx5IHNoYXBlIHRoaXMgam9iIGhhcyBldmVyIGhpdAogICAgICAjIC0tIGByZXRyeV9vbjogZXJyb3JgIGV4Y2x1ZGVzIHRpbWVvdXRzLCBzbyBgbWF4X2F0dGVtcHRzOiAyYCBuZXZlcgogICAgICAjIGVuZ2FnZWQuIERyb3BwaW5nIGl0IGFsc28gcmVtb3ZlcyB0aGUgbGl0ZXJhbCBiYWNrc2xhc2ggdGhlIGFjdGlvbgogICAgICAjIGlucHV0IHJlcXVpcmVkIChgLS1cJHt7IG1hdHJpeC5icm93c2VyIH19YCksIHdoaWNoIHN1cnZpdmVkIGludG8gdGhlCiAgICAgICMgcmVzb2x2ZWQgY29tbWFuZCBhbmQgb25seSB3b3JrZWQgYmVjYXVzZSBhIHNoZWxsIHN0cmlwcGVkIGl0LgogICAgICAtIG5hbWU6IFJ1biB3YXNtLXBhY2sgYnJvd3NlciB0ZXN0cwogICAgICAgIHJ1bjogd2FzbS1wYWNrIHRlc3QgLS1yZWxlYXNlIC0taGVhZGxlc3MgLS0ke3sgbWF0cml4LmJyb3dzZXIgfX0gLi9wZy13YXNtCgogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIyBXaXJlIGNvbXBhdGliaWxpdHk6IEhFQUQtc2VhbGVkIGNvbnRhaW5lcnMgbXVzdCBvcGVuIHdpdGggcHVibGlzaGVkIHJlYWRlcnMKICAjICgjMjUxIC8gIzI2MCkuICMyNjEgYWRkcyBhIHdpcmUtY29tcGF0LWpzIGpvYiB0aGF0IGRvd25sb2FkcyB0aGUgYXJ0aWZhY3QKICAjIHRoaXMgam9iIHVwbG9hZHMuCiAgIwogICMgVGhlIHBhdGggZmlsdGVyIGlzIGEgc3RlcCwgbm90IGFuIGBvbjogcGF0aHM6YCBrZXksIG9uIHB1cnBvc2U6IGEgam9iIHRoYXQKICAjIGlzIHNraXBwZWQgYnkgYSBwYXRoIGZpbHRlciBuZXZlciByZXBvcnRzLCBzbyBhIHJlcXVpcmVkIGNoZWNrIHdvdWxkIHNpdAogICMgcGVuZGluZyBmb3JldmVyIG9uIFBScyB0aGF0IGRvIG5vdCB0b3VjaCB0aGUgd2lyZSBzdXJmYWNlLiBUaGlzIHNoYXBlIGFsd2F5cwogICMgcmVwb3J0cyBhbmQgb25seSBkb2VzIHRoZSBleHBlbnNpdmUgd29yayB3aGVuIGl0IG5lZWRzIHRvLgogICMKICAjIE9uIGBwdXNoYCB0aGUgZmlsdGVyIGlzIHRoZSB3cm9uZyBpbnN0cnVtZW50IGFuZCBpcyBieXBhc3NlZCAoIzI5OSkuIEl0CiAgIyBkaWZmcyBvbmx5IHRoZSBwdXNoIHRoYXQgdHJpZ2dlcmVkIGl0LCBzbyBhIGNvbW1pdCB0aGF0IHJlYWNoZWQgYG1haW5gCiAgIyB3aXRob3V0IHRoaXMgZ2F0ZSBldmVyIHJ1bm5pbmcgaXMgbmV2ZXIgcmUtY2hlY2tlZCBhZnRlcndhcmRzIC0tIGFuZCB0aGUgam9iCiAgIyBzdGlsbCByZXBvcnRzIGdyZWVuLCBiZWNhdXNlICJmaWx0ZXIgc2FpZCBubyIgYW5kICJnYXRlIHBhc3NlZCIgYXJlIHRoZSBzYW1lCiAgIyBzdWNjZXNzLiBUaGF0IGlzIG5vdCBoeXBvdGhldGljYWw6ICMyOTcgY2hhbmdlZCBzZXZlbiBmaWxlcyB1bmRlcgogICMgYHBnLWNvbXBhdC8qKmAgYW5kIG1lcmdlZCBkdXJpbmcgdGhlIDIwMjYtMDgtMDYgQWN0aW9ucyBvdXRhZ2Ugd2l0aCBubyBydW4KICAjIGF0IGFsbCwgYW5kIHRoZSB0aHJlZSBgbWFpbmAgcnVucyBhZnRlciBpdCAoNTA2MTQ0YzIsIGMxNjgyYmE3LCAxMjM4Mzg5YikKICAjIGVhY2ggcmVwb3J0ZWQgYFdpcmUgY29tcGF0OiBzdWNjZXNzYCB3aXRoIGBTZWFsYC9gT3BlbmAgYm90aCBza2lwcGVkLiBTbyBvbgogICMgYSBwdXNoIHRoZSBnYXRlIGFsd2F5cyBkb2VzIHRoZSByZWFsIHdvcms6IHdoYXRldmVyIGlzIG9uIGBtYWluYCBpcyB3aGF0CiAgIyBnZXRzIHNlYWxlZCBhbmQgb3BlbmVkLCBob3dldmVyIGl0IGdvdCB0aGVyZS4KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHdpcmUtY29tcGF0LXJ1c3Q6CiAgICBuYW1lOiBXaXJlIGNvbXBhdCAocHVibGlzaGVkIHBnLWNvcmUpCiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICBwZXJtaXNzaW9uczoKICAgICAgY29udGVudHM6IHJlYWQKICAgICAgcHVsbC1yZXF1ZXN0czogcmVhZCAjIHBhdGhzLWZpbHRlciByZWFkcyB0aGUgUFIncyBjaGFuZ2VkIGZpbGVzCiAgICAjIHdpcmUtY29tcGF0LWpzICgjMjYxKSBvcGVucyB0aGUgc2FtZSBieXRlcyB3aXRoIHRoZSBwdWJsaXNoZWQgbnBtIHJlYWRlcnMuCiAgICAjIEl0IGRvd25sb2FkcyB0aGUgYXJ0aWZhY3QgdGhlIHNlYWwgc3RlcCBiZWxvdyBwcm9kdWNlcywgc28gaXQgZ2F0ZXMgb24gdGhlCiAgICAjIHNhbWUgb3V0Y29tZSB0aGUgdXBsb2FkIGdhdGVzIG9uIHJhdGhlciB0aGFuIHJlLXJ1bm5pbmcgdGhlIHBhdGggZmlsdGVyIGFuZAogICAgIyBkcmlmdGluZyBvdXQgb2Ygc3RlcCB3aXRoIGl0LgogICAgb3V0cHV0czoKICAgICAgc2VhbGVkOiAke3sgc3RlcHMuc2VhbC5vdXRjb21lIH19CiAgICBzdGVwczoKICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICMgU0hBLXBpbm5lZCBhcyB0aGUgb25lIGFjdGlvbiBuZXcgdG8gdGhpcyByZXBvOyB0aGUgcmVzdCBmb2xsb3cgdGhlCiAgICAgICMgZmlsZSdzIGV4aXN0aW5nIGZsb2F0aW5nLXJlZiBjb252ZW50aW9uLgogICAgICAtIHVzZXM6IGRvcm55L3BhdGhzLWZpbHRlckA3YjQ1MGZmZjIxNDczYmNhNDYxZDRiOTJjZTQxNGI5ZDA0MjBkNzA2ICMgdjQuMC4yCiAgICAgICAgaWQ6IGNoYW5nZXMKICAgICAgICB3aXRoOgogICAgICAgICAgZmlsdGVyczogfAogICAgICAgICAgICB3aXJlOgogICAgICAgICAgICAgIC0gJ3BnLWNvcmUvKionCiAgICAgICAgICAgICAgLSAncGctd2FzbS8qKicKICAgICAgICAgICAgICAtICdwZy1jb21wYXQvKionCiAgICAgICAgICAgICAgLSAncGctY29tcGF0LWpzLyoqJwogICAgICAgICAgICAgICMgcGctY29yZSBoYXMgbm8gbG9ja2ZpbGUgb2YgaXRzIG93bjogdGhlIGJ5dGVzIEhFQUQgc2VhbHMgYXJlIGEKICAgICAgICAgICAgICAjIGZ1bmN0aW9uIG9mIHRoZSBST09UIGxvY2tmaWxlIChhIGJpbmNvZGUtbmV4dC9pYmUvc2VyZGUgYnVtcAogICAgICAgICAgICAgICMgdG91Y2hlcyBvbmx5IHRoZXNlIHR3byBmaWxlcykuIFJvb3QgQ2FyZ28udG9tbCBhbHNvIGhvbGRzIHRoZQogICAgICAgICAgICAgICMgZXhjbHVkZSBsaXN0IHRoYXQga2VlcHMgcGctY29tcGF0IG9uIGNyYXRlcy5pbyBwZy1jb3JlLgogICAgICAgICAgICAgIC0gJ0NhcmdvLmxvY2snCiAgICAgICAgICAgICAgLSAnQ2FyZ28udG9tbCcKICAgICAgICAgICAgICAtICcuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWwnCgogICAgICAjIE9uZSBkZWNpc2lvbiwgcmVhZCBieSBldmVyeSBzdGVwIGJlbG93LCBzbyB0aGUgcHVzaCBvdmVycmlkZSBjYW5ub3QgYmUKICAgICAgIyBhcHBsaWVkIHRvIHRoZSBzZWFsIGJ1dCBmb3Jnb3R0ZW4gb24gdGhlIG9wZW4uCiAgICAgIC0gbmFtZTogRGVjaWRlIHdoZXRoZXIgdG8gZG8gdGhlIHJlYWwgd29yawogICAgICAgIGlkOiBnYXRlCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBlbnY6CiAgICAgICAgICBXSVJFX0NIQU5HRUQ6ICR7eyBzdGVwcy5jaGFuZ2VzLm91dHB1dHMud2lyZSB9fQogICAgICAgIHJ1bjogfAogICAgICAgICAgaWYgW1sgIiRXSVJFX0NIQU5HRUQiID09ICJ0cnVlIiB8fCAiJEdJVEhVQl9FVkVOVF9OQU1FIiA9PSAicHVzaCIgXV07IHRoZW4KICAgICAgICAgICAgZWNobyAicnVuPXRydWUiID4+ICIkR0lUSFVCX09VVFBVVCIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAicnVuPWZhbHNlIiA+PiAiJEdJVEhVQl9PVVRQVVQiCiAgICAgICAgICBmaQoKICAgICAgLSBpZjogc3RlcHMuZ2F0ZS5vdXRwdXRzLnJ1biA9PSAndHJ1ZScKICAgICAgICB1c2VzOiBkdG9sbmF5L3J1c3QtdG9vbGNoYWluQHN0YWJsZQogICAgICAgIHdpdGg6CiAgICAgICAgICBjb21wb25lbnRzOiBjbGlwcHksIHJ1c3RmbXQKCiAgICAgIC0gbmFtZTogU2VhbCB0aGUgc2FtcGxlIHNldCB3aXRoIEhFQUQKICAgICAgICBpZDogc2VhbAogICAgICAgIGlmOiBzdGVwcy5nYXRlLm91dHB1dHMucnVuID09ICd0cnVlJwogICAgICAgIHNoZWxsOiBiYXNoCiAgICAgICAgcnVuOiB8CiAgICAgICAgICBjYXJnbyBydW4gLS1sb2NrZWQgLXAgcGctY29yZSAtLWZlYXR1cmVzIHN0cmVhbSAtLWV4YW1wbGUgc2VhbC1zYW1wbGVzIFwKICAgICAgICAgICAgLS0gIiRSVU5ORVJfVEVNUC93aXJlLWNvbXBhdC1hcnRpZmFjdHMiCgogICAgICAjIEhhbmQtb2ZmIHRvIHdpcmUtY29tcGF0LWpzICgjMjYxKS4gVXBsb2FkZWQgYmVmb3JlIHRoZSByZWFkZXIgcnVucyBzbyBhCiAgICAgICMgcmVkIGdhdGUgc3RpbGwgbGVhdmVzIHRoZSBieXRlcyB0aGF0IGJyb2tlIGl0LgogICAgICAtIG5hbWU6IFVwbG9hZCB0aGUgc2FtcGxlIHNldAogICAgICAgIGlmOiBzdGVwcy5zZWFsLm91dGNvbWUgPT0gJ3N1Y2Nlc3MnCiAgICAgICAgdXNlczogYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjQKICAgICAgICB3aXRoOgogICAgICAgICAgbmFtZTogd2lyZS1jb21wYXQtYXJ0aWZhY3RzLSR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIHx8IGdpdGh1Yi5zaGEgfX0KICAgICAgICAgIHBhdGg6ICR7eyBydW5uZXIudGVtcCB9fS93aXJlLWNvbXBhdC1hcnRpZmFjdHMKICAgICAgICAgIHJldGVudGlvbi1kYXlzOiA3CgogICAgICAtIG5hbWU6IE9wZW4gaXQgd2l0aCBwdWJsaXNoZWQgcGctY29yZQogICAgICAgIGlmOiBzdGVwcy5nYXRlLm91dHB1dHMucnVuID09ICd0cnVlJwogICAgICAgIHNoZWxsOiBiYXNoCiAgICAgICAgZW52OgogICAgICAgICAgUEdfQ09NUEFUX0FSVElGQUNUUzogJHt7IHJ1bm5lci50ZW1wIH19L3dpcmUtY29tcGF0LWFydGlmYWN0cwogICAgICAgIHJ1bjogY2FyZ28gdGVzdCAtLW1hbmlmZXN0LXBhdGggcGctY29tcGF0L0NhcmdvLnRvbWwgLS1sb2NrZWQKCiAgIyBwZy1jb21wYXQgaXMgb3V0c2lkZSB0aGUgd29ya3NwYWNlLCBzbyB0aGUgcGVyLWNyYXRlIGZtdC9jbGlwcHkgbWF0cmljZXMgZG8KICAjIG5vdCBjb3ZlciBpdC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHdpcmUtY29tcGF0LXJ1c3Qgb24gcHVycG9zZTogYSBuZXcgc3RhYmxlCiAgIyBydXN0YyBsaW50IG11c3Qgbm90IHJlZCBhIHJlcXVpcmVkIGNoZWNrIG5hbWVkIGFmdGVyIHdpcmUgY29tcGF0aWJpbGl0eSwKICAjIG5vciBwcmUtZW1wdCB0aGUgc2VhbC9yZWFkIHN0ZXBzIHRoYXQgYW5zd2VyIGl0LgogIHBnLWNvbXBhdC1saW50OgogICAgbmFtZTogTGludCBwZy1jb21wYXQKICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIHBlcm1pc3Npb25zOgogICAgICBjb250ZW50czogcmVhZAogICAgICBwdWxsLXJlcXVlc3RzOiByZWFkCiAgICBzdGVwczoKICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgIC0gdXNlczogZG9ybnkvcGF0aHMtZmlsdGVyQDdiNDUwZmZmMjE0NzNiY2E0NjFkNGI5MmNlNDE0YjlkMDQyMGQ3MDYgIyB2NC4wLjIKICAgICAgICBpZDogY2hhbmdlcwogICAgICAgIHdpdGg6CiAgICAgICAgICBmaWx0ZXJzOiB8CiAgICAgICAgICAgIHdpcmU6CiAgICAgICAgICAgICAgLSAncGctY29tcGF0LyoqJwogICAgICAgICAgICAgIC0gJ0NhcmdvLmxvY2snCiAgICAgICAgICAgICAgLSAnQ2FyZ28udG9tbCcKICAgICAgICAgICAgICAtICcuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWwnCiAgICAgIC0gaWY6IHN0ZXBzLmNoYW5nZXMub3V0cHV0cy53aXJlID09ICd0cnVlJwogICAgICAgIHVzZXM6IGR0b2xuYXkvcnVzdC10b29sY2hhaW5Ac3RhYmxlCiAgICAgICAgd2l0aDoKICAgICAgICAgIGNvbXBvbmVudHM6IGNsaXBweSwgcnVzdGZtdAogICAgICAtIG5hbWU6IEZvcm1hdCBwZy1jb21wYXQKICAgICAgICBpZjogc3RlcHMuY2hhbmdlcy5vdXRwdXRzLndpcmUgPT0gJ3RydWUnCiAgICAgICAgcnVuOiBjYXJnbyBmbXQgLS1tYW5pZmVzdC1wYXRoIHBnLWNvbXBhdC9DYXJnby50b21sIC0tYWxsIC0tIC0tY2hlY2sKICAgICAgLSBuYW1lOiBDbGlwcHkgcGctY29tcGF0CiAgICAgICAgaWY6IHN0ZXBzLmNoYW5nZXMub3V0cHV0cy53aXJlID09ICd0cnVlJwogICAgICAgIHJ1bjogY2FyZ28gY2xpcHB5IC0tbWFuaWZlc3QtcGF0aCBwZy1jb21wYXQvQ2FyZ28udG9tbCAtLWFsbC10YXJnZXRzIC0tbG9ja2VkIC0tIC1EIHdhcm5pbmdzCgogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIyBQdWJsaWMtQVBJIHNlbXZlciBnYXRlICgjMjUzKS4gRmFpbHMgYSBQUiB0aGF0IGJyZWFrcyBwZy1jb3JlJ3Mgb3IgcGctd2FzbSdzCiAgIyBwdWJsaWMgQVBJIHdpdGhvdXQgZGVjbGFyaW5nIHRoZSBicmVhay4KICAjCiAgIyBWZXJzaW9ucyBoZXJlIGFyZSBidW1wZWQgYnkgcmVsZWFzZS1wbHosIG5vdCBieSB0aGUgUFIgdGhhdCBtYWtlcyB0aGUKICAjIGNoYW5nZSwgc28gImRlY2xhcmVkIiBtZWFucyB0aGUgY29udmVudGlvbmFsLWNvbW1pdCBgIWAgbWFya2VyIHRoYXQKICAjIHJlbGVhc2UtcGx6IHR1cm5zIGludG8gYSBtYWpvciBidW1wLiBUaGUgbWFya2VyIGlzIHJlYWQgb2ZmIHRoZSBQUiB0aXRsZQogICMgaW50byBTRU1WRVJfUkVMRUFTRV9UWVBFOyBgZWRpdGVkYCBpcyBhbHJlYWR5IGluIHRoaXMgZmlsZSdzIHRyaWdnZXIgbGlzdCwKICAjIHNvIGFkZGluZyB0aGUgYCFgIHRvIHRoZSB0aXRsZSByZS1ydW5zIHRoZSBnYXRlLgogICMKICAjIFNhbWUgYWx3YXlzLXJlcG9ydHMgc2hhcGUgYXMgd2lyZS1jb21wYXQtcnVzdDogdGhlIHBhdGggZmlsdGVyIGlzIGEgc3RlcCwKICAjIG5vdCBhbiBgb246IHBhdGhzOmAga2V5LCBzbyBhIHJlcXVpcmVkIGNoZWNrIG5ldmVyIHNpdHMgcGVuZGluZy4KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHNlbXZlci1jaGVja3M6CiAgICBuYW1lOiBQdWJsaWMgQVBJIHNlbXZlcgogICAgaWY6IGdpdGh1Yi5ldmVudF9uYW1lID09ICdwdWxsX3JlcXVlc3QnCiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICBwZXJtaXNzaW9uczoKICAgICAgY29udGVudHM6IHJlYWQKICAgICAgcHVsbC1yZXF1ZXN0czogcmVhZCAjIHBhdGhzLWZpbHRlciByZWFkcyB0aGUgUFIncyBjaGFuZ2VkIGZpbGVzCiAgICBzdGVwczoKICAgICAgIyBwZy13YXNtIGlzIG5vdCBwdWJsaXNoZWQgdG8gY3JhdGVzLmlvLCBzbyBpdHMgYmFzZWxpbmUgaXMgb3JpZ2luL21haW4KICAgICAgIyByYXRoZXIgdGhhbiBhIHJlZ2lzdHJ5IHZlcnNpb24sIGFuZCB0aGUgZnVsbCBoaXN0b3J5IGhhcyB0byBiZSBoZXJlLgogICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgICB3aXRoOgogICAgICAgICAgZmV0Y2gtZGVwdGg6IDAKCiAgICAgIC0gdXNlczogZG9ybnkvcGF0aHMtZmlsdGVyQDdiNDUwZmZmMjE0NzNiY2E0NjFkNGI5MmNlNDE0YjlkMDQyMGQ3MDYgIyB2NC4wLjIKICAgICAgICBpZDogY2hhbmdlcwogICAgICAgIHdpdGg6CiAgICAgICAgICBmaWx0ZXJzOiB8CiAgICAgICAgICAgIGFwaToKICAgICAgICAgICAgICAtICdwZy1jb3JlLyoqJwogICAgICAgICAgICAgIC0gJ3BnLXdhc20vKionCiAgICAgICAgICAgICAgLSAnQ2FyZ28udG9tbCcKICAgICAgICAgICAgICAtICdDYXJnby5sb2NrJwogICAgICAgICAgICAgIC0gJ3NjcmlwdHMvc2VtdmVyLWNoZWNrcy5zaCcKICAgICAgICAgICAgICAtICdzY3JpcHRzL3NlbXZlci1jaGVja3MtdGVzdC5zaCcKICAgICAgICAgICAgICAtICcuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWwnCgogICAgICAjIFN0dWJzIGNhcmdvLCBzbyBpdCBuZWVkcyBubyB0b29sY2hhaW4gYW5kIHJ1bnMgaW4gdW5kZXIgYSBzZWNvbmQuIEl0CiAgICAgICMgY292ZXJzIHRoZSAxMDAtdnMtMTAxIGV4aXQtY29kZSBtYXBwaW5nIHRoZSBnYXRlIGRlcGVuZHMgb246IDEwMCBpcyBhCiAgICAgICMgc2VtdmVyIHZpb2xhdGlvbiwgMTAxIGlzIHRoZSB0b29sIG9yIHRoZSBidWlsZCBmYWlsaW5nLgogICAgICAtIG5hbWU6IFRlc3QgdGhlIGdhdGUgc2NyaXB0CiAgICAgICAgaWY6IHN0ZXBzLmNoYW5nZXMub3V0cHV0cy5hcGkgPT0gJ3RydWUnCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBydW46IC4vc2NyaXB0cy9zZW12ZXItY2hlY2tzLXRlc3Quc2gKCiAgICAgIC0gaWY6IHN0ZXBzLmNoYW5nZXMub3V0cHV0cy5hcGkgPT0gJ3RydWUnCiAgICAgICAgdXNlczogZHRvbG5heS9ydXN0LXRvb2xjaGFpbkBzdGFibGUKICAgICAgICB3aXRoOgogICAgICAgICAgdGFyZ2V0czogd2FzbTMyLXVua25vd24tdW5rbm93bgoKICAgICAgIyBQaW5uZWQgcmVsZWFzZSBiaW5hcnkgcmF0aGVyIHRoYW4gYGNhcmdvIGluc3RhbGxgIChhIGZpdmUtbWludXRlIGJ1aWxkKQogICAgICAjIG9yIGEgZm91cnRoIHRoaXJkLXBhcnR5IGFjdGlvbi4gQnVtcCB0aGUgdmVyc2lvbiBhbmQgdGhlIGRpZ2VzdCB0b2dldGhlci4KICAgICAgLSBuYW1lOiBJbnN0YWxsIGNhcmdvLXNlbXZlci1jaGVja3MKICAgICAgICBpZjogc3RlcHMuY2hhbmdlcy5vdXRwdXRzLmFwaSA9PSAndHJ1ZScKICAgICAgICBzaGVsbDogYmFzaAogICAgICAgIGVudjoKICAgICAgICAgIFZFUlNJT046IDAuNDkuMAogICAgICAgICAgU0hBMjU2OiA3MmY2ODM0ZDc1ZDI4YTY2ZTAyYzlmZDZhMjMwY2U5MDFiYjMwZWVlNjA2N2I4NTg2N2E5NzQ0NWRmMDQwZTRhCiAgICAgICAgcnVuOiB8CiAgICAgICAgICBjdXJsIC1zU2ZMIC1vICIkUlVOTkVSX1RFTVAvY2FyZ28tc2VtdmVyLWNoZWNrcy50YXIuZ3oiIFwKICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9vYmkxa2Vub2JpL2NhcmdvLXNlbXZlci1jaGVja3MvcmVsZWFzZXMvZG93bmxvYWQvdiR7VkVSU0lPTn0vY2FyZ28tc2VtdmVyLWNoZWNrcy14ODZfNjQtdW5rbm93bi1saW51eC1nbnUudGFyLmd6IgogICAgICAgICAgZWNobyAiJHtTSEEyNTZ9ICAkUlVOTkVSX1RFTVAvY2FyZ28tc2VtdmVyLWNoZWNrcy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0KICAgICAgICAgIHRhciAteHpmICIkUlVOTkVSX1RFTVAvY2FyZ28tc2VtdmVyLWNoZWNrcy50YXIuZ3oiIC1DICIkSE9NRS8uY2FyZ28vYmluIiBjYXJnby1zZW12ZXItY2hlY2tzCgogICAgICAjIFRoZSBQUiB0aXRsZSwgbm90IHRoZSBjb21taXQgc3ViamVjdDogUFJzIGFyZSBzcXVhc2gtbWVyZ2VkIGhlcmUsIHNvIHRoZQogICAgICAjIHRpdGxlIGlzIHdoYXQgcmVsZWFzZS1wbHogYW5kIHRoZSBDb252ZW50aW9uYWwgQ29tbWl0IGNoZWNrIHJlYWQuIFBhc3NlZAogICAgICAjIHRocm91Z2ggdGhlIGVudmlyb25tZW50IHJhdGhlciB0aGFuIGludGVycG9sYXRlZCBpbnRvIHRoZSBzY3JpcHQsIHNvIGEKICAgICAgIyBQUiB0aXRsZSBjYW5ub3QgaW5qZWN0IHNoZWxsLgogICAgICAjCiAgICAgICMgVGhlIHRpdGxlIGAhYCBpcyB0aGUgb25seSBhY2NlcHRlZCBkZWNsYXJhdGlvbi4gQSBgQlJFQUtJTkcgQ0hBTkdFOmAKICAgICAgIyBmb290ZXIgaW4gdGhlIFBSICpib2R5KiBpcyBkZWxpYmVyYXRlbHkgbm90IGFjY2VwdGVkOiB0aGlzIHJlcG8ncwogICAgICAjIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSBpcyBDT01NSVRfTUVTU0FHRVMsIHNvIHRoZSBib2R5IG5ldmVyIHJlYWNoZXMKICAgICAgIyB0aGUgc3F1YXNoZWQgY29tbWl0LCBhbmQgcmVsZWFzZS1wbHogcmVhZHMgY29tbWl0cy4gSG9ub3VyaW5nIGEgYm9keS1vbmx5CiAgICAgICMgZm9vdGVyIHdvdWxkIHBhc3MgdGhlIGdhdGUgb24gYSBgZml4KHBnLWNvcmUpOmAgUFIgdGhhdCByZWxlYXNlLXBseiB0aGVuCiAgICAgICMgcHVibGlzaGVzIGFzIGEgcGF0Y2ggcmVsZWFzZSBvZiBhIGJyZWFraW5nIGNoYW5nZS4KICAgICAgLSBuYW1lOiBSZWFkIHRoZSBicmVha2luZy1jaGFuZ2UgZGVjbGFyYXRpb24gb2ZmIHRoZSBQUiB0aXRsZQogICAgICAgIGlkOiBkZWNsYXJlZAogICAgICAgIGlmOiBzdGVwcy5jaGFuZ2VzLm91dHB1dHMuYXBpID09ICd0cnVlJwogICAgICAgIHNoZWxsOiBiYXNoCiAgICAgICAgZW52OgogICAgICAgICAgUFJfVElUTEU6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnRpdGxlIH19CiAgICAgICAgcnVuOiB8CiAgICAgICAgICBpZiBbWyAiJFBSX1RJVExFIiA9fiBeW2EtekEtWl0rKFwoW15cKV0qXCkpPyE6IF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIkJyZWFraW5nIGNoYW5nZSBkZWNsYXJlZCBpbiB0aGUgUFIgdGl0bGU7IGEgbWFqb3IgYnVtcCBpcyBhbGxvd2VkLiIKICAgICAgICAgICAgZWNobyAicmVsZWFzZV90eXBlPW1ham9yIiA+PiAiJEdJVEhVQl9PVVRQVVQiCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIk5vICchJyBpbiB0aGUgUFIgdGl0bGU7IGFueSBicmVha2luZyBjaGFuZ2Ugd2lsbCBmYWlsIHRoZSBnYXRlLiIKICAgICAgICAgIGZpCgogICAgICAtIG5hbWU6IENoZWNrIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgaWY6IHN0ZXBzLmNoYW5nZXMub3V0cHV0cy5hcGkgPT0gJ3RydWUnCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBlbnY6CiAgICAgICAgICBTRU1WRVJfUkVMRUFTRV9UWVBFOiAke3sgc3RlcHMuZGVjbGFyZWQub3V0cHV0cy5yZWxlYXNlX3R5cGUgfX0KICAgICAgICBydW46IC4vc2NyaXB0cy9zZW12ZXItY2hlY2tzLnNoCiAgIyBUaGUgTm9kZSBoYWxmIG9mIHRoZSBzYW1lIGdhdGUgKCMyNjEpOiB0aGUgY29udGFpbmVycyB3aXJlLWNvbXBhdC1ydXN0CiAgIyBzZWFsZWQgbXVzdCBhbHNvIG9wZW4gd2l0aCB0aGUgcHVibGlzaGVkIG5wbSByZWFkZXJzIGluIENPTVBBVElCSUxJVFkubWQncwogICMgc3VwcG9ydCB3aW5kb3cuIEl0IGRvd25sb2FkcyByYXRoZXIgdGhhbiByZS1zZWFscywgc28gYm90aCBoYWx2ZXMgYXJlIGhlbGQKICAjIHRvIHRoZSBzYW1lIGJ5dGVzIGFuZCBhIG5vbi1kZXRlcm1pbmlzdGljIHNlYWxlciBjYW5ub3QgaGlkZSBiZXR3ZWVuIHRoZW0uCiAgIwogICMgYGlmOiAhY2FuY2VsbGVkKClgIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0OiBhIHJlZCB3aXJlLWNvbXBhdC1ydXN0IGlzCiAgIyBleGFjdGx5IHdoZW4gaXQgaXMgd29ydGgga25vd2luZyB3aGV0aGVyIHRoZSBKUyByZWFkZXJzIGJyb2tlIHRoZSBzYW1lIHdheSwKICAjIGFuZCB0aGUgYXJ0aWZhY3QgaXMgdXBsb2FkZWQgYmVmb3JlIHRoYXQgam9iJ3MgcmVhZCBzdGVwIGZvciB0aGlzIHJlYXNvbi4KICAjIFdpdGhvdXQgaXQsIGBuZWVkc2Agd291bGQgc2tpcCB0aGlzIGpvYiBvbiB0aGUgcnVuIHdoZXJlIGl0IGhhcyB0aGUgbW9zdCB0bwogICMgc2F5LgogICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgd2lyZS1jb21wYXQtanM6CiAgICBuYW1lOiBXaXJlIGNvbXBhdCAocHVibGlzaGVkIHBnLXdhc20vcGctanMpCiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICBuZWVkczogd2lyZS1jb21wYXQtcnVzdAogICAgaWY6ICR7eyAhY2FuY2VsbGVkKCkgfX0KICAgIHBlcm1pc3Npb25zOgogICAgICBjb250ZW50czogcmVhZAogICAgc3RlcHM6CiAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2NAoKICAgICAgIyBFdmVyeSBzdGVwIGJlbG93IGlzIGJlaGluZCB0aGUgc2VhbCBvdXRjb21lLCBub3QganVzdCB0aGUgZG93bmxvYWQuCiAgICAgICMgYG91dGNvbWVgIGlzICdza2lwcGVkJyB3aGVuIHRoZSBwYXRoIGZpbHRlciBzYWlkIG5vIChub3RoaW5nIHRvIG9wZW4sCiAgICAgICMgcmVwb3J0IHN1Y2Nlc3MpIGFuZCAnZmFpbHVyZScgd2hlbiBzZWFsaW5nIGl0c2VsZiBicm9rZSAod2lyZS1jb21wYXQtcnVzdAogICAgICAjIG93bnMgdGhhdCBmYWlsdXJlOyBkbyBub3QgcmVwb3J0IGl0IHR3aWNlKS4KICAgICAgLSBpZjogbmVlZHMud2lyZS1jb21wYXQtcnVzdC5vdXRwdXRzLnNlYWxlZCA9PSAnc3VjY2VzcycKICAgICAgICB1c2VzOiBhY3Rpb25zL3NldHVwLW5vZGVAdjYKICAgICAgICB3aXRoOgogICAgICAgICAgbm9kZS12ZXJzaW9uOiAnMjQnCiAgICAgICAgICBjYWNoZTogbnBtCiAgICAgICAgICBjYWNoZS1kZXBlbmRlbmN5LXBhdGg6IHBnLWNvbXBhdC1qcy9wYWNrYWdlLWxvY2suanNvbgoKICAgICAgLSBuYW1lOiBEb3dubG9hZCB0aGUgc2FtcGxlIHNldAogICAgICAgIGlmOiBuZWVkcy53aXJlLWNvbXBhdC1ydXN0Lm91dHB1dHMuc2VhbGVkID09ICdzdWNjZXNzJwogICAgICAgIHVzZXM6IGFjdGlvbnMvZG93bmxvYWQtYXJ0aWZhY3RAdjQKICAgICAgICB3aXRoOgogICAgICAgICAgbmFtZTogd2lyZS1jb21wYXQtYXJ0aWZhY3RzLSR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIHx8IGdpdGh1Yi5zaGEgfX0KICAgICAgICAgIHBhdGg6ICR7eyBydW5uZXIudGVtcCB9fS93aXJlLWNvbXBhdC1hcnRpZmFjdHMKCiAgICAgICMgY2ksIG5vdCBpbnN0YWxsOiB0aGUgcmVhZGVycyBhcmUgcGlubmVkIGJ5IHBnLWNvbXBhdC1qcy9wYWNrYWdlLWxvY2suanNvbiwKICAgICAgIyBhbmQgYSBnYXRlIHRoYXQgcXVpZXRseSByZXNvbHZlZCBhIGRpZmZlcmVudCByZWFkZXIgd291bGQgYmUgbWVhc3VyaW5nCiAgICAgICMgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHN1cHBvcnQgd2luZG93LgogICAgICAtIG5hbWU6IEluc3RhbGwgdGhlIHB1Ymxpc2hlZCByZWFkZXJzCiAgICAgICAgaWY6IG5lZWRzLndpcmUtY29tcGF0LXJ1c3Qub3V0cHV0cy5zZWFsZWQgPT0gJ3N1Y2Nlc3MnCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICB3b3JraW5nLWRpcmVjdG9yeTogcGctY29tcGF0LWpzCiAgICAgICAgcnVuOiBucG0gY2kKCiAgICAgIC0gbmFtZTogT3BlbiB0aGUgc2V0IHdpdGggcHVibGlzaGVkIHBnLXdhc20vcGctanMKICAgICAgICBpZjogbmVlZHMud2lyZS1jb21wYXQtcnVzdC5vdXRwdXRzLnNlYWxlZCA9PSAnc3VjY2VzcycKICAgICAgICBzaGVsbDogYmFzaAogICAgICAgIHdvcmtpbmctZGlyZWN0b3J5OiBwZy1jb21wYXQtanMKICAgICAgICBlbnY6CiAgICAgICAgICBQR19DT01QQVRfQVJUSUZBQ1RTOiAke3sgcnVubmVyLnRlbXAgfX0vd2lyZS1jb21wYXQtYXJ0aWZhY3RzCiAgICAgICAgcnVuOiBucG0gdGVzdAoKICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICMgU2luZ2xlIHJlcXVpcmVkIGNoZWNrIGNvbnNvbGlkYXRpbmcgdGhlIHR3byBoYWx2ZXMgYWJvdmUgKCMyNjIpLiBUaGUKICAjIHJlcG9pbnQgaGFwcGVuZWQgaW4gIzI5NjogIldpcmUgY29tcGF0IiBpcyB0aGUgb25lIHJlcXVpcmVkIGNvbnRleHQsIGFuZCB0aGUKICAjIHR3byBwZXItbGFuZ3VhZ2UgbmFtZXMgYXJlIG5vIGxvbmdlciByZXF1aXJlZCBpbmRpdmlkdWFsbHkuIFNpbmNlICMyOTkgaXQgaXMKICAjIGFsc28gdGhlIHNvbGUgY29udGV4dCBvZiB0aGUgYG1haW46IHJlcXVpcmVkIGNoZWNrc2AgcnVsZXNldCwgd2hvc2UKICAjIGBieXBhc3NfYWN0b3JzYCBpcyBlbXB0eSAtLSBzbyB1bmxpa2UgY2xhc3NpYyBwcm90ZWN0aW9uIChgZW5mb3JjZV9hZG1pbnNgCiAgIyBpcyBzdGlsbCBmYWxzZSkgdGhpcyBuYW1lIGNhbm5vdCBiZSBtZXJnZWQgcGFzdCB3aXRoIGAtLWFkbWluYC4gUmVuYW1pbmcKICAjIHRoaXMgam9iIHNpbGVudGx5IGRpc2FybXMgdGhhdCBydWxlc2V0OyByZW5hbWUgdGhlIHJ1bGVzZXQncyBjb250ZXh0IGluIHRoZQogICMgc2FtZSBjaGFuZ2UuCiAgIwogICMgYGlmOiAhY2FuY2VsbGVkKClgIGZvciB0aGUgc2FtZSByZWFzb24gYXMgd2lyZS1jb21wYXQtanMgYWJvdmU6IHRoaXMgam9iCiAgIyBtdXN0IHN0aWxsIHJ1biBhbmQgcmVwb3J0IHdoZW4gYW4gdXBzdHJlYW0gaGFsZiBmYWlsZWQsIG9yIHRoZSByZXF1aXJlZAogICMgY2hlY2sgc2l0cyBwZW5kaW5nIGZvcmV2ZXIgaW5zdGVhZCBvZiB0dXJuaW5nIHJlZC4KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHdpcmUtY29tcGF0OgogICAgbmFtZTogV2lyZSBjb21wYXQKICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIG5lZWRzOiBbd2lyZS1jb21wYXQtcnVzdCwgd2lyZS1jb21wYXQtanNdCiAgICBpZjogJHt7ICFjYW5jZWxsZWQoKSB9fQogICAgcGVybWlzc2lvbnM6CiAgICAgIGNvbnRlbnRzOiByZWFkCiAgICBzdGVwczoKICAgICAgLSBuYW1lOiBSZXF1aXJlIGJvdGggaGFsdmVzIHRvIGhhdmUgcGFzc2VkCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBydW46IHwKICAgICAgICAgIGVjaG8gIndpcmUtY29tcGF0LXJ1c3Q6ICR7eyBuZWVkcy53aXJlLWNvbXBhdC1ydXN0LnJlc3VsdCB9fSIKICAgICAgICAgIGVjaG8gIndpcmUtY29tcGF0LWpzOiAke3sgbmVlZHMud2lyZS1jb21wYXQtanMucmVzdWx0IH19IgogICAgICAgICAgaWYgW1sgIiR7eyBuZWVkcy53aXJlLWNvbXBhdC1ydXN0LnJlc3VsdCB9fSIgIT0gInN1Y2Nlc3MiIHx8ICIke3sgbmVlZHMud2lyZS1jb21wYXQtanMucmVzdWx0IH19IiAhPSAic3VjY2VzcyIgXV07IHRoZW4KICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgICBmaQoKICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICMgVGhlIHJlZ2lzdHJ5IGhhbGYgb2YgdGhlIHdpcmluZyBndWFyZHMgKCMzMTgpLgogICMKICAjIGBwZy1jb3JlL3Rlc3RzL2NpX3dpcmluZy5yc2AgYXNzZXJ0cyB0aGF0IHRoZSBqb2IgYWJvdmUgaXMgc3RpbGwgKm5hbWVkKgogICMgYFdpcmUgY29tcGF0YC4gVGhpcyBhc3NlcnRzIHRoZSBvdGhlciBlbmQgb2YgdGhhdCBsaW5rOiB0aGF0IHRoZSBgbWFpbmAKICAjIHJ1bGVzZXQgc3RpbGwgKnJlcXVpcmVzKiB0aGF0IGNvbnRleHQuIE5laXRoZXIgZW5kIGlzIHN1ZmZpY2llbnQuIEEgY29udGV4dAogICMgcmVxdWlyZWQgYnV0IG5vdCBwcm9kdWNlZCBibG9ja3Mgbm90aGluZyAoIzI5OSBtZWFzdXJlZCB0aGF0IGFuIGFic2VudCBjaGVjawogICMgaXMgYXMgZGFuZ2Vyb3VzIGFzIGEgcmVkIG9uZSk7IGEgY29udGV4dCBwcm9kdWNlZCBidXQgbm90IHJlcXVpcmVkIGVuZm9yY2VzCiAgIyBub3RoaW5nIHdoaWxlIGV2ZXJ5IHRlc3Qgc3RheXMgZ3JlZW4uCiAgIwogICMgQm90aCAjMjcyIGFuZCBwb3N0Z3VhcmQtanMjMjIyIGRlY2xhcmVkIHRoaXMgZW5kIHVucmVhY2hhYmxlIGZyb20gQ0ksIG9uIHRoZQogICMgYXNzdW1wdGlvbiBpdCBuZWVkcyBhbiBhZG1pbiBjcmVkZW50aWFsLiBNZWFzdXJlZCBpbiAjMzE4OiBpdCBkb2VzIG5vdC4gT24gYQogICMgcHVibGljIHJlcG8gdGhlIGVmZmVjdGl2ZS1ydWxlcyBlbmRwb2ludCBhbnN3ZXJzIDIwMCB0byB0aGUgYnVpbHQtaW4gdG9rZW4KICAjIGF0IGFueSBwZXJtaXNzaW9uIGxldmVsLCBzbyBgY29udGVudHM6IHJlYWRgIGJlbG93IGlzIGFscmVhZHkgbW9yZSB0aGFuIHRoaXMKICAjIG5lZWRzLCBhbmQgbm8gc2VjcmV0IGlzIGludm9sdmVkLgogICMKICAjIERlbGliZXJhdGVseSBOT1QgcGFydCBvZiB0aGUgYFdpcmUgY29tcGF0YCBhZ2dyZWdhdG9yIGFuZCBkZWxpYmVyYXRlbHkgbm90IGEKICAjIHJlcXVpcmVkIGNvbnRleHQ6IHRoaXMgcmVhZHMgYSBsaXZlIHRoaXJkLXBhcnR5IEFQSSwgYW5kIGEgR2l0SHViIEFQSSBvdXRhZ2UKICAjIG11c3Qgbm90IGJlY29tZSBhbiB1bm1lcmdlYWJsZSByZXBvLiBFeGl0IDIgKHVuZGV0ZXJtaW5lZCkgaXMgdGhlcmVmb3JlIGEKICAjIGRpc3RpbmN0IG91dGNvbWUgZnJvbSBleGl0IDEgKGRyaWZ0KSAtLSBzZWUgc2NyaXB0cy9ydWxlc2V0LWRyaWZ0LnNoLgogICMKICAjIEFuZCBkZWxpYmVyYXRlbHkgbm8gYHNjaGVkdWxlOmAuIEEgbmlnaHRseSB3b3VsZCBkZXRlY3QgZHJpZnQgZHVyaW5nIHF1aWV0CiAgIyBwZXJpb2RzLCBidXQgYSBkaXNhcm1lZCBnYXRlIGNhbiBvbmx5IGRvIGhhcm0gd2hlbiBzb21ldGhpbmcgbWVyZ2VzLCBhbmQKICAjIGV2ZXJ5IG1lcmdlIGhlcmUgcGFzc2VzIHRocm91Z2ggYSBgcHVsbF9yZXF1ZXN0YCBhbmQgYSBgcHVzaGAgcnVuIG9mIHRoaXMKICAjIHdvcmtmbG93LiBSdW5uaW5nIGF0IGV4YWN0bHkgdGhlIG1vbWVudCB0aGUgZ2F0ZSBpcyByZWxpZWQgdXBvbiBhbHNvIG1ha2VzCiAgIyB0aGUgcmVzdWx0IHVubWlzc2FibGUsIHdoaWNoIGEgc2NoZWR1bGVkIHJ1biBpcyBub3QgLS0gdGhlIHRpY2tldCdzIG93bgogICMgd2FybmluZyB3YXMgdGhhdCBhIGRyaWZ0IGRldGVjdG9yIG5vYm9keSByZWFkcyBpcyBpdHNlbGYgYSBzaWxlbnQgZ2F0ZS4KICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJ1bGVzZXQtZHJpZnQ6CiAgICBuYW1lOiBSdWxlc2V0IHN0aWxsIHJlcXVpcmVzIHRoZSBnYXRlCiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICBwZXJtaXNzaW9uczoKICAgICAgY29udGVudHM6IHJlYWQKICAgIHN0ZXBzOgogICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgICB3aXRoOgogICAgICAgICAgIyBUaGUgY2hhbmdlbG9nLWNvdmVyYWdlIGNoZWNrZXIncyBzZWxmLXRlc3QgYmVsb3cgKCM0MTIpIHJ1bnMKICAgICAgICAgICMgYWdhaW5zdCBmaXh0dXJlcyB0aGF0IGFyZSByZWFsIHRhZ3MgaW4gdGhpcyByZXBvJ3MgaGlzdG9yeSwgc28gdGhlCiAgICAgICAgICAjIGpvYiBuZWVkcyBmdWxsIGhpc3RvcnkgYW5kIHRhZ3MgLS0gdGhlIGRlZmF1bHQgc2hhbGxvdyBjaGVja291dAogICAgICAgICAgIyBtYWtlcyB0aGUgY292ZXJhZ2Ugc2NyaXB0IHJlcG9ydCBleGl0IDIgKHVuZGV0ZXJtaW5lZCkgb24gZXZlcnkKICAgICAgICAgICMgb25lIG9mIHRoZW0gaW5zdGVhZCBvZiBleGVyY2lzaW5nIHRoZSBjYXNlLgogICAgICAgICAgZmV0Y2gtZGVwdGg6IDAKCiAgICAgIC0gbmFtZTogQ29tcGFyZSB0aGUgbGl2ZSBydWxlc2V0IGFnYWluc3QgdGhlIGd1YXJkJ3MgY29uc3RhbnQKICAgICAgICBzaGVsbDogYmFzaAogICAgICAgIGVudjoKICAgICAgICAgICMgTm90IHJlcXVpcmVkIGZvciB0aGUgcmVhZCAtLSB1bmF1dGhlbnRpY2F0ZWQgd29ya3Mgb24gYSBwdWJsaWMgcmVwby4KICAgICAgICAgICMgSXQgaXMgcGFzc2VkIGJlY2F1c2UgdGhlIHJ1bm5lcidzIGFub255bW91cyBidWRnZXQgaXMgNjAvaG91ciBwZXIKICAgICAgICAgICMgc2hhcmVkIElQLCBhbmQgZXhoYXVzdGluZyBpdCB3b3VsZCBzaG93IHVwIGFzIGV4aXQgMiBub2lzZS4KICAgICAgICAgIEdIX1RPS0VOOiAke3sgZ2l0aHViLnRva2VuIH19CiAgICAgICAgcnVuOiBzY3JpcHRzL3J1bGVzZXQtZHJpZnQuc2gKCiAgICAgIC0gbmFtZTogRXhpdCBjb2RlcyBzdGlsbCBtZWFuIHdoYXQgdGhlIGdhdGUgcmVwb3J0cwogICAgICAgIHNoZWxsOiBiYXNoCiAgICAgICAgcnVuOiBzY3JpcHRzL3J1bGVzZXQtZHJpZnQtdGVzdC5zaAoKICAgICAgLSBuYW1lOiBUZXN0IHRoZSBjaGFuZ2Vsb2ctY292ZXJhZ2UgY2hlY2tlcgogICAgICAgIHNoZWxsOiBiYXNoCiAgICAgICAgcnVuOiBzY3JpcHRzL2NoYW5nZWxvZy1jb3ZlcmFnZS10ZXN0LnNoCgogICAgICAtIG5hbWU6IFRlc3QgdGhlIHdhc20tcGFja2FnZSBjaGVja2VyCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBydW46IHNjcmlwdHMvd2FzbS1wYWNrYWdlLWNoZWNrLXRlc3Quc2gKCiAgICAgIC0gbmFtZTogVGVzdCB0aGUgY2hhbmdlbG9nLWNvdmVyYWdlIHJlcG9ydGVyCiAgICAgICAgc2hlbGw6IGJhc2gKICAgICAgICBydW46IHNjcmlwdHMvY2hhbmdlbG9nLWNvdmVyYWdlLXJlcG9ydC10ZXN0LnNoCg==

`dobby-coder` has no `workflows: write`, so #440 landed the four
`ci_wiring.rs` assertions deliberately RED and posted this build.yml
patch for a maintainer. Applied verbatim from that comment, which is
itself verbatim from #432's section 1.

Three substantive changes to `test-wasm-browsers`: a job-level
`timeout-minutes: 12` (~2x the slowest observed success, against a
20-minute budget that was ~48x the suite's 24.68s runtime),
`WASM_BINDGEN_TEST_TIMEOUT` 120 -> 30, and `nick-fields/retry` replaced
by a bare `run:`. The wrapper was configured backwards -- `retry_on:
error` re-rolled genuine non-zero exits while never engaging for a
timeout, the only shape this job has ever hit. Dropping it also deletes
the literal backslash in `--\${{ matrix.browser }}`, which survived into
the resolved command and worked only because the action handed it to a
shell that stripped it.

The matrix, `runs-on`, checkout, `cargo install wasm-pack` and the
firefox apt step are unchanged; all three browsers stay, safari included.

With this applied, `--test ci_wiring` is 16/16 locally, including
`the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper` and
#429's `no_workflow_step_captures_dollar_question_mark`.
@rubenhensen

Copy link
Copy Markdown
Contributor

Workflow half applied — .github/workflows/build.yml, commit 8b81b1c, taken verbatim from the posted patch (which is itself verbatim from #432 section 1). All 41 checks pass, Test workspace (pg-core) included, so the_wasm_browser_job_has_an_honest_timeout_and_no_retry_wrapper is green and so is #429's no_workflow_step_captures_dollar_question_mark.

The new budget is confirmed honest by this run rather than by argument. All three legs passed well inside timeout-minutes: 12: safari 3m21s, firefox 4m9s, chrome 2m51s. That is against a 20-minute budget which #416 measured at ~48x the suite's 24.68s runtime, and it leaves the slowest leg at about a third of the new ceiling.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

wasm browser job: an honest timeout, no retry wrapper, and ci_wiring pins so the patch cannot be unapplied

1 participant