diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..0c07aebe82df --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,90 @@ +## +## %CopyrightBegin% +## +## Copyright Ericsson AB 2024. All Rights Reserved. +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## +## %CopyrightEnd% +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "master" + schedule: + interval: "weekly" + labels: + - "team:VM" + assignees: + - "garazdawi" + - "kikofernandez" + open-pull-requests-limit: 10 + groups: + github-actions: + patterns: ['*'] + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "maint" + schedule: + interval: "weekly" + labels: + - "team:VM" + assignees: + - "garazdawi" + - "kikofernandez" + open-pull-requests-limit: 10 + groups: + github-actions: + patterns: ['*'] + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "maint-27" + schedule: + interval: "weekly" + labels: + - "team:VM" + assignees: + - "garazdawi" + - "kikofernandez" + open-pull-requests-limit: 10 + groups: + github-actions: + patterns: ['*'] + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "maint-26" + schedule: + interval: "weekly" + labels: + - "team:VM" + assignees: + - "garazdawi" + - "kikofernandez" + open-pull-requests-limit: 10 + groups: + github-actions: + patterns: ['*'] + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "maint-25" + schedule: + interval: "weekly" + labels: + - "team:VM" + assignees: + - "garazdawi" + - "kikofernandez" + open-pull-requests-limit: 10 + groups: + github-actions: + patterns: ['*'] \ No newline at end of file diff --git a/.github/dockerfiles/Dockerfile.64-bit b/.github/dockerfiles/Dockerfile.64-bit index 07054bc81165..4c0d15b05410 100644 --- a/.github/dockerfiles/Dockerfile.64-bit +++ b/.github/dockerfiles/Dockerfile.64-bit @@ -13,11 +13,30 @@ RUN cd /buildroot && tar -xzf ./otp.tar.gz WORKDIR /buildroot/otp/ ENV CFLAGS="-O2 -g -Werror -DwxSTC_DISABLE_MACRO_DEPRECATIONS=1" +ENV CFLAGS="${CFLAGS} -Wall -Wformat -Wformat=2 -Wno-conversion -Wimplicit-fallthrough \ + -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS \ + -fstack-clash-protection -fstack-protector-strong -Wtrampolines \ + -fcf-protection=full -fexceptions -fno-strict-overflow -fno-delete-null-pointer-checks \ + -D_GLIBCXX_ASSERTIONS" +## OpenSSF recommended CFLAGS, skipped are: +## -Wconversion -Wextra -Wsign-conversion - As we have way too many of these warnings +## -fstrict-flex-arrays=3 -Wbidi-chars=any - As gcc 11 does not support it +## -mbranch-protection=standard - Only on arm +## -Werror=implicit -Wincompatible-pointer-types -Wint-conversion - As these do not work on c++ code +ENV SKIPPED_OSSF_CFLAGS="-Wconversion -mbranch-protection=standard \ + -Wextra -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion \ + -Wsign-conversion" +ENV LDFLAGS="-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -Wl,--no-copy-dt-needed-entries" +## OpenSSF recommended LDFLAGS, skipped are: +## -Wl,-z,nodlopen - as opening drivers/nifs needs this +## -fPIE - not needed with gcc 11 +## -fPIC -shared - only needed for .so files +ENV SKIPPED_OSSF_LDFLAGS="-Wl,-z,nodlopen -fPIE -fPIC -shared" ## Configure (if not cached), check that no application are disabled and then make RUN if [ ! -f Makefile ]; then \ touch README.md && \ - ./configure --prefix="/Erlang ∅⊤℞" && \ + ./configure --prefix="/Erlang ∅⊤℞" --enable-pie && \ if cat lib/*/CONF_INFO || cat lib/*/SKIP || cat lib/SKIP-APPLICATIONS; then exit 1; fi && \ find . -type f -newer README.md | xargs tar --transform 's:^./:otp/:' -cf ../otp_cache.tar; \ fi && \ @@ -26,6 +45,7 @@ RUN if [ ! -f Makefile ]; then \ ## Disable -Werror as testcases do not compile with it on ENV CFLAGS="-O2 -g" +ENV LDFLAGS="" ## Update init.sh with correct env vars RUN echo "export MAKEFLAGS=$MAKEFLAGS" > /buildroot/env.sh && \ diff --git a/.github/dockerfiles/Dockerfile.ubuntu-base b/.github/dockerfiles/Dockerfile.ubuntu-base index 3190faea4812..9fc28e8add4a 100644 --- a/.github/dockerfiles/Dockerfile.ubuntu-base +++ b/.github/dockerfiles/Dockerfile.ubuntu-base @@ -31,10 +31,13 @@ ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 ## Install build tools RUN apt-get update && apt-get -y upgrade && \ - apt-get install -y build-essential m4 autoconf \ - default-jdk flex pkg-config locales tzdata sudo ${INSTALL_LIBS} && \ + apt-get install -y build-essential m4 autoconf clang-format \ + flex pkg-config locales tzdata sudo ${INSTALL_LIBS} && \ sed -i 's@# en_US.UTF-8@en_US.UTF-8@g' /etc/locale.gen && locale-gen && \ - update-alternatives --set wx-config /usr/lib/x86_64-linux-gnu/wx/config/gtk3-unicode-3.0 + update-alternatives --set wx-config /usr/lib/x86_64-linux-gnu/wx/config/gtk3-unicode-3.0 && \ + apt-get install -y openjdk-8-jdk-headless && apt-get install -y openjdk-11-jdk-headless && \ + (update-java-alternatives -s java-1.8.0-openjdk-amd64 || true) && \ + java -version 2>&1 | grep 'version "1[.]8' > /dev/null || exit 1 ARG MAKEFLAGS=-j4 ENV MAKEFLAGS=$MAKEFLAGS \ diff --git a/.github/scripts/create-artifacts.sh b/.github/scripts/create-artifacts.sh index 85013fef2057..58797ae8bd2e 100755 --- a/.github/scripts/create-artifacts.sh +++ b/.github/scripts/create-artifacts.sh @@ -26,5 +26,7 @@ mkdir ${DIR} tar -xzf otp_src.tar.gz mv otp otp_src_${VSN} tar -czf ${DIR}/otp_src_${VSN}.tar.gz otp_src_${VSN} -mv otp_doc_man.tar.gz ${DIR}/otp_doc_man_${VSN}.tar.gz +if [ -f otp_doc_man.tar.gz ]; then + mv otp_doc_man.tar.gz ${DIR}/otp_doc_man_${VSN}.tar.gz +fi mv otp_doc_html.tar.gz ${DIR}/otp_doc_html_${VSN}.tar.gz diff --git a/.github/scripts/ossf-sarif-generator.es b/.github/scripts/ossf-sarif-generator.es new file mode 100755 index 000000000000..1c352e73f0f7 --- /dev/null +++ b/.github/scripts/ossf-sarif-generator.es @@ -0,0 +1,106 @@ +#!/usr/bin/env escript + +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% + +%% This script takes a json string as argument and checks that all the compiler flags defined by the OSSF +%% are used. + +main([CompilerFlagsJson]) -> + io:format(standard_error,"~p",[os:env()]), + CFLAGS = proplists:get_value(cflags, erlang:system_info(compile_info)) ++ " " ++ os:getenv("SKIPPED_OSSF_CFLAGS"), + LDFLAGS = proplists:get_value(ldflags, erlang:system_info(compile_info)) ++ " " ++ os:getenv("SKIPPED_OSSF_LDFLAGS"), + {gnuc, {Vsn, _, _} } = erlang:system_info(c_compiler_used), + #{ ~"options" := #{ ~"recommended" := Opts } } = json:decode(unicode:characters_to_binary(CompilerFlagsJson)), + io:format(standard_error, ~s'CFLAGS="~ts"~nLDFLAGS="~ts"~n',[CFLAGS, LDFLAGS]), + Missing = [Opt || Opt <- Opts, check_option(Opt, string:split(CFLAGS, " ", all), string:split(LDFLAGS, " ", all), Vsn)], + io:format("~ts~n",[sarif(Missing)]), + ok. +check_option(#{ ~"requires" := #{ ~"gcc" := GccVsn }, ~"opt" := Opt }, CFLAGS, _LDFLAGS, CurrentGccVsn) -> + io:format(standard_error, "Looking for ~ts...",[Opt]), + case binary_to_integer(hd(string:split(GccVsn, "."))) > CurrentGccVsn of + true -> io:format(standard_error, "skipped!~n",[]), false; + false -> + check_for_flags(Opt, CFLAGS) + end; +check_option(#{ ~"requires" := #{ ~"binutils" := _ }, ~"opt" := Opt }, _CFLAGS, LDFLAGS, _CurrentGccVsn) -> + io:format(standard_error, "Looking for ~ts...",[Opt]), + check_for_flags(Opt, LDFLAGS); +check_option(#{ ~"requires" := #{ ~"libstdc++" := _ }, ~"opt" := Opt }, _CFLAGS, LDFLAGS, _CurrentGccVsn) -> + io:format(standard_error, "Looking for ~ts...",[Opt]), + check_for_flags(Opt, LDFLAGS); +check_option(#{ ~"requires" := Tool, ~"opt" := Opt }, _CFLAGS, _LDFLAGS, _CurrentGccVsn) -> + io:format(standard_error, "~ts not implemented yet using ~p!~n",[Opt, Tool]), + true. + +check_for_flags(Flag, Flags) -> + case lists:any(fun(O) -> lists:search(fun(A) -> string:equal(string:trim(O), string:trim(A)) end, Flags) =:= false end, string:split(Flag, " ", all) ) of + true -> io:format(standard_error, "missing!~n",[]), true; + false -> io:format(standard_error, "found!~n",[]), false + end. + +sarif(Missing) -> + Zip = lists:zip(lists:seq(1,length(Missing)), Missing), + json:encode( + #{ ~"version" => ~"2.1.0", + ~"$schema" => ~"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json", + ~"runs" => + [ #{ + ~"tool" => + #{ ~"driver" => + #{ ~"informationUri" => ~"https://github.com/erlang/otp/.github/workflow/ossf-scanner", + ~"name" => ~"ossf-scanner", + ~"rules" => + [ #{ ~"id" => base64:encode(erlang:md5(Opt)), + ~"name" => ~"MissingCompilerFlag", + ~"shortDescription" => + #{ ~"text" => <<"Missing CFLAGS ", Opt/binary>> }, + ~"helpUri" => ~"https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++", + ~"fullDescription" => + #{ + ~"text" => <> + } + } + || {_Id, #{ ~"desc" := Desc, ~"opt" := Opt }} <- Zip], + ~"version" => ~"1.0" + } + }, + ~"artifacts" => + [ #{ + ~"location" => #{ + ~"uri" => ~".github/docker/Dockerfile.64-bit" + }, + ~"length" => -1 + } + ], + ~"results" => + [ #{ + ~"ruleId" => base64:encode(erlang:md5(Opt)), + ~"ruleIndex" => Id, + ~"level" => ~"warning", + ~"message" => #{ ~"text" => <<"Missing CFLAGS ", Opt/binary>> }, + ~"locations" => + [ #{ ~"physicalLocation" => + #{ ~"artifactLocation" => + #{ ~"uri" => ~".github/docker/Dockerfile.64-bit" } + } + } ] + } || {Id, #{ ~"opt" := Opt }} <- Zip] + } ] + }). \ No newline at end of file diff --git a/.github/scripts/release-docs.sh b/.github/scripts/release-docs.sh index c28bc89ab02b..bd8c0c47b37b 100755 --- a/.github/scripts/release-docs.sh +++ b/.github/scripts/release-docs.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash ## %CopyrightBegin% ## @@ -18,9 +18,25 @@ ## ## %CopyrightEnd% -docker run -v $PWD/:/github otp "make release docs release_docs && make release_docs DOC_TARGETS='man html' RELEASE_ROOT=/github/docs" -sudo chown -R `whoami` docs +release=${1} +vsn=${2} +if [[ ${release} < 27 ]]; then + docker run -v $PWD/:/github otp "make release docs release_docs && make release_docs DOC_TARGETS='man html pdf' RELEASE_ROOT=/github/docs" +else + case "${vsn}" in + "27.0**") + DOC_TARGETS=html + ;; + *) + DOC_TARGETS="html man" + ;; + esac + docker run -v $PWD/:/github otp "./otp_build download_ex_doc && make release docs release_docs && make release_docs DOC_TARGETS='${DOC_TARGETS}' RELEASE_ROOT=/github/docs" +fi +sudo chown -R "$(whoami)" docs cd docs -tar czf ../otp_doc_man.tar.gz man -rm -rf man +if test -x man; then + tar czf ../otp_doc_man.tar.gz man + rm -rf man +fi tar czf ../otp_doc_html.tar.gz * diff --git a/.github/scripts/sync-github-releases.sh b/.github/scripts/sync-github-releases.sh index 48df370b2216..2212ef4c91dc 100755 --- a/.github/scripts/sync-github-releases.sh +++ b/.github/scripts/sync-github-releases.sh @@ -27,7 +27,7 @@ HDR=(-H "Authorization: ${TOKEN}") REPO="https://api.github.com/repos/${REPOSITORY}" _json_escape () { - printf '```\n%s\n```' "${1}" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))' + echo "${1}" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))' } _strip_name() { @@ -43,9 +43,16 @@ _curl_post() { -H "Accept: application/vnd.github.v3+json" "${@}" } +_curl_patch() { + curl -o /dev/null --silent --fail --show-error -X PATCH "${HDR[@]}" \ + -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ + "${@}" +} + RI=() ALL_TAGS=() CREATE_RELEASE=() +UPDATE_BODY=() TAG_URL="${REPO}/tags?per_page=100" ## This function is used to loop over the pagianated results from github tags @@ -72,6 +79,7 @@ while [ "${TAG_URL}" != "" ]; do } name=$(_row '.name') stripped_name=$(_strip_name ${name}) + RELEASE_VSN=$(echo "${stripped_name}" | awk -F. '{print $1}') if echo ${stripped_name} | grep -E "${RELEASE_FILTER}" > /dev/null; then RELEASE=$(_curl_get "${REPO}/releases/tags/${name}") @@ -94,10 +102,34 @@ while [ "${TAG_URL}" != "" ]; do RI=("${remotename[@]}" "${RI[@]}") fi } + + ## Check if we need to patch the body of the release + if ! echo "${RELEASE}" | jq -e 'select(.body != "")' > /dev/null; then + RELEASE_ID=$(echo "${RELEASE}" | jq '.id') + UPDATE_BODY=("${UPDATE_BODY[@]}" "${name}:${RELEASE_ID}") + if [[ ${RELEASE_VSN} -gt 26 ]]; then + RM="${name}.README.md" + else + RM="${name}.README" + fi + echo "Sync ${RM} for ${name} (for update of release body, release id = ${RELEASE_ID})" + RI=("${RM}" "${RI[@]}") + fi + _asset "${name}.README" "${name}.README" "otp_src_${stripped_name}.readme" + if [[ ${RELEASE_VSN} -gt 26 ]]; then + _asset "${name}.README.md" + fi _asset "otp_src_${stripped_name}.tar.gz" _asset "otp_doc_html_${stripped_name}.tar.gz" - _asset "otp_doc_man_${stripped_name}.tar.gz" + case "${stripped_name}" in + 27.0**) + ## There are no man pages for 27.0 release + ;; + *) + _asset "otp_doc_man_${stripped_name}.tar.gz" + ;; + esac case "${stripped_name}" in 22.*.**|21.*.**) ## No need to check for windows releases in 21 and 22 patches @@ -105,6 +137,12 @@ while [ "${TAG_URL}" != "" ]; do *) _asset "otp_win32_${stripped_name}.exe" _asset "otp_win64_${stripped_name}.exe" + if echo "${RELEASE}" | jq -er ".assets[] | select(.name == \"otp_win32_${stripped_name}.exe\")" > /dev/null; then + _asset "otp_win32_${stripped_name}.zip" + fi + if echo "${RELEASE}" | jq -er ".assets[] | select(.name == \"otp_win64_${stripped_name}.exe\")" > /dev/null; then + _asset "otp_win64_${stripped_name}.zip" + fi ;; esac fi @@ -142,34 +180,53 @@ done for name in "${CREATE_RELEASE[@]}"; do echo "Create release for ${name}" stripped_name=$(_strip_name ${name}) - if [ -s "downloads/${name}.README" ]; then - README=`cat downloads/${name}.README` + if [ -s "downloads/${name}.README.md" ]; then + README=$(cat downloads/${name}.README.md) + README=$(_json_escape "${README}") + elif [ -s "downloads/${name}.README" ]; then + README=$(cat downloads/${name}.README) + if echo "${README}" | grep "HIGHLIGHTS" > /dev/null; then + ## We have highlights, so only use those as the body + + ## This awk script is a hack. + ## It counts the number of lines that start with '---' and + ## then outputs any text after the first '---' until the 7th. + README=$(echo "${README}" | awk 'BEGIN{ echo=0 } { if ( $1 ~ /^---/ ) { echo++ } if ( echo > 0 && echo < 7 ) { print $0 } }') + fi + README=$(_json_escape "$(printf '```\n%s\n```' "${README}")") else README="" fi - if echo "${README}" | grep "HIGHLIGHTS" > /dev/null; then - ## We have highlights, so only use those as the body - - ## This awk script is a hack. - ## It counts the number of lines that start with '---' and - ## then outputs any text after the first '---' until the 7th. - README=`echo "${README}" | awk 'BEGIN{ echo=0 } { if ( $1 ~ /^---/ ) { echo++ } if ( echo > 0 && echo < 7 ) { print $0 } }'` - fi if [ "${README}" != "" ]; then - RM=$(_json_escape "${README}") BODY=", \"body\":${RM}" else BODY="" fi - $(_curl_post "${REPO}/releases" -d '{"tag_name":"'"${name}"'", "name":"OTP '"${stripped_name}\"${BODY}}") + _curl_post "${REPO}/releases" -d '{"tag_name":"'"${name}"'", "name":"OTP '"${stripped_name}\"${BODY}}" done +for name_id in "${UPDATE_BODY[@]}"; do + name=$(echo "${name_id}" | awk -F: '{print $1}') + RELEASE_ID=$(echo "${name_id}" | awk -F: '{print $2}') + if [ -s downloads/"${name}.README.md" ]; then + README=$(cat downloads/"${name}.README.md") + README=$(_json_escape "${README}") + elif [ -s downloads/"${name}.README" ]; then + README=$(cat downloads/"${name}.README") + README=$(_json_escape "$(printf '```\n%s\n```' "${README}")") + fi + echo "Update body of ${name}" + _curl_patch "${REPO}/releases/${RELEASE_ID}" -d "{\"body\":${README}}" +done UPLOADED=false ## Array of all tags that do not have a pre-build MISSING_PREBUILD=() +## Array of zip files that have been triggered this sync +MISSING_WIN_ZIP=() + _upload_artifacts() { local name=${1}; local stripped_name="" @@ -187,18 +244,30 @@ _upload_artifacts() { "${UPLOAD_URL}?name=${1}" \ --data-binary "@downloads/${1}" else + ## See if we need to trigger any .exe to .zip convertions + if echo "${RI[@]}" | grep "otp_${2}_${stripped_name}.zip" > /dev/null; then + if [ ${#MISSING_WIN_ZIP[@]} -lt 20 ]; then + MISSING_WIN_ZIP=("${MISSING_WIN_ZIP[@]}" "${stripped_name}") + _curl_post "${REPO}/actions/workflows/upload-windows-zip.yaml/dispatches" \ + -d '{"ref":"master", "inputs":{"version":"'"${stripped_name}"'", "target":"'"${2}"'"}}' + fi + fi + ## See if we need to re-build any prebuilds if echo "${RI[@]}" | grep "${stripped_name}.tar.gz" > /dev/null; then MISSING_PREBUILD=("${MISSING_PREBUILD[@]}" "${name}") fi fi } _upload "${name}.README" "text" + _upload "${name}.README.md" "text" _upload "otp_src_${stripped_name}.tar.gz" "application/gzip" _upload "otp_doc_html_${stripped_name}.tar.gz" "application/gzip" _upload "otp_doc_man_${stripped_name}.tar.gz" "application/gzip" _upload "otp_win32_${stripped_name}.exe" "application/x-msdownload" _upload "otp_win64_${stripped_name}.exe" "application/x-msdownload" - } + _upload "otp_win32_${stripped_name}.zip" "win32" + _upload "otp_win64_${stripped_name}.zip" "win64" +} ## Upload all assets for tags for name in "${ALL_TAGS[@]}"; do @@ -215,7 +284,7 @@ if [ ${UPLOADED} = false ]; then for name in "${MISSING_PREBUILD[@]}"; do stripped_name=$(_strip_name "${name}") release=$(echo "${stripped_name}" | awk -F. '{print $1}') - if [[ $release < 24 ]]; then + if [[ $release -lt 24 ]]; then ## Releases before 24 are no longer supported and are a bit different ## from 24+ so I've removed support for them echo "Skipping old release ${name}" @@ -233,13 +302,13 @@ if [ ${UPLOADED} = false ]; then -f otp_src/.github/dockerfiles/Dockerfile.64-bit . docker run -v "$PWD":/github otp \ "/github/scripts/build-otp-tar -o /github/otp_clean_src.tar.gz /github/otp_src.tar.gz -b /buildroot/otp/ /buildroot/otp.tar.gz" - .github/scripts/release-docs.sh + .github/scripts/release-docs.sh "${release}" "${stripped_name}" .github/scripts/create-artifacts.sh downloads "${name}" ## Delete any artifacts that we should not upload for artifact in dowloads/*; do - if ! echo "${RI[@]}" | grep "${artifact}" 2> /dev/null > /dev/null; then - rm -f "downloads/${artifact}" + if ! echo "${RI[@]}" | grep "${artifact#downloads/}" 2> /dev/null > /dev/null; then + rm -f "${artifact}" fi done _upload_artifacts "${name}" diff --git a/.github/workflows/actions-updater.yaml b/.github/workflows/actions-updater.yaml deleted file mode 100644 index 5d1d7786b989..000000000000 --- a/.github/workflows/actions-updater.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: GitHub Actions Version Updater - -# Controls when the action will run. -on: - workflow_dispatch: - schedule: - # Automatically run on every Sunday - - cron: '0 0 * * 0' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Generate token - id: generate_token - uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # ratchet:actions/create-github-app-token@v1.11.0 - with: - app-id: ${{ secrets.APP_ID }} - private-key: ${{ secrets.APP_PEM }} - - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # ratchet:actions/checkout@v4.2.2 - with: - token: ${{ steps.generate_token.outputs.token }} - - - name: Run GitHub Actions Version Updater - uses: saadmk11/github-actions-version-updater@64be81ba69383f81f2be476703ea6570c4c8686e # ratchet:saadmk11/github-actions-version-updater@v0.8.1 - with: - token: ${{ steps.generate_token.outputs.token }} - pull_request_branch: "github/actions-update" - extra_workflow_locations: ".github/actions/build-base-image" diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 1f4c2eff6028..ef16183e825b 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -237,7 +237,7 @@ jobs: cd otp/release ./Install -sasl $PWD ./bin/erl -noshell -eval 'io:format("~s", [erlang:system_info(system_version)]), halt().' - ./bin/erl -noshell -eval 'ok = crypto:start(), io:format("crypto ok~n"), halt().' + ./bin/erl -noshell -eval 'ok = application:start(crypto), io:format("crypto ok~n"), halt().' ./bin/erl -noshell -eval '{wx_ref,_,_,_} = wx:new(), io:format("wx ok~n"), halt().' - name: Upload tarball @@ -443,10 +443,19 @@ jobs: FROM otp ENV BASE_URL=$BASE_URL RUN ./otp_build download_ex_doc + ## Need later jdk to create correct anchors in html docs + RUN sudo update-java-alternatives -s java-1.11.0-openjdk-amd64 RUN make release docs release_docs && sudo make install-docs EOF - name: Release docs to publish - run: .github/scripts/release-docs.sh + run: | + docker run -v $PWD/:/github otp \ + "make release_docs DOC_TARGETS='html man' RELEASE_ROOT=/github/docs" + sudo chown -R `whoami` docs + cd docs + tar czf ../otp_doc_man.tar.gz man + rm -rf man + tar czf ../otp_doc_html.tar.gz * - name: Upload html documentation archive uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # ratchet:actions/upload-artifact@v4.4.3 with: @@ -475,12 +484,6 @@ jobs: - uses: ./.github/actions/build-base-image with: BASE_BRANCH: ${{ env.BASE_BRANCH }} - - name: Install clang-format - run: | - docker build -t otp - < results.sarif + + - name: "Upload artifact" + if: ${{ !cancelled() }} + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 ratchet:actions/upload-artifact@v4 + with: + name: SARIF file + path: results.sarif + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + if: ${{ !cancelled() }} + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # ratchet:github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif + diff --git a/.github/workflows/upload-windows-zip.yaml b/.github/workflows/upload-windows-zip.yaml new file mode 100644 index 000000000000..f8a59569641b --- /dev/null +++ b/.github/workflows/upload-windows-zip.yaml @@ -0,0 +1,73 @@ +name: Upload windows .zip + +on: + workflow_dispatch: + inputs: + version: + required: true + target: + required: true + +permissions: + contents: read + +jobs: + upload-windows-zip: + runs-on: windows-2022 + ## Needed to upload assets to releases + permissions: + contents: write + env: + basename: otp_${{ inputs.target }}_${{ inputs.version }} + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # ratchet:actions/checkout@v4.2.2 + + - name: Install OTP + shell: cmd + run: | + curl.exe --fail -Lo otp.exe https://github.com/erlang/otp/releases/download/OTP-${{ inputs.version }}/${{ env.basename }}.exe + otp.exe /S /D=%CD%\${{ env.basename }} + + - name: Download vc_redist.exe + shell: bash + run: | + case "${{ inputs.target }}" in + win32) + vc_redist_target=x86 + ;; + win64) + vc_redist_target=x64 + ;; + *) + echo "invalid target $target" + exit 1 + ;; + esac + curl --fail -Lo vc_redist.exe "https://aka.ms/vs/17/release/vc_redist.$vc_redist_target.exe" + + - name: Create .zip + shell: pwsh + run: | + $root = Get-Location + + cd ${{ env.basename }} + rm bin\erl.ini + rm Install.exe + rm Install.ini + rm Uninstall.exe + $sha256 = Get-FileHash $root\otp.exe -Algorithm SHA256 + $sha256.Hash.ToLower() | Out-File -FilePath installer.sha256 + cp $root/vc_redist.exe . + cp $root/erts/etc/win32/INSTALL.txt . + Compress-Archive -Path * -DestinationPath $root\${{ env.basename }}.zip + + cd $root + Expand-Archive -Path ${{ env.basename }}.zip -DestinationPath .\otp_test + .\otp_test\bin\erl.exe +V + + - name: Upload + shell: pwsh + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release upload -R $env:GITHUB_REPOSITORY --clobber OTP-${{ inputs.version }} ${{ env.basename }}.zip diff --git a/.gitignore b/.gitignore index 04fda0a5bc6f..aa7b36b7be28 100644 --- a/.gitignore +++ b/.gitignore @@ -224,6 +224,7 @@ JAVADOC-GENERATED /lib/compiler/src/beam_opcodes.hrl /lib/compiler/src/core_parse.erl +/lib/compiler/test/*_no_bool_opt_SUITE.erl /lib/compiler/test/*_no_opt_SUITE.erl /lib/compiler/test/*_no_copt_SUITE.erl /lib/compiler/test/*_no_copt_ssa_SUITE.erl diff --git a/HOWTO/INSTALL-RASPBERRYPI3.md b/HOWTO/INSTALL-RASPBERRYPI3.md index 77fdc67f552c..1f4ac108bbf7 100644 --- a/HOWTO/INSTALL-RASPBERRYPI3.md +++ b/HOWTO/INSTALL-RASPBERRYPI3.md @@ -241,7 +241,7 @@ Uncheck option: $ cat > test.c $ int main() { printf("Hello, world!\n"); return 0; } - + $ armv8-rpi3-linux-gnueabihf-gcc -o test test.c diff --git a/Makefile.in b/Makefile.in index ec5988348c54..79c605a9c7e3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -976,7 +976,8 @@ bootstrap_clean: .PHONY: test dialyzer test: all release release_tests - $(ERL_TOP)/make/test_target_script.sh $(ERL_TOP) + MAKE="$(MAKE)" \ + $(ERL_TOP)/make/test_target_script.sh $(ERL_TOP) ifeq ($(TYPE),) dialyzer: all diff --git a/OTP_VERSION b/OTP_VERSION index c859fa17d6c9..831e5d302605 100644 --- a/OTP_VERSION +++ b/OTP_VERSION @@ -1 +1 @@ -27.1.2 +28.0-rc0 diff --git a/README.md b/README.md index 787fda443bd9..57ec78a0af55 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Erlang** is a programming language and runtime system for building massively scalable soft real-time systems with requirements on high availability. -**OTP** is a set of Erlang libraries, which consists of the Erlang runtime system, a number of ready-to-use components mainly written in Erlang, and a set of design principles for Erlang programs. [Learn more about Erlang and OTP](http://erlang.org/doc/system_architecture_intro/sys_arch_intro.html). +**OTP** is a set of Erlang libraries, which consists of the Erlang runtime system, a number of ready-to-use components mainly written in Erlang, and a set of design principles for Erlang programs. [Learn more about Erlang and OTP](https://www.erlang.org/doc/system/getting_started.html). [Learn how to program in Erlang](http://learnyousomeerlang.com/). @@ -54,7 +54,7 @@ cd otp Checkout the branch or tag of your choice ```sh -git checkout maint-26 # current latest stable version +git checkout maint-27 # current latest stable version ``` Configure, build and install diff --git a/bootstrap/bin/no_dot_erlang.boot b/bootstrap/bin/no_dot_erlang.boot index f97a79d08126..037cbbdc48b3 100644 Binary files a/bootstrap/bin/no_dot_erlang.boot and b/bootstrap/bin/no_dot_erlang.boot differ diff --git a/bootstrap/bin/start.boot b/bootstrap/bin/start.boot index f97a79d08126..037cbbdc48b3 100644 Binary files a/bootstrap/bin/start.boot and b/bootstrap/bin/start.boot differ diff --git a/bootstrap/bin/start_clean.boot b/bootstrap/bin/start_clean.boot index f97a79d08126..037cbbdc48b3 100644 Binary files a/bootstrap/bin/start_clean.boot and b/bootstrap/bin/start_clean.boot differ diff --git a/bootstrap/lib/compiler/ebin/beam_a.beam b/bootstrap/lib/compiler/ebin/beam_a.beam index e5a482df5c5c..c1c9a098a060 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_a.beam and b/bootstrap/lib/compiler/ebin/beam_a.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_asm.beam b/bootstrap/lib/compiler/ebin/beam_asm.beam index 0248a03d8cf0..ace358cbf203 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_asm.beam and b/bootstrap/lib/compiler/ebin/beam_asm.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_block.beam b/bootstrap/lib/compiler/ebin/beam_block.beam index 57c9ad75a049..547800e02bb3 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_block.beam and b/bootstrap/lib/compiler/ebin/beam_block.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_bounds.beam b/bootstrap/lib/compiler/ebin/beam_bounds.beam index cdf7000927e5..abca5b4ffc83 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_bounds.beam and b/bootstrap/lib/compiler/ebin/beam_bounds.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_call_types.beam b/bootstrap/lib/compiler/ebin/beam_call_types.beam index 9832a66afe1a..6bcc79ff63e9 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_call_types.beam and b/bootstrap/lib/compiler/ebin/beam_call_types.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_clean.beam b/bootstrap/lib/compiler/ebin/beam_clean.beam index da99b9a689fd..a16418bc585e 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_clean.beam and b/bootstrap/lib/compiler/ebin/beam_clean.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_core_to_ssa.beam b/bootstrap/lib/compiler/ebin/beam_core_to_ssa.beam index 93d0ab2fa8c5..73722b3f8ac5 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_core_to_ssa.beam and b/bootstrap/lib/compiler/ebin/beam_core_to_ssa.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_dict.beam b/bootstrap/lib/compiler/ebin/beam_dict.beam index f2c82cf9f6c9..9c29f0c902b2 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_dict.beam and b/bootstrap/lib/compiler/ebin/beam_dict.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_digraph.beam b/bootstrap/lib/compiler/ebin/beam_digraph.beam index eb431607c4a8..3007e123fcde 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_digraph.beam and b/bootstrap/lib/compiler/ebin/beam_digraph.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_disasm.beam b/bootstrap/lib/compiler/ebin/beam_disasm.beam index e805536527e6..7eabf02fe100 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_disasm.beam and b/bootstrap/lib/compiler/ebin/beam_disasm.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_doc.beam b/bootstrap/lib/compiler/ebin/beam_doc.beam index ad94221334d3..0cbcfbdae456 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_doc.beam and b/bootstrap/lib/compiler/ebin/beam_doc.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_flatten.beam b/bootstrap/lib/compiler/ebin/beam_flatten.beam index 98e89c7e75c7..b8b5fda803b3 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_flatten.beam and b/bootstrap/lib/compiler/ebin/beam_flatten.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_jump.beam b/bootstrap/lib/compiler/ebin/beam_jump.beam index 664d6ca79c30..ab442fc9536c 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_jump.beam and b/bootstrap/lib/compiler/ebin/beam_jump.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_listing.beam b/bootstrap/lib/compiler/ebin/beam_listing.beam index 75e3094fe118..05db88a62acd 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_listing.beam and b/bootstrap/lib/compiler/ebin/beam_listing.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_opcodes.beam b/bootstrap/lib/compiler/ebin/beam_opcodes.beam index 9d7f03b661cd..b3c8c3b5edba 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_opcodes.beam and b/bootstrap/lib/compiler/ebin/beam_opcodes.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa.beam b/bootstrap/lib/compiler/ebin/beam_ssa.beam index c2e06183b8fa..89031c6da130 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa.beam and b/bootstrap/lib/compiler/ebin/beam_ssa.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_alias.beam b/bootstrap/lib/compiler/ebin/beam_ssa_alias.beam index d4f76b217c29..254ae9d62fe6 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_alias.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_alias.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_bc_size.beam b/bootstrap/lib/compiler/ebin/beam_ssa_bc_size.beam index 565429fa44ca..472d92d9b57d 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_bc_size.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_bc_size.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_bool.beam b/bootstrap/lib/compiler/ebin/beam_ssa_bool.beam index d3b6de91a5fc..43e96663430f 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_bool.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_bool.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_bsm.beam b/bootstrap/lib/compiler/ebin/beam_ssa_bsm.beam index 4c84f11b94b9..8ad1172bd658 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_bsm.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_bsm.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_check.beam b/bootstrap/lib/compiler/ebin/beam_ssa_check.beam index 65d80ea29012..c0e47449c610 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_check.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_check.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_codegen.beam b/bootstrap/lib/compiler/ebin/beam_ssa_codegen.beam index 399074204820..8c3a0ec51bd6 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_codegen.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_codegen.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_dead.beam b/bootstrap/lib/compiler/ebin/beam_ssa_dead.beam index ef2496379607..cd27274ace6b 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_dead.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_dead.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_destructive_update.beam b/bootstrap/lib/compiler/ebin/beam_ssa_destructive_update.beam index e4bf22cbe163..4765697d0145 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_destructive_update.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_destructive_update.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_lint.beam b/bootstrap/lib/compiler/ebin/beam_ssa_lint.beam index 5432fecdd35a..decdce53d903 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_lint.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_lint.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_opt.beam b/bootstrap/lib/compiler/ebin/beam_ssa_opt.beam index cd04b7ad0d1a..a428abf1591e 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_opt.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_opt.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_pp.beam b/bootstrap/lib/compiler/ebin/beam_ssa_pp.beam index 606a921a9215..a6143229e98a 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_pp.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_pp.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_pre_codegen.beam b/bootstrap/lib/compiler/ebin/beam_ssa_pre_codegen.beam index 2821a2bd607c..f74a9aa743de 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_pre_codegen.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_pre_codegen.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_recv.beam b/bootstrap/lib/compiler/ebin/beam_ssa_recv.beam index d99f58152ead..cf9a1e033d7e 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_recv.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_recv.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_share.beam b/bootstrap/lib/compiler/ebin/beam_ssa_share.beam index cc379cead7bb..220b828019a6 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_share.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_share.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_ss.beam b/bootstrap/lib/compiler/ebin/beam_ssa_ss.beam index a5da4e61da8f..eff1378a60a0 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_ss.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_ss.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_throw.beam b/bootstrap/lib/compiler/ebin/beam_ssa_throw.beam index c9d46ebd83db..9e5369298de4 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_throw.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_throw.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_ssa_type.beam b/bootstrap/lib/compiler/ebin/beam_ssa_type.beam index 11e57ccbe2b6..3f174e0503e7 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_ssa_type.beam and b/bootstrap/lib/compiler/ebin/beam_ssa_type.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_trim.beam b/bootstrap/lib/compiler/ebin/beam_trim.beam index 256d7504ed4b..b9a327dd4886 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_trim.beam and b/bootstrap/lib/compiler/ebin/beam_trim.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_types.beam b/bootstrap/lib/compiler/ebin/beam_types.beam index 4e1dae1f7a75..c6f7016c62f2 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_types.beam and b/bootstrap/lib/compiler/ebin/beam_types.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_utils.beam b/bootstrap/lib/compiler/ebin/beam_utils.beam index c8a221309b62..05dfb99b7e54 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_utils.beam and b/bootstrap/lib/compiler/ebin/beam_utils.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_validator.beam b/bootstrap/lib/compiler/ebin/beam_validator.beam index b387777dbf70..eb01f92549e5 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_validator.beam and b/bootstrap/lib/compiler/ebin/beam_validator.beam differ diff --git a/bootstrap/lib/compiler/ebin/beam_z.beam b/bootstrap/lib/compiler/ebin/beam_z.beam index 58d8451384d4..a7020e1e5462 100644 Binary files a/bootstrap/lib/compiler/ebin/beam_z.beam and b/bootstrap/lib/compiler/ebin/beam_z.beam differ diff --git a/bootstrap/lib/compiler/ebin/cerl.beam b/bootstrap/lib/compiler/ebin/cerl.beam index 8621e53f29df..c109cc252229 100644 Binary files a/bootstrap/lib/compiler/ebin/cerl.beam and b/bootstrap/lib/compiler/ebin/cerl.beam differ diff --git a/bootstrap/lib/compiler/ebin/cerl_clauses.beam b/bootstrap/lib/compiler/ebin/cerl_clauses.beam index 4150d97dfa4f..6026ee42a373 100644 Binary files a/bootstrap/lib/compiler/ebin/cerl_clauses.beam and b/bootstrap/lib/compiler/ebin/cerl_clauses.beam differ diff --git a/bootstrap/lib/compiler/ebin/cerl_inline.beam b/bootstrap/lib/compiler/ebin/cerl_inline.beam index 652172e55024..c32763285e8f 100644 Binary files a/bootstrap/lib/compiler/ebin/cerl_inline.beam and b/bootstrap/lib/compiler/ebin/cerl_inline.beam differ diff --git a/bootstrap/lib/compiler/ebin/cerl_trees.beam b/bootstrap/lib/compiler/ebin/cerl_trees.beam index 5e62d78916bd..1f42f1670279 100644 Binary files a/bootstrap/lib/compiler/ebin/cerl_trees.beam and b/bootstrap/lib/compiler/ebin/cerl_trees.beam differ diff --git a/bootstrap/lib/compiler/ebin/compile.beam b/bootstrap/lib/compiler/ebin/compile.beam index 660252174ef9..9a2e8657b29c 100644 Binary files a/bootstrap/lib/compiler/ebin/compile.beam and b/bootstrap/lib/compiler/ebin/compile.beam differ diff --git a/bootstrap/lib/compiler/ebin/core_lib.beam b/bootstrap/lib/compiler/ebin/core_lib.beam index f13e58b07008..a71982cf686d 100644 Binary files a/bootstrap/lib/compiler/ebin/core_lib.beam and b/bootstrap/lib/compiler/ebin/core_lib.beam differ diff --git a/bootstrap/lib/compiler/ebin/core_lint.beam b/bootstrap/lib/compiler/ebin/core_lint.beam index 8221309fcacd..8991ebf6ef20 100644 Binary files a/bootstrap/lib/compiler/ebin/core_lint.beam and b/bootstrap/lib/compiler/ebin/core_lint.beam differ diff --git a/bootstrap/lib/compiler/ebin/core_parse.beam b/bootstrap/lib/compiler/ebin/core_parse.beam index 7e03c6718831..470d37595153 100644 Binary files a/bootstrap/lib/compiler/ebin/core_parse.beam and b/bootstrap/lib/compiler/ebin/core_parse.beam differ diff --git a/bootstrap/lib/compiler/ebin/core_pp.beam b/bootstrap/lib/compiler/ebin/core_pp.beam index cf00cfab75ef..95662403cf29 100644 Binary files a/bootstrap/lib/compiler/ebin/core_pp.beam and b/bootstrap/lib/compiler/ebin/core_pp.beam differ diff --git a/bootstrap/lib/compiler/ebin/core_scan.beam b/bootstrap/lib/compiler/ebin/core_scan.beam index a3987036d4ab..e00c06380358 100644 Binary files a/bootstrap/lib/compiler/ebin/core_scan.beam and b/bootstrap/lib/compiler/ebin/core_scan.beam differ diff --git a/bootstrap/lib/compiler/ebin/erl_bifs.beam b/bootstrap/lib/compiler/ebin/erl_bifs.beam index 16ea5d53a65c..f967258a4d9b 100644 Binary files a/bootstrap/lib/compiler/ebin/erl_bifs.beam and b/bootstrap/lib/compiler/ebin/erl_bifs.beam differ diff --git a/bootstrap/lib/compiler/ebin/rec_env.beam b/bootstrap/lib/compiler/ebin/rec_env.beam index 00eade123130..6e1a437376ef 100644 Binary files a/bootstrap/lib/compiler/ebin/rec_env.beam and b/bootstrap/lib/compiler/ebin/rec_env.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_alias.beam b/bootstrap/lib/compiler/ebin/sys_core_alias.beam index c090160068d9..ff2998e9708d 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_alias.beam and b/bootstrap/lib/compiler/ebin/sys_core_alias.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_bsm.beam b/bootstrap/lib/compiler/ebin/sys_core_bsm.beam index 8d90129a3b92..7716f9f0bc18 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_bsm.beam and b/bootstrap/lib/compiler/ebin/sys_core_bsm.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_fold.beam b/bootstrap/lib/compiler/ebin/sys_core_fold.beam index 40cfb51434d1..4f0bd6f43329 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_fold.beam and b/bootstrap/lib/compiler/ebin/sys_core_fold.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_fold_lists.beam b/bootstrap/lib/compiler/ebin/sys_core_fold_lists.beam index 8466bcc518fc..d0caac392dc6 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_fold_lists.beam and b/bootstrap/lib/compiler/ebin/sys_core_fold_lists.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_inline.beam b/bootstrap/lib/compiler/ebin/sys_core_inline.beam index 4e1e2937da6d..18c43987ae2c 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_inline.beam and b/bootstrap/lib/compiler/ebin/sys_core_inline.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_core_prepare.beam b/bootstrap/lib/compiler/ebin/sys_core_prepare.beam index 2f151bacdefb..cc2a36d69770 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_core_prepare.beam and b/bootstrap/lib/compiler/ebin/sys_core_prepare.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_coverage.beam b/bootstrap/lib/compiler/ebin/sys_coverage.beam index c4467eac98fb..b72fdc1c825b 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_coverage.beam and b/bootstrap/lib/compiler/ebin/sys_coverage.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_messages.beam b/bootstrap/lib/compiler/ebin/sys_messages.beam index 343d3da52818..14d6d1d5f0c4 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_messages.beam and b/bootstrap/lib/compiler/ebin/sys_messages.beam differ diff --git a/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam b/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam index 019008db8f23..0db690aeaddf 100644 Binary files a/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam and b/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam differ diff --git a/bootstrap/lib/compiler/ebin/v3_core.beam b/bootstrap/lib/compiler/ebin/v3_core.beam index 45aa9012016a..9c6d6888fc30 100644 Binary files a/bootstrap/lib/compiler/ebin/v3_core.beam and b/bootstrap/lib/compiler/ebin/v3_core.beam differ diff --git a/bootstrap/lib/kernel/ebin/application.beam b/bootstrap/lib/kernel/ebin/application.beam index df14e103ffe1..c66b16cd4477 100644 Binary files a/bootstrap/lib/kernel/ebin/application.beam and b/bootstrap/lib/kernel/ebin/application.beam differ diff --git a/bootstrap/lib/kernel/ebin/application_controller.beam b/bootstrap/lib/kernel/ebin/application_controller.beam index 717e9e0edf90..d2f999695bbb 100644 Binary files a/bootstrap/lib/kernel/ebin/application_controller.beam and b/bootstrap/lib/kernel/ebin/application_controller.beam differ diff --git a/bootstrap/lib/kernel/ebin/application_master.beam b/bootstrap/lib/kernel/ebin/application_master.beam index 82250740fff4..17e0ccdd95e3 100644 Binary files a/bootstrap/lib/kernel/ebin/application_master.beam and b/bootstrap/lib/kernel/ebin/application_master.beam differ diff --git a/bootstrap/lib/kernel/ebin/application_starter.beam b/bootstrap/lib/kernel/ebin/application_starter.beam index be42d823a031..f042bd63a9a4 100644 Binary files a/bootstrap/lib/kernel/ebin/application_starter.beam and b/bootstrap/lib/kernel/ebin/application_starter.beam differ diff --git a/bootstrap/lib/kernel/ebin/auth.beam b/bootstrap/lib/kernel/ebin/auth.beam index d27b1730f247..1df091e405e0 100644 Binary files a/bootstrap/lib/kernel/ebin/auth.beam and b/bootstrap/lib/kernel/ebin/auth.beam differ diff --git a/bootstrap/lib/kernel/ebin/code.beam b/bootstrap/lib/kernel/ebin/code.beam index 9d5262c041b7..0e7ba4c53a8e 100644 Binary files a/bootstrap/lib/kernel/ebin/code.beam and b/bootstrap/lib/kernel/ebin/code.beam differ diff --git a/bootstrap/lib/kernel/ebin/code_server.beam b/bootstrap/lib/kernel/ebin/code_server.beam index f7041b0d54da..b43d553ab01e 100644 Binary files a/bootstrap/lib/kernel/ebin/code_server.beam and b/bootstrap/lib/kernel/ebin/code_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/disk_log.beam b/bootstrap/lib/kernel/ebin/disk_log.beam index e484b78f981e..560575015043 100644 Binary files a/bootstrap/lib/kernel/ebin/disk_log.beam and b/bootstrap/lib/kernel/ebin/disk_log.beam differ diff --git a/bootstrap/lib/kernel/ebin/disk_log_1.beam b/bootstrap/lib/kernel/ebin/disk_log_1.beam index 5986913c5963..b5bcf676e28c 100644 Binary files a/bootstrap/lib/kernel/ebin/disk_log_1.beam and b/bootstrap/lib/kernel/ebin/disk_log_1.beam differ diff --git a/bootstrap/lib/kernel/ebin/disk_log_server.beam b/bootstrap/lib/kernel/ebin/disk_log_server.beam index a29a6d6a8e9b..8b08f75d0216 100644 Binary files a/bootstrap/lib/kernel/ebin/disk_log_server.beam and b/bootstrap/lib/kernel/ebin/disk_log_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/disk_log_sup.beam b/bootstrap/lib/kernel/ebin/disk_log_sup.beam index 08580c0be2f7..044ef25333f8 100644 Binary files a/bootstrap/lib/kernel/ebin/disk_log_sup.beam and b/bootstrap/lib/kernel/ebin/disk_log_sup.beam differ diff --git a/bootstrap/lib/kernel/ebin/dist_ac.beam b/bootstrap/lib/kernel/ebin/dist_ac.beam index ddb4226a990b..793fdfdd100a 100644 Binary files a/bootstrap/lib/kernel/ebin/dist_ac.beam and b/bootstrap/lib/kernel/ebin/dist_ac.beam differ diff --git a/bootstrap/lib/kernel/ebin/dist_util.beam b/bootstrap/lib/kernel/ebin/dist_util.beam index 9814c93c7717..a55616fd3ac4 100644 Binary files a/bootstrap/lib/kernel/ebin/dist_util.beam and b/bootstrap/lib/kernel/ebin/dist_util.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_boot_server.beam b/bootstrap/lib/kernel/ebin/erl_boot_server.beam index b7c38063e5a8..621376388f42 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_boot_server.beam and b/bootstrap/lib/kernel/ebin/erl_boot_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_compile_server.beam b/bootstrap/lib/kernel/ebin/erl_compile_server.beam index fab1cc648d65..df576682507d 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_compile_server.beam and b/bootstrap/lib/kernel/ebin/erl_compile_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_ddll.beam b/bootstrap/lib/kernel/ebin/erl_ddll.beam index 961c70638dc4..e4323498cb65 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_ddll.beam and b/bootstrap/lib/kernel/ebin/erl_ddll.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_distribution.beam b/bootstrap/lib/kernel/ebin/erl_distribution.beam index c428d8f85cbf..381c0a168e74 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_distribution.beam and b/bootstrap/lib/kernel/ebin/erl_distribution.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_epmd.beam b/bootstrap/lib/kernel/ebin/erl_epmd.beam index 79166c370137..3c31699be261 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_epmd.beam and b/bootstrap/lib/kernel/ebin/erl_epmd.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_erts_errors.beam b/bootstrap/lib/kernel/ebin/erl_erts_errors.beam index 3c2a625361ca..c45a9620218e 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_erts_errors.beam and b/bootstrap/lib/kernel/ebin/erl_erts_errors.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_kernel_errors.beam b/bootstrap/lib/kernel/ebin/erl_kernel_errors.beam index ce556a70c632..59f43f690c06 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_kernel_errors.beam and b/bootstrap/lib/kernel/ebin/erl_kernel_errors.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_reply.beam b/bootstrap/lib/kernel/ebin/erl_reply.beam index ae5939d2057d..587ad7dcb5f4 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_reply.beam and b/bootstrap/lib/kernel/ebin/erl_reply.beam differ diff --git a/bootstrap/lib/kernel/ebin/erl_signal_handler.beam b/bootstrap/lib/kernel/ebin/erl_signal_handler.beam index 02813a014e8f..163b78c5c61a 100644 Binary files a/bootstrap/lib/kernel/ebin/erl_signal_handler.beam and b/bootstrap/lib/kernel/ebin/erl_signal_handler.beam differ diff --git a/bootstrap/lib/kernel/ebin/erpc.beam b/bootstrap/lib/kernel/ebin/erpc.beam index 5c12638c2d36..e3ac8d3d6053 100644 Binary files a/bootstrap/lib/kernel/ebin/erpc.beam and b/bootstrap/lib/kernel/ebin/erpc.beam differ diff --git a/bootstrap/lib/kernel/ebin/error_handler.beam b/bootstrap/lib/kernel/ebin/error_handler.beam index 5b4b142ddf34..c3aaf8b2d010 100644 Binary files a/bootstrap/lib/kernel/ebin/error_handler.beam and b/bootstrap/lib/kernel/ebin/error_handler.beam differ diff --git a/bootstrap/lib/kernel/ebin/error_logger.beam b/bootstrap/lib/kernel/ebin/error_logger.beam index b1ee0e9cca3c..e024e8e3ff8b 100644 Binary files a/bootstrap/lib/kernel/ebin/error_logger.beam and b/bootstrap/lib/kernel/ebin/error_logger.beam differ diff --git a/bootstrap/lib/kernel/ebin/erts_debug.beam b/bootstrap/lib/kernel/ebin/erts_debug.beam index db402f89b038..e15efb901bff 100644 Binary files a/bootstrap/lib/kernel/ebin/erts_debug.beam and b/bootstrap/lib/kernel/ebin/erts_debug.beam differ diff --git a/bootstrap/lib/kernel/ebin/file.beam b/bootstrap/lib/kernel/ebin/file.beam index 4c3d3cf71187..1862867d65de 100644 Binary files a/bootstrap/lib/kernel/ebin/file.beam and b/bootstrap/lib/kernel/ebin/file.beam differ diff --git a/bootstrap/lib/kernel/ebin/file_io_server.beam b/bootstrap/lib/kernel/ebin/file_io_server.beam index ad35c7db1ca5..d0dd73e8785c 100644 Binary files a/bootstrap/lib/kernel/ebin/file_io_server.beam and b/bootstrap/lib/kernel/ebin/file_io_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/file_server.beam b/bootstrap/lib/kernel/ebin/file_server.beam index 44f1f0ea544e..c09237f7e072 100644 Binary files a/bootstrap/lib/kernel/ebin/file_server.beam and b/bootstrap/lib/kernel/ebin/file_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/gen_sctp.beam b/bootstrap/lib/kernel/ebin/gen_sctp.beam index 93ad9671534e..3bb0af562de3 100644 Binary files a/bootstrap/lib/kernel/ebin/gen_sctp.beam and b/bootstrap/lib/kernel/ebin/gen_sctp.beam differ diff --git a/bootstrap/lib/kernel/ebin/gen_tcp.beam b/bootstrap/lib/kernel/ebin/gen_tcp.beam index 44f189bdc211..01ec58c449b2 100644 Binary files a/bootstrap/lib/kernel/ebin/gen_tcp.beam and b/bootstrap/lib/kernel/ebin/gen_tcp.beam differ diff --git a/bootstrap/lib/kernel/ebin/gen_tcp_socket.beam b/bootstrap/lib/kernel/ebin/gen_tcp_socket.beam index 13ea023d7fe1..fc87457d51ff 100644 Binary files a/bootstrap/lib/kernel/ebin/gen_tcp_socket.beam and b/bootstrap/lib/kernel/ebin/gen_tcp_socket.beam differ diff --git a/bootstrap/lib/kernel/ebin/gen_udp.beam b/bootstrap/lib/kernel/ebin/gen_udp.beam index f5dcaac86491..583635d97b21 100644 Binary files a/bootstrap/lib/kernel/ebin/gen_udp.beam and b/bootstrap/lib/kernel/ebin/gen_udp.beam differ diff --git a/bootstrap/lib/kernel/ebin/gen_udp_socket.beam b/bootstrap/lib/kernel/ebin/gen_udp_socket.beam index cd1719b46c98..e4803dcd61f5 100644 Binary files a/bootstrap/lib/kernel/ebin/gen_udp_socket.beam and b/bootstrap/lib/kernel/ebin/gen_udp_socket.beam differ diff --git a/bootstrap/lib/kernel/ebin/global.beam b/bootstrap/lib/kernel/ebin/global.beam index 07dad1a8b8a1..0a2c8bd50742 100644 Binary files a/bootstrap/lib/kernel/ebin/global.beam and b/bootstrap/lib/kernel/ebin/global.beam differ diff --git a/bootstrap/lib/kernel/ebin/global_group.beam b/bootstrap/lib/kernel/ebin/global_group.beam index 322848f62b91..10cecae688a3 100644 Binary files a/bootstrap/lib/kernel/ebin/global_group.beam and b/bootstrap/lib/kernel/ebin/global_group.beam differ diff --git a/bootstrap/lib/kernel/ebin/global_search.beam b/bootstrap/lib/kernel/ebin/global_search.beam index 4de494702bc8..d06e83aa6d49 100644 Binary files a/bootstrap/lib/kernel/ebin/global_search.beam and b/bootstrap/lib/kernel/ebin/global_search.beam differ diff --git a/bootstrap/lib/kernel/ebin/group.beam b/bootstrap/lib/kernel/ebin/group.beam index fcec2a6ad445..3154d8155136 100644 Binary files a/bootstrap/lib/kernel/ebin/group.beam and b/bootstrap/lib/kernel/ebin/group.beam differ diff --git a/bootstrap/lib/kernel/ebin/group_history.beam b/bootstrap/lib/kernel/ebin/group_history.beam index 42a3365ea828..5fc692e25902 100644 Binary files a/bootstrap/lib/kernel/ebin/group_history.beam and b/bootstrap/lib/kernel/ebin/group_history.beam differ diff --git a/bootstrap/lib/kernel/ebin/heart.beam b/bootstrap/lib/kernel/ebin/heart.beam index 21b50066de05..2dc54807b393 100644 Binary files a/bootstrap/lib/kernel/ebin/heart.beam and b/bootstrap/lib/kernel/ebin/heart.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam index 1feb02a9138f..827c029f1a0d 100644 Binary files a/bootstrap/lib/kernel/ebin/inet.beam and b/bootstrap/lib/kernel/ebin/inet.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet6_sctp.beam b/bootstrap/lib/kernel/ebin/inet6_sctp.beam index 7da078064449..bc5e201fa079 100644 Binary files a/bootstrap/lib/kernel/ebin/inet6_sctp.beam and b/bootstrap/lib/kernel/ebin/inet6_sctp.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet6_tcp.beam b/bootstrap/lib/kernel/ebin/inet6_tcp.beam index 10e236f7c70e..1425395f15a8 100644 Binary files a/bootstrap/lib/kernel/ebin/inet6_tcp.beam and b/bootstrap/lib/kernel/ebin/inet6_tcp.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam index 0c8d4873e07b..43f194c9209a 100644 Binary files a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam and b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet6_udp.beam b/bootstrap/lib/kernel/ebin/inet6_udp.beam index 30a8cc812f04..91a536650eca 100644 Binary files a/bootstrap/lib/kernel/ebin/inet6_udp.beam and b/bootstrap/lib/kernel/ebin/inet6_udp.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_config.beam b/bootstrap/lib/kernel/ebin/inet_config.beam index 8d2d5010003a..fe8deb770327 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_config.beam and b/bootstrap/lib/kernel/ebin/inet_config.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_db.beam b/bootstrap/lib/kernel/ebin/inet_db.beam index 487eb12d5265..386ffbdfbc0d 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_db.beam and b/bootstrap/lib/kernel/ebin/inet_db.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_dns.beam b/bootstrap/lib/kernel/ebin/inet_dns.beam index 6d481c2b19a6..43e23633b67b 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_dns.beam and b/bootstrap/lib/kernel/ebin/inet_dns.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_dns_tsig.beam b/bootstrap/lib/kernel/ebin/inet_dns_tsig.beam index 660573b9833f..9366345fa355 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_dns_tsig.beam and b/bootstrap/lib/kernel/ebin/inet_dns_tsig.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_epmd_dist.beam b/bootstrap/lib/kernel/ebin/inet_epmd_dist.beam index 0beb15cd8963..6a4e782bc300 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_epmd_dist.beam and b/bootstrap/lib/kernel/ebin/inet_epmd_dist.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_epmd_socket.beam b/bootstrap/lib/kernel/ebin/inet_epmd_socket.beam index 900d876bed11..119be3661574 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_epmd_socket.beam and b/bootstrap/lib/kernel/ebin/inet_epmd_socket.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_gethost_native.beam b/bootstrap/lib/kernel/ebin/inet_gethost_native.beam index 1452fc10f209..3438dab0675b 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_gethost_native.beam and b/bootstrap/lib/kernel/ebin/inet_gethost_native.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_hosts.beam b/bootstrap/lib/kernel/ebin/inet_hosts.beam index ad86d0057305..a8b7e5deee8e 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_hosts.beam and b/bootstrap/lib/kernel/ebin/inet_hosts.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_parse.beam b/bootstrap/lib/kernel/ebin/inet_parse.beam index 15d7fd26fdfe..adf46d68643d 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_parse.beam and b/bootstrap/lib/kernel/ebin/inet_parse.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_res.beam b/bootstrap/lib/kernel/ebin/inet_res.beam index d39b8939af9d..0fd7c4f1b287 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_res.beam and b/bootstrap/lib/kernel/ebin/inet_res.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_sctp.beam b/bootstrap/lib/kernel/ebin/inet_sctp.beam index 1257932cc11e..fce18f035fcd 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_sctp.beam and b/bootstrap/lib/kernel/ebin/inet_sctp.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_tcp.beam b/bootstrap/lib/kernel/ebin/inet_tcp.beam index 2dcbefeb26fb..984a1aa1fb4f 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_tcp.beam and b/bootstrap/lib/kernel/ebin/inet_tcp.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam b/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam index 43defcdac834..689089bb5581 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam and b/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam differ diff --git a/bootstrap/lib/kernel/ebin/inet_udp.beam b/bootstrap/lib/kernel/ebin/inet_udp.beam index 3e2e341724b6..9a35e5a15a05 100644 Binary files a/bootstrap/lib/kernel/ebin/inet_udp.beam and b/bootstrap/lib/kernel/ebin/inet_udp.beam differ diff --git a/bootstrap/lib/kernel/ebin/kernel.beam b/bootstrap/lib/kernel/ebin/kernel.beam index 8f7a601924ea..718f23f3fa4c 100644 Binary files a/bootstrap/lib/kernel/ebin/kernel.beam and b/bootstrap/lib/kernel/ebin/kernel.beam differ diff --git a/bootstrap/lib/kernel/ebin/kernel_config.beam b/bootstrap/lib/kernel/ebin/kernel_config.beam index 23097a8e0542..940e0fdd7097 100644 Binary files a/bootstrap/lib/kernel/ebin/kernel_config.beam and b/bootstrap/lib/kernel/ebin/kernel_config.beam differ diff --git a/bootstrap/lib/kernel/ebin/kernel_refc.beam b/bootstrap/lib/kernel/ebin/kernel_refc.beam index e077a281c962..39251eed756d 100644 Binary files a/bootstrap/lib/kernel/ebin/kernel_refc.beam and b/bootstrap/lib/kernel/ebin/kernel_refc.beam differ diff --git a/bootstrap/lib/kernel/ebin/local_tcp.beam b/bootstrap/lib/kernel/ebin/local_tcp.beam index 3f3dc3bcbe49..d511f6307bcd 100644 Binary files a/bootstrap/lib/kernel/ebin/local_tcp.beam and b/bootstrap/lib/kernel/ebin/local_tcp.beam differ diff --git a/bootstrap/lib/kernel/ebin/local_udp.beam b/bootstrap/lib/kernel/ebin/local_udp.beam index eb00970a627d..7b10df06714d 100644 Binary files a/bootstrap/lib/kernel/ebin/local_udp.beam and b/bootstrap/lib/kernel/ebin/local_udp.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger.beam b/bootstrap/lib/kernel/ebin/logger.beam index a1b29cd893b6..9e6743f736cb 100644 Binary files a/bootstrap/lib/kernel/ebin/logger.beam and b/bootstrap/lib/kernel/ebin/logger.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_backend.beam b/bootstrap/lib/kernel/ebin/logger_backend.beam index b271f7e1975c..5157a3d236b2 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_backend.beam and b/bootstrap/lib/kernel/ebin/logger_backend.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_config.beam b/bootstrap/lib/kernel/ebin/logger_config.beam index b96be6485ca7..c14063af2487 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_config.beam and b/bootstrap/lib/kernel/ebin/logger_config.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_disk_log_h.beam b/bootstrap/lib/kernel/ebin/logger_disk_log_h.beam index 03e2bf7d9aa6..86d0b4622c6d 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_disk_log_h.beam and b/bootstrap/lib/kernel/ebin/logger_disk_log_h.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_filters.beam b/bootstrap/lib/kernel/ebin/logger_filters.beam index bed7edf101a9..d40764450fa2 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_filters.beam and b/bootstrap/lib/kernel/ebin/logger_filters.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_formatter.beam b/bootstrap/lib/kernel/ebin/logger_formatter.beam index 44b4da53a35c..29c8ac8ef4de 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_formatter.beam and b/bootstrap/lib/kernel/ebin/logger_formatter.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_h_common.beam b/bootstrap/lib/kernel/ebin/logger_h_common.beam index ed9dce5be68d..0f90d122fecf 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_h_common.beam and b/bootstrap/lib/kernel/ebin/logger_h_common.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_handler.beam b/bootstrap/lib/kernel/ebin/logger_handler.beam index a1a5097bbd1d..47b5ca9d1a89 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_handler.beam and b/bootstrap/lib/kernel/ebin/logger_handler.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_handler_watcher.beam b/bootstrap/lib/kernel/ebin/logger_handler_watcher.beam index be588c9523cb..ca36b1fc4be6 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_handler_watcher.beam and b/bootstrap/lib/kernel/ebin/logger_handler_watcher.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_olp.beam b/bootstrap/lib/kernel/ebin/logger_olp.beam index 55e1f80aa9ea..a366eadd98b9 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_olp.beam and b/bootstrap/lib/kernel/ebin/logger_olp.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_proxy.beam b/bootstrap/lib/kernel/ebin/logger_proxy.beam index 9a75661e5e7f..936760b1f1fa 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_proxy.beam and b/bootstrap/lib/kernel/ebin/logger_proxy.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_server.beam b/bootstrap/lib/kernel/ebin/logger_server.beam index dcd19fb2f269..0b28455316be 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_server.beam and b/bootstrap/lib/kernel/ebin/logger_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_simple_h.beam b/bootstrap/lib/kernel/ebin/logger_simple_h.beam index ebd43436a075..279a8712a6f1 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_simple_h.beam and b/bootstrap/lib/kernel/ebin/logger_simple_h.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_std_h.beam b/bootstrap/lib/kernel/ebin/logger_std_h.beam index c55440dd9f2e..34195446160e 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_std_h.beam and b/bootstrap/lib/kernel/ebin/logger_std_h.beam differ diff --git a/bootstrap/lib/kernel/ebin/logger_sup.beam b/bootstrap/lib/kernel/ebin/logger_sup.beam index c3c515406135..45202de710bf 100644 Binary files a/bootstrap/lib/kernel/ebin/logger_sup.beam and b/bootstrap/lib/kernel/ebin/logger_sup.beam differ diff --git a/bootstrap/lib/kernel/ebin/net.beam b/bootstrap/lib/kernel/ebin/net.beam index 95180eaa6086..423c4c56dcda 100644 Binary files a/bootstrap/lib/kernel/ebin/net.beam and b/bootstrap/lib/kernel/ebin/net.beam differ diff --git a/bootstrap/lib/kernel/ebin/net_adm.beam b/bootstrap/lib/kernel/ebin/net_adm.beam index 4199516dac25..a37cdb3696af 100644 Binary files a/bootstrap/lib/kernel/ebin/net_adm.beam and b/bootstrap/lib/kernel/ebin/net_adm.beam differ diff --git a/bootstrap/lib/kernel/ebin/net_kernel.beam b/bootstrap/lib/kernel/ebin/net_kernel.beam index ab295246f127..1e771e1027d4 100644 Binary files a/bootstrap/lib/kernel/ebin/net_kernel.beam and b/bootstrap/lib/kernel/ebin/net_kernel.beam differ diff --git a/bootstrap/lib/kernel/ebin/os.beam b/bootstrap/lib/kernel/ebin/os.beam index b3687ef9e64c..d8cd242a188b 100644 Binary files a/bootstrap/lib/kernel/ebin/os.beam and b/bootstrap/lib/kernel/ebin/os.beam differ diff --git a/bootstrap/lib/kernel/ebin/pg.beam b/bootstrap/lib/kernel/ebin/pg.beam index 0c7bf306096b..61ad9cca0b6e 100644 Binary files a/bootstrap/lib/kernel/ebin/pg.beam and b/bootstrap/lib/kernel/ebin/pg.beam differ diff --git a/bootstrap/lib/kernel/ebin/pg2.beam b/bootstrap/lib/kernel/ebin/pg2.beam index 926b00f04ae6..2ae997e0dbd1 100644 Binary files a/bootstrap/lib/kernel/ebin/pg2.beam and b/bootstrap/lib/kernel/ebin/pg2.beam differ diff --git a/bootstrap/lib/kernel/ebin/prim_tty.beam b/bootstrap/lib/kernel/ebin/prim_tty.beam index 7924a6342298..be2f0b1a51dd 100644 Binary files a/bootstrap/lib/kernel/ebin/prim_tty.beam and b/bootstrap/lib/kernel/ebin/prim_tty.beam differ diff --git a/bootstrap/lib/kernel/ebin/prim_tty_sighandler.beam b/bootstrap/lib/kernel/ebin/prim_tty_sighandler.beam new file mode 100644 index 000000000000..e8d01e63e9b6 Binary files /dev/null and b/bootstrap/lib/kernel/ebin/prim_tty_sighandler.beam differ diff --git a/bootstrap/lib/kernel/ebin/ram_file.beam b/bootstrap/lib/kernel/ebin/ram_file.beam index a8a76793168b..fa248762a54c 100644 Binary files a/bootstrap/lib/kernel/ebin/ram_file.beam and b/bootstrap/lib/kernel/ebin/ram_file.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io.beam b/bootstrap/lib/kernel/ebin/raw_file_io.beam index 10badb0f3d13..5fe19d14cee6 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io.beam and b/bootstrap/lib/kernel/ebin/raw_file_io.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam b/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam index a75208182193..0b48f612c860 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam and b/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam b/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam index 05b65bda11b8..d14f041bf435 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam and b/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam b/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam index 6dc380926a87..83a630c9259d 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam and b/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam b/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam index 2122be3198ed..ec7b66228edc 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam and b/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_list.beam b/bootstrap/lib/kernel/ebin/raw_file_io_list.beam index 4429f8ef8241..667db2d48bb7 100644 Binary files a/bootstrap/lib/kernel/ebin/raw_file_io_list.beam and b/bootstrap/lib/kernel/ebin/raw_file_io_list.beam differ diff --git a/bootstrap/lib/kernel/ebin/rpc.beam b/bootstrap/lib/kernel/ebin/rpc.beam index ec636219b180..80005c2deb73 100644 Binary files a/bootstrap/lib/kernel/ebin/rpc.beam and b/bootstrap/lib/kernel/ebin/rpc.beam differ diff --git a/bootstrap/lib/kernel/ebin/seq_trace.beam b/bootstrap/lib/kernel/ebin/seq_trace.beam index 03c7aa2f7656..1bcd5b411e6b 100644 Binary files a/bootstrap/lib/kernel/ebin/seq_trace.beam and b/bootstrap/lib/kernel/ebin/seq_trace.beam differ diff --git a/bootstrap/lib/kernel/ebin/socket.beam b/bootstrap/lib/kernel/ebin/socket.beam index 5fed62dd874e..dd75311ec06e 100644 Binary files a/bootstrap/lib/kernel/ebin/socket.beam and b/bootstrap/lib/kernel/ebin/socket.beam differ diff --git a/bootstrap/lib/kernel/ebin/standard_error.beam b/bootstrap/lib/kernel/ebin/standard_error.beam index 9bcc09fe0d7c..1be97d9e465c 100644 Binary files a/bootstrap/lib/kernel/ebin/standard_error.beam and b/bootstrap/lib/kernel/ebin/standard_error.beam differ diff --git a/bootstrap/lib/kernel/ebin/trace.beam b/bootstrap/lib/kernel/ebin/trace.beam index b6e68d99ded5..0125d6c78ca6 100644 Binary files a/bootstrap/lib/kernel/ebin/trace.beam and b/bootstrap/lib/kernel/ebin/trace.beam differ diff --git a/bootstrap/lib/kernel/ebin/user_drv.beam b/bootstrap/lib/kernel/ebin/user_drv.beam index e05665d74fe7..e33e3942a439 100644 Binary files a/bootstrap/lib/kernel/ebin/user_drv.beam and b/bootstrap/lib/kernel/ebin/user_drv.beam differ diff --git a/bootstrap/lib/kernel/ebin/user_sup.beam b/bootstrap/lib/kernel/ebin/user_sup.beam index b1414962bd63..00357b4d7fcc 100644 Binary files a/bootstrap/lib/kernel/ebin/user_sup.beam and b/bootstrap/lib/kernel/ebin/user_sup.beam differ diff --git a/bootstrap/lib/kernel/ebin/wrap_log_reader.beam b/bootstrap/lib/kernel/ebin/wrap_log_reader.beam index 0f3fed49648e..eaf0e1b008a0 100644 Binary files a/bootstrap/lib/kernel/ebin/wrap_log_reader.beam and b/bootstrap/lib/kernel/ebin/wrap_log_reader.beam differ diff --git a/bootstrap/lib/stdlib/ebin/argparse.beam b/bootstrap/lib/stdlib/ebin/argparse.beam index a431a899ec02..ac13e655b6e2 100644 Binary files a/bootstrap/lib/stdlib/ebin/argparse.beam and b/bootstrap/lib/stdlib/ebin/argparse.beam differ diff --git a/bootstrap/lib/stdlib/ebin/array.beam b/bootstrap/lib/stdlib/ebin/array.beam index 5d89118e6919..fb4e963d8d65 100644 Binary files a/bootstrap/lib/stdlib/ebin/array.beam and b/bootstrap/lib/stdlib/ebin/array.beam differ diff --git a/bootstrap/lib/stdlib/ebin/base64.beam b/bootstrap/lib/stdlib/ebin/base64.beam index caafea586c29..10515aaa991d 100644 Binary files a/bootstrap/lib/stdlib/ebin/base64.beam and b/bootstrap/lib/stdlib/ebin/base64.beam differ diff --git a/bootstrap/lib/stdlib/ebin/beam_lib.beam b/bootstrap/lib/stdlib/ebin/beam_lib.beam index 9a8c7ea77a2e..f0fad6254627 100644 Binary files a/bootstrap/lib/stdlib/ebin/beam_lib.beam and b/bootstrap/lib/stdlib/ebin/beam_lib.beam differ diff --git a/bootstrap/lib/stdlib/ebin/binary.beam b/bootstrap/lib/stdlib/ebin/binary.beam index 79a10d026ac0..d1d869a6c1db 100644 Binary files a/bootstrap/lib/stdlib/ebin/binary.beam and b/bootstrap/lib/stdlib/ebin/binary.beam differ diff --git a/bootstrap/lib/stdlib/ebin/c.beam b/bootstrap/lib/stdlib/ebin/c.beam index d49ee4daef01..8b9681610b80 100644 Binary files a/bootstrap/lib/stdlib/ebin/c.beam and b/bootstrap/lib/stdlib/ebin/c.beam differ diff --git a/bootstrap/lib/stdlib/ebin/calendar.beam b/bootstrap/lib/stdlib/ebin/calendar.beam index b268c0c16686..3ac1364c03c6 100644 Binary files a/bootstrap/lib/stdlib/ebin/calendar.beam and b/bootstrap/lib/stdlib/ebin/calendar.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dets.beam b/bootstrap/lib/stdlib/ebin/dets.beam index 430756e29406..dce6aae1cb12 100644 Binary files a/bootstrap/lib/stdlib/ebin/dets.beam and b/bootstrap/lib/stdlib/ebin/dets.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dets_server.beam b/bootstrap/lib/stdlib/ebin/dets_server.beam index 46c55727b303..10e34efef1eb 100644 Binary files a/bootstrap/lib/stdlib/ebin/dets_server.beam and b/bootstrap/lib/stdlib/ebin/dets_server.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dets_sup.beam b/bootstrap/lib/stdlib/ebin/dets_sup.beam index cc67d1a9a49b..9e4fcb1ca858 100644 Binary files a/bootstrap/lib/stdlib/ebin/dets_sup.beam and b/bootstrap/lib/stdlib/ebin/dets_sup.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dets_utils.beam b/bootstrap/lib/stdlib/ebin/dets_utils.beam index 645d10fc8ced..01b93997fd4f 100644 Binary files a/bootstrap/lib/stdlib/ebin/dets_utils.beam and b/bootstrap/lib/stdlib/ebin/dets_utils.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dets_v9.beam b/bootstrap/lib/stdlib/ebin/dets_v9.beam index d8a5459abe9d..cc31d8a03b01 100644 Binary files a/bootstrap/lib/stdlib/ebin/dets_v9.beam and b/bootstrap/lib/stdlib/ebin/dets_v9.beam differ diff --git a/bootstrap/lib/stdlib/ebin/dict.beam b/bootstrap/lib/stdlib/ebin/dict.beam index 103e321a0c38..c62c9b667303 100644 Binary files a/bootstrap/lib/stdlib/ebin/dict.beam and b/bootstrap/lib/stdlib/ebin/dict.beam differ diff --git a/bootstrap/lib/stdlib/ebin/digraph.beam b/bootstrap/lib/stdlib/ebin/digraph.beam index 059288d5f90c..277d724a715e 100644 Binary files a/bootstrap/lib/stdlib/ebin/digraph.beam and b/bootstrap/lib/stdlib/ebin/digraph.beam differ diff --git a/bootstrap/lib/stdlib/ebin/digraph_utils.beam b/bootstrap/lib/stdlib/ebin/digraph_utils.beam index 167628bdf871..97942ba10a66 100644 Binary files a/bootstrap/lib/stdlib/ebin/digraph_utils.beam and b/bootstrap/lib/stdlib/ebin/digraph_utils.beam differ diff --git a/bootstrap/lib/stdlib/ebin/edlin.beam b/bootstrap/lib/stdlib/ebin/edlin.beam index 5989b69d99a8..b72d9a003d0a 100644 Binary files a/bootstrap/lib/stdlib/ebin/edlin.beam and b/bootstrap/lib/stdlib/ebin/edlin.beam differ diff --git a/bootstrap/lib/stdlib/ebin/edlin_context.beam b/bootstrap/lib/stdlib/ebin/edlin_context.beam index b2d7ae036301..78a6f1e86e29 100644 Binary files a/bootstrap/lib/stdlib/ebin/edlin_context.beam and b/bootstrap/lib/stdlib/ebin/edlin_context.beam differ diff --git a/bootstrap/lib/stdlib/ebin/edlin_expand.beam b/bootstrap/lib/stdlib/ebin/edlin_expand.beam index 22a9756892af..62bf9e0c3997 100644 Binary files a/bootstrap/lib/stdlib/ebin/edlin_expand.beam and b/bootstrap/lib/stdlib/ebin/edlin_expand.beam differ diff --git a/bootstrap/lib/stdlib/ebin/edlin_key.beam b/bootstrap/lib/stdlib/ebin/edlin_key.beam index b02a0f859dc1..6ec8baa70d94 100644 Binary files a/bootstrap/lib/stdlib/ebin/edlin_key.beam and b/bootstrap/lib/stdlib/ebin/edlin_key.beam differ diff --git a/bootstrap/lib/stdlib/ebin/edlin_type_suggestion.beam b/bootstrap/lib/stdlib/ebin/edlin_type_suggestion.beam index aeefad9a5389..a3e5a19985d9 100644 Binary files a/bootstrap/lib/stdlib/ebin/edlin_type_suggestion.beam and b/bootstrap/lib/stdlib/ebin/edlin_type_suggestion.beam differ diff --git a/bootstrap/lib/stdlib/ebin/epp.beam b/bootstrap/lib/stdlib/ebin/epp.beam index 861719c8de99..8f54d952326b 100644 Binary files a/bootstrap/lib/stdlib/ebin/epp.beam and b/bootstrap/lib/stdlib/ebin/epp.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_abstract_code.beam b/bootstrap/lib/stdlib/ebin/erl_abstract_code.beam index c5f2b67cb7dc..e307923d9f10 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_abstract_code.beam and b/bootstrap/lib/stdlib/ebin/erl_abstract_code.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_anno.beam b/bootstrap/lib/stdlib/ebin/erl_anno.beam index bb9ea9b9d6a8..1b00f39da62d 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_anno.beam and b/bootstrap/lib/stdlib/ebin/erl_anno.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_bits.beam b/bootstrap/lib/stdlib/ebin/erl_bits.beam index 7dfc6e855712..5dd2f5ce6113 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_bits.beam and b/bootstrap/lib/stdlib/ebin/erl_bits.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_compile.beam b/bootstrap/lib/stdlib/ebin/erl_compile.beam index 50e29ff43e9c..380d02c4c5fc 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_compile.beam and b/bootstrap/lib/stdlib/ebin/erl_compile.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_error.beam b/bootstrap/lib/stdlib/ebin/erl_error.beam index 8261d7484aee..353c9ada0027 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_error.beam and b/bootstrap/lib/stdlib/ebin/erl_error.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_eval.beam b/bootstrap/lib/stdlib/ebin/erl_eval.beam index a647f5461589..92152891bb62 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_eval.beam and b/bootstrap/lib/stdlib/ebin/erl_eval.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_expand_records.beam b/bootstrap/lib/stdlib/ebin/erl_expand_records.beam index 90b5a66278b8..f9f49384b117 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_expand_records.beam and b/bootstrap/lib/stdlib/ebin/erl_expand_records.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_features.beam b/bootstrap/lib/stdlib/ebin/erl_features.beam index 175ec82a3465..64c4aab685e2 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_features.beam and b/bootstrap/lib/stdlib/ebin/erl_features.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_id_trans.beam b/bootstrap/lib/stdlib/ebin/erl_id_trans.beam index c29b5c5f9a85..aaf4a531f937 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_id_trans.beam and b/bootstrap/lib/stdlib/ebin/erl_id_trans.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_internal.beam b/bootstrap/lib/stdlib/ebin/erl_internal.beam index a55213788884..c6f6c163bb7b 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_internal.beam and b/bootstrap/lib/stdlib/ebin/erl_internal.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_lint.beam b/bootstrap/lib/stdlib/ebin/erl_lint.beam index ab9f675c63d0..098b353153d9 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_lint.beam and b/bootstrap/lib/stdlib/ebin/erl_lint.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_parse.beam b/bootstrap/lib/stdlib/ebin/erl_parse.beam index fbbaaebb48f4..9d8b98ef58ae 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_parse.beam and b/bootstrap/lib/stdlib/ebin/erl_parse.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam b/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam index 72925edea06e..e192aa3965dd 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam and b/bootstrap/lib/stdlib/ebin/erl_posix_msg.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_pp.beam b/bootstrap/lib/stdlib/ebin/erl_pp.beam index 267a1e7ea1e0..19045a94f026 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_pp.beam and b/bootstrap/lib/stdlib/ebin/erl_pp.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_scan.beam b/bootstrap/lib/stdlib/ebin/erl_scan.beam index cdf97122e34e..319761ffdc77 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_scan.beam and b/bootstrap/lib/stdlib/ebin/erl_scan.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_stdlib_errors.beam b/bootstrap/lib/stdlib/ebin/erl_stdlib_errors.beam index 9c109a5dbb50..87df800be8e1 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_stdlib_errors.beam and b/bootstrap/lib/stdlib/ebin/erl_stdlib_errors.beam differ diff --git a/bootstrap/lib/stdlib/ebin/erl_tar.beam b/bootstrap/lib/stdlib/ebin/erl_tar.beam index 3ac33395b92e..db8c8a086a93 100644 Binary files a/bootstrap/lib/stdlib/ebin/erl_tar.beam and b/bootstrap/lib/stdlib/ebin/erl_tar.beam differ diff --git a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam index 80fa9b645e51..34cf271bd8dc 100644 Binary files a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam and b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam differ diff --git a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam index 499b43c5c71a..d66efdec7824 100644 Binary files a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam and b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam differ diff --git a/bootstrap/lib/stdlib/ebin/escript.beam b/bootstrap/lib/stdlib/ebin/escript.beam index cfe62b5b73e9..defaa1fc786b 100644 Binary files a/bootstrap/lib/stdlib/ebin/escript.beam and b/bootstrap/lib/stdlib/ebin/escript.beam differ diff --git a/bootstrap/lib/stdlib/ebin/ets.beam b/bootstrap/lib/stdlib/ebin/ets.beam index b77299905948..8778cd8de4f4 100644 Binary files a/bootstrap/lib/stdlib/ebin/ets.beam and b/bootstrap/lib/stdlib/ebin/ets.beam differ diff --git a/bootstrap/lib/stdlib/ebin/eval_bits.beam b/bootstrap/lib/stdlib/ebin/eval_bits.beam index ee3d3aeacdc6..fd90b737c0db 100644 Binary files a/bootstrap/lib/stdlib/ebin/eval_bits.beam and b/bootstrap/lib/stdlib/ebin/eval_bits.beam differ diff --git a/bootstrap/lib/stdlib/ebin/file_sorter.beam b/bootstrap/lib/stdlib/ebin/file_sorter.beam index 367b32497755..3cfbb625a93a 100644 Binary files a/bootstrap/lib/stdlib/ebin/file_sorter.beam and b/bootstrap/lib/stdlib/ebin/file_sorter.beam differ diff --git a/bootstrap/lib/stdlib/ebin/filelib.beam b/bootstrap/lib/stdlib/ebin/filelib.beam index cb1b94a860c7..2e1bac3e5ba4 100644 Binary files a/bootstrap/lib/stdlib/ebin/filelib.beam and b/bootstrap/lib/stdlib/ebin/filelib.beam differ diff --git a/bootstrap/lib/stdlib/ebin/filename.beam b/bootstrap/lib/stdlib/ebin/filename.beam index 0b518ae49008..b4a543b02083 100644 Binary files a/bootstrap/lib/stdlib/ebin/filename.beam and b/bootstrap/lib/stdlib/ebin/filename.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gb_sets.beam b/bootstrap/lib/stdlib/ebin/gb_sets.beam index c91a556196f8..48ba9ed3f74c 100644 Binary files a/bootstrap/lib/stdlib/ebin/gb_sets.beam and b/bootstrap/lib/stdlib/ebin/gb_sets.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gb_trees.beam b/bootstrap/lib/stdlib/ebin/gb_trees.beam index cc7a18d77a9f..853a4b427f27 100644 Binary files a/bootstrap/lib/stdlib/ebin/gb_trees.beam and b/bootstrap/lib/stdlib/ebin/gb_trees.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gen.beam b/bootstrap/lib/stdlib/ebin/gen.beam index 33b383d33fe5..13f079ab7e76 100644 Binary files a/bootstrap/lib/stdlib/ebin/gen.beam and b/bootstrap/lib/stdlib/ebin/gen.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gen_event.beam b/bootstrap/lib/stdlib/ebin/gen_event.beam index e73aafded96c..c9c44c0b6ca8 100644 Binary files a/bootstrap/lib/stdlib/ebin/gen_event.beam and b/bootstrap/lib/stdlib/ebin/gen_event.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gen_fsm.beam b/bootstrap/lib/stdlib/ebin/gen_fsm.beam index 2c3ac053f282..64ab3ab1257d 100644 Binary files a/bootstrap/lib/stdlib/ebin/gen_fsm.beam and b/bootstrap/lib/stdlib/ebin/gen_fsm.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gen_server.beam b/bootstrap/lib/stdlib/ebin/gen_server.beam index d1f1625dd3d5..9b14662d7ace 100644 Binary files a/bootstrap/lib/stdlib/ebin/gen_server.beam and b/bootstrap/lib/stdlib/ebin/gen_server.beam differ diff --git a/bootstrap/lib/stdlib/ebin/gen_statem.beam b/bootstrap/lib/stdlib/ebin/gen_statem.beam index 979e4bb8ba05..7ff6847f915a 100644 Binary files a/bootstrap/lib/stdlib/ebin/gen_statem.beam and b/bootstrap/lib/stdlib/ebin/gen_statem.beam differ diff --git a/bootstrap/lib/stdlib/ebin/io.beam b/bootstrap/lib/stdlib/ebin/io.beam index 8a9074659683..aa546d714a52 100644 Binary files a/bootstrap/lib/stdlib/ebin/io.beam and b/bootstrap/lib/stdlib/ebin/io.beam differ diff --git a/bootstrap/lib/stdlib/ebin/io_lib.beam b/bootstrap/lib/stdlib/ebin/io_lib.beam index b701b9573e4d..f9e9e4a548f4 100644 Binary files a/bootstrap/lib/stdlib/ebin/io_lib.beam and b/bootstrap/lib/stdlib/ebin/io_lib.beam differ diff --git a/bootstrap/lib/stdlib/ebin/io_lib_format.beam b/bootstrap/lib/stdlib/ebin/io_lib_format.beam index 5123fafc4a3e..85046706277b 100644 Binary files a/bootstrap/lib/stdlib/ebin/io_lib_format.beam and b/bootstrap/lib/stdlib/ebin/io_lib_format.beam differ diff --git a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam index 9c9a3fffe7de..d8e8020671eb 100644 Binary files a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam and b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam differ diff --git a/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam b/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam index 9f603bdf1d7d..d506cb19176a 100644 Binary files a/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam and b/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam differ diff --git a/bootstrap/lib/stdlib/ebin/json.beam b/bootstrap/lib/stdlib/ebin/json.beam index 3b5fdebe4a55..66847356f23b 100644 Binary files a/bootstrap/lib/stdlib/ebin/json.beam and b/bootstrap/lib/stdlib/ebin/json.beam differ diff --git a/bootstrap/lib/stdlib/ebin/lists.beam b/bootstrap/lib/stdlib/ebin/lists.beam index a78d358000e6..5594921440ca 100644 Binary files a/bootstrap/lib/stdlib/ebin/lists.beam and b/bootstrap/lib/stdlib/ebin/lists.beam differ diff --git a/bootstrap/lib/stdlib/ebin/log_mf_h.beam b/bootstrap/lib/stdlib/ebin/log_mf_h.beam index 39899cfb1b96..5e5ce9830d85 100644 Binary files a/bootstrap/lib/stdlib/ebin/log_mf_h.beam and b/bootstrap/lib/stdlib/ebin/log_mf_h.beam differ diff --git a/bootstrap/lib/stdlib/ebin/maps.beam b/bootstrap/lib/stdlib/ebin/maps.beam index d5c2fbcfda08..44cf994d4633 100644 Binary files a/bootstrap/lib/stdlib/ebin/maps.beam and b/bootstrap/lib/stdlib/ebin/maps.beam differ diff --git a/bootstrap/lib/stdlib/ebin/math.beam b/bootstrap/lib/stdlib/ebin/math.beam index e756ca27f7db..a6dfa49fc1b0 100644 Binary files a/bootstrap/lib/stdlib/ebin/math.beam and b/bootstrap/lib/stdlib/ebin/math.beam differ diff --git a/bootstrap/lib/stdlib/ebin/ms_transform.beam b/bootstrap/lib/stdlib/ebin/ms_transform.beam index 478533ba6713..d497cfea97a5 100644 Binary files a/bootstrap/lib/stdlib/ebin/ms_transform.beam and b/bootstrap/lib/stdlib/ebin/ms_transform.beam differ diff --git a/bootstrap/lib/stdlib/ebin/orddict.beam b/bootstrap/lib/stdlib/ebin/orddict.beam index a9084d24406d..b9992d97bc3c 100644 Binary files a/bootstrap/lib/stdlib/ebin/orddict.beam and b/bootstrap/lib/stdlib/ebin/orddict.beam differ diff --git a/bootstrap/lib/stdlib/ebin/ordsets.beam b/bootstrap/lib/stdlib/ebin/ordsets.beam index 74f702592939..da2f836e86dd 100644 Binary files a/bootstrap/lib/stdlib/ebin/ordsets.beam and b/bootstrap/lib/stdlib/ebin/ordsets.beam differ diff --git a/bootstrap/lib/stdlib/ebin/otp_internal.beam b/bootstrap/lib/stdlib/ebin/otp_internal.beam index 9b3a55094dea..72f51a8bf64a 100644 Binary files a/bootstrap/lib/stdlib/ebin/otp_internal.beam and b/bootstrap/lib/stdlib/ebin/otp_internal.beam differ diff --git a/bootstrap/lib/stdlib/ebin/peer.beam b/bootstrap/lib/stdlib/ebin/peer.beam index 1f5b5941c5d9..627070b5f4ae 100644 Binary files a/bootstrap/lib/stdlib/ebin/peer.beam and b/bootstrap/lib/stdlib/ebin/peer.beam differ diff --git a/bootstrap/lib/stdlib/ebin/pool.beam b/bootstrap/lib/stdlib/ebin/pool.beam index ee0557dac9c6..1d148edf368c 100644 Binary files a/bootstrap/lib/stdlib/ebin/pool.beam and b/bootstrap/lib/stdlib/ebin/pool.beam differ diff --git a/bootstrap/lib/stdlib/ebin/proc_lib.beam b/bootstrap/lib/stdlib/ebin/proc_lib.beam index a162d1c73a12..1d98bd4e7f50 100644 Binary files a/bootstrap/lib/stdlib/ebin/proc_lib.beam and b/bootstrap/lib/stdlib/ebin/proc_lib.beam differ diff --git a/bootstrap/lib/stdlib/ebin/proplists.beam b/bootstrap/lib/stdlib/ebin/proplists.beam index 7c921651bc86..b89ee52de7cb 100644 Binary files a/bootstrap/lib/stdlib/ebin/proplists.beam and b/bootstrap/lib/stdlib/ebin/proplists.beam differ diff --git a/bootstrap/lib/stdlib/ebin/qlc.beam b/bootstrap/lib/stdlib/ebin/qlc.beam index e563c60b5d3b..315bbe08a64d 100644 Binary files a/bootstrap/lib/stdlib/ebin/qlc.beam and b/bootstrap/lib/stdlib/ebin/qlc.beam differ diff --git a/bootstrap/lib/stdlib/ebin/qlc_pt.beam b/bootstrap/lib/stdlib/ebin/qlc_pt.beam index 9087d50065fb..5f2820249773 100644 Binary files a/bootstrap/lib/stdlib/ebin/qlc_pt.beam and b/bootstrap/lib/stdlib/ebin/qlc_pt.beam differ diff --git a/bootstrap/lib/stdlib/ebin/queue.beam b/bootstrap/lib/stdlib/ebin/queue.beam index 4fe72530f58d..b04e7954c641 100644 Binary files a/bootstrap/lib/stdlib/ebin/queue.beam and b/bootstrap/lib/stdlib/ebin/queue.beam differ diff --git a/bootstrap/lib/stdlib/ebin/rand.beam b/bootstrap/lib/stdlib/ebin/rand.beam index cdfcdff5b25d..10820f8969bc 100644 Binary files a/bootstrap/lib/stdlib/ebin/rand.beam and b/bootstrap/lib/stdlib/ebin/rand.beam differ diff --git a/bootstrap/lib/stdlib/ebin/random.beam b/bootstrap/lib/stdlib/ebin/random.beam index f8d56e1e8fb5..dd09e878ffb9 100644 Binary files a/bootstrap/lib/stdlib/ebin/random.beam and b/bootstrap/lib/stdlib/ebin/random.beam differ diff --git a/bootstrap/lib/stdlib/ebin/re.beam b/bootstrap/lib/stdlib/ebin/re.beam index da86bb88a9b5..1f26a8becd83 100644 Binary files a/bootstrap/lib/stdlib/ebin/re.beam and b/bootstrap/lib/stdlib/ebin/re.beam differ diff --git a/bootstrap/lib/stdlib/ebin/sets.beam b/bootstrap/lib/stdlib/ebin/sets.beam index 274458a68d0f..337cfda45210 100644 Binary files a/bootstrap/lib/stdlib/ebin/sets.beam and b/bootstrap/lib/stdlib/ebin/sets.beam differ diff --git a/bootstrap/lib/stdlib/ebin/shell.beam b/bootstrap/lib/stdlib/ebin/shell.beam index be34a1523713..907253c09b2f 100644 Binary files a/bootstrap/lib/stdlib/ebin/shell.beam and b/bootstrap/lib/stdlib/ebin/shell.beam differ diff --git a/bootstrap/lib/stdlib/ebin/shell_default.beam b/bootstrap/lib/stdlib/ebin/shell_default.beam index 7f30948e0553..715293ab8cf7 100644 Binary files a/bootstrap/lib/stdlib/ebin/shell_default.beam and b/bootstrap/lib/stdlib/ebin/shell_default.beam differ diff --git a/bootstrap/lib/stdlib/ebin/shell_docs.beam b/bootstrap/lib/stdlib/ebin/shell_docs.beam index cb91301cda79..0c5bc35a56dd 100644 Binary files a/bootstrap/lib/stdlib/ebin/shell_docs.beam and b/bootstrap/lib/stdlib/ebin/shell_docs.beam differ diff --git a/bootstrap/lib/stdlib/ebin/shell_docs_markdown.beam b/bootstrap/lib/stdlib/ebin/shell_docs_markdown.beam index b2b9074c7d10..7f115c67ed8b 100644 Binary files a/bootstrap/lib/stdlib/ebin/shell_docs_markdown.beam and b/bootstrap/lib/stdlib/ebin/shell_docs_markdown.beam differ diff --git a/bootstrap/lib/stdlib/ebin/slave.beam b/bootstrap/lib/stdlib/ebin/slave.beam index d2030844bc40..b035cf597573 100644 Binary files a/bootstrap/lib/stdlib/ebin/slave.beam and b/bootstrap/lib/stdlib/ebin/slave.beam differ diff --git a/bootstrap/lib/stdlib/ebin/sofs.beam b/bootstrap/lib/stdlib/ebin/sofs.beam index 73d19fb1ecab..183c470cbab9 100644 Binary files a/bootstrap/lib/stdlib/ebin/sofs.beam and b/bootstrap/lib/stdlib/ebin/sofs.beam differ diff --git a/bootstrap/lib/stdlib/ebin/string.beam b/bootstrap/lib/stdlib/ebin/string.beam index ff8b737afc2c..0dafa401588c 100644 Binary files a/bootstrap/lib/stdlib/ebin/string.beam and b/bootstrap/lib/stdlib/ebin/string.beam differ diff --git a/bootstrap/lib/stdlib/ebin/supervisor.beam b/bootstrap/lib/stdlib/ebin/supervisor.beam index b61bd8cc02a3..c2d15cf98c19 100644 Binary files a/bootstrap/lib/stdlib/ebin/supervisor.beam and b/bootstrap/lib/stdlib/ebin/supervisor.beam differ diff --git a/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam b/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam index 7423b84918ae..f30e8ae68f29 100644 Binary files a/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam and b/bootstrap/lib/stdlib/ebin/supervisor_bridge.beam differ diff --git a/bootstrap/lib/stdlib/ebin/sys.beam b/bootstrap/lib/stdlib/ebin/sys.beam index 7d19ccd29614..3b11fdd0c90e 100644 Binary files a/bootstrap/lib/stdlib/ebin/sys.beam and b/bootstrap/lib/stdlib/ebin/sys.beam differ diff --git a/bootstrap/lib/stdlib/ebin/timer.beam b/bootstrap/lib/stdlib/ebin/timer.beam index 1ad26fe11c5b..ed85fcc4108f 100644 Binary files a/bootstrap/lib/stdlib/ebin/timer.beam and b/bootstrap/lib/stdlib/ebin/timer.beam differ diff --git a/bootstrap/lib/stdlib/ebin/unicode.beam b/bootstrap/lib/stdlib/ebin/unicode.beam index 7b21cd609b5a..c19d098fe4b4 100644 Binary files a/bootstrap/lib/stdlib/ebin/unicode.beam and b/bootstrap/lib/stdlib/ebin/unicode.beam differ diff --git a/bootstrap/lib/stdlib/ebin/unicode_util.beam b/bootstrap/lib/stdlib/ebin/unicode_util.beam index 1b735f6cc27d..2278cc5c0d92 100644 Binary files a/bootstrap/lib/stdlib/ebin/unicode_util.beam and b/bootstrap/lib/stdlib/ebin/unicode_util.beam differ diff --git a/bootstrap/lib/stdlib/ebin/uri_string.beam b/bootstrap/lib/stdlib/ebin/uri_string.beam index 085d95f1c6f2..dc06228652cd 100644 Binary files a/bootstrap/lib/stdlib/ebin/uri_string.beam and b/bootstrap/lib/stdlib/ebin/uri_string.beam differ diff --git a/bootstrap/lib/stdlib/ebin/win32reg.beam b/bootstrap/lib/stdlib/ebin/win32reg.beam index 833cf0a40d05..c028edb276e7 100644 Binary files a/bootstrap/lib/stdlib/ebin/win32reg.beam and b/bootstrap/lib/stdlib/ebin/win32reg.beam differ diff --git a/bootstrap/lib/stdlib/ebin/zip.beam b/bootstrap/lib/stdlib/ebin/zip.beam index d1143cfd9f2b..511da16dd71a 100644 Binary files a/bootstrap/lib/stdlib/ebin/zip.beam and b/bootstrap/lib/stdlib/ebin/zip.beam differ diff --git a/erts/config.h.in b/erts/config.h.in index 733e18434043..8a1d0cdb5cb6 100644 --- a/erts/config.h.in +++ b/erts/config.h.in @@ -672,6 +672,10 @@ '-Waddress-of-packed-member'') */ #undef HAVE_GCC_DIAG_IGNORE_WADDRESS_OF_PACKED_MEMBER +/* define if compiler support _Pragma('GCC diagnostic ignored + '-Wformat-nonliteral'') */ +#undef HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL + /* Define to 1 if you have a good `getaddrinfo' function. */ #undef HAVE_GETADDRINFO diff --git a/erts/configure b/erts/configure index 9cea09ff81c2..c972cb283d98 100755 --- a/erts/configure +++ b/erts/configure @@ -702,7 +702,6 @@ PROFILE_COMPILER USE_PGO XCRUN LLVM_PROFDATA -WERRORFLAGS WFLAGS DEBUG_FLAGS ERTS_CONFIG_H_IDIR @@ -3663,6 +3662,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + @@ -3838,6 +3842,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3852,6 +3863,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3866,6 +3884,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3877,18 +3902,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -8280,7 +8306,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - ## Check if we can do profile guided optimization of beam_emu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -fprofile-generate -Werror..." >&5 @@ -26873,10 +26898,35 @@ fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" +saved_CFLAGS="$CFLAGS" +CFLAGS="-Werror $CFLAGS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +_Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") + _Pragma("GCC diagnostic pop") + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +printf "%s\n" "#define HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +CFLAGS="$saved_CFLAGS" + if test "x$GCC" = xyes; then - CFLAGS="$WERRORFLAGS $CFLAGS" + CFLAGS="$WERRORFLAGS $CFLAGS" fi diff --git a/erts/configure.ac b/erts/configure.ac index e79def7c42bf..f546f1a5a5fd 100644 --- a/erts/configure.ac +++ b/erts/configure.ac @@ -29,14 +29,7 @@ m4_include([otp.m4]) LM_PRECIOUS_VARS -dnl We check if -Werror was given on command line and if so -dnl we disable it for the configure and only use it when -dnl actually building erts -no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') -if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then - CFLAGS="$no_werror_CFLAGS" - WERRORFLAGS=-Werror -fi +ERL_PUSH_WERROR dnl How to set srcdir absolute is taken from the GNU Emacs distribution #### Make srcdir absolute, if it isn't already. It's important to @@ -630,7 +623,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[ dnl DEBUG_FLAGS is obsolete (I hope) AC_SUBST(DEBUG_FLAGS) AC_SUBST(WFLAGS) -AC_SUBST(WERRORFLAGS) ## Check if we can do profile guided optimization of beam_emu LM_CHECK_RUN_CFLAG([-fprofile-generate -Werror],[PROFILE_GENERATE]) @@ -3621,14 +3613,23 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[_Pragma("GCC diagnostic push") define if compiler support _Pragma('GCC diagnostic ignored '-Waddress-of-packed-member''))],[]) CFLAGS="$saved_CFLAGS" +dnl ---------------------------------------------------------------------- +dnl Check for GCC diagnostic ignored "-Wformat-nonliteral" +dnl ---------------------------------------------------------------------- +saved_CFLAGS="$CFLAGS" +CFLAGS="-Werror $CFLAGS" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[_Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") + _Pragma("GCC diagnostic pop") + ]])],[AC_DEFINE(HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL,1, + define if compiler support _Pragma('GCC diagnostic ignored '-Wformat-nonliteral''))],[]) +CFLAGS="$saved_CFLAGS" dnl ---------------------------------------------------------------------- dnl Enable any -Werror flags dnl ---------------------------------------------------------------------- -if test "x$GCC" = xyes; then - CFLAGS="$WERRORFLAGS $CFLAGS" -fi +ERL_POP_WERROR dnl ---------------------------------------------------------------------- dnl Enable build determinism flag diff --git a/erts/doc/guides/absform.md b/erts/doc/guides/absform.md index 6f15630dd98b..1f814d8d4847 100644 --- a/erts/doc/guides/absform.md +++ b/erts/doc/guides/absform.md @@ -292,13 +292,23 @@ An expression E is one of the following: A qualifier Q is one of the following: - If Q is a filter `E`, where `E` is an expression, then Rep(Q) = `Rep(E)`. +- If Q is a zip generator `Q_1 && ...&& Q_k]`, where each `Q_i` is + a non-zip generator, then Rep(E) = `{zip,ANNO,[Rep(Q_1), ..., Rep(Q_k)]}`. + For Rep(Q), see below. - If Q is a list generator `P <- E`, where `P` is a pattern and `E` is an expression, then Rep(Q) = `{generate,ANNO,Rep(P),Rep(E)}`. +- If Q is a list generator `P <:- E`, where `P` is a pattern and `E` is an + expression, then Rep(Q) = `{generate_strict,ANNO,Rep(P),Rep(E)}`. - If Q is a bitstring generator `P <= E`, where `P` is a pattern and `E` is an expression, then Rep(Q) = `{b_generate,ANNO,Rep(P),Rep(E)}`. +- If Q is a bitstring generator `P <:= E`, where `P` is a pattern and `E` is an + expression, then Rep(Q) = `{b_generate_strict,ANNO,Rep(P),Rep(E)}`. - If Q is a map generator `P <- E`, where `P` is an association pattern `P_1 := P_2` and `E` is an expression, then Rep(Q) = `{m_generate,ANNO,Rep(P),Rep(E)}`. For Rep(P), see below. +- If Q is a map generator `P <:- E`, where `P` is an association pattern + `P_1 := P_2` and `E` is an expression, then Rep(Q) = + `{m_generate_strict,ANNO,Rep(P),Rep(E)}`. ### Bitstring Element Type Specifiers diff --git a/erts/doc/references/erl_nif.md b/erts/doc/references/erl_nif.md index e35cb882ec46..71bf2852db4b 100644 --- a/erts/doc/references/erl_nif.md +++ b/erts/doc/references/erl_nif.md @@ -617,13 +617,8 @@ calling NIF API functions. Functions exist for the following functionality: scheduler thread. If the dirty NIF is expected to be CPU-bound, its `flags` field is to be set - to `ERL_NIF_DIRTY_JOB_CPU_BOUND` or `ERL_NIF_DIRTY_JOB_IO_BOUND`. - - > #### Note {: .info } - > - > If one of the `ERL_NIF_DIRTY_JOB_*_BOUND` flags is set, and the runtime - > system has no support for dirty schedulers, the runtime system refuses to - > load the NIF library. + to `ERL_NIF_DIRTY_JOB_CPU_BOUND`. If it's expected to be I/O-bound set + `flags` to `ERL_NIF_DIRTY_JOB_IO_BOUND`. - **`ErlNifBinary`**{: #ErlNifBinary } @@ -3484,12 +3479,9 @@ long-running work into multiple regular NIF calls or to schedule a If it cannot be converted to an atom, `enif_schedule_nif` returns a `badarg` exception. -- **`flags`** - Must be set to `0` for a regular NIF. If the emulator was built - with dirty scheduler support enabled, `flags` can be set to either +- **`flags`** - Must be set to `0` for a regular NIF, `ERL_NIF_DIRTY_JOB_CPU_BOUND` if the job is expected to be CPU-bound, or - `ERL_NIF_DIRTY_JOB_IO_BOUND` for jobs that will be I/O-bound. If dirty - scheduler threads are not available in the emulator, an attempt to schedule - such a job results in a `notsup` exception. + `ERL_NIF_DIRTY_JOB_IO_BOUND` for jobs that will be I/O-bound. - **`argc` and `argv`** - Can either be the originals passed into the calling NIF, or can be values created by the calling NIF. diff --git a/erts/doc/references/erlc_cmd.md b/erts/doc/references/erlc_cmd.md index 08b73df9adc3..f62de061442f 100644 --- a/erts/doc/references/erlc_cmd.md +++ b/erts/doc/references/erlc_cmd.md @@ -63,7 +63,7 @@ The following flags are supported: containing tuples and lists must be quoted. Terms containing spaces must be quoted on all platforms. -- **`-WError`** - Makes all warnings into errors. +- **`-Werror`** - Makes all warnings into errors. - **`-W`** - Sets warning level to `Number`. Defaults to `1`. To turn off warnings, use `-W0`. diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in index 86e3f0f6509d..a35bc38d4099 100644 --- a/erts/emulator/Makefile.in +++ b/erts/emulator/Makefile.in @@ -944,7 +944,7 @@ $(OBJDIR)/%.o: nifs/$(ERLANG_OSTYPE)/%.c # included before any other directives, including other #includes. # ASMJIT_FLAGS=-DASMJIT_EMBED=1 -DASMJIT_NO_BUILDER=1 -DASMJIT_NO_DEPRECATED=1 -DASMJIT_STATIC=1 -DASMJIT_NO_FOREIGN=1 - +ASMJIT_CXXFLAGS=$(filter-out -Wformat -Wformat=2, $(CXXFLAGS)) ASMJIT_PCH_OBJ=$(TTF_DIR)/asmjit/asmjit.hpp.gch ASMJIT_PCH_SRC=$(TTF_DIR)/asmjit/asmjit.hpp @@ -960,7 +960,7 @@ $(OBJDIR)/%.o: beam/jit/$(JIT_ARCH)/%.cpp beam/jit/$(JIT_ARCH)/beam_asm.hpp $(AS $(OBJDIR)/asmjit/%.o: asmjit/%.cpp $(ASMJIT_PCH_OBJ) $(dir $@) $(V_CXX) $(ASMJIT_FLAGS) $(INCLUDES) \ - $(subst -O2, $(GEN_OPT_FLGS), $(CXXFLAGS)) \ + $(subst -O2, $(GEN_OPT_FLGS), $(ASMJIT_CXXFLAGS)) \ -include $(ASMJIT_PCH_SRC) -c $< -o $@ ## The dependency on erl_bif_info.c is in order to trigger a rebuild when @@ -1410,42 +1410,40 @@ DEPEND_DEPS=jit src drv nif sys target zlib ryu $(TTF_DIR)/src.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(BEAM_SRC) \ - | $(SED_DEPEND) > $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(BEAM_SRC) > $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ $(TTF_DIR)/drv.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) -DLIBSCTP=$(LIBSCTP) $(DRV_COMMON_SRC) \ - | $(SED_DEPEND) > $@ - $(V_at)$(DEP_CC) $(DEP_FLAGS) -I../etc/$(ERLANG_OSTYPE) $(DRV_OSTYPE_SRC) \ - | $(SED_DEPEND) >> $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) -DLIBSCTP=$(LIBSCTP) $(DRV_COMMON_SRC) > $@.tmp + $(V_at)$(DEP_CC) $(DEP_FLAGS) -I../etc/$(ERLANG_OSTYPE) $(DRV_OSTYPE_SRC) >> $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ $(TTF_DIR)/nif.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(NIF_COMMON_SRC) \ - | $(SED_DEPEND) > $@ - $(V_at)$(DEP_CC) $(DEP_FLAGS) -I../etc/$(ERLANG_OSTYPE) $(NIF_OSTYPE_SRC) \ - | $(SED_DEPEND) >> $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(NIF_COMMON_SRC) > $@.tmp + $(V_at)$(DEP_CC) $(DEP_FLAGS) -DLIBSCTP=$(LIBSCTP) -I../etc/$(ERLANG_OSTYPE) $(NIF_OSTYPE_SRC) >> $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ $(TTF_DIR)/sys.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(SYS_SRC) \ - | $(SED_DEPEND) > $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(SYS_SRC) > $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ $(TTF_DIR)/target.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(TARGET_SRC) \ - | $(SED_DEPEND) > $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(TARGET_SRC) > $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ $(TTF_DIR)/zlib.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(ZLIB_SRC) \ - | $(SED_DEPEND_ZLIB) > $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(ZLIB_SRC) > $@.tmp + $(V_at)$(SED_DEPEND_ZLIB) $@.tmp > $@ $(TTF_DIR)/ryu.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) - $(V_at)$(DEP_CC) $(DEP_FLAGS) $(RYU_SRC) \ - | $(SED_DEPEND_ZLIB) > $@ + $(V_at)$(DEP_CC) $(DEP_FLAGS) $(RYU_SRC) > $@.tmp + $(V_at)$(SED_DEPEND_ZLIB) $@.tmp > $@ $(TTF_DIR)/jit.depend.mk: $(TTF_DIR)/GENERATED $(PRELOAD_SRC) $(gen_verbose) @touch $@ ifeq ($(JIT_ENABLED),yes) - $(V_at)$(DEP_CXX) $(DEP_CXXFLAGS) $(BEAM_CPP_SRC) \ - | $(SED_DEPEND) > $@ + $(V_at)$(DEP_CXX) $(DEP_CXXFLAGS) $(BEAM_CPP_SRC) > $@.tmp + $(V_at)$(SED_DEPEND) $@.tmp > $@ endif .PHONY: depend @@ -1456,6 +1454,7 @@ else depend: $(TTF_DIR)/depend.mk $(TTF_DIR)/depend.mk: $(foreach dep, $(DEPEND_DEPS), $(TTF_DIR)/$(dep).depend.mk) $(gen_verbose) + $(V_at)rm $(TTF_DIR)/*.tmp $(V_at)echo "" > "$@" $(V_at)for dep in "$^"; do cat $$dep >> "$@"; done $(V_at)cd $(ERTS_LIB_DIR) && $(MAKE) depend diff --git a/erts/emulator/beam/atom.c b/erts/emulator/beam/atom.c index 036816df2fae..809caa40ff9d 100644 --- a/erts/emulator/beam/atom.c +++ b/erts/emulator/beam/atom.c @@ -28,6 +28,7 @@ #include "global.h" #include "hash.h" #include "atom.h" +#include "erl_global_literals.h" #define ATOM_SIZE 3000 @@ -48,19 +49,6 @@ static erts_rwmtx_t atom_table_lock; static erts_atomic_t atom_put_ops; #endif -/* Functions for allocating space for the ext of atoms. We do not - * use malloc for each atom to prevent excessive memory fragmentation - */ - -typedef struct _atom_text { - struct _atom_text* next; - unsigned char text[ATOM_TEXT_SIZE]; -} AtomText; - -static AtomText* text_list; /* List of text buffers */ -static byte *atom_text_pos; -static byte *atom_text_end; -static Uint reserved_atom_space; /* Total amount of atom text space */ static Uint atom_space; /* Amount of atom text space used */ /* @@ -81,44 +69,8 @@ void atom_info(fmtfn_t to, void *to_arg) atom_read_unlock(); } -/* - * Allocate an atom text segment. - */ -static void -more_atom_space(void) -{ - AtomText* ptr; - - ptr = (AtomText*) erts_alloc(ERTS_ALC_T_ATOM_TXT, sizeof(AtomText)); - ptr->next = text_list; - text_list = ptr; - atom_text_pos = ptr->text; - atom_text_end = atom_text_pos + ATOM_TEXT_SIZE; - reserved_atom_space += sizeof(AtomText); - - VERBOSE(DEBUG_SYSTEM,("Allocated %d atom space\n",ATOM_TEXT_SIZE)); -} - -/* - * Allocate string space within an atom text segment. - */ - -static byte* -atom_text_alloc(int bytes) -{ - byte *res; - - ASSERT(bytes <= MAX_ATOM_SZ_LIMIT); - if (atom_text_pos + bytes >= atom_text_end) { - more_atom_space(); - } - res = atom_text_pos; - atom_text_pos += bytes; - atom_space += bytes; - return res; -} /* * Calculate atom hash value (using the hash algorithm @@ -128,7 +80,7 @@ atom_text_alloc(int bytes) static HashValue atom_hash(Atom* obj) { - byte* p = obj->name; + byte* p = obj->u.name; int len = obj->len; HashValue h = 0, g; byte v; @@ -150,12 +102,23 @@ atom_hash(Atom* obj) return h; } +const byte *erts_atom_get_name(const Atom *atom) +{ + byte *name; + Uint size; + Uint offset; + ERTS_GET_BITSTRING(atom->u.bin, name, offset, size); + ASSERT(offset == 0 && (size % 8) == 0); + (void) size; + (void) offset; + return name; +} static int atom_cmp(Atom* tmpl, Atom* obj) { if (tmpl->len == obj->len && - sys_memcmp(tmpl->name, obj->name, tmpl->len) == 0) + sys_memcmp(tmpl->u.name, erts_atom_get_name(obj), tmpl->len) == 0) return 0; return 1; } @@ -164,13 +127,39 @@ atom_cmp(Atom* tmpl, Atom* obj) static Atom* atom_alloc(Atom* tmpl) { - Atom* obj = (Atom*) erts_alloc(ERTS_ALC_T_ATOM, sizeof(Atom)); + Atom *obj = (Atom*) erts_alloc(ERTS_ALC_T_ATOM, sizeof(Atom)); + + { + Eterm *hp; + Uint heap_size = 0; + ErtsHeapFactory factory; + ErlOffHeap oh; + struct erl_off_heap_header **literal_ohp; + + if (tmpl->len <= ERL_ONHEAP_BINARY_LIMIT) { + heap_size = heap_bits_size(NBITS(tmpl->len)); + } else { + heap_size = ERL_REFC_BITS_SIZE; + } - obj->name = atom_text_alloc(tmpl->len); - sys_memcpy(obj->name, tmpl->name, tmpl->len); + hp = erts_global_literal_allocate(heap_size, &literal_ohp); + ERTS_INIT_OFF_HEAP(&oh); + oh.first = *literal_ohp; + + erts_factory_static_init(&factory, hp, heap_size, &oh); + *literal_ohp = oh.first; + obj->u.bin = erts_hfact_new_binary_from_data(&factory, + 0, + tmpl->len, + tmpl->u.name); + erts_global_literal_register(&obj->u.bin); + } + obj->len = tmpl->len; obj->latin1_chars = tmpl->latin1_chars; obj->slot.index = -1; + atom_space += tmpl->len; + /* * Precompute ordinal value of first 3 bytes + 7 bits. @@ -186,7 +175,7 @@ atom_alloc(Atom* tmpl) j = (tmpl->len < 4) ? tmpl->len : 4; for(i = 0; i < j; ++i) - c[i] = tmpl->name[i]; + c[i] = tmpl->u.name[i]; for(; i < 4; ++i) c[i] = '\0'; obj->ord0 = (c[0] << 23) + (c[1] << 15) + (c[2] << 7) + (c[3] >> 1); @@ -293,7 +282,7 @@ erts_atom_put_index(const byte *name, Sint len, ErtsAtomEncoding enc, int trunc) } a.len = tlen; - a.name = (byte *) text; + a.u.name = (byte *) text; atom_read_lock(); aix = index_get(&erts_atom_table, (void*) &a); atom_read_unlock(); @@ -333,7 +322,7 @@ erts_atom_put_index(const byte *name, Sint len, ErtsAtomEncoding enc, int trunc) a.len = tlen; a.latin1_chars = (Sint16) no_latin1_chars; - a.name = (byte *) text; + a.u.name = (byte *) text; atom_write_lock(); aix = index_put(&erts_atom_table, (void*) &a); atom_write_unlock(); @@ -400,7 +389,7 @@ erts_atom_get(const char *name, Uint len, Eterm* ap, ErtsAtomEncoding enc) latin1_to_utf8(utf8_copy, sizeof(utf8_copy), (const byte**)&name, &len); - a.name = (byte*)name; + a.u.name = (byte*)name; a.len = (Sint16)len; break; case ERTS_ATOM_ENC_7BIT_ASCII: @@ -415,7 +404,7 @@ erts_atom_get(const char *name, Uint len, Eterm* ap, ErtsAtomEncoding enc) } a.len = (Sint16)len; - a.name = (byte*)name; + a.u.name = (byte*)name; break; case ERTS_ATOM_ENC_UTF8: if (len > MAX_ATOM_SZ_LIMIT) { @@ -427,7 +416,7 @@ erts_atom_get(const char *name, Uint len, Eterm* ap, ErtsAtomEncoding enc) * name will fail. */ a.len = (Sint16)len; - a.name = (byte*)name; + a.u.name = (byte*)name; break; } @@ -446,7 +435,7 @@ erts_atom_get_text_space_sizes(Uint *reserved, Uint *used) if (lock) atom_read_lock(); if (reserved) - *reserved = reserved_atom_space; + *reserved = atom_space; if (used) *used = atom_space; if (lock) @@ -479,33 +468,28 @@ init_atom_table(void) f.meta_free = (HMFREE_FUN) erts_free; f.meta_print = (HMPRINT_FUN) erts_print; - atom_text_pos = NULL; - atom_text_end = NULL; - reserved_atom_space = 0; - atom_space = 0; - text_list = NULL; - erts_index_init(ERTS_ALC_T_ATOM_TABLE, &erts_atom_table, "atom_tab", ATOM_SIZE, erts_atom_table_size, f); - more_atom_space(); - /* Ordinary atoms */ + /* Ordinary atoms. a is a template for creating an entry in the atom table */ for (i = 0; erl_atom_names[i] != 0; i++) { int ix; a.len = sys_strlen(erl_atom_names[i]); a.latin1_chars = a.len; - a.name = (byte*)erl_atom_names[i]; + a.u.name = (byte*)erl_atom_names[i]; a.slot.index = i; + + #ifdef DEBUG /* Verify 7-bit ascii */ for (ix = 0; ix < a.len; ix++) { - ASSERT((a.name[ix] & 0x80) == 0); + ASSERT((a.u.name[ix] & 0x80) == 0); } #endif ix = index_put(&erts_atom_table, (void*) &a); - atom_text_pos -= a.len; - atom_space -= a.len; - atom_tab(ix)->name = (byte*)erl_atom_names[i]; + (void) ix; + /* Assert that the entry in the atom table is not a template */ + ASSERT(erts_atom_get_name(atom_tab(ix))); } } diff --git a/erts/emulator/beam/atom.h b/erts/emulator/beam/atom.h index 681bd4586f06..ff05bc35d2cf 100644 --- a/erts/emulator/beam/atom.h +++ b/erts/emulator/beam/atom.h @@ -50,7 +50,10 @@ typedef struct atom { Sint16 len; /* length of atom name (UTF-8 encoded) */ Sint16 latin1_chars; /* 0-255 if atom can be encoded in latin1; otherwise, -1 */ int ord0; /* ordinal value of first 3 bytes + 7 bits */ - byte* name; /* name of atom */ + union{ + byte* name; /* name of atom, used by templates */ + Eterm bin; /* name of atom, used when atom is in table*/ + } u; } Atom; extern IndexTable erts_atom_table; @@ -59,6 +62,8 @@ ERTS_GLB_INLINE Atom* atom_tab(Uint i); ERTS_GLB_INLINE int erts_is_atom_utf8_bytes(byte *text, size_t len, Eterm term); ERTS_GLB_INLINE int erts_is_atom_str(const char *str, Eterm term, int is_latin1); +const byte *erts_atom_get_name(const Atom *atom); + #if ERTS_GLB_INLINE_INCL_FUNC_DEF ERTS_GLB_INLINE Atom* atom_tab(Uint i) @@ -73,7 +78,7 @@ ERTS_GLB_INLINE int erts_is_atom_utf8_bytes(byte *text, size_t len, Eterm term) return 0; a = atom_tab(atom_val(term)); return (len == (size_t) a->len - && sys_memcmp((void *) a->name, (void *) text, len) == 0); + && sys_memcmp((void *) erts_atom_get_name(a), (void *) text, len) == 0); } ERTS_GLB_INLINE int erts_is_atom_str(const char *str, Eterm term, int is_latin1) @@ -87,7 +92,7 @@ ERTS_GLB_INLINE int erts_is_atom_str(const char *str, Eterm term, int is_latin1) return 0; a = atom_tab(atom_val(term)); len = a->len; - aname = a->name; + aname = erts_atom_get_name(a); if (is_latin1) { for (i = 0; i < len; s++) { if (aname[i] < 0x80) { diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names index 758c84d1c1d7..b017300f4a5e 100644 --- a/erts/emulator/beam/atom.names +++ b/erts/emulator/beam/atom.names @@ -673,7 +673,10 @@ atom sigstop atom sigint atom sigsegv atom sigtstp +atom sigcont atom sigquit +atom sigwinch +atom siginfo atom silent atom size atom skip diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index 0c2089038a28..59bb67ebc6a4 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -1762,8 +1762,9 @@ erts_purge_state_add_fun(ErlFunEntry *fe) purge_state.funs[purge_state.fe_count++] = fe; } -Export * -erts_suspend_process_on_pending_purge_lambda(Process *c_p, ErlFunEntry* fe) +const Export * +erts_suspend_process_on_pending_purge_lambda(Process *c_p, + const ErlFunEntry* fe) { erts_mtx_lock(&purge_state.mtx); if (purge_state.module == fe->module) { diff --git a/erts/emulator/beam/beam_bp.c b/erts/emulator/beam/beam_bp.c index 294fa6c7ca2a..d2481ca93052 100644 --- a/erts/emulator/beam/beam_bp.c +++ b/erts/emulator/beam/beam_bp.c @@ -63,8 +63,6 @@ #define ERTS_BPF_ALL 0x3FF -erts_atomic32_t erts_active_bp_index; -erts_atomic32_t erts_staging_bp_index; erts_mtx_t erts_dirty_bp_ix_mtx; ErtsTraceSession* erts_staging_trace_session; @@ -223,12 +221,15 @@ erts_bp_match_functions(BpFunctions* f, ErtsCodeMFA *mfa, int specified) case 3: if (ci->mfa.arity != mfa->arity) continue; + ERTS_FALLTHROUGH(); case 2: if (ci->mfa.function != mfa->function) continue; + ERTS_FALLTHROUGH(); case 1: if (ci->mfa.module != mfa->module) continue; + ERTS_FALLTHROUGH(); case 0: break; } @@ -261,12 +262,15 @@ erts_bp_match_export(BpFunctions* f, ErtsCodeMFA *mfa, int specified) case 3: if (mfa->arity != ep->info.mfa.arity) continue; + ERTS_FALLTHROUGH(); case 2: if (mfa->function != ep->info.mfa.function) continue; + ERTS_FALLTHROUGH(); case 1: if (mfa->module != ep->info.mfa.module) continue; + ERTS_FALLTHROUGH(); case 0: break; default: diff --git a/erts/emulator/beam/beam_bp.h b/erts/emulator/beam/beam_bp.h index 3e8bca39c35f..46acd9dc38f3 100644 --- a/erts/emulator/beam/beam_bp.h +++ b/erts/emulator/beam/beam_bp.h @@ -80,8 +80,6 @@ typedef struct GenericBpData { BpDataCallTrace* memory; /* For memory trace */ } GenericBpData; -#define ERTS_NUM_BP_IX 2 - typedef struct GenericBp { BeamInstr orig_instr; GenericBpData data[ERTS_NUM_BP_IX]; @@ -108,8 +106,6 @@ enum erts_break_op{ ERTS_BREAK_PAUSE }; -typedef Uint32 ErtsBpIndex; - typedef struct { const ErtsCodeInfo *code_info; Module* mod; @@ -195,9 +191,6 @@ const ErtsCodeInfo *erts_find_local_func(const ErtsCodeMFA *mfa); #if ERTS_GLB_INLINE_INCL_FUNC_DEF -extern erts_atomic32_t erts_active_bp_index; -extern erts_atomic32_t erts_staging_bp_index; - ERTS_GLB_INLINE ErtsBpIndex erts_active_bp_ix(void) { return erts_atomic32_read_nob(&erts_active_bp_index); diff --git a/erts/emulator/beam/beam_code.h b/erts/emulator/beam/beam_code.h index d1fe4a8823e3..456d3cf2e840 100644 --- a/erts/emulator/beam/beam_code.h +++ b/erts/emulator/beam/beam_code.h @@ -145,8 +145,9 @@ void erts_release_literal_area(struct ErtsLiteralArea_* literal_area); struct erl_fun_entry; void erts_purge_state_add_fun(struct erl_fun_entry *fe); -Export *erts_suspend_process_on_pending_purge_lambda(Process *c_p, - struct erl_fun_entry*); +const Export * +erts_suspend_process_on_pending_purge_lambda(Process *c_p, + const struct erl_fun_entry*); /* * MFA event debug "tracing" usage: diff --git a/erts/emulator/beam/beam_common.c b/erts/emulator/beam/beam_common.c index 4d3af9e944fc..bc25fb280c9c 100644 --- a/erts/emulator/beam/beam_common.c +++ b/erts/emulator/beam/beam_common.c @@ -1285,11 +1285,13 @@ build_stacktrace(Process* c_p, Eterm exc) { return res; } -Export* -call_error_handler(Process* p, const ErtsCodeMFA *mfa, Eterm* reg, Eterm func) +const Export *call_error_handler(Process* p, + const ErtsCodeMFA *mfa, + Eterm* reg, + Eterm func) { + const Export* ep; Eterm* hp; - Export* ep; int arity; Eterm args; Uint sz; @@ -1333,10 +1335,10 @@ call_error_handler(Process* p, const ErtsCodeMFA *mfa, Eterm* reg, Eterm func) return ep; } -static Export* +static const Export * apply_setup_error_handler(Process* p, Eterm module, Eterm function, Uint arity, Eterm* reg) { - Export* ep; + const Export *ep; /* * Find the export table index for the error handler. Return NULL if @@ -1374,7 +1376,7 @@ apply_setup_error_handler(Process* p, Eterm module, Eterm function, Uint arity, } static ERTS_INLINE void -apply_bif_error_adjustment(Process *p, Export *ep, +apply_bif_error_adjustment(Process *p, const Export *ep, Eterm *reg, Uint arity, ErtsCodePtr I, Uint stack_offset) { @@ -1462,11 +1464,11 @@ apply_bif_error_adjustment(Process *p, Export *ep, } } -Export* +const Export * apply(Process* p, Eterm* reg, ErtsCodePtr I, Uint stack_offset) { + const Export *ep; int arity; - Export* ep; Eterm tmp; Eterm module = reg[0]; Eterm function = reg[1]; @@ -1562,11 +1564,11 @@ apply(Process* p, Eterm* reg, ErtsCodePtr I, Uint stack_offset) return ep; } -Export* +const Export * fixed_apply(Process* p, Eterm* reg, Uint arity, ErtsCodePtr I, Uint stack_offset) { - Export* ep; + const Export *ep; Eterm module; Eterm function; @@ -1743,12 +1745,7 @@ call_fun(Process* p, /* Current process. */ if (ERTS_LIKELY(code_ptr != beam_unloaded_fun && fun_arity(funp) == arity)) { - /* Copy the free variables, skipping the FunRef in the environment. - * - * Note that we avoid using fun_num_free as it asserts that the - * argument is a local function, which we don't need to care about - * here. */ - for (int i = 0, num_free = fun_env_size(funp) - 1; i < num_free; i++) { + for (int i = 0; i < fun_num_free(funp); i++) { reg[i + arity] = funp->env[i]; } @@ -1793,10 +1790,10 @@ call_fun(Process* p, /* Current process. */ p->fvalue = TUPLE2(hp, fun, args); return NULL; } else { - ErlFunEntry *fe; + const ErlFunEntry *fe; + const Export *ep; Eterm module; Module *modp; - Export *ep; /* There is no module loaded that defines the fun, either because * the fun is newly created from the external representation (the @@ -2478,8 +2475,8 @@ int catchlevel(Process *p) int erts_is_builtin(Eterm Mod, Eterm Name, int arity) { + const Export *ep; Export e; - Export* ep; if (Mod == am_erlang) { /* diff --git a/erts/emulator/beam/beam_common.h b/erts/emulator/beam/beam_common.h index 3c93d580a650..78711ef2c7fd 100644 --- a/erts/emulator/beam/beam_common.h +++ b/erts/emulator/beam/beam_common.h @@ -250,11 +250,11 @@ do { \ ErtsCodeMFA *ubif2mfa(void* uf); ErtsCodePtr handle_error(Process* c_p, ErtsCodePtr pc, Eterm* reg, const ErtsCodeMFA* bif_mfa); -Export* call_error_handler(Process* p, const ErtsCodeMFA* mfa, +const Export *call_error_handler(Process* p, const ErtsCodeMFA* mfa, Eterm* reg, Eterm func); -Export* fixed_apply(Process* p, Eterm* reg, Uint arity, +const Export *fixed_apply(Process* p, Eterm* reg, Uint arity, ErtsCodePtr I, Uint offs); -Export* apply(Process* p, Eterm* reg, ErtsCodePtr I, Uint offs); +const Export *apply(Process* p, Eterm* reg, ErtsCodePtr I, Uint offs); ErtsCodePtr call_fun(Process* p, int arity, Eterm* reg, Eterm args); ErtsCodePtr apply_fun(Process* p, Eterm fun, Eterm args, Eterm* reg); int is_function2(Eterm Term, Uint arity); diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c index 8bbb99c54488..62a252a9d40c 100644 --- a/erts/emulator/beam/beam_debug.c +++ b/erts/emulator/beam/beam_debug.c @@ -346,10 +346,10 @@ erts_debug_disassemble_1(BIF_ALIST_1) } } else if (is_tuple(addr)) { ErtsCodeIndex code_ix; + const Export *ep; Module* modp; Eterm mod; Eterm name; - Export* ep; Sint arity; int n; @@ -690,15 +690,6 @@ print_op(fmtfn_t to, void *to_arg, int op, int size, BeamInstr* addr) print_byte_string(to, to_arg, str, bytes); } break; - case op_bs_put_string_WW: - if (ap - first_arg == 0) { - erts_print(to, to_arg, "%d", *ap); - } else { - Uint bytes = ap[-1]; - byte* str = (byte *) ap[0]; - print_byte_string(to, to_arg, str, bytes); - } - break; default: #ifdef ARCH_64 erts_print(to, to_arg, "%ld", *ap); diff --git a/erts/emulator/beam/beam_file.c b/erts/emulator/beam/beam_file.c index 58e7e722fb2a..998391651ea6 100644 --- a/erts/emulator/beam/beam_file.c +++ b/erts/emulator/beam/beam_file.c @@ -241,6 +241,7 @@ static int parse_atom_chunk(BeamFile *beam, BeamReader reader; Sint32 count; int i; + bool long_counts = false; ASSERT(beam->atoms.entries == NULL); atoms = &beam->atoms; @@ -248,6 +249,10 @@ static int parse_atom_chunk(BeamFile *beam, beamreader_init(chunk->data, chunk->size, &reader); LoadAssert(beamreader_read_i32(&reader, &count)); + if (count < 0) { + long_counts = true; + count = -count; + } LoadAssert(CHECK_ITEM_COUNT(count, 1, sizeof(atoms->entries[0]))); /* Reserve a slot for the empty list, which is encoded as atom 0 as we @@ -264,12 +269,21 @@ static int parse_atom_chunk(BeamFile *beam, for (i = 1; i < count; i++) { const byte *string; - byte length; Eterm atom; + Uint length; - LoadAssert(beamreader_read_u8(&reader, &length)); - LoadAssert(beamreader_read_bytes(&reader, length, &string)); + if (long_counts) { + TaggedNumber len; + LoadAssert(beamreader_read_tagged(&reader, &len)); + LoadAssert(len.size == 0); + length = (Uint) len.word_value; + } else { + byte len; + LoadAssert(beamreader_read_u8(&reader, &len)); + length = len; + } + LoadAssert(beamreader_read_bytes(&reader, length, &string)); atom = erts_atom_put(string, length, ERTS_ATOM_ENC_UTF8, 1); LoadAssert(atom != THE_NON_VALUE); @@ -522,7 +536,7 @@ static int parse_line_chunk(BeamFile *beam, IFF_Chunk *chunk) { Eterm name, suffix; Eterm *hp; - suffix = erts_get_global_literal(ERTS_LIT_ERL_FILE_SUFFIX); + suffix = ERTS_GLOBAL_LIT_ERL_FILE_SUFFIX; hp = name_heap; name = erts_atom_to_string(&hp, beam->module, suffix); @@ -678,7 +692,7 @@ static void free_literal_fragment(ErlHeapFragment *fragment) { } static int parse_decompressed_literals(BeamFile *beam, - byte *data, + const byte *data, uLongf size) { BeamFile_LiteralTable *literals; BeamFile_LiteralEntry *entries; @@ -779,8 +793,6 @@ static int parse_literal_chunk(BeamFile *beam, IFF_Chunk *chunk) { BeamReader reader; Sint32 compressed_size, uncompressed_size; - uLongf uncompressed_size_z; - byte *uncompressed_data; int success; beamreader_init(chunk->data, chunk->size, &reader); @@ -789,20 +801,31 @@ static int parse_literal_chunk(BeamFile *beam, IFF_Chunk *chunk) { LoadAssert(beamreader_read_i32(&reader, &uncompressed_size)); LoadAssert(compressed_size >= 0); - uncompressed_size_z = uncompressed_size; - uncompressed_data = erts_alloc(ERTS_ALC_T_TMP, uncompressed_size); success = 0; - if (erl_zlib_uncompress(uncompressed_data, - &uncompressed_size_z, - reader.head, - compressed_size) == Z_OK) { + if (uncompressed_size == 0) { + /* Erlang/OTP 28 and later. The literal table is not + * compressed. */ success = parse_decompressed_literals(beam, - uncompressed_data, - uncompressed_size_z); + reader.head, + reader.end - reader.head); + } else { + byte *uncompressed_data; + uLongf uncompressed_size_z; + + uncompressed_size_z = uncompressed_size; + uncompressed_data = erts_alloc(ERTS_ALC_T_TMP, uncompressed_size); + if (erl_zlib_uncompress(uncompressed_data, + &uncompressed_size_z, + reader.head, + compressed_size) == Z_OK) { + success = parse_decompressed_literals(beam, + uncompressed_data, + uncompressed_size_z); + } + erts_free(ERTS_ALC_T_TMP, (void*)uncompressed_data); } - erts_free(ERTS_ALC_T_TMP, (void*)uncompressed_data); return success; } @@ -1312,11 +1335,13 @@ int iff_read_chunk(IFF_File *iff, Uint id, IFF_Chunk *chunk) void beamfile_init(void) { Eterm suffix; Eterm *hp; + struct erl_off_heap_header **ohp; - hp = erts_alloc_global_literal(ERTS_LIT_ERL_FILE_SUFFIX, 8); + hp = erts_global_literal_allocate(8, &ohp); suffix = erts_bin_bytes_to_list(NIL, hp, (byte*)".erl", 4, 0); - erts_register_global_literal(ERTS_LIT_ERL_FILE_SUFFIX, suffix); + erts_global_literal_register(&suffix); + ERTS_GLOBAL_LIT_ERL_FILE_SUFFIX = suffix; } /* * * * * * * */ @@ -1511,11 +1536,8 @@ static int marshal_allocation_list(BeamReader *reader, Sint *res) { sum += FLOAT_SIZE_OBJECT * number; break; case 2: - LoadAssert(sum <= (ERTS_SINT32_MAX - (ERL_FUN_SIZE + 1) * number)); - - /* This is always a local fun, so we need to add one word to - * reserve space for its `FunRef`. */ - sum += (ERL_FUN_SIZE + 1) * number; + LoadAssert(sum <= (ERTS_SINT32_MAX - ERL_FUN_SIZE * number)); + sum += ERL_FUN_SIZE * number; break; default: LoadError("Invalid allocation tag"); diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 543ed9f0177c..76fbf19a19d0 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -194,8 +194,13 @@ erts_prepare_loading(Binary* magic, Process *c_p, Eterm group_leader, * * We know that because OTP 23/24/25/26 artifically set the * highest used op code to the op code for the `swap` - * instruction introduced in OTP 23. (OTP 27 artificially sets - * the highest op code to `make_fun3` introduced in OTP 24.) + * instruction introduced in OTP 23. + * + * OTP 27 artificially sets the highest op code to `make_fun3` + * introduced in OTP 24. + * + * OTP 28 artificially sets the highest op code to `bs_create_bin` + * introduced in OTP 25. * * Old BEAM files produced by OTP R12 and earlier may be * incompatible with the current runtime system. We used to @@ -207,7 +212,7 @@ erts_prepare_loading(Binary* magic, Process *c_p, Eterm group_leader, "This BEAM file was compiled for an old version of " "the runtime system.\n" " To fix this, please re-compile this module with " - "Erlang/OTP 24 or later.\n"); + "Erlang/OTP 25 or later.\n"); } if (!load_code(stp)) { @@ -499,6 +504,8 @@ static int load_code(LoaderState* stp) int specific, arity, arg, i; Uint32 mask[3] = {0, 0, 0}; + ERTS_UNDEF(arity, 0); /* Suppress warning. */ + if (num_specific != 0) { /* The `bs_append` instruction made obsolete in * Erlang/OTP 28 has 8 operands. Therefore, the if @@ -674,24 +681,6 @@ erts_release_literal_area(ErtsLiteralArea* literal_area) erts_bin_release(bin); break; } - case FUN_REF_SUBTAG: - { - ErlFunEntry* fe = ((FunRef*)oh)->entry; - - /* All fun entries are NULL during module loading, before the - * code is finalized, so we need to tolerate it to avoid - * crashing in the prepared code destructor. - * - * Strictly speaking it would be nice to crash when we see this - * outside of loading, but it's too complicated to keep track - * of whether we are. */ - if (fe != NULL) { - if (erts_refc_dectest(&fe->refc, 0) == 0) { - erts_erase_fun_entry(fe); - } - } - break; - } case REF_SUBTAG: { ErtsMagicBinary *bptr; diff --git a/erts/emulator/beam/beam_types.h b/erts/emulator/beam/beam_types.h index 84368462c55b..3d69fd0ce8b4 100644 --- a/erts/emulator/beam/beam_types.h +++ b/erts/emulator/beam/beam_types.h @@ -22,7 +22,7 @@ * @description Basic type representation for BEAM instruction operands. * @file beam_types.h * - * While the compiler is good eliminating redundant type tests and simplifying + * While the compiler is good at eliminating redundant type tests and simplifying * instructions, we're limited by the available instructions and it's not * always worthwhile to add new variants. * diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index 0086c33eb3b1..a32186da8a40 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -2930,10 +2930,10 @@ BIF_RETTYPE atom_to_list_1(BIF_ALIST_1) BIF_RET(NIL); /* the empty atom */ ares = - erts_analyze_utf8(ap->name, ap->len, &err_pos, &num_chars, NULL); + erts_analyze_utf8(erts_atom_get_name(ap), ap->len, &err_pos, &num_chars, NULL); ASSERT(ares == ERTS_UTF8_OK); (void)ares; - res = erts_utf8_to_list(BIF_P, num_chars, ap->name, ap->len, ap->len, + res = erts_utf8_to_list(BIF_P, num_chars, erts_atom_get_name(ap), ap->len, ap->len, &num_built, &num_eaten, NIL); ASSERT(num_built == num_chars); ASSERT(num_eaten == ap->len); @@ -3296,6 +3296,7 @@ BIF_RETTYPE string_list_to_float_1(BIF_ALIST_1) break; case EXP0: /* example: "2.3e--" */ LOAD_E(i, i_mem, list, list_mem); + ERTS_FALLTHROUGH(); default: /* unexpected - done */ part = END; } @@ -3309,6 +3310,7 @@ BIF_RETTYPE string_list_to_float_1(BIF_ALIST_1) break; case EXP0: /* example: "2.3e++" */ LOAD_E(i, i_mem, list, list_mem); + ERTS_FALLTHROUGH(); default: /* unexpected - done */ part = END; } @@ -3319,8 +3321,10 @@ BIF_RETTYPE string_list_to_float_1(BIF_ALIST_1) break; case EXP_SIGN: /* example: "2.3e." */ LOAD_E(i, i_mem, list, list_mem); + ERTS_FALLTHROUGH(); case EXP0: /* example: "2.3e+." */ LOAD_E(i, i_mem, list, list_mem); + ERTS_FALLTHROUGH(); default: /* unexpected - done */ part = END; } @@ -3337,6 +3341,7 @@ BIF_RETTYPE string_list_to_float_1(BIF_ALIST_1) case EXP0: /* example: "2.3e+e" */ case EXP_SIGN: /* example: "2.3ee" */ LOAD_E(i, i_mem, list, list_mem); + ERTS_FALLTHROUGH(); case INT: /* would like this to be ok, example "2e2", but it's not compatible with list_to_float */ default: /* unexpected - done */ diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab index 798a7418d749..c7aa2bff1c78 100644 --- a/erts/emulator/beam/bif.tab +++ b/erts/emulator/beam/bif.tab @@ -84,7 +84,7 @@ ubif erlang:hd/1 bif erlang:integer_to_list/1 ubif erlang:length/1 bif erlang:link/1 -bif erlang:list_to_atom/1 +ubif erlang:list_to_atom/1 bif erlang:list_to_binary/1 bif erlang:list_to_float/1 bif erlang:list_to_pid/1 @@ -262,10 +262,6 @@ bif erlang:make_tuple/3 bif erlang:system_flag/2 bif erlang:system_info/1 -# New in R9C -bif erlang:system_monitor/0 -bif erlang:system_monitor/1 -bif erlang:system_monitor/2 # Added 2006-11-07 bif erlang:system_profile/2 # End Added 2006-11-07 @@ -482,7 +478,7 @@ bif string:list_to_float/1 bif erlang:make_fun/3 bif erlang:iolist_size/1 bif erlang:iolist_to_binary/1 -bif erlang:list_to_existing_atom/1 +ubif erlang:list_to_existing_atom/1 # # New Bifs in R12B-0 @@ -514,8 +510,8 @@ bif unicode:bin_is_7bit/1 # New Bifs in R13A. # bif erlang:atom_to_binary/2 -bif erlang:binary_to_atom/2 -bif erlang:binary_to_existing_atom/2 +ubif erlang:binary_to_atom/2 +ubif erlang:binary_to_existing_atom/2 bif net_kernel:dflag_unicode_io/1 # # New Bifs in R13B-1 @@ -805,3 +801,9 @@ bif erts_internal:trace_pattern/4 bif erts_internal:trace_info/3 bif erts_trace_cleaner:check/0 bif erts_trace_cleaner:send_trace_clean_signal/1 + +# +# New in 28 +# +bif erts_internal:system_monitor/1 +bif erts_internal:system_monitor/3 diff --git a/erts/emulator/beam/break.c b/erts/emulator/beam/break.c index ad6f48445fb3..561d1d147cfb 100644 --- a/erts/emulator/beam/break.c +++ b/erts/emulator/beam/break.c @@ -127,32 +127,28 @@ process_killer(void) for (i = max-1; i >= 0; i--) { rp = erts_pix2proc(i); if (rp && rp->i != ENULL) { - int br; print_process_info(ERTS_PRINT_STDOUT, NULL, rp, 0); erts_printf("(k)ill (n)ext (r)eturn:\n"); - while(1) { - if ((j = sys_get_key(0)) <= 0) - erts_exit(0, ""); - switch(j) { - case 'k': - { - Process *init_proc; - - ASSERT(erts_init_process_id != ERTS_INVALID_PID); - init_proc = erts_proc_lookup_raw(erts_init_process_id); - - /* Send a 'kill' exit signal from init process */ - erts_proc_sig_send_exit(&init_proc->common, - erts_init_process_id, - rp->common.id, - am_kill, NIL, 0); - } - case 'n': br = 1; break; - case 'r': return; - default: return; - } - if (br == 1) break; - } + if ((j = sys_get_key(0)) <= 0) + erts_exit(0, ""); + switch(j) { + case 'k': + { + Process *init_proc; + + ASSERT(erts_init_process_id != ERTS_INVALID_PID); + init_proc = erts_proc_lookup_raw(erts_init_process_id); + + /* Send a 'kill' exit signal from init process */ + erts_proc_sig_send_exit(&init_proc->common, + erts_init_process_id, + rp->common.id, + am_kill, NIL, 0); + break; + } + case 'n': break; + default: return; + } } } } @@ -608,12 +604,12 @@ do_break(void) case '*': /* * The asterisk is an read error on windows, * where sys_get_key isn't that great in console mode. - * The usual reason for a read error is Ctrl-C. Treat this as + * The usual reason for a read error is Ctrl+C. Treat this as * 'a' to avoid infinite loop. */ erts_exit(0, ""); case 'A': /* Halt generating crash dump */ - erts_exit(ERTS_ERROR_EXIT, "Crash dump requested by user"); + erts_exit(ERTS_ERROR_EXIT, "Crash dump requested by user\n"); case 'c': return; case 'p': @@ -639,7 +635,7 @@ do_break(void) distribution_info(ERTS_PRINT_STDOUT, NULL); return; case 'D': - db_info(ERTS_PRINT_STDOUT, NULL, 1); + db_info(ERTS_PRINT_STDOUT, NULL, true); return; case 'k': process_killer(); @@ -1030,7 +1026,7 @@ erl_crash_dump_v(char *file, int line, const char* fmt, va_list args) info(to, to_arg); /* General system info */ if (erts_ptab_initialized(&erts_proc)) process_info(to, to_arg); /* Info about each process and port */ - db_info(to, to_arg, 0); + db_info(to, to_arg, false); erts_print_bif_timer_info(to, to_arg); distribution_info(to, to_arg); erts_cbprintf(to, to_arg, "=loaded_modules\n"); diff --git a/erts/emulator/beam/code_ix.c b/erts/emulator/beam/code_ix.c index e46ede484657..823cf8f8d85a 100644 --- a/erts/emulator/beam/code_ix.c +++ b/erts/emulator/beam/code_ix.c @@ -119,14 +119,25 @@ void erts_end_staging_code_ix(void) void erts_commit_staging_code_ix(void) { + /* We need these locks as we are about to make the next code index + * active. */ + extern void export_staged_write_lock(void); + extern void export_staged_write_unlock(void); + extern void fun_staged_write_lock(void); + extern void fun_staged_write_unlock(void); ErtsCodeIndex ix; - /* We need to this lock as we are now making the staging export table active */ - export_staging_lock(); - ix = erts_staging_code_ix(); - erts_atomic32_set_nob(&the_active_code_index, ix); - ix = (ix + 1) % ERTS_NUM_CODE_IX; - erts_atomic32_set_nob(&the_staging_code_index, ix); - export_staging_unlock(); + + export_staged_write_lock(); + fun_staged_write_lock(); + { + ix = erts_staging_code_ix(); + erts_atomic32_set_nob(&the_active_code_index, ix); + ix = (ix + 1) % ERTS_NUM_CODE_IX; + erts_atomic32_set_nob(&the_staging_code_index, ix); + } + fun_staged_write_unlock(); + export_staged_write_unlock(); + erts_tracer_nif_clear(); CIX_TRACE("activate"); } diff --git a/erts/emulator/beam/copy.c b/erts/emulator/beam/copy.c index 8284a5c8a283..df6b37c8762e 100644 --- a/erts/emulator/beam/copy.c +++ b/erts/emulator/beam/copy.c @@ -143,24 +143,21 @@ Uint size_object_x(Eterm obj, erts_literal_area_t *litopt) } obj = *++ptr; break; - case FUN_REF_SUBTAG: - sum += ERL_FUN_REF_SIZE; - goto pop_next; case FUN_SUBTAG: { const ErlFunThing* funp = (ErlFunThing*)fun_val(obj); ASSERT(ERL_FUN_SIZE == (1 + thing_arityval(hdr))); - sum += ERL_FUN_SIZE + fun_env_size(funp); + sum += ERL_FUN_SIZE + fun_num_free(funp); - for (int i = 1; i < fun_env_size(funp); i++) { + for (int i = 1; i < fun_num_free(funp); i++) { obj = funp->env[i]; if (!IS_CONST(obj)) { ESTACK_PUSH(s, obj); } } - if (fun_env_size(funp) > 0) { + if (fun_num_free(funp) > 0) { obj = funp->env[0]; break; } @@ -396,16 +393,13 @@ Uint size_shared(Eterm obj) } goto pop_next; } - case FUN_REF_SUBTAG: - sum += ERL_FUN_REF_SIZE; - goto pop_next; case FUN_SUBTAG: { const ErlFunThing* funp = (ErlFunThing *) ptr; ASSERT(ERL_FUN_SIZE == (1 + thing_arityval(hdr))); - sum += ERL_FUN_SIZE + fun_env_size(funp); + sum += ERL_FUN_SIZE + fun_num_free(funp); - for (int i = 0; i < fun_env_size(funp); i++) { + for (int i = 0; i < fun_num_free(funp); i++) { obj = funp->env[i]; if (!IS_CONST(obj)) { EQUEUE_PUT(s, obj); @@ -561,7 +555,7 @@ Uint size_shared(Eterm obj) case FUN_SUBTAG: { const ErlFunThing *funp = (ErlFunThing *) ptr; - for (int i = 0; i < fun_env_size(funp); i++) { + for (int i = 0; i < fun_num_free(funp); i++) { obj = funp->env[i]; if (!IS_CONST(obj)) { EQUEUE_PUT_UNCHECKED(s, obj); @@ -846,33 +840,6 @@ Eterm copy_struct_x(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap, } } break; - case FUN_REF_SUBTAG: - { - const FunRef *src_ref = (const FunRef *)objp; - FunRef *dst_ref; - - hbot -= ERL_FUN_REF_SIZE; - dst_ref = (FunRef *)hbot; - - dst_ref->thing_word = HEADER_FUN_REF; - dst_ref->entry = src_ref->entry; - - dst_ref->next = off_heap->first; - off_heap->first = (struct erl_off_heap_header*)dst_ref; - - /* All fun entries are NULL during module loading, before - * the code is finalized. - * - * Strictly speaking it would be nice to crash when we see - * this outside of loading, but it's too complicated to - * keep track of whether we are. */ - if (dst_ref->entry != NULL) { - erts_refc_inc(&(dst_ref->entry)->refc, 2); - } - - *argp = make_boxed((Eterm*)dst_ref); - } - break; case FUN_SUBTAG: { const ErlFunThing *src_fun = (const ErlFunThing *)objp; @@ -880,12 +847,12 @@ Eterm copy_struct_x(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap, *dst_fun = *src_fun; - for (int i = 0; i < fun_env_size(dst_fun); i++) { + for (int i = 0; i < fun_num_free(dst_fun); i++) { dst_fun->env[i] = src_fun->env[i]; } ASSERT(&htop[ERL_FUN_SIZE] == &dst_fun->env[0]); - htop = &dst_fun->env[fun_env_size(dst_fun)]; + htop = &dst_fun->env[fun_num_free(dst_fun)]; *argp = make_fun(dst_fun); } break; @@ -931,6 +898,7 @@ Eterm copy_struct_x(Eterm obj, Uint sz, Eterm** hpp, ErlOffHeap* off_heap, case MAP_HEADER_TAG_HAMT_HEAD_BITMAP : case MAP_HEADER_TAG_HAMT_HEAD_ARRAY : *htop++ = *objp++; + ERTS_FALLTHROUGH(); case MAP_HEADER_TAG_HAMT_NODE_BITMAP : i = 1 + hashmap_bitcount(MAP_HEADER_VAL(hdr)); while (i--) { *htop++ = *objp++; } @@ -1263,9 +1231,9 @@ Uint copy_shared_calculate(Eterm obj, erts_shcopy_t *info) const ErlFunThing* funp = (ErlFunThing *) ptr; ASSERT(ERL_FUN_SIZE == (1 + thing_arityval(hdr))); - sum += ERL_FUN_SIZE + fun_env_size(funp); + sum += ERL_FUN_SIZE + fun_num_free(funp); - for (int i = 0; i < fun_env_size(funp); i++) { + for (int i = 0; i < fun_num_free(funp); i++) { obj = funp->env[i]; if (!IS_CONST(obj)) { EQUEUE_PUT(s, obj); @@ -1584,22 +1552,6 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info, } goto cleanup_next; } - case FUN_REF_SUBTAG: - { - const FunRef *src_ref = (const FunRef *)ptr; - FunRef *dst_ref = (FunRef *)hp; - - dst_ref->thing_word = HEADER_FUN_REF; - dst_ref->entry = src_ref->entry; - - dst_ref->next = off_heap->first; - off_heap->first = (struct erl_off_heap_header*)dst_ref; - erts_refc_inc(&(dst_ref->entry)->refc, 2); - - *resp = make_boxed((Eterm*)dst_ref); - hp += ERL_FUN_REF_SIZE; - } - goto cleanup_next; case FUN_SUBTAG: { const ErlFunThing *src_fun = (const ErlFunThing *)ptr; ErlFunThing *dst_fun = (ErlFunThing *)hp; @@ -1610,7 +1562,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info, * restore it. */ dst_fun->thing_word = hdr; - for (int i = 0; i < fun_env_size(dst_fun); i++) { + for (int i = 0; i < fun_num_free(dst_fun); i++) { obj = src_fun->env[i]; if (!IS_CONST(obj)) { @@ -1622,7 +1574,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info, } ASSERT(&hp[ERL_FUN_SIZE] == &dst_fun->env[0]); - hp = &dst_fun->env[fun_env_size(dst_fun)]; + hp = &dst_fun->env[fun_num_free(dst_fun)]; *resp = make_fun(dst_fun); goto cleanup_next; @@ -1650,6 +1602,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info, case MAP_HEADER_TAG_HAMT_HEAD_BITMAP : case MAP_HEADER_TAG_HAMT_HEAD_ARRAY : *hp++ = *++ptr; /* total map size */ + ERTS_FALLTHROUGH(); case MAP_HEADER_TAG_HAMT_NODE_BITMAP : { Uint n = hashmap_bitcount(MAP_HEADER_VAL(hdr)); while (n--) { @@ -1805,7 +1758,7 @@ Uint copy_shared_perform_x(Eterm obj, Uint size, erts_shcopy_t *info, const ErlFunThing* funp = (ErlFunThing *) hscan; ASSERT(ERL_FUN_SIZE == (1 + thing_arityval(*hscan))); hscan += ERL_FUN_SIZE; - remaining = fun_env_size(funp); + remaining = fun_num_free(funp); break; } case MAP_SUBTAG: @@ -2005,12 +1958,6 @@ Eterm* copy_shallow_x(Eterm *ERTS_RESTRICT ptr, Uint sz, Eterm **hpp, ERTS_BR_OVERHEAD(off_heap, br); goto off_heap_common; } - case FUN_REF_SUBTAG: - { - FunRef *refp = (FunRef *) (tp-1); - erts_refc_inc(&(refp->entry)->refc, 2); - goto off_heap_common; - } case EXTERNAL_PID_SUBTAG: case EXTERNAL_PORT_SUBTAG: case EXTERNAL_REF_SUBTAG: @@ -2042,7 +1989,7 @@ Eterm* copy_shallow_x(Eterm *ERTS_RESTRICT ptr, Uint sz, Eterm **hpp, erts_refc_inc(&mreft->mb->intern.refc, 2); goto off_heap_common; } - /* Fall through... */ + ERTS_FALLTHROUGH(); } default: { @@ -2156,11 +2103,11 @@ move_one_frag(Eterm** hpp, ErlHeapFragment* frag, ErlOffHeap* off_heap, int lite if (!is_magic_ref_thing(hdr)) { break; } + ERTS_FALLTHROUGH(); case BIN_REF_SUBTAG: case EXTERNAL_PID_SUBTAG: case EXTERNAL_PORT_SUBTAG: case EXTERNAL_REF_SUBTAG: - case FUN_REF_SUBTAG: hdr->next = off_heap->first; off_heap->first = hdr; break; diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 6f2bd972b09f..c1670f8b2fb9 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -383,6 +383,7 @@ con_monitor_link_seq_cleanup(void *vcmlcp) ASSERT(!cmlcp->yield_state); cmlcp->state = ERTS_CML_CLEANUP_STATE_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CML_CLEANUP_STATE_MONITORS: reds = erts_monitor_list_foreach_delete_yielding(&dist->monitors, monitor_connection_down, @@ -393,6 +394,7 @@ con_monitor_link_seq_cleanup(void *vcmlcp) ASSERT(!cmlcp->yield_state); cmlcp->state = ERTS_CML_CLEANUP_STATE_ONAME_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CML_CLEANUP_STATE_ONAME_MONITORS: reds = erts_monitor_tree_foreach_delete_yielding(&dist->orig_name_monitors, monitor_connection_down, @@ -403,6 +405,7 @@ con_monitor_link_seq_cleanup(void *vcmlcp) ASSERT(!cmlcp->yield_state); cmlcp->state = ERTS_CML_CLEANUP_STATE_PEND_SPAWN_EXIT_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CML_CLEANUP_STATE_PEND_SPAWN_EXIT_MONITORS: reds = erts_monitor_tree_foreach_delete_yielding(&dist->dist_pend_spawn_exit, dist_pend_spawn_exit_connection_down, @@ -416,6 +419,7 @@ con_monitor_link_seq_cleanup(void *vcmlcp) ASSERT(!cmlcp->yield_state); cmlcp->state = ERTS_CML_CLEANUP_STATE_SEQUENCES; + ERTS_FALLTHROUGH(); case ERTS_CML_CLEANUP_STATE_SEQUENCES: reds = erts_dist_seq_tree_foreach_delete_yielding(&cmlcp->seq, &cmlcp->yield_state, @@ -425,6 +429,7 @@ con_monitor_link_seq_cleanup(void *vcmlcp) ASSERT(!cmlcp->yield_state); cmlcp->state = ERTS_CML_CLEANUP_STATE_NODE_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CML_CLEANUP_STATE_NODE_MONITORS: if (cmlcp->trigger_node_monitors) { Process* waiter; @@ -838,7 +843,7 @@ int is_node_name_atom(Eterm a) return 0; i = atom_val(a); ASSERT((i > 0) && (i < atom_table_size()) && (atom_tab(i) != NULL)); - return is_node_name((char*)atom_tab(i)->name, atom_tab(i)->len); + return is_node_name((char*)erts_atom_get_name(atom_tab(i)), atom_tab(i)->len); } static void @@ -1146,6 +1151,7 @@ void init_dist(void) Eterm *hp_start, *hp, **hpp = NULL, tuple; Uint sz = 0, *szp = &sz; while (1) { + struct erl_off_heap_header **ohp; /* * Sync with dist_util.erl: * @@ -1162,10 +1168,11 @@ void init_dist(void) if (hpp) { ASSERT(is_value(tuple)); ASSERT(hp == hp_start + sz); - erts_register_global_literal(ERTS_LIT_DFLAGS_RECORD, tuple); + erts_global_literal_register(&tuple); + ERTS_GLOBAL_LIT_DFLAGS_RECORD = tuple; break; } - hp = hp_start = erts_alloc_global_literal(ERTS_LIT_DFLAGS_RECORD, sz); + hp = hp_start = erts_global_literal_allocate(sz, &ohp); hpp = &hp; szp = NULL; } @@ -2112,6 +2119,7 @@ int erts_net_message(Port *prt, } /* fall through, the first fragment in the sequence was the last fragment */ + ERTS_FALLTHROUGH(); case ERTS_PREP_DIST_EXT_FRAG_CONT: { DistSeqNode *seq; erts_de_rlock(dep); @@ -3272,6 +3280,7 @@ erts_dsig_send(ErtsDSigSendContext *ctx) } ctx->phase = ERTS_DSIG_SEND_PHASE_MSG_SIZE; + ERTS_FALLTHROUGH(); case ERTS_DSIG_SEND_PHASE_MSG_SIZE: { Sint reds, *redsp; if (!ctx->no_trap) @@ -3309,6 +3318,7 @@ erts_dsig_send(ErtsDSigSendContext *ctx) } ctx->phase = ERTS_DSIG_SEND_PHASE_ALLOC; + ERTS_FALLTHROUGH(); } case ERTS_DSIG_SEND_PHASE_ALLOC: { @@ -3354,6 +3364,7 @@ erts_dsig_send(ErtsDSigSendContext *ctx) } ctx->phase = ERTS_DSIG_SEND_PHASE_MSG_ENCODE; + ERTS_FALLTHROUGH(); } case ERTS_DSIG_SEND_PHASE_MSG_ENCODE: { Sint reds, *redsp; @@ -3385,6 +3396,7 @@ erts_dsig_send(ErtsDSigSendContext *ctx) } ctx->phase = ERTS_DSIG_SEND_PHASE_FIN; + ERTS_FALLTHROUGH(); } case ERTS_DSIG_SEND_PHASE_FIN: { Uint fid = ctx->fragments; @@ -3454,6 +3466,7 @@ erts_dsig_send(ErtsDSigSendContext *ctx) retval = ERTS_DSIG_SEND_CONTINUE; goto done; } + ERTS_FALLTHROUGH(); } case ERTS_DSIG_SEND_PHASE_SEND: { /* @@ -3608,8 +3621,8 @@ erts_dsig_send(ErtsDSigSendContext *ctx) if (ctx->fragments) { ctx->c_p->flags |= F_FRAGMENTED_SEND; retval = ERTS_DSIG_SEND_CONTINUE; - if (!resume && erts_system_monitor_flags.busy_dist_port) - monitor_generic(ctx->c_p, am_busy_dist_port, cid); + if (!resume && erts_system_monitor_busy_dist_port_cnt) + monitor_busy_dist_port(ctx->c_p, cid); goto done; } } @@ -3633,8 +3646,9 @@ erts_dsig_send(ErtsDSigSendContext *ctx) port_str, remote_str, pid_str); } #endif - if (!resume && erts_system_monitor_flags.busy_dist_port) - monitor_generic(ctx->c_p, am_busy_dist_port, cid); + if (!resume && erts_system_monitor_busy_dist_port_cnt) { + monitor_busy_dist_port(ctx->c_p, cid); + } retval = ERTS_DSIG_SEND_YIELD; } else { retval = ERTS_DSIG_SEND_OK; @@ -5423,7 +5437,7 @@ BIF_RETTYPE erts_internal_get_dflags_0(BIF_ALIST_0) szp = NULL; } } - return erts_get_global_literal(ERTS_LIT_DFLAGS_RECORD); + return ERTS_GLOBAL_LIT_DFLAGS_RECORD; } BIF_RETTYPE erts_internal_get_creation_0(BIF_ALIST_0) diff --git a/erts/emulator/beam/emu/beam_emu.c b/erts/emulator/beam/emu/beam_emu.c index bdc0173bedca..b951f936af4f 100644 --- a/erts/emulator/beam/emu/beam_emu.c +++ b/erts/emulator/beam/emu/beam_emu.c @@ -320,8 +320,6 @@ void process_main(ErtsSchedulerData *esdp) ERTS_MSACC_DECLARE_CACHE_X() /* a cached value of the tsd pointer for msacc */ - ERL_BITS_DECLARE_STATEP; /* Has to be last declaration */ - /* * Note: In this function, we attempt to place rarely executed code towards * the end of the function, in the hope that the cache hit rate will be better. @@ -379,7 +377,6 @@ void process_main(ErtsSchedulerData *esdp) start_time_i = c_p->i; } - ERL_BITS_RELOAD_STATEP(c_p); { int reds; BeamInstr next; @@ -531,7 +528,7 @@ void process_main(ErtsSchedulerData *esdp) * code[3]: &&call_error_handler * code[4]: Not used */ - Export *error_handler; + const Export *error_handler; HEAVY_SWAPOUT; error_handler = call_error_handler(c_p, erts_code_to_codemfa(I), diff --git a/erts/emulator/beam/emu/bs_instrs.tab b/erts/emulator/beam/emu/bs_instrs.tab index 57d9ab256cb8..7e95d4e790a1 100644 --- a/erts/emulator/beam/emu/bs_instrs.tab +++ b/erts/emulator/beam/emu/bs_instrs.tab @@ -291,513 +291,12 @@ i_bs_skip_bits_imm2(Fail, Ms, Bits) { } } -i_new_bs_put_binary(Fail, Sz, Flags, Src) { - Eterm sz = $Sz; - Sint _size; - $BS_GET_UNCHECKED_FIELD_SIZE(sz, (($Flags) >> 3), $BADARG($Fail), _size); - c_p->fcalls = FCALLS; - if (!erts_new_bs_put_binary(c_p, $Src, _size)) { - $BADARG($Fail); - } - FCALLS = c_p->fcalls; -} - -i_new_bs_put_binary_all := i_new_bs_put_binary_all.fetch.execute; - -i_new_bs_put_binary_all.head() { - Eterm src; -} - -i_new_bs_put_binary_all.fetch(Src) { - src = $Src; -} - -i_new_bs_put_binary_all.execute(Fail, Unit) { - c_p->fcalls = FCALLS; - if (!erts_new_bs_put_binary_all(c_p, src, ($Unit))) { - $BADARG($Fail); - } - FCALLS = c_p->fcalls; -} - -i_new_bs_put_binary_imm(Fail, Sz, Src) { - c_p->fcalls = FCALLS; - if (!erts_new_bs_put_binary(c_p, ($Src), ($Sz))) { - $BADARG($Fail); - } - FCALLS = c_p->fcalls; -} - -i_new_bs_put_float(Fail, Sz, Flags, Src) { - Eterm sz = $Sz; - Eterm flags = $Flags; - Sint _size; - $BS_GET_UNCHECKED_FIELD_SIZE(sz, (flags >> 3), $BADARG($Fail), _size); - if (is_value(erts_new_bs_put_float(c_p, ($Src), _size, flags))) { - $BADARG($Fail); - } -} - -i_new_bs_put_float_imm(Fail, Sz, Flags, Src) { - if (is_value(erts_new_bs_put_float(c_p, ($Src), ($Sz), ($Flags)))) { - $BADARG($Fail); - } -} - -i_new_bs_put_integer(Fail, Sz, Flags, Src) { - Eterm sz = $Sz; - Eterm flags = $Flags; - Sint _size; - $BS_GET_UNCHECKED_FIELD_SIZE(sz, (flags >> 3), $BADARG($Fail), _size); - if (!erts_new_bs_put_integer(ERL_BITS_ARGS_3(($Src), _size, flags))) { - $BADARG($Fail); - } -} - -i_new_bs_put_integer_imm := i_new_bs_put_integer_imm.fetch.execute; - -i_new_bs_put_integer_imm.head() { - Eterm src; -} - -i_new_bs_put_integer_imm.fetch(Src) { - src = $Src; -} - -i_new_bs_put_integer_imm.execute(Fail, Sz, Flags) { - if (!erts_new_bs_put_integer(ERL_BITS_ARGS_3(src, ($Sz), ($Flags)))) { - $BADARG($Fail); - } -} - -# -# i_bs_init* -# - -i_bs_init_fail_heap := bs_init.fail_heap.verify.execute; -i_bs_init_fail := bs_init.fail.verify.execute; -i_bs_init := bs_init.plain.execute; -i_bs_init_heap := bs_init.heap.execute; - -bs_init.head() { - Eterm BsOp1; - Eterm BsOp2; -} - -bs_init.fail_heap(Size, HeapAlloc) { - BsOp1 = $Size; - BsOp2 = $HeapAlloc; -} - -bs_init.fail(Size) { - BsOp1 = $Size; - BsOp2 = 0; -} - -bs_init.plain(Size) { - BsOp1 = $Size; - BsOp2 = 0; -} - -bs_init.heap(Size, HeapAlloc) { - BsOp1 = $Size; - BsOp2 = $HeapAlloc; -} - -bs_init.verify(Fail) { - if (is_small(BsOp1)) { - Sint size = signed_val(BsOp1); - if (size < 0) { - $BADARG($Fail); - } - BsOp1 = (Eterm) size; - } else { - Uint bytes; - - if (!term_to_Uint(BsOp1, &bytes)) { - c_p->freason = bytes; - $FAIL_HEAD_OR_BODY($Fail); - } - if ((bytes >> (8*sizeof(Uint)-3)) != 0) { - $SYSTEM_LIMIT($Fail); - } - BsOp1 = (Eterm) bytes; - } -} - -bs_init.execute(Live, Dst) { - Uint num_bits, heap_extra; - Eterm new_binary; - - erts_bin_offset = 0; - - num_bits = BsOp1 * CHAR_BIT; - heap_extra = BsOp2; - - if (num_bits <= ERL_ONHEAP_BITS_LIMIT) { - ErlHeapBits *hb; - Uint bin_need; - - bin_need = heap_bits_size(num_bits); - $GC_TEST(0, bin_need + heap_extra + ERL_SUB_BITS_SIZE, $Live); - - hb = (ErlHeapBits*)HTOP; - HTOP += bin_need; - - hb->thing_word = header_heap_bits(num_bits); - hb->size = num_bits; - erts_current_bin = (byte *) hb->data; - - new_binary = make_bitstring(hb); - } else { - Binary* bptr; - - $TEST_BIN_VHEAP(NBYTES(num_bits) / sizeof(Eterm), - heap_extra + ERL_REFC_BITS_SIZE, - $Live); - - bptr = erts_bin_nrml_alloc(NBYTES(num_bits)); - erts_current_bin = (byte *) bptr->orig_bytes; - - LIGHT_SWAPOUT; - - new_binary = erts_wrap_refc_bitstring(&MSO(c_p).first, - &MSO(c_p).overhead, - &HEAP_TOP(c_p), - bptr, - erts_current_bin, - 0, - num_bits); - - LIGHT_SWAPIN; - } - - $Dst = new_binary; -} - -# -# i_bs_init_bits* -# - -i_bs_init_bits := bs_init_bits.plain.execute; -i_bs_init_bits_heap := bs_init_bits.heap.execute; -i_bs_init_bits_fail := bs_init_bits.fail.verify.execute; -i_bs_init_bits_fail_heap := bs_init_bits.fail_heap.verify.execute; - -bs_init_bits.head() { - Eterm num_bits_term; - Uint num_bits; - Uint alloc; -} - -bs_init_bits.plain(NumBits) { - num_bits = $NumBits; - alloc = 0; -} - -bs_init_bits.heap(NumBits, Alloc) { - num_bits = $NumBits; - alloc = $Alloc; -} - -bs_init_bits.fail(NumBitsTerm) { - num_bits_term = $NumBitsTerm; - alloc = 0; -} - -bs_init_bits.fail_heap(NumBitsTerm, Alloc) { - num_bits_term = $NumBitsTerm; - alloc = $Alloc; -} - -bs_init_bits.verify(Fail) { - if (is_small(num_bits_term)) { - Sint size = signed_val(num_bits_term); - if (size < 0) { - $BADARG($Fail); - } - num_bits = (Uint) size; - } else { - Uint bits; - - if (!term_to_Uint(num_bits_term, &bits)) { - c_p->freason = bits; - $FAIL_HEAD_OR_BODY($Fail); - } - num_bits = (Uint) bits; - } -} - -bs_init_bits.execute(Live, Dst) { - Eterm new_binary; - - if (num_bits <= ERL_ONHEAP_BITS_LIMIT) { - alloc += heap_bits_size(num_bits); - } else { - alloc += ERL_REFC_BITS_SIZE; - } - - erts_bin_offset = 0; - - /* num_bits = Number of bits to build - * num_bytes = Number of bytes to allocate in the binary - * alloc = Total number of words to allocate on heap - * Operands: NotUsed NotUsed Dst - */ - if (num_bits <= ERL_ONHEAP_BITS_LIMIT) { - ErlHeapBits *hb; - - $test_heap(alloc, $Live); - - hb = (ErlHeapBits*) HTOP; - HTOP += heap_bits_size(num_bits); - hb->thing_word = header_heap_bits(num_bits); - - hb->size = num_bits; - - erts_current_bin = (byte*)hb->data; - new_binary = make_bitstring(hb); - } else { - Binary *bptr; - - $TEST_BIN_VHEAP(NBYTES(num_bits) / sizeof(Eterm), - alloc + ERL_REFC_BITS_SIZE, - $Live); - - bptr = erts_bin_nrml_alloc(NBYTES(num_bits)); - erts_current_bin = (byte *) bptr->orig_bytes; - - LIGHT_SWAPOUT; - - new_binary = erts_wrap_refc_bitstring(&MSO(c_p).first, - &MSO(c_p).overhead, - &HEAP_TOP(c_p), - bptr, - erts_current_bin, - 0, - num_bits); - - LIGHT_SWAPIN; - } - - HEAP_SPACE_VERIFIED(0); - $Dst = new_binary; -} - -bs_add(Fail, Src1, Src2, Unit, Dst) { - Eterm Op1 = $Src1; - Eterm Op2 = $Src2; - Uint unit = $Unit; - - if (is_both_small(Op1, Op2)) { - Sint Arg1 = signed_val(Op1); - Sint Arg2 = signed_val(Op2); - - if (Arg1 >= 0 && Arg2 >= 0) { - $BS_SAFE_MUL(Arg2, unit, $SYSTEM_LIMIT($Fail), Op1); - Op1 += Arg1; - -#ifdef ARCH_32 - store_bs_add_result: -#endif - if (Op1 <= MAX_SMALL) { - Op1 = make_small(Op1); - } else { - /* - * May generate a heap fragment, but in this - * particular case it is OK, since the value will be - * stored into an x register (the GC will scan x - * registers for references to heap fragments) and - * there is no risk that value can be stored into a - * location that is not scanned for heap-fragment - * references (such as the heap). - */ - SWAPOUT; - Op1 = erts_make_integer(Op1, c_p); - HTOP = HEAP_TOP(c_p); - } - $Dst = Op1; - $NEXT0(); - } - $BADARG($Fail); - } else { -#ifdef ARCH_64 - /* The size must fit into a small on 64-bit platforms, which can't - * happen if either operand is a bignum. */ - if (((is_small(Op1) && signed_val(Op1) >= 0) || - (is_big(Op1) && !big_sign(Op1))) && - ((is_small(Op2) && signed_val(Op2) >= 0) || - (is_big(Op2) && !big_sign(Op2)))) { - $SYSTEM_LIMIT($Fail); - } else { - $BADARG($Fail); - } -#else - Uint a; - Uint b; - Uint c; - - /* - * Now we know that one of the arguments is - * not a small. We must convert both arguments - * to Uints and check for errors at the same time. - * - * Error checking is tricky. - * - * If one of the arguments is not numeric or - * not positive, the error reason is BADARG. - * - * Otherwise if both arguments are numeric, - * but at least one argument does not fit in - * an Uint, the reason is SYSTEM_LIMIT. - */ - - if (!term_to_Uint(Op1, &a)) { - if (a == BADARG) { - c_p->freason = a; - $FAIL_HEAD_OR_BODY($Fail); - } - if (!term_to_Uint(Op2, &b)) { - c_p->freason = b; - $FAIL_HEAD_OR_BODY($Fail); - } - $SYSTEM_LIMIT($Fail); - } else if (!term_to_Uint(Op2, &b)) { - c_p->freason = b; - $FAIL_HEAD_OR_BODY($Fail); - } - - /* - * The arguments are now correct and stored in a and b. - */ - - $BS_SAFE_MUL(b, unit, $SYSTEM_LIMIT($Fail), c); - Op1 = a + c; - if (Op1 < a) { - /* - * If the result is less than one of the - * arguments, there must have been an overflow. - */ - $SYSTEM_LIMIT($Fail); - } - goto store_bs_add_result; -#endif - } - /* No fallthrough */ - ASSERT(0); -} - -bs_put_string(Len, Ptr) { - erts_new_bs_put_string(ERL_BITS_ARGS_2((byte *) $Ptr, $Len)); -} - -i_bs_append(Fail, ExtraHeap, Live, Unit, Size, Dst) { - Uint live = $Live; - Uint res; - - HEAVY_SWAPOUT; - reg[live] = x(SCRATCH_X_REG); - res = erts_bs_append(c_p, reg, live, $Size, $ExtraHeap, $Unit); - HEAVY_SWAPIN; - if (is_non_value(res)) { - $MAYBE_EXIT_AFTER_GC(); - - /* c_p->freason is already set (to BADARG or SYSTEM_LIMIT). */ - $FAIL_HEAD_OR_BODY($Fail); - } - $Dst = res; -} - -i_bs_private_append(Fail, Unit, Size, Src, Dst) { - Eterm res; - - c_p->fcalls = FCALLS; - res = erts_bs_private_append(c_p, $Src, $Size, $Unit); - if (is_non_value(res)) { - /* c_p->freason is already set (to BADARG or SYSTEM_LIMIT). */ - $FAIL_HEAD_OR_BODY($Fail); - } - FCALLS = c_p->fcalls; - $Dst = res; -} - bs_init_writable() { HEAVY_SWAPOUT; x(0) = erts_bs_init_writable(c_p, x(0)); HEAVY_SWAPIN; } -i_bs_utf8_size(Src, Dst) { - Eterm arg = $Src; - Eterm result; - - /* - * Calculate the number of bytes needed to encode the source - * operand to UTF-8. If the source operand is invalid (e.g. wrong - * type or range) we return a nonsense integer result (0 or 4). We - * can get away with that because we KNOW that bs_put_utf8 will do - * full error checking. - */ - - if (arg < make_small(0x80UL)) { - result = make_small(1); - } else if (arg < make_small(0x800UL)) { - result = make_small(2); - } else if (arg < make_small(0x10000UL)) { - result = make_small(3); - } else { - result = make_small(4); - } - $Dst = result; -} - -i_bs_put_utf8(Fail, Src) { - if (!erts_bs_put_utf8(ERL_BITS_ARGS_1($Src))) { - $BADARG($Fail); - } -} - -i_bs_utf16_size(Src, Dst) { - Eterm arg = $Src; - Eterm result = make_small(2); - - /* - * Calculate the number of bytes needed to encode the source - * operarand to UTF-16. If the source operand is invalid (e.g. wrong - * type or range) we return a nonsense integer result (2 or 4). We - * can get away with that because we KNOW that bs_put_utf16 will do - * full error checking. - */ - - if (arg >= make_small(0x10000UL)) { - result = make_small(4); - } - $Dst = result; -} - -i_bs_put_utf16(Fail, Flags, Src) { - if (!erts_bs_put_utf16(ERL_BITS_ARGS_2($Src, $Flags))) { - $BADARG($Fail); - } -} - -// Validate a value about to be stored in a binary. -i_bs_validate_unicode(Fail, Src) { - Eterm val = $Src; - - /* - * There is no need to untag the integer, but it IS necessary - * to make sure it is small (if the term is a bignum, it could - * slip through the test, and there is no further test that - * would catch it, since bit syntax construction silently masks - * too big numbers). - */ - if (is_not_small(val) || val > make_small(0x10FFFFUL) || - (make_small(0xD800UL) <= val && val <= make_small(0xDFFFUL))) { - $BADARG($Fail); - } -} - // Validate a value that has been matched out. i_bs_validate_unicode_retract(Fail, Src, Ms) { /* @@ -874,6 +373,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { const BeamInstr* p; Uint alloc = $Alloc; Eterm new_binary; + ErlBitsState* EBS = ERL_BITS_EBS_FROM_REG(reg); /* We count the total number of bits in an unsigned integer. To avoid * having to check for overflow when adding to `num_bits`, we ensure that @@ -1064,15 +564,13 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { } p_start += BSC_NUM_ARGS; } else if (p[0] == BSC_PRIVATE_APPEND) { - Uint unit; Eterm Src; $test_heap(alloc, $Live); - $BS_LOAD_UNIT(p, unit); $BS_LOAD_SRC(p, Src); - new_binary = erts_bs_private_append_checked(c_p, Src, num_bits, unit); + new_binary = erts_bs_private_append_checked(EBS, c_p, Src, num_bits); if (is_non_value(new_binary)) { $BS_FAIL_INFO($Fail, c_p->freason, c_p->fvalue, Src); @@ -1088,7 +586,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { /* num_bits = Number of bits to build * alloc = Total number of words to allocate on heap */ - erts_bin_offset = 0; + EBS->erts_bin_offset = 0; if (num_bits <= ERL_ONHEAP_BITS_LIMIT) { ErlHeapBits *hb; @@ -1097,7 +595,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { HTOP += heap_bits_size(num_bits); hb->thing_word = header_heap_bits(num_bits); hb->size = num_bits; - erts_current_bin = (byte *) hb->data; + EBS->erts_current_bin = (byte *) hb->data; new_binary = make_bitstring(hb); } else { Binary* bptr; @@ -1107,7 +605,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { $Live); bptr = erts_bin_nrml_alloc(NBYTES(num_bits)); - erts_current_bin = (byte *)bptr->orig_bytes; + EBS->erts_current_bin = (byte *)bptr->orig_bytes; LIGHT_SWAPOUT; @@ -1115,7 +613,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { &MSO(c_p).overhead, &HEAP_TOP(c_p), bptr, - erts_current_bin, + EBS->erts_current_bin, 0, num_bits); @@ -1139,7 +637,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { byte* string; $BS_LOAD_STRING_SRC(p, string); $BS_LOAD_FIXED_SIZE(p, Size); - erts_new_bs_put_string(ERL_BITS_ARGS_2(string, Size)); + erts_bs_put_string(EBS, string, Size); continue; } @@ -1148,7 +646,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { switch (p[0]) { case BSC_BINARY_ALL: $BS_LOAD_UNIT(p, unit); - if (!erts_new_bs_put_binary_all(c_p, Src, unit)) { + if (!erts_bs_put_binary_all(EBS, c_p, Src, unit)) { $BS_FAIL_INFO($Fail, BADARG, am_unit, Src); } break; @@ -1157,14 +655,14 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { $BS_LOAD_FLAGS(p, flags); $BS_LOAD_SIZE(p, Size); $BS_GET_UNCHECKED_FIELD_SIZE(Size, unit, $BADARG($Fail), _size); - if (!erts_new_bs_put_binary(c_p, Src, _size)) { + if (!erts_bs_put_binary(EBS, c_p, Src, _size)) { Eterm reason = is_bitstring(Src) ? am_short : am_type; $BS_FAIL_INFO($Fail, BADARG, reason, Src); } break; case BSC_BINARY_FIXED_SIZE: $BS_LOAD_FIXED_SIZE(p, Size); - if (!erts_new_bs_put_binary(c_p, Src, Size)) { + if (!erts_bs_put_binary(EBS, c_p, Src, Size)) { Eterm reason = is_bitstring(Src) ? am_short : am_type; $BS_FAIL_INFO($Fail, BADARG, reason, Src); } @@ -1174,7 +672,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { $BS_LOAD_FLAGS(p, flags); $BS_LOAD_SIZE(p, Size); $BS_GET_UNCHECKED_FIELD_SIZE(Size, unit, $BADARG($Fail), _size); - Src = erts_new_bs_put_float(c_p, Src, _size, flags); + Src = erts_bs_put_float(EBS, c_p, Src, _size, flags); if (is_value(Src)) { $BS_FAIL_INFO($Fail, BADARG, c_p->fvalue, Src); } @@ -1182,7 +680,7 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { case BSC_FLOAT_FIXED_SIZE: $BS_LOAD_FLAGS(p, flags); $BS_LOAD_FIXED_SIZE(p, Size); - Src = erts_new_bs_put_float(c_p, Src, Size, flags); + Src = erts_bs_put_float(EBS, c_p, Src, Size, flags); if (is_value(Src)) { $BS_FAIL_INFO($Fail, BADARG, c_p->fvalue, Src); } @@ -1190,33 +688,48 @@ i_bs_create_bin(Fail, Alloc, Live, Dst, N) { case BSC_INTEGER: { Sint _size; + int result; $BS_LOAD_UNIT(p, unit); $BS_LOAD_FLAGS(p, flags); $BS_LOAD_SIZE(p, Size); $BS_GET_UNCHECKED_FIELD_SIZE(Size, unit, $BADARG($Fail), _size); - if (!erts_new_bs_put_integer(ERL_BITS_ARGS_3(Src, _size, flags))) { + if (flags & BSF_LITTLE) { + result = erts_bs_put_integer_le(EBS, Src, _size); + } else { + result = erts_bs_put_integer_be(EBS, Src, _size); + } + if (!result) { $BS_FAIL_INFO($Fail, BADARG, am_type, Src); } } break; case BSC_INTEGER_FIXED_SIZE: case BSC_UTF32: - $BS_LOAD_FLAGS(p, flags); - $BS_LOAD_FIXED_SIZE(p, Size); - if (!erts_new_bs_put_integer(ERL_BITS_ARGS_3(Src, Size, flags))) { - $BS_FAIL_INFO($Fail, BADARG, am_type, Src); + { + int result; + + $BS_LOAD_FLAGS(p, flags); + $BS_LOAD_FIXED_SIZE(p, Size); + if (flags & BSF_LITTLE) { + result = erts_bs_put_integer_le(EBS, Src, Size); + } else { + result = erts_bs_put_integer_be(EBS, Src, Size); + } + if (!result) { + $BS_FAIL_INFO($Fail, BADARG, am_type, Src); + } } break; case BSC_UTF8: - if (!erts_bs_put_utf8(ERL_BITS_ARGS_1(Src))) { + if (!erts_bs_put_utf8(EBS, Src)) { $BS_FAIL_INFO($Fail, BADARG, am_type, Src); } break; case BSC_UTF16: $BS_LOAD_FLAGS(p, flags); $BS_LOAD_SRC(p, Src); - if (!erts_bs_put_utf16(ERL_BITS_ARGS_2(Src, flags))) { + if (!erts_bs_put_utf16(EBS, Src, flags)) { $BS_FAIL_INFO($Fail, BADARG, am_type, Src); } break; @@ -1830,22 +1343,22 @@ i_bs_read_bits.execute() { #ifdef ARCH_64 case 9: case 8: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 7: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 6: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 5: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); #else case 5: #endif case 4: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 3: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 2: - bitdata = bitdata << 8 | *byte_ptr++; + bitdata = bitdata << 8 | *byte_ptr++; ERTS_FALLTHROUGH(); case 1: bitdata = bitdata << 8 | *byte_ptr++; } diff --git a/erts/emulator/beam/emu/emu_load.c b/erts/emulator/beam/emu/emu_load.c index 7ca930eb5815..c0dff45262b7 100644 --- a/erts/emulator/beam/emu/emu_load.c +++ b/erts/emulator/beam/emu/emu_load.c @@ -93,10 +93,10 @@ int beam_load_prepare_emit(LoaderState *stp) { init_label(&stp->labels[i]); } - stp->fun_refs = erts_alloc(ERTS_ALC_T_PREPARED_CODE, + stp->lambda_literals = erts_alloc(ERTS_ALC_T_PREPARED_CODE, stp->beam.lambdas.count * sizeof(SWord)); for (i = 0; i < stp->beam.lambdas.count; i++) { - stp->fun_refs[i] = ERTS_SWORD_MAX; + stp->lambda_literals[i] = ERTS_SWORD_MAX; } stp->import_patches = @@ -111,7 +111,7 @@ int beam_load_prepare_emit(LoaderState *stp) { for (i = 0; i < stp->beam.imports.count; i++) { BeamFile_ImportEntry *import; - Export *export; + const Export *export; int bif_number; import = &stp->beam.imports.entries[i]; @@ -190,9 +190,9 @@ int beam_load_prepared_dtor(Binary* magic) stp->labels = NULL; } - if (stp->fun_refs != NULL) { - erts_free(ERTS_ALC_T_PREPARED_CODE, (void *)stp->fun_refs); - stp->fun_refs = NULL; + if (stp->lambda_literals != NULL) { + erts_free(ERTS_ALC_T_PREPARED_CODE, (void *)stp->lambda_literals); + stp->lambda_literals = NULL; } if (stp->import_patches != NULL) { @@ -600,7 +600,7 @@ void beam_load_finalize_code(LoaderState* stp, struct erl_module_instance* inst_ */ for (i = 0; i < stp->beam.imports.count; i++) { BeamFile_ImportEntry *import; - Export *export; + const Export *export; Uint current; Uint next; @@ -634,44 +634,28 @@ void beam_load_finalize_code(LoaderState* stp, struct erl_module_instance* inst_ for (int i = 0; i < lambda_table->count; i++) { BeamFile_LambdaEntry *lambda; ErlFunEntry *fun_entry; - FunRef *fun_refp; - Eterm fun_ref; lambda = &lambda_table->entries[i]; - fun_entry = erts_put_fun_entry2(stp->module, - lambda->old_uniq, - i, - stp->beam.checksum, - lambda->index, - lambda->arity - lambda->num_free); + fun_entry = erts_fun_entry_put(stp->module, + lambda->old_uniq, + i, + stp->beam.checksum, + lambda->index, + lambda->arity - lambda->num_free); fun_entries[i] = fun_entry; - fun_ref = beamfile_get_literal(&stp->beam, stp->fun_refs[i]); - - /* If there are no free variables, the literal refers to an - * ErlFunThing that needs to be fixed up before we process the - * FunRef. */ + /* If there are no free variables, the loader has created a literal + * for this lambda and we need to set its fun entry. */ if (lambda->num_free == 0) { - ErlFunThing *funp = (ErlFunThing*)boxed_val(fun_ref); + ErlFunThing *funp; + Eterm fun; + + ASSERT(stp->lambda_literals[i] != ERTS_SWORD_MAX); + fun = beamfile_get_literal(&stp->beam, stp->lambda_literals[i]); + funp = (ErlFunThing*)boxed_val(fun); ASSERT(funp->entry.fun == NULL); funp->entry.fun = fun_entry; - fun_ref = funp->env[0]; - } - - /* Patch up the fun reference literal. */ - fun_refp = (FunRef*)boxed_val(fun_ref); - fun_refp->entry = fun_entry; - - /* Bump the reference count: this could not be done when copying - * the literal as we had no idea which entry it belonged to. - * - * We also need to parry an annoying wrinkle: when reloading a - * module over itself, we inherit the old instance's fun entries, - * and thus have to cancel the reference bump in - * `erts_put_fun_entry2` to make fun purging work. */ - if (!erts_is_fun_loaded(fun_entry, staging_ix)) { - erts_refc_inctest(&fun_entry->refc, 1); } erts_set_fun_code(fun_entry, @@ -1434,7 +1418,6 @@ int beam_load_emit_op(LoaderState *stp, BeamOp *tmp_op) { /* Remember offset for the on_load function. */ stp->on_load = ci; break; - case op_bs_put_string_WW: case op_i_bs_match_string_xfWW: case op_i_bs_match_string_yfWW: new_string_patch(stp, ci-1); diff --git a/erts/emulator/beam/emu/generators.tab b/erts/emulator/beam/emu/generators.tab index 1fad49e6a1b2..038a1f17a55c 100644 --- a/erts/emulator/beam/emu/generators.tab +++ b/erts/emulator/beam/emu/generators.tab @@ -563,7 +563,7 @@ gen.new_small_map_lit(Dst, Live, Size, Rest) { tmp = thp = erts_alloc(ERTS_ALC_T_LOADER_TMP, ((size == 0 ? 0 : 1) + size/2) * sizeof(*tmp)); if (size == 0) { - keys = erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); + keys = ERTS_GLOBAL_LIT_EMPTY_TUPLE; } else { keys = make_tuple(thp); *thp++ = make_arityval(size/2); diff --git a/erts/emulator/beam/emu/instrs.tab b/erts/emulator/beam/emu/instrs.tab index caca6ef28eb6..a108298f27fb 100644 --- a/erts/emulator/beam/emu/instrs.tab +++ b/erts/emulator/beam/emu/instrs.tab @@ -231,7 +231,7 @@ i_move_call_ext_last(CallDest, Deallocate, Src) { APPLY(I, Deallocate, Next) { //| -no_next - Export *ep; + const Export *ep; HEAVY_SWAPOUT; ep = apply(c_p, reg, $I, $Deallocate); @@ -278,7 +278,7 @@ i_apply_only() { FIXED_APPLY(Arity, I, Deallocate, Next) { //| -no_next - Export *ep; + const Export *ep; HEAVY_SWAPOUT; ep = fixed_apply(c_p, reg, $Arity, $I, $Deallocate); @@ -546,10 +546,8 @@ i_make_fun3(FunP, Dst, Arity, NumFree) { ErlFunThing* funp; //| -no_next - /* We add one word to account for the `FunRef` keeping our fun entry - * alive, it's kept as part of the environment. */ funp = (ErlFunThing*)HTOP; - HTOP += ERL_FUN_SIZE + num_free + 1; + HTOP += ERL_FUN_SIZE + num_free; funp->thing_word = MAKE_FUN_HEADER($Arity, num_free, 0); funp->entry.fun = fe; @@ -568,7 +566,7 @@ i_make_fun3(FunP, Dst, Arity, NumFree) { I = $NEXT_INSTRUCTION; - for (i = 0; i < (num_free + 1); i++) { + for (i = 0; i < num_free; i++) { Eterm term = *I++; switch (loader_tag(term)) { case LOADER_X_REG: diff --git a/erts/emulator/beam/emu/load.h b/erts/emulator/beam/emu/load.h index 79b04a3fb89e..e57f30d013c0 100644 --- a/erts/emulator/beam/emu/load.h +++ b/erts/emulator/beam/emu/load.h @@ -142,11 +142,8 @@ struct LoaderState_ { unsigned int current_li; /* Current line instruction */ unsigned int* func_line; /* Mapping from function to first line instr */ - /* Translates lambda indexes to the literal holding their FunRef. - * - * Lambdas that lack an environment are represented by an ErlFunThing that - * is immediately followed by an FunRef. */ - SWord *fun_refs; + /* Translates lambda indexes to their canonical literal, if any. */ + SWord *lambda_literals; int otp_20_or_higher; diff --git a/erts/emulator/beam/emu/ops.tab b/erts/emulator/beam/emu/ops.tab index f80785269782..0a5606d82948 100644 --- a/erts/emulator/beam/emu/ops.tab +++ b/erts/emulator/beam/emu/ops.tab @@ -56,8 +56,8 @@ int_func_start Lbl Line M F A => label Lbl | i_func_info u M F A | line Line # The end of a function. int_func_end/2 -int_func_end Func Entry | needs_nif_padding() => i_nif_padding -int_func_end Func Entry => _ +int_func_end _Func _Entry | needs_nif_padding() => i_nif_padding +int_func_end _Func _Entry => _ i_nif_padding @@ -72,14 +72,14 @@ padding # BIF, so we can omit the line instruction for non-BIFs. # -move S X0=x==0 | line Loc | call_ext_last Ar Func=u$is_not_bif D => +move S X0=x==0 | line _Loc | call_ext_last Ar Func=u$is_not_bif D => move S X0 | call_ext_last Ar Func D -move S X0=x==0 | line Loc | call_ext_only Ar Func=u$is_not_bif => +move S X0=x==0 | line _Loc | call_ext_only Ar Func=u$is_not_bif => move S X0 | call_ext_only Ar Func -move S X0=x==0 | line Loc | call_last Ar Func D => +move S X0=x==0 | line _Loc | call_last Ar Func D => move S X0 | call_last Ar Func D -move S X0=x==0 | line Loc | call_only Ar Func => +move S X0=x==0 | line _Loc | call_only Ar Func => move S X0 | call_only Ar Func # To ensure that a "move Src x(0)" instruction can be combined with @@ -95,7 +95,7 @@ move S X0=x==0 | line Loc => line Loc | move S X0 line n => _ line I -executable_line Id Line => _ +executable_line _Id _Line => _ # For the JIT, the init_yregs/1 instruction allows generation of better code. # For the BEAM interpreter, though, it will probably be more efficient to @@ -119,8 +119,8 @@ i_init y # there is a stack frame. deallocate Q -move Src=y Dst=x | trim N Remaining => move_trim Src Dst N -trim N Remaining => i_trim N +move Src=y Dst=x | trim N _Remaining => move_trim Src Dst N +trim N _Remaining => i_trim N move_trim y x t i_trim t @@ -246,7 +246,7 @@ i_get_tuple_element3 x P x is_number f? xy %hot -is_number Fail=f i => _ +is_number _Fail=f i => _ is_number Fail=f na => jump Fail is_number Fail Literal=q => move Literal x | is_number Fail x @@ -332,7 +332,7 @@ move Y1=y X1=x | move Y2=y X2=x | succ(Y1, Y2) => move_src_window Y1 Y2 X1 X2 | move Y3=y X3=x | succ(Y2, Y3) => move_src_window Y1 Y3 X1 X2 X3 -move_src_window Y1 Y2 X1 X2 | move Y3=y X3=x | move Y4=y X4=x | succ(Y3, Y4) => +move_src_window Y1 _Y2 X1 X2 | move Y3=y X3=x | move Y4=y X4=x | succ(Y3, Y4) => move_src_window2 Y1 X1 X2 | move_src_window Y3 Y4 X3 X4 move_src_window Y1 Y2 X1 X2 | move Y3=y X3=x => move3 Y1 X1 Y2 X2 Y3 X3 @@ -485,7 +485,7 @@ send # Optimized comparisons with one immediate/literal operand. # -is_eq_exact Lbl LHS RHS | equal(LHS, RHS) => _ +is_eq_exact _Lbl LHS RHS | equal(LHS, RHS) => _ is_eq_exact Lbl C1=c C2=c => move C1 x | is_eq_exact Lbl x C2 is_eq_exact Lbl C=c R=xy => is_eq_exact Lbl R C @@ -654,7 +654,7 @@ test_heap_1_put_list I y is_tagged_tuple Fail Literal=q Arity Atom => move Literal x | is_tagged_tuple Fail x Arity Atom -is_tagged_tuple Fail=f c Arity Atom => jump Fail +is_tagged_tuple Fail=f c _Arity _Atom => jump Fail is_tagged_tuple f? rxy A a @@ -671,7 +671,7 @@ is_tuple_of_arity f? rxy A is_tuple f? rxy test_arity Fail Literal=q Arity => move Literal x | test_arity Fail x Arity -test_arity Fail=f c Arity => jump Fail +test_arity Fail=f c _Arity => jump Fail test_arity Fail Tuple=x Arity | get_tuple_element Tuple2 Pos Dst=x | equal(Tuple, Tuple2) => test_arity_get_tuple_element Fail Tuple Arity Pos Dst @@ -712,7 +712,7 @@ get_tuple_element Reg=x P1 D1=y | get_tuple_element Reg2=x P2 D2=y | get_tuple_element Reg P Dst => i_get_tuple_element Reg P Dst -is_integer Fail=f i => _ +is_integer _Fail=f i => _ is_integer Fail=f an => jump Fail is_integer Fail Literal=q => move Literal x | is_integer Fail x @@ -723,7 +723,7 @@ is_integer_allocate f? x t t is_integer f? xy -is_list Fail=f n => _ +is_list _Fail=f n => _ is_list Fail Literal=q => move Literal x | is_list Fail x is_list Fail=f c => jump Fail is_list f? x @@ -758,7 +758,7 @@ is_atom f? x %cold is_atom f? y %hot -is_atom Fail=f a => _ +is_atom _Fail=f a => _ is_atom Fail=f niq => jump Fail is_float f? x @@ -768,7 +768,7 @@ is_float f? y is_float Fail=f nai => jump Fail is_float Fail Literal=q => move Literal x | is_float Fail x -is_nil Fail=f n => _ +is_nil _Fail=f n => _ is_nil Fail=f qia => jump Fail is_nil f? xy @@ -808,8 +808,8 @@ is_port f? x is_port f? y %hot -is_boolean Fail=f a==am_true => _ -is_boolean Fail=f a==am_false => _ +is_boolean _Fail=f a==am_true => _ +is_boolean _Fail=f a==am_false => _ is_boolean Fail=f ac => jump Fail %cold @@ -881,7 +881,7 @@ call_ext_only u==0 u$func:erlang:yield/0 => i_yield | return # The hibernate/3 BIF is an instruction. # call_ext u==3 u$func:erlang:hibernate/3 => i_hibernate -call_ext_last u==3 u$func:erlang:hibernate/3 D => i_hibernate +call_ext_last u==3 u$func:erlang:hibernate/3 _D => i_hibernate call_ext_only u==3 u$func:erlang:hibernate/3 => i_hibernate call_ext u==0 u$func:os:perf_counter/0 => @@ -909,7 +909,7 @@ call_ext_only Ar=u Bif=u$is_bif | is_heavy_bif(Bif) => call_ext u Bif=u$is_bif => call_light_bif Bif call_ext_last u Bif=u$is_bif D => call_light_bif_last Bif D -call_ext_only Ar=u Bif=u$is_bif => call_light_bif_only Bif +call_ext_only _Ar=u Bif=u$is_bif => call_light_bif_only Bif # # Any remaining calls are calls to Erlang functions, not BIFs. @@ -918,16 +918,16 @@ call_ext_only Ar=u Bif=u$is_bif => call_light_bif_only Bif # with call instructions. # -move S=c x==0 | call_ext Ar=u Func=u$is_not_bif => +move S=c x==0 | call_ext _Ar=u Func=u$is_not_bif => i_move_call_ext S Func -move S=c x==0 | call_ext_last Ar=u Func=u$is_not_bif D => +move S=c x==0 | call_ext_last _Ar=u Func=u$is_not_bif D => i_move_call_ext_last Func D S -move S=c x==0 | call_ext_only Ar=u Func=u$is_not_bif => +move S=c x==0 | call_ext_only _Ar=u Func=u$is_not_bif => i_move_call_ext_only Func S -call_ext Ar Func => i_call_ext Func -call_ext_last Ar Func D => i_call_ext_last Func D -call_ext_only Ar Func => i_call_ext_only Func +call_ext _Ar Func => i_call_ext Func +call_ext_last _Ar Func D => i_call_ext_last Func D +call_ext_only _Ar Func => i_call_ext_only Func i_apply i_apply_last Q @@ -971,12 +971,12 @@ i_perf_counter bif0 u$bif:erlang:self/0 Dst=d => self Dst bif0 u$bif:erlang:node/0 Dst=d => node Dst -bif1 Fail=f Bif=u$bif:erlang:hd/1 Src=x Dst=x => +bif1 Fail=f _Bif=u$bif:erlang:hd/1 Src=x Dst=x => is_nonempty_list_get_hd Fail Src Dst -bif1 Fail=f Bif=u$bif:erlang:tl/1 Src=x Dst=x => +bif1 Fail=f _Bif=u$bif:erlang:tl/1 Src=x Dst=x => is_nonempty_list_get_tl Fail Src Dst -bif1 Fail Bif=u$bif:erlang:get/1 Src=s Dst=d => +bif1 _Fail _Bif=u$bif:erlang:get/1 Src=s Dst=d => get(Src, Dst) bif2 Jump=j u$bif:erlang:element/2 S1=s S2=xy Dst=d => @@ -1015,24 +1015,24 @@ i_bif3_body s s s b d # Internal calls. # -move S=cxy x==0 | call Ar P=f => move_call S P +move S=cxy x==0 | call _Ar P=f => move_call S P move_call/2 move_call cxy f -move S x==0 | call_last Ar P=f D => move_call_last S P D +move S x==0 | call_last _Ar P=f D => move_call_last S P D move_call_last/3 move_call_last cxy f Q -move S=cx x==0 | call_only Ar P=f => move_call_only S P +move S=cx x==0 | call_only _Ar P=f => move_call_only S P move_call_only/2 move_call_only cx f -call Ar Func => i_call Func -call_last Ar Func D => i_call_last Func D -call_only Ar Func => i_call_only Func +call _Ar Func => i_call Func +call_last _Ar Func D => i_call_last Func D +call_only _Ar Func => i_call_only Func i_call f i_call_last f Q @@ -1140,7 +1140,7 @@ i_bs_ensure_bits Ctx1 u==32 Fail | i_bs_read_bits Ctx2 u==32 | # is encountered. # bad_bs_match/1 -bad_bs_match A | never() => _ +bad_bs_match _A | never() => _ # ================================================================ # Bit syntax matching (from R11B). @@ -1183,7 +1183,7 @@ i_bs_get_binary_all2 xy f? t t d bs_get_float2 Fail=f Ms=xy Live=u Sz=s Unit=u Flags=u Dst=d => get_float2(Fail, Ms, Live, Sz, Unit, Flags, Dst) -bs_get_float2 Fail=f Ms=x Live=u Sz=q Unit=u Flags=u Dst=d => jump Fail +bs_get_float2 Fail=f _Ms=x _Live=u _Sz=q _Unit=u _Flags=u _Dst=d => jump Fail i_bs_get_float2 xy f? t s t d @@ -1195,14 +1195,14 @@ bs_skip_bits2 Fail=f Ms=xy Sz=sq Unit=u Flags=u => i_bs_skip_bits_imm2 f? xy W i_bs_skip_bits2 xy xy f? t -bs_test_tail2 Fail=f Ms=xy o => jump Fail -bs_test_tail2 Fail=f Ms=xy Bits=u==0 => bs_test_zero_tail2 Fail Ms +bs_test_tail2 Fail=f _Ms=xy o => jump Fail +bs_test_tail2 Fail=f Ms=xy _Bits=u==0 => bs_test_zero_tail2 Fail Ms bs_test_tail2 Fail=f Ms=xy Bits=u => bs_test_tail_imm2 Fail Ms Bits bs_test_zero_tail2 f? xy bs_test_tail_imm2 f? xy W -bs_test_unit F Ms Unit=u==8 => bs_test_unit8 F Ms +bs_test_unit F Ms _Unit=u==8 => bs_test_unit8 F Ms bs_test_unit f? xy t bs_test_unit8 f? xy @@ -1223,10 +1223,10 @@ bs_start_match4 Fail=f Live=u Src=xy Ctx=d => %if ARCH_64 # This instruction nops on 64-bit platforms -bs_start_match4 a==am_resume Live Ctx Dst | equal(Ctx, Dst) => _ -bs_start_match4 a==am_resume Live Ctx Dst => move Ctx Dst +bs_start_match4 a==am_resume _Live Ctx Dst | equal(Ctx, Dst) => _ +bs_start_match4 a==am_resume _Live Ctx Dst => move Ctx Dst -bs_start_match3 Fail Bin Live Ctx | bs_get_position Ctx2 Pos=x Ignored | +bs_start_match3 Fail Bin Live Ctx | bs_get_position Ctx2 Pos=x _Ignored | equal(Ctx, Ctx2) => i_bs_start_match3_gp Bin Live Fail Ctx Pos i_bs_start_match3_gp xy t j d x @@ -1238,7 +1238,7 @@ bs_start_match4 a==am_resume Live Ctx Dst => %endif -bs_start_match3 Fail=j ica Live Dst => jump Fail +bs_start_match3 Fail=j ica _Live _Dst => jump Fail bs_start_match3 Fail Bin Live Dst => i_bs_start_match3 Bin Live Fail Dst i_bs_start_match3 xy t j d @@ -1247,7 +1247,7 @@ i_bs_start_match3 xy t j d # fit into an unsigned small. %if ARCH_64 - bs_get_position Src Dst Live => i_bs_get_position Src Dst + bs_get_position Src Dst _Live => i_bs_get_position Src Dst i_bs_get_position xy xy bs_set_position xy xy %else @@ -1293,160 +1293,14 @@ bs_create_bin Fail Alloc=u Live=u Unit=u Dst=xy N=u Segments=* => i_bs_create_bin j I W d W * -# ================================================================ -# Old instruction for constructing binaries (up to OTP 24). -# ================================================================ - -%warm - -bs_init2 Fail Sz Words Regs Flags Dst | binary_too_big(Sz) => system_limit Fail - -bs_init2 Fail Sz Words Regs Flags Dst=y => - bs_init2 Fail Sz Words Regs Flags x | move x Dst - -bs_init2 Fail Sz=u Words=u==0 Regs Flags Dst => i_bs_init Sz Regs Dst - -bs_init2 Fail Sz=u Words Regs Flags Dst => - i_bs_init_heap Sz Words Regs Dst - -bs_init2 Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_fail Sz Fail Regs Dst -bs_init2 Fail Sz Words Regs Flags Dst => - i_bs_init_fail_heap Sz Words Fail Regs Dst - -i_bs_init_fail xy j? t? x - -i_bs_init_fail_heap s I j? t? x - -i_bs_init W t? x - -i_bs_init_heap W I t? x - - -bs_init_bits Fail Sz=o Words Regs Flags Dst => system_limit Fail -bs_init_bits Fail Sz Words Regs Flags Dst=y => - bs_init_bits Fail Sz Words Regs Flags x | move x Dst - -bs_init_bits Fail Sz=u Words=u==0 Regs Flags Dst => - i_bs_init_bits Sz Regs Dst -bs_init_bits Fail Sz=u Words Regs Flags Dst => - i_bs_init_bits_heap Sz Words Regs Dst - -bs_init_bits Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_bits_fail Sz Fail Regs Dst -bs_init_bits Fail Sz Words Regs Flags Dst => - i_bs_init_bits_fail_heap Sz Words Fail Regs Dst - -i_bs_init_bits_fail xy j? t? x - -i_bs_init_bits_fail_heap s I j? t? x - -i_bs_init_bits W t? x -i_bs_init_bits_heap W I t? x - -bs_add Fail S1=i==0 S2 Unit=u==1 D => move S2 D - -bs_add j? s s t? x - -bs_append Fail Size Extra Live Unit Bin Flags Dst => - move Bin x | i_bs_append Fail Extra Live Unit Size Dst - -bs_private_append Fail Size Unit Bin Flags Dst => - i_bs_private_append Fail Unit Size Bin Dst - -i_bs_private_append Fail Unit Size Bin Dst=y => - i_bs_private_append Fail Unit Size Bin x | move x Dst - bs_init_writable -i_bs_append j? I t? t s xy -i_bs_private_append j? t s S x - -# -# Storing integers into binaries. -# - -bs_put_integer Fail=j Sz=sq Unit=u Flags=u Src=s => - put_integer(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_integer j? S t s -i_new_bs_put_integer_imm xyc j? W t - -# -# Utf8/utf16/utf32 support. (R12B-5) -# - -bs_utf8_size j Src Dst=d => i_bs_utf8_size Src Dst -bs_utf16_size j Src Dst=d => i_bs_utf16_size Src Dst - -bs_put_utf8 Fail u Src => i_bs_put_utf8 Fail Src - -bs_put_utf16 Fail Flags Src => put_utf16(Fail, Flags, Src) - -bs_put_utf32 Fail=j Flags=u Src=s => - i_bs_validate_unicode Fail Src | bs_put_integer Fail i=32 u=1 Flags Src - -i_bs_utf8_size S x -i_bs_utf16_size S x - -i_bs_put_utf8 j? S -i_bs_put_utf16 j? t S - -i_bs_validate_unicode j? S - -# Handle unoptimized code and the 'native' flag for utf16 segments. -i_bs_utf8_size Src=c Dst => move Src x | i_bs_utf8_size x Dst -i_bs_utf16_size Src=c Dst => move Src x | i_bs_utf16_size x Dst -i_bs_put_utf8 Fail Src=c => move Src x | i_bs_put_utf8 Fail x -i_bs_put_utf16 Fail Flags Src=c => move Src x | i_bs_put_utf16 Fail Flags x -i_bs_validate_unicode Fail Src=c => move Src x | i_bs_validate_unicode Fail x - -# -# Storing floats into binaries. -# - -# Will fail. No need to keep the instruction, because bs_add or -# bs_init* would already have raised an exception. -bs_put_float Fail Sz=q Unit Flags Val => _ - -bs_put_float Fail=j Sz=s Unit=u Flags=u Src=s => - put_float(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_float j? S t s -i_new_bs_put_float_imm j? W t s - -# -# Storing binaries into binaries. -# - -bs_put_binary Fail=j Sz=s Unit=u Flags=u Src=s => - put_binary(Fail, Sz, Unit, Flags, Src) - -# In unoptimized code, the binary argument could be a literal. (In optimized -# code, there would be a bs_put_string instruction.) -i_new_bs_put_binary Fail Size Unit Lit=c => - move Lit x | i_new_bs_put_binary Fail Size Unit x -i_new_bs_put_binary_imm Fail Size Lit=c => - move Lit x | i_new_bs_put_binary_imm Fail Size x -i_new_bs_put_binary_all Lit=c Fail Unit => - move Lit x | i_new_bs_put_binary_all x Fail Unit - -i_new_bs_put_binary j? S t S -i_new_bs_put_binary_imm j? W S -i_new_bs_put_binary_all xy j? t - -# -# Warning: The i_bs_put_string and i_new_bs_put_string instructions -# are specially treated in the loader. -# Don't change the instruction format unless you change the loader too. -# - -bs_put_string W W - # # New floating point instructions (R8). # +%warm + fadd p FR1 FR2 FR3 => i_fadd FR1 FR2 FR3 fsub p FR1 FR2 FR3 => i_fsub FR1 FR2 FR3 fmul p FR1 FR2 FR3 => i_fmul FR1 FR2 FR3 @@ -1486,7 +1340,7 @@ apply_last t Q # always preceded by an is_map test. That means that put_map_assoc can # never fail and does not need any failure label. -put_map_assoc Fail Map Dst Live Size Rest=* => +put_map_assoc _Fail Map Dst Live Size Rest=* => i_put_map_assoc Map Dst Live Size Rest i_put_map_assoc/4 @@ -1519,7 +1373,7 @@ i_new_small_map_lit d t q * update_map_assoc xyc d t I * update_map_exact xy j? d t I * -is_map Fail Lit=q | literal_is_map(Lit) => _ +is_map _Fail Lit=q | literal_is_map(Lit) => _ is_map Fail cq => jump Fail is_map f? xy @@ -1555,7 +1409,7 @@ gc_bif1 Fail Live u$bif:erlang:splus/1 Src Dst => gc_bif2 Fail Live u$bif:erlang:splus/2 S1 S2 Dst => gen_plus Fail Live S1 S2 Dst -gc_bif1 Fail Live u$bif:erlang:sminus/1 Src Dst => +gc_bif1 Fail _Live u$bif:erlang:sminus/1 Src Dst => i_unary_minus Src Fail Dst gc_bif2 Fail Live u$bif:erlang:sminus/2 S1 S2 Dst => gen_minus Fail Live S1 S2 Dst @@ -1565,12 +1419,12 @@ gc_bif2 Fail Live u$bif:erlang:sminus/2 S1 S2 Dst => # the i_increment/3 instruction (in bodies, not in guards). # -gen_plus p Live Int=i Reg=d Dst => +gen_plus p _Live Int=i Reg=d Dst => increment(Reg, Int, Dst) -gen_plus p Live Reg=d Int=i Dst => +gen_plus p _Live Reg=d Int=i Dst => increment(Reg, Int, Dst) -gen_minus p Live Reg=d Int=i Dst | negation_is_small(Int) => +gen_minus p _Live Reg=d Int=i Dst | negation_is_small(Int) => increment_from_minus(Reg, Int, Dst) # @@ -1579,40 +1433,40 @@ gen_minus p Live Reg=d Int=i Dst | negation_is_small(Int) => # It is OK to swap arguments for '+' in a guard. It is also # OK to turn minus into plus in a guard. -gen_plus Fail=f Live S1=c S2 Dst => i_plus S2 S1 Fail Dst +gen_plus Fail=f _Live S1=c S2 Dst => i_plus S2 S1 Fail Dst gen_minus Fail=f Live S1 S2=i Dst | negation_is_small(S2) => plus_from_minus(Fail, Live, S1, S2, Dst) -gen_plus Fail Live S1 S2 Dst => i_plus S1 S2 Fail Dst +gen_plus Fail _Live S1 S2 Dst => i_plus S1 S2 Fail Dst -gen_minus Fail Live S1 S2 Dst => i_minus S1 S2 Fail Dst +gen_minus Fail _Live S1 S2 Dst => i_minus S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:stimes/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:stimes/2 S1 S2 Dst => i_times Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:div/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:div/2 S1 S2 Dst => i_m_div Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:intdiv/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:intdiv/2 S1 S2 Dst => i_int_div Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:rem/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:rem/2 S1 S2 Dst => i_rem S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bsl/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bsl/2 S1 S2 Dst => i_bsl S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bsr/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bsr/2 S1 S2 Dst => i_bsr S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:band/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:band/2 S1 S2 Dst => i_band S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bor/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bor/2 S1 S2 Dst => i_bor Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:bxor/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bxor/2 S1 S2 Dst => i_bxor Fail S1 S2 Dst -gc_bif1 Fail Live u$bif:erlang:bnot/1 Src Dst=d => +gc_bif1 Fail _Live u$bif:erlang:bnot/1 Src Dst=d => i_int_bnot Fail Src Dst i_increment rxy W d @@ -1670,14 +1524,14 @@ i_length j? t d # # Guard BIFs. # -gc_bif1 p Live Bif Src Dst => i_bif1_body Src Bif Dst -gc_bif1 Fail=f Live Bif Src Dst => i_bif1 Src Fail Bif Dst +gc_bif1 p _Live Bif Src Dst => i_bif1_body Src Bif Dst +gc_bif1 Fail=f _Live Bif Src Dst => i_bif1 Src Fail Bif Dst -gc_bif2 p Live Bif S1 S2 Dst => i_bif2_body S2 S1 Bif Dst -gc_bif2 Fail=f Live Bif S1 S2 Dst => i_bif2 S2 S1 Fail Bif Dst +gc_bif2 p _Live Bif S1 S2 Dst => i_bif2_body S2 S1 Bif Dst +gc_bif2 Fail=f _Live Bif S1 S2 Dst => i_bif2 S2 S1 Fail Bif Dst -gc_bif3 p Live Bif S1 S2 S3 Dst => i_bif3_body S3 S2 S1 Bif Dst -gc_bif3 Fail=f Live Bif S1 S2 S3 Dst => i_bif3 S3 S2 S1 Fail Bif Dst +gc_bif3 p _Live Bif S1 S2 S3 Dst => i_bif3_body S3 S2 S1 Bif Dst +gc_bif3 Fail=f _Live Bif S1 S2 S3 Dst => i_bif3 S3 S2 S1 Fail Bif Dst # # The following instruction is specially handled in beam_load.c @@ -1685,7 +1539,7 @@ gc_bif3 Fail=f Live Bif S1 S2 S3 Dst => i_bif3 S3 S2 S1 Fail Bif Dst # encountered. # unsupported_guard_bif/3 -unsupported_guard_bif A B C | never() => _ +unsupported_guard_bif _A _B _C | never() => _ # # R13B03 @@ -1708,8 +1562,8 @@ raw_raise # move_x1, move_x2 -move C=aiq X=x==1 => move_x1 C -move C=aiq X=x==2 => move_x2 C +move C=aiq _X=x==1 => move_x1 C +move C=aiq _X=x==2 => move_x2 C move n D=y => i_init D diff --git a/erts/emulator/beam/emu/predicates.tab b/erts/emulator/beam/emu/predicates.tab index 927e4e504ff6..932385f700f9 100644 --- a/erts/emulator/beam/emu/predicates.tab +++ b/erts/emulator/beam/emu/predicates.tab @@ -47,7 +47,9 @@ pred.independent_moves(Src1, Dst1, Src2, Dst2) { } pred.needs_nif_padding() { - Export *e = erts_active_export_entry(S->module, S->function, S->arity); + const Export *e = erts_active_export_entry(S->module, + S->function, + S->arity); if (e != NULL && e->bif_number != -1) { return 1; diff --git a/erts/emulator/beam/emu/trace_instrs.tab b/erts/emulator/beam/emu/trace_instrs.tab index b6b119c6313e..4f109bde602f 100644 --- a/erts/emulator/beam/emu/trace_instrs.tab +++ b/erts/emulator/beam/emu/trace_instrs.tab @@ -162,7 +162,7 @@ i_perf_counter() { } i_debug_breakpoint() { - Export *breakpoint_handler; + const Export *breakpoint_handler; HEAVY_SWAPOUT; breakpoint_handler = call_error_handler(c_p, erts_code_to_codemfa(I), diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c index 9fdba3e9a7f1..af45d98d902d 100644 --- a/erts/emulator/beam/erl_alloc.c +++ b/erts/emulator/beam/erl_alloc.c @@ -2493,6 +2493,7 @@ erts_memory(fmtfn_t *print_to_p, void *print_to_arg, void *proc, Eterm earg) size.code += export_table_sz(); size.code += export_entries_sz(); size.code += erts_fun_table_sz(); + size.code += erts_fun_entries_sz(); size.code += erts_ranges_sz(); size.code += erts_total_code_size; } @@ -2638,6 +2639,11 @@ erts_allocated_areas(fmtfn_t *print_to_p, void *print_to_arg, void *proc) values[i].ui[0] = erts_fun_table_sz(); i++; + values[i].arity = 2; + values[i].name = "fun_list"; + values[i].ui[0] = erts_fun_entries_sz(); + i++; + values[i].arity = 2; values[i].name = "module_refs"; values[i].ui[0] = erts_ranges_sz(); diff --git a/erts/emulator/beam/erl_alloc_util.c b/erts/emulator/beam/erl_alloc_util.c index eb43532de001..7e1d50dd1dbf 100644 --- a/erts/emulator/beam/erl_alloc_util.c +++ b/erts/emulator/beam/erl_alloc_util.c @@ -7820,7 +7820,7 @@ static int gather_ahist_append_result(hist_tree_t *node, void *arg, Sint reds) hp = erts_produce_heap(&state->msg_factory, heap_size, 0); if (state->hist_slot_count == 0) { - histogram_tuple = erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); + histogram_tuple = ERTS_GLOBAL_LIT_EMPTY_TUPLE; } else { hp[0] = make_arityval(state->hist_slot_count); @@ -8168,7 +8168,7 @@ static void gather_cinfo_append_result(gather_cinfo_t *state, } } if (state->hist_slot_count == 0) { - histogram_tuple = erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); + histogram_tuple = ERTS_GLOBAL_LIT_EMPTY_TUPLE; } else { hp[0] = make_arityval(state->hist_slot_count); for (ix = 0; ix < state->hist_slot_count; ix++) { diff --git a/erts/emulator/beam/erl_arith.c b/erts/emulator/beam/erl_arith.c index b608df2b4fc0..e394a3a9416c 100644 --- a/erts/emulator/beam/erl_arith.c +++ b/erts/emulator/beam/erl_arith.c @@ -370,7 +370,7 @@ erts_mixed_plus(Process* p, Eterm arg1, Eterm arg2) case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE): case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { - case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): + case TAG_PRIMARY_IMMED1: switch ((arg2 & _TAG_IMMED1_MASK) >> _TAG_PRIMARY_SIZE) { case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): if (arg2 == SMALL_ZERO) { @@ -408,7 +408,9 @@ erts_mixed_plus(Process* p, Eterm arg1, Eterm arg2) default: goto badarith; } - } + default: + goto badarith; + } case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_IMMED1: @@ -576,7 +578,7 @@ erts_mixed_minus(Process* p, Eterm arg1, Eterm arg2) case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE): case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { - case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): + case TAG_PRIMARY_IMMED1: switch ((arg2 & _TAG_IMMED1_MASK) >> _TAG_PRIMARY_SIZE) { case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): if (arg2 == SMALL_ZERO) { @@ -615,6 +617,8 @@ erts_mixed_minus(Process* p, Eterm arg1, Eterm arg2) default: goto badarith; } + default: + goto badarith; } case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { @@ -744,17 +748,19 @@ erts_mixed_times(Process* p, Eterm arg1, Eterm arg2) default: goto badarith; } - } - default: + default: + goto badarith; + } + default: goto badarith; - } + } case TAG_PRIMARY_BOXED: hdr = *boxed_val(arg1); switch ((hdr & _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE) { case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE): case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { - case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): + case TAG_PRIMARY_IMMED1: switch ((arg2 & _TAG_IMMED1_MASK) >> _TAG_PRIMARY_SIZE) { case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): if (arg2 == SMALL_ZERO) @@ -810,7 +816,9 @@ erts_mixed_times(Process* p, Eterm arg1, Eterm arg2) default: goto badarith; } - } + default: + goto badarith; + } case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_IMMED1: @@ -998,7 +1006,7 @@ erts_mixed_div(Process* p, Eterm arg1, Eterm arg2) case (_TAG_HEADER_POS_BIG >> _TAG_PRIMARY_SIZE): case (_TAG_HEADER_NEG_BIG >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { - case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): + case TAG_PRIMARY_IMMED1: switch ((arg2 & _TAG_IMMED1_MASK) >> _TAG_PRIMARY_SIZE) { case (_TAG_IMMED1_SMALL >> _TAG_PRIMARY_SIZE): if (big_to_double(arg1, &f1.fd) < 0) { @@ -1028,7 +1036,9 @@ erts_mixed_div(Process* p, Eterm arg1, Eterm arg2) default: goto badarith; } - } + default: + goto badarith; + } case (_TAG_HEADER_FLOAT >> _TAG_PRIMARY_SIZE): switch (arg2 & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_IMMED1: diff --git a/erts/emulator/beam/erl_bif_ddll.c b/erts/emulator/beam/erl_bif_ddll.c index 9279b5cce743..15f37e3fd5b7 100644 --- a/erts/emulator/beam/erl_bif_ddll.c +++ b/erts/emulator/beam/erl_bif_ddll.c @@ -1725,7 +1725,7 @@ static int errdesc_to_code(Eterm errdesc, int *code /* out */) for (i = 0; errcode_tab[i].atm != NULL; ++i) { int len = sys_strlen(errcode_tab[i].atm); if (len == ap->len && - !sys_strncmp(errcode_tab[i].atm,(char *) ap->name,len)) { + !sys_strncmp(errcode_tab[i].atm,(char *) erts_atom_get_name(ap),len)) { *code = errcode_tab[i].code; return 0; } @@ -1799,7 +1799,7 @@ static char *pick_list_or_atom(Eterm name_term) goto error; } name = erts_alloc(ERTS_ALC_T_DDLL_TMP_BUF, ap->len + 1); - sys_memcpy(name,ap->name,ap->len); + sys_memcpy(name,erts_atom_get_name(ap),ap->len); name[ap->len] = '\0'; } else { if (erts_iolist_size(name_term, &name_len)) { diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index c2bd395ad3a7..f9f366523cc1 100644 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -2169,9 +2169,9 @@ process_info_aux(Process *c_p, * so we must do a HRelease() to avoid creating holes. */ Sint needed = scb->n*(2+4); + const Export *exp; Eterm term, list; int i, j; - Export *exp; reserve_size += needed; @@ -2700,7 +2700,7 @@ c_compiler_used(Eterm **hpp, Uint *szp) static int is_snif_term(Eterm module_atom) { int i; Atom *a = atom_tab(atom_val(module_atom)); - char *aname = (char *) a->name; + char *aname = (char *) erts_atom_get_name(a); /* if a->name has a '.' then the bif (snif) is bogus i.e a package */ for (i = 0; i < a->len; i++) { @@ -2982,7 +2982,7 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1) NIL)); } else if (BIF_ARG_1 == am_os_type) { - BIF_RET(erts_get_global_literal(ERTS_LIT_OS_TYPE)); + BIF_RET(ERTS_GLOBAL_LIT_OS_TYPE); } else if (BIF_ARG_1 == am_allocator) { BIF_RET(erts_allocator_options((void *) BIF_P)); @@ -2998,7 +2998,7 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1) BIF_RET(erts_alloc_util_allocators((void *) BIF_P)); } else if (BIF_ARG_1 == am_os_version) { - BIF_RET(erts_get_global_literal(ERTS_LIT_OS_VERSION)); + BIF_RET(ERTS_GLOBAL_LIT_OS_VERSION); } else if (BIF_ARG_1 == am_version) { int n = sys_strlen(ERLANG_VERSION); @@ -3806,8 +3806,8 @@ fun_info_2(BIF_ALIST_2) Eterm what = BIF_ARG_2; const ErtsCodeMFA *mfa; + const ErlFunEntry *fe; ErlFunThing *funp; - ErlFunEntry *fe; Eterm* hp; Eterm val; @@ -3873,7 +3873,7 @@ fun_info_2(BIF_ALIST_2) break; case am_refc: if (is_local_fun(funp)) { - val = erts_make_integer(erts_atomic_read_nob(&fe->refc), p); + val = make_small(1); } else { val = am_undefined; } @@ -6262,21 +6262,25 @@ static void os_info_init(void) char* buf = erts_alloc(ERTS_ALC_T_TMP, 1024); /* More than enough */ Eterm* hp; Eterm tuple; + struct erl_off_heap_header **ohp; os_flavor(buf, 1024); flav = erts_atom_put((byte *) buf, sys_strlen(buf), ERTS_ATOM_ENC_LATIN1, 1); erts_free(ERTS_ALC_T_TMP, (void *) buf); - hp = erts_alloc_global_literal(ERTS_LIT_OS_TYPE, 3); + + hp = erts_global_literal_allocate(3, &ohp); tuple = TUPLE2(hp, type, flav); - erts_register_global_literal(ERTS_LIT_OS_TYPE, tuple); + erts_global_literal_register(&tuple); + ERTS_GLOBAL_LIT_OS_TYPE = tuple; - hp = erts_alloc_global_literal(ERTS_LIT_OS_VERSION, 4); + hp = erts_global_literal_allocate(4, &ohp); os_version(&major, &minor, &build); tuple = TUPLE3(hp, make_small(major), make_small(minor), make_small(build)); - erts_register_global_literal(ERTS_LIT_OS_VERSION, tuple); + erts_global_literal_register(&tuple); + ERTS_GLOBAL_LIT_OS_VERSION = tuple; } void diff --git a/erts/emulator/beam/erl_bif_lists.c b/erts/emulator/beam/erl_bif_lists.c index 5dcd53d6139c..10afb3adaa22 100644 --- a/erts/emulator/beam/erl_bif_lists.c +++ b/erts/emulator/beam/erl_bif_lists.c @@ -56,6 +56,36 @@ static int append_ctx_bin_dtor(Binary *context_bin) { return 1; } +static int append_empty_rhs(Process *p, ErtsAppendContext *context) { + static const Sint ELEMENTS_PER_RED = 32; + Sint budget, count; + + budget = ELEMENTS_PER_RED * ERTS_BIF_REDS_LEFT(p); + +#ifdef DEBUG + budget = budget / 10 + 1; +#endif + + for (count = 0; count < budget && is_list(context->iterator); count++) { + context->iterator = CDR(list_val(context->iterator)); + } + + BUMP_REDS(p, count / ELEMENTS_PER_RED); + + if (is_list(context->iterator)) { + return 0; + } else if (is_nil(context->iterator)) { +#ifdef DEBUG + context->result_cdr = &context->rhs_original; +#endif + context->result = context->lhs_original; + + return 1; + } + + return -1; +} + static Eterm append_create_trap_state(Process *p, ErtsAppendContext *from_context) { ErtsAppendContext *to_context; @@ -203,6 +233,11 @@ static BIF_RETTYPE lists_append_onheap(Process *p, ErtsAppendContext *context) { } static int append_continue(Process *p, ErtsAppendContext *context) { + /* Fast-lane when the rhs is nil: return lhs. */ + if (is_nil(context->rhs_original)) { + return append_empty_rhs(p, context); + } + /* We build the result on the unused part of the heap if possible to save * us the trouble of having to figure out the list size. We fall back to * lists_append_alloc when we run out of space. */ @@ -906,7 +941,12 @@ static int subtract_continue(Process *p, ErtsSubtractContext *context) { return res; } - if (context->lhs_remaining <= SUBTRACT_LHS_THRESHOLD) { + /* If the lhs list is empty then there's nothing to do. + * Returning early will be taken care of in the `SUBTRACT_STAGE_LEN_RHS` + * stage after the rhs list has been scanned. */ + if (context->lhs_remaining > 0 && + context->lhs_remaining <= SUBTRACT_LHS_THRESHOLD && + is_list(context->rhs_original)) { return subtract_enter_naive_lhs(p, context); } @@ -926,6 +966,20 @@ static int subtract_continue(Process *p, ErtsSubtractContext *context) { return res; } + /* If the lhs list is empty then the subtraction must return nil. */ + if (context->lhs_remaining == 0) { + ASSERT(is_nil(context->lhs_original)); + context->result = NIL; + return 1; + } + /* If the rhs list is empty then the subtraction should return the + * lhs list unchanged. */ + if (context->rhs_remaining == 0) { + ASSERT(is_nil(context->rhs_original)); + context->result = context->lhs_original; + return 1; + } + /* We've walked through both lists fully now so we no longer need * to check for errors past this point. */ diff --git a/erts/emulator/beam/erl_bif_re.c b/erts/emulator/beam/erl_bif_re.c index 91554f65f7f9..88433a29389c 100644 --- a/erts/emulator/beam/erl_bif_re.c +++ b/erts/emulator/beam/erl_bif_re.c @@ -1024,7 +1024,7 @@ build_capture(Eterm capture_spec[CAPSPEC_SIZE], const pcre *code) } } ASSERT(tmpb != NULL); - sys_memcpy(tmpb,ap->name,ap->len); + sys_memcpy(tmpb,erts_atom_get_name(ap),ap->len); tmpb[ap->len] = '\0'; } else { ErlDrvSizeT slen; @@ -1361,7 +1361,8 @@ re_run(Process *p, Eterm arg1, Eterm arg2, Eterm arg3, int first) case PCRE_ERROR_BADUTF8_OFFSET: BUMP_ALL_REDS(p); /* Unknown amount of work done... */ /* Fall through for badarg... */ - + ERTS_FALLTHROUGH(); + /* Bad pre-compiled regexp... */ case PCRE_ERROR_BADMAGIC: case PCRE_ERROR_BADENDIANNESS: diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c index eb57056c2bfa..40b1433c9f6b 100644 --- a/erts/emulator/beam/erl_bif_trace.c +++ b/erts/emulator/beam/erl_bif_trace.c @@ -26,6 +26,8 @@ # include "config.h" #endif +#include + #include "sys.h" #include "erl_vm.h" #include "global.h" @@ -74,7 +76,7 @@ static int stage_trace_event_pattern(Eterm event, Binary*, int on); static void smp_bp_finisher(void* arg); static BIF_RETTYPE -system_monitor(Process *p, Eterm monitor_pid, Eterm list); +system_monitor(Process *p, ErtsTraceSession*, Eterm monitor_pid, Eterm list); static Eterm trace_session_create(Process*, Eterm name, Eterm tracer_term, Eterm opts); static void trace_session_destroy_aux(void *session_v); static void trace_session_destroy(ErtsTraceSession*); @@ -94,12 +96,16 @@ static Eterm trace_info_on_load(Process* p, ErtsTraceSession*, Eterm key); static Eterm trace_info_sessions(Process* p, Eterm What, Eterm key); static Eterm trace_info_event(Process* p, ErtsTraceSession*, Eterm event, Eterm key); +static Eterm trace_info_system(Process* p, ErtsTraceSession*); static void clear_event_trace(ErtsTracingEvent *et); static void set_event_trace(ErtsTracingEvent *et, Binary* match_spec); static void install_exp_breakpoints(BpFunctions* f); static void uninstall_exp_breakpoints(BpFunctions* f); static void clean_export_entries(BpFunctions* f); +static Eterm system_monitor_get(ErtsTraceSession*, Process*); +static Eterm system_monitor_make_list(Process*, ErtsTraceSession*, Eterm** hpp, Uint extra); +static void update_sysmon_globals(ErtsTraceSession*, struct system_monitor_session*); ErtsTraceSession erts_trace_session_0; erts_rwmtx_t erts_trace_session_list_lock; @@ -142,6 +148,15 @@ int erts_trace_session_init(ErtsTraceSession* s, ErtsTracer tracer, s->tracer = tracer; s->name_atom = name_atom; erts_atomic_init_nob(&s->state, ERTS_TRACE_SESSION_ALIVE); + + s->system_monitor.receiver = NIL; + for (int i = 0; i < ERTS_SYSMON_LIMIT_CNT; i++) { + s->system_monitor.limits[i] = 0; + } + s->system_monitor.flags.busy_port = false; + s->system_monitor.flags.busy_dist_port = false; + s->system_monitor.long_msgq_off = -1; + #ifdef DEBUG erts_refc_init(&s->dbg_bp_refc, 0); erts_refc_init(&s->dbg_p_refc, 0); @@ -174,7 +189,7 @@ int erts_trace_session_init(ErtsTraceSession* s, ErtsTracer tracer, * Does refc++ on returned trace session. */ static int term_to_session(Eterm term, ErtsTraceSession **session_p, - int allow_dead) + bool allow_dead) { ErtsTraceSession *s = NULL; Binary *bin; @@ -286,7 +301,7 @@ erts_internal_trace_pattern_4(BIF_ALIST_4) { ErtsTraceSession* session; - if (!term_to_session(BIF_ARG_1, &session, 0)) { + if (!term_to_session(BIF_ARG_1, &session, false)) { goto session_error; } @@ -881,7 +896,7 @@ Eterm erts_internal_trace_4(BIF_ALIST_4) ErtsTraceSession* session; Eterm ret; - if (!term_to_session(BIF_ARG_1, &session, 0)) { + if (!term_to_session(BIF_ARG_1, &session, false)) { goto session_error; } if (!erts_try_seize_code_mod_permission(BIF_P)) { @@ -1268,7 +1283,7 @@ Eterm erts_internal_trace_session_destroy_1(BIF_ALIST_1) { ErtsTraceSession* session; - if (!term_to_session(BIF_ARG_1, &session, 1)) { + if (!term_to_session(BIF_ARG_1, &session, true)) { BIF_P->fvalue = am_badopt; BIF_ERROR(BIF_P, BADARG | EXF_HAS_EXT_INFO); } @@ -1392,7 +1407,7 @@ Eterm erts_internal_trace_info_3(BIF_ALIST_3) /* trace:session_info */ session = NULL; } - else if (!term_to_session(BIF_ARG_1, &session, 0)) { + else if (!term_to_session(BIF_ARG_1, &session, true)) { goto session_error; } @@ -1433,6 +1448,8 @@ Eterm trace_info(Process* p, ErtsTraceSession* session, Eterm What, Eterm Key) res = trace_info_on_load(p, session, Key); } else if (What == am_send || What == am_receive) { res = trace_info_event(p, session, What, Key); + } else if (What == am_system && Key == am_all) { + res = trace_info_system(p, session); } else if (is_atom(What) || is_pid(What) || is_port(What)) { res = trace_info_pid(p, session, What, Key); } else if (is_tuple(What)) { @@ -1787,8 +1804,8 @@ static int function_is_traced(Process *p, Eterm *call_memory) /* out */ { const ErtsCodeInfo *ci; + const Export *ep; Export e; - Export* ep; /* First look for an export entry */ e.info.mfa = *mfa; @@ -1831,8 +1848,8 @@ static int function_is_traced(Process *p, static Eterm function_traced_by_sessions(Process *p, const ErtsCodeMFA *mfa) { const ErtsCodeInfo *ci; + const Export *ep; Export e; - Export* ep; ErtsHeapFactory factory; Eterm list = NIL; @@ -2277,6 +2294,15 @@ trace_info_event(Process* p, ErtsTraceSession* session, Eterm event, Eterm key) BIF_ERROR(p, BADARG); } +static Eterm +trace_info_system(Process* p, ErtsTraceSession* session) +{ + Eterm *hp; + Eterm list; + + list = system_monitor_make_list(p, session, &hp, 3); + return TUPLE2(hp, am_system, list); +} #undef FUNC_TRACE_NOEXIST #undef FUNC_TRACE_UNTRACED @@ -2640,6 +2666,7 @@ erts_finish_breakpointing(void) } /* Nothing to do here. Fall through to next stage. */ finish_bp.current++; + ERTS_FALLTHROUGH(); case 1: /* * Switch index for the breakpoint data, activating the staged @@ -2676,6 +2703,7 @@ erts_finish_breakpointing(void) } /* Nothing done here. Fall through to next stage. */ finish_bp.current++; + ERTS_FALLTHROUGH(); case 3: /* * Now all breakpoints have either been inserted or removed. @@ -3023,211 +3051,441 @@ BIF_RETTYPE seq_trace_print_2(BIF_ALIST_2) BIF_RET(am_true); } -void erts_system_monitor_clear(Process *c_p) { - if (c_p) { - erts_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN); - erts_thr_progress_block(); - } - erts_set_system_monitor(NIL); - erts_system_monitor_long_gc = 0; - erts_system_monitor_long_schedule = 0; - erts_system_monitor_large_heap = 0; - erts_system_monitor_flags.busy_port = 0; - erts_system_monitor_flags.busy_dist_port = 0; - erts_system_monitor_long_msgq_on = ERTS_SWORD_MAX; - erts_system_monitor_long_msgq_off = -1; - if (c_p) { - erts_thr_progress_unblock(); - erts_proc_lock(c_p, ERTS_PROC_LOCK_MAIN); +void erts_system_monitor_clear(ErtsTraceSession *session) +{ + struct system_monitor_session prev = session->system_monitor; + + erts_set_system_monitor(session, NIL); + for (int i = 0; i < ERTS_SYSMON_LIMIT_CNT; i++) { + session->system_monitor.limits[i] = 0; } -} + session->system_monitor.flags.busy_port = false; + session->system_monitor.flags.busy_dist_port = false; + session->system_monitor.long_msgq_off = -1; + update_sysmon_globals(session, &prev); +} -static Eterm system_monitor_get(Process *p) +static Eterm system_monitor_get(ErtsTraceSession *session, Process *p) { Eterm *hp; - Eterm system_monitor = erts_get_system_monitor(); + Eterm res; + Eterm system_monitor = erts_get_system_monitor(session); if (system_monitor == NIL) { return am_undefined; - } else { - Eterm res; - Uint hsz = 3 + (erts_system_monitor_flags.busy_dist_port ? 2 : 0) + - (erts_system_monitor_flags.busy_port ? 2 : 0); - Eterm long_gc = NIL; - Eterm long_schedule = NIL; - Eterm large_heap = NIL; - Eterm long_msgq_off = NIL; - Eterm long_msgq_on = NIL; - - if (erts_system_monitor_long_msgq_off >= 0) { - ASSERT(erts_system_monitor_long_msgq_on - > erts_system_monitor_long_msgq_off); - hsz += 2+3+3; - (void) erts_bld_uint(NULL, &hsz, - (Sint) erts_system_monitor_long_msgq_off); - (void) erts_bld_uint(NULL, &hsz, - (Sint) erts_system_monitor_long_msgq_on); - } - if (erts_system_monitor_long_gc != 0) { - hsz += 2+3; - (void) erts_bld_uint(NULL, &hsz, erts_system_monitor_long_gc); - } - if (erts_system_monitor_long_schedule != 0) { - hsz += 2+3; - (void) erts_bld_uint(NULL, &hsz, erts_system_monitor_long_schedule); - } - if (erts_system_monitor_large_heap != 0) { - hsz += 2+3; - (void) erts_bld_uint(NULL, &hsz, erts_system_monitor_large_heap); - } + } - hp = HAlloc(p, hsz); - if (erts_system_monitor_long_msgq_off >= 0) { - long_msgq_off = erts_bld_uint(&hp, NULL, - (Sint) erts_system_monitor_long_msgq_off); - long_msgq_on = erts_bld_uint(&hp, NULL, - (Sint) erts_system_monitor_long_msgq_on); + res = system_monitor_make_list(p, session, &hp, 3); + + return TUPLE2(hp, system_monitor, res); +} + +static Eterm system_monitor_make_list(Process *p, ErtsTraceSession *session, + Eterm** hpp, Uint extra) +{ + Uint hsz = ((session->system_monitor.flags.busy_dist_port ? 2 : 0) + + (session->system_monitor.flags.busy_port ? 2 : 0)); + Eterm long_gc = NIL; + Eterm long_schedule = NIL; + Eterm large_heap = NIL; + Eterm long_msgq_off = NIL; + Eterm long_msgq_on = NIL; + Eterm res; + Eterm *hp; +#ifdef DEBUG + Eterm *hp_end; +#endif + + if (session->system_monitor.long_msgq_off >= 0) { + ASSERT(session->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ] + > (Uint)session->system_monitor.long_msgq_off); + hsz += 2+3+3; + (void) erts_bld_uint(NULL, &hsz, + (Uint) session->system_monitor.long_msgq_off); + (void) erts_bld_uint(NULL, &hsz, + session->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LONG_GC] != 0) { + hsz += 2+3; + erts_bld_uint(NULL, &hsz, session->system_monitor.limits[ERTS_SYSMON_LONG_GC]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE] != 0) { + hsz += 2+3; + erts_bld_uint(NULL, &hsz, session->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP] != 0) { + hsz += 2+3; + erts_bld_uint(NULL, &hsz, session->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP]); + } + + hp = HAlloc(p, hsz + extra); +#ifdef DEBUG + hp_end = hp + hsz; +#endif + if (session->system_monitor.long_msgq_off >= 0) { + long_msgq_off = erts_bld_uint(&hp, NULL, + session->system_monitor.long_msgq_off); + long_msgq_on = erts_bld_uint(&hp, NULL, + session->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LONG_GC] != 0) { + long_gc = erts_bld_uint(&hp, NULL, session->system_monitor.limits[ERTS_SYSMON_LONG_GC]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE] != 0) { + long_schedule = erts_bld_uint(&hp, NULL, session->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE]); + } + if (session->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP] != 0) { + large_heap = erts_bld_uint(&hp, NULL, session->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP]); + } + res = NIL; + if (long_msgq_off != NIL) { + Eterm t; + ASSERT(long_msgq_on != NIL); + t = TUPLE2(hp, long_msgq_off, long_msgq_on); hp += 3; + t = TUPLE2(hp, am_long_message_queue, t); hp += 3; + res = CONS(hp, t, res); hp += 2; + } + if (long_gc != NIL) { + Eterm t = TUPLE2(hp, am_long_gc, long_gc); hp += 3; + res = CONS(hp, t, res); hp += 2; + } + if (long_schedule != NIL) { + Eterm t = TUPLE2(hp, am_long_schedule, long_schedule); hp += 3; + res = CONS(hp, t, res); hp += 2; + } + if (large_heap != NIL) { + Eterm t = TUPLE2(hp, am_large_heap, large_heap); hp += 3; + res = CONS(hp, t, res); hp += 2; + } + if (session->system_monitor.flags.busy_port) { + res = CONS(hp, am_busy_port, res); hp += 2; + } + if (session->system_monitor.flags.busy_dist_port) { + res = CONS(hp, am_busy_dist_port, res); hp += 2; + } + ASSERT(hp == hp_end); + *hpp = hp; + return res; +} + + +/* + * Backend for erlang:system_monitor/0 + * but also called directly by tests with undocumented tracer-less sesssions. +*/ +BIF_RETTYPE erts_internal_system_monitor_1(BIF_ALIST_1) +{ + ErtsTraceSession *session; + Eterm res; + + if (BIF_ARG_1 == am_legacy) { + session = &erts_trace_session_0; + } + else if (!term_to_session(BIF_ARG_1, &session, false)) { + BIF_ERROR(BIF_P, BADARG); + } + res = system_monitor_get(session, BIF_P); + erts_deref_trace_session(session); + BIF_RET(res); +} + +/* + * Backend for erlang:system_monitor/1,2 + * and trace:system/3 + * but also called directly by tests with undocumented tracer-less sesssions. +*/ +BIF_RETTYPE erts_internal_system_monitor_3(BIF_ALIST_3) +{ + ErtsTraceSession *session; + Eterm res; + + if (BIF_ARG_1 == am_legacy) { + session = &erts_trace_session_0; + } + else if (!term_to_session(BIF_ARG_1, &session, false)) { + BIF_ERROR(BIF_P, BADARG); + } + + res = system_monitor(BIF_P, session, BIF_ARG_2, BIF_ARG_3); + + erts_deref_trace_session(session); + return res; +} + +static Sint calc_sysmon_global_msgq_off_max(void) +{ + Sint max_limit = -1; + + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.long_msgq_off > max_limit) { + max_limit = s->system_monitor.long_msgq_off; } - if (erts_system_monitor_long_gc != 0) { - long_gc = erts_bld_uint(&hp, NULL, erts_system_monitor_long_gc); - } - if (erts_system_monitor_long_schedule != 0) { - long_schedule = erts_bld_uint(&hp, NULL, - erts_system_monitor_long_schedule); - } - if (erts_system_monitor_large_heap != 0) { - large_heap = erts_bld_uint(&hp, NULL, erts_system_monitor_large_heap); - } - res = NIL; - if (long_msgq_off != NIL) { - Eterm t; - ASSERT(long_msgq_on != NIL); - t = TUPLE2(hp, long_msgq_off, long_msgq_on); hp += 3; - t = TUPLE2(hp, am_long_message_queue, t); hp += 3; - res = CONS(hp, t, res); hp += 2; + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); + return max_limit; +} + +static Uint calc_sysmon_global_limit(Uint limit_ix) +{ + ErtsTraceSession *s; + Uint min_limit = 0; + + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.limits[limit_ix]-1 < min_limit-1) { + min_limit = s->system_monitor.limits[limit_ix]; } - if (long_gc != NIL) { - Eterm t = TUPLE2(hp, am_long_gc, long_gc); hp += 3; - res = CONS(hp, t, res); hp += 2; - } - if (long_schedule != NIL) { - Eterm t = TUPLE2(hp, am_long_schedule, long_schedule); hp += 3; - res = CONS(hp, t, res); hp += 2; - } - if (large_heap != NIL) { - Eterm t = TUPLE2(hp, am_large_heap, large_heap); hp += 3; - res = CONS(hp, t, res); hp += 2; - } - if (erts_system_monitor_flags.busy_port) { - res = CONS(hp, am_busy_port, res); hp += 2; - } - if (erts_system_monitor_flags.busy_dist_port) { - res = CONS(hp, am_busy_dist_port, res); hp += 2; - } - return TUPLE2(hp, system_monitor, res); } + erts_rwmtx_runlock(&erts_trace_session_list_lock); + return min_limit; } +static void +set_sysmon_global_limit(Uint *global_limit, ErtsTraceSession *session, + Uint limit_ix) +{ + const Uint new_limit = session->system_monitor.limits[limit_ix]; -BIF_RETTYPE system_monitor_0(BIF_ALIST_0) + ASSERT(limit_ix < ERTS_SYSMON_LIMIT_CNT); + + /* Trick: Do -1 with underflow to compare 0 (off) as UINT_MAX */ + + if (new_limit - 1 < *global_limit - 1) { + /* Enable or lower limit */ + *global_limit = new_limit; + ASSERT(*global_limit == calc_sysmon_global_limit(limit_ix)); + } + else if (new_limit != *global_limit) { + *global_limit = calc_sysmon_global_limit(limit_ix); + } + else { + ASSERT(*global_limit == calc_sysmon_global_limit(limit_ix)); + } +} + +static void set_sysmon_global_enabled_cnt(bool was_enabled, bool is_enabled, + Sint *counter_p) { - BIF_RET(system_monitor_get(BIF_P)); + if (was_enabled != is_enabled) { + if (is_enabled) { + (*counter_p)++; + } + else { + ASSERT(was_enabled); + ASSERT(*counter_p > 0); + (*counter_p)--; + } + } } -BIF_RETTYPE system_monitor_1(BIF_ALIST_1) +static void update_sysmon_globals(ErtsTraceSession *s, + struct system_monitor_session* prev) { - Process* p = BIF_P; - Eterm spec = BIF_ARG_1; + ERTS_LC_ASSERT(erts_thr_progress_is_blocking()); - if (spec == am_undefined) { - BIF_RET(system_monitor(p, spec, NIL)); - } else if (is_tuple(spec)) { - Eterm *tp = tuple_val(spec); - if (tp[0] != make_arityval(2)) goto error; - BIF_RET(system_monitor(p, tp[1], tp[2])); + set_sysmon_global_limit(&erts_system_monitor_long_gc, s, + ERTS_SYSMON_LONG_GC); + set_sysmon_global_limit(&erts_system_monitor_long_schedule, s, + ERTS_SYSMON_LONG_SCHEDULE); + set_sysmon_global_limit(&erts_system_monitor_large_heap, s, + ERTS_SYSMON_LARGE_HEAP); + set_sysmon_global_limit(&erts_system_monitor_long_msgq_on, s, + ERTS_SYSMON_LONG_MSGQ); + + if (s->system_monitor.long_msgq_off > erts_system_monitor_long_msgq_off) { + erts_system_monitor_long_msgq_off = s->system_monitor.long_msgq_off; + ASSERT(erts_system_monitor_long_msgq_off == calc_sysmon_global_msgq_off_max()); } - error: - BIF_ERROR(p, BADARG); + else if (s->system_monitor.long_msgq_off != erts_system_monitor_long_msgq_off) { + erts_system_monitor_long_msgq_off = calc_sysmon_global_msgq_off_max(); + } + else { + ASSERT(erts_system_monitor_long_msgq_off == calc_sysmon_global_msgq_off_max()); + } + + set_sysmon_global_enabled_cnt(prev->flags.busy_port, + s->system_monitor.flags.busy_port, + &erts_system_monitor_busy_port_cnt); + set_sysmon_global_enabled_cnt(prev->flags.busy_dist_port, + s->system_monitor.flags.busy_dist_port, + &erts_system_monitor_busy_dist_port_cnt); +#ifdef DEBUG + { + Sint busy_port_cnt = 0, busy_dist_port_cnt = 0; + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.flags.busy_port) busy_port_cnt++; + if (s->system_monitor.flags.busy_dist_port) busy_dist_port_cnt++; + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); + ASSERT(busy_port_cnt == erts_system_monitor_busy_port_cnt); + ASSERT(busy_dist_port_cnt == erts_system_monitor_busy_dist_port_cnt); + } +#endif +} + +static bool term_to_limit(Eterm term, Uint *limit_p, Uint min_limit) +{ + if (term == am_false) { + *limit_p = 0; + return true; + } + if (term_to_Uint(term, limit_p)) { + if (*limit_p < min_limit) *limit_p = min_limit; + return true; + } + return false; } -BIF_RETTYPE system_monitor_2(BIF_ALIST_2) +static bool term_to_boolean(Eterm term, bool *bool_p) { - return system_monitor(BIF_P, BIF_ARG_1, BIF_ARG_2); + switch (term) { + case am_true: *bool_p = true; return true; + case am_false: *bool_p = false; return true; + } + return false; } + static BIF_RETTYPE -system_monitor(Process *p, Eterm monitor_pid, Eterm list) +system_monitor(Process *p, ErtsTraceSession *session, + Eterm monitor_pid, Eterm list) { - Eterm prev; - int system_blocked = 0; + Eterm return_term; + bool system_blocked = false; - if (monitor_pid == am_undefined || list == NIL) { - prev = system_monitor_get(p); - erts_system_monitor_clear(p); - BIF_RET(prev); - } - if (is_not_list(list)) goto error; + if (is_not_list(list) && is_not_nil(list)) goto error; else { - Uint long_gc, long_schedule, large_heap; - Sint long_msgq_on, long_msgq_off; - int busy_port, busy_dist_port; + struct system_monitor_session prev; + struct system_monitor_session want; - system_blocked = 1; + if (!ERTS_TRACER_IS_NIL(session->tracer) + && !is_internal_pid(session->tracer)) { + /* ToDo: Should we support ports and NIFs for system_monitor? */ + goto error; + } + + system_blocked = true; erts_proc_unlock(p, ERTS_PROC_LOCK_MAIN); erts_thr_progress_block(); - erts_proc_lock(p, ERTS_PROC_LOCK_MAIN); + erts_proc_lock(p, ERTS_PROC_LOCK_MAIN); - if (!erts_pid2proc(p, ERTS_PROC_LOCK_MAIN, monitor_pid, 0)) - goto error; + prev = session->system_monitor; - for (long_gc = 0, long_schedule = 0, large_heap = 0, - busy_port = 0, busy_dist_port = 0, - long_msgq_on = ERTS_SWORD_MAX, long_msgq_off = -1; - is_list(list); - list = CDR(list_val(list))) { - Eterm t = CAR(list_val(list)); - if (is_tuple(t)) { - Eterm *tp = tuple_val(t); - if (arityval(tp[0]) != 2) goto error; - if (tp[1] == am_long_gc) { - if (! term_to_Uint(tp[2], &long_gc)) goto error; - if (long_gc < 1) long_gc = 1; - } else if (tp[1] == am_long_schedule) { - if (! term_to_Uint(tp[2], &long_schedule)) goto error; - if (long_schedule < 1) long_schedule = 1; - } else if (tp[1] == am_large_heap) { - if (! term_to_Uint(tp[2], &large_heap)) goto error; - if (large_heap < 16384) large_heap = 16384; - /* 16 Kword is not an unnatural heap size */ - } else if (tp[1] == am_long_message_queue) { - if (!is_tuple_arity(tp[2], 2)) goto error; + if (ERTS_TRACER_IS_NIL(session->tracer)) { + /* + * Old erlang:system_monitor API + * We use monitor_pid argument + * and treat list as the new state (missing items are disabled) + */ + if (monitor_pid == am_undefined || list == NIL) { + monitor_pid = NIL; + list = NIL; + } + else if (!erts_pid2proc(p, ERTS_PROC_LOCK_MAIN, monitor_pid, 0)) + goto error; + return_term = system_monitor_get(session, p); + want.receiver = monitor_pid; + want.limits[ERTS_SYSMON_LONG_GC] = 0; + want.limits[ERTS_SYSMON_LONG_SCHEDULE] = 0; + want.limits[ERTS_SYSMON_LARGE_HEAP] = 0; + want.limits[ERTS_SYSMON_LONG_MSGQ] = 0; + want.long_msgq_off = -1; + want.flags.busy_port = false; + want.flags.busy_dist_port = false; + } + else { + /* + * New trace module API + * We use session tracer (ignore monitor_pid argument) + * and treat list as diff to apply (missing items are unchanged) + */ + if (monitor_pid != am_session) { + goto error; + } + want = prev; + want.receiver = session->tracer; + return_term = am_ok; + } + + for ( ; is_list(list); list = CDR(list_val(list))) { + Eterm t = CAR(list_val(list)); + Eterm *tp; + Eterm fake_tuple[3]; + + if (!is_tuple_arity(t,2)) { + if (is_atom(t)) { + t = TUPLE2(fake_tuple, t, am_true); + } + else { + goto error; + } + } + tp = tuple_val(t); + + switch (tp[1]) { + case am_long_gc: + if (!term_to_limit(tp[2], &want.limits[ERTS_SYSMON_LONG_GC], 1)) { + goto error; + } + break; + case am_long_schedule: + if (!term_to_limit(tp[2], &want.limits[ERTS_SYSMON_LONG_SCHEDULE], 1)) { + goto error; + } + break; + case am_large_heap: + /* 16 Kword is not an unnatural heap size */ + if (!term_to_limit(tp[2], &want.limits[ERTS_SYSMON_LARGE_HEAP], + 16384)) { + goto error; + } + break; + case am_long_message_queue: + if (tp[2] == am_false) { + want.limits[ERTS_SYSMON_LONG_MSGQ] = 0; + want.long_msgq_off = -1; + } else if (is_tuple_arity(tp[2], 2)) { tp = tuple_val(tp[2]); - if (!term_to_Sint(tp[1], &long_msgq_off)) goto error; - if (!term_to_Sint(tp[2], &long_msgq_on)) goto error; - if (long_msgq_off < 0) goto error; - if (long_msgq_on <= 0) goto error; - if (long_msgq_off >= long_msgq_on) goto error; - } else goto error; - } else if (t == am_busy_port) { - busy_port = !0; - } else if (t == am_busy_dist_port) { - busy_dist_port = !0; - } else goto error; + if (!term_to_Sint(tp[1], &want.long_msgq_off)) goto error; + if (!term_to_limit(tp[2], &want.limits[ERTS_SYSMON_LONG_MSGQ], + 0)) { + goto error; + } + if (want.long_msgq_off < 0 + || want.limits[ERTS_SYSMON_LONG_MSGQ] <= 0 + || want.long_msgq_off >= want.limits[ERTS_SYSMON_LONG_MSGQ]) { + goto error; + } + } else { + goto error; + } + break; + case am_busy_port: + if (!term_to_boolean(tp[2], &want.flags.busy_port)) { + goto error; + } + break; + case am_busy_dist_port: + if (!term_to_boolean(tp[2], &want.flags.busy_dist_port)) { + goto error; + } + break; + default: + goto error; + } } - if (is_not_nil(list)) goto error; - prev = system_monitor_get(p); - erts_set_system_monitor(monitor_pid); - erts_system_monitor_long_gc = long_gc; - erts_system_monitor_long_schedule = long_schedule; - erts_system_monitor_large_heap = large_heap; - erts_system_monitor_flags.busy_port = !!busy_port; - erts_system_monitor_flags.busy_dist_port = !!busy_dist_port; - erts_system_monitor_long_msgq_off = long_msgq_off; - erts_system_monitor_long_msgq_on = long_msgq_on; + if (is_not_nil(list)) { + goto error; + } - erts_thr_progress_unblock(); - BIF_RET(prev); + session->system_monitor = want; + update_sysmon_globals(session, &prev); + + erts_thr_progress_unblock(); + BIF_RET(return_term); } error: diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c index 62bfe4eb3ad1..ef3640e1c289 100644 --- a/erts/emulator/beam/erl_bits.c +++ b/erts/emulator/beam/erl_bits.c @@ -246,13 +246,13 @@ Process *p, Uint num_bits, unsigned flags, ErlSubBits *sb) */ switch (BYTE_OFFSET(n)) { #if defined(ARCH_64) - case 7: w = (w << 8) | *bp++; - case 6: w = (w << 8) | *bp++; - case 5: w = (w << 8) | *bp++; - case 4: w = (w << 8) | *bp++; + case 7: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); + case 6: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); + case 5: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); + case 4: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); #endif - case 3: w = (w << 8) | *bp++; - case 2: w = (w << 8) | *bp++; + case 3: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); + case 2: w = (w << 8) | *bp++; ERTS_FALLTHROUGH(); case 1: w = (w << 8) | *bp++; } n = BIT_OFFSET(n); @@ -302,15 +302,15 @@ Process *p, Uint num_bits, unsigned flags, ErlSubBits *sb) * Move bits to temporary buffer. We want the buffer to be stored in * little-endian order, since bignums are little-endian. */ - + if (flags & BSF_LITTLE) { - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, - LSB, 0, 1, num_bits); + erts_copy_bits_fwd(erl_sub_bits_get_base(sb), sb->start, + LSB, 0, num_bits); *MSB >>= offs; /* adjust msb */ } else { *MSB = 0; - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, - MSB, offs, -1, num_bits); + erts_copy_bits_rev(erl_sub_bits_get_base(sb), sb->start, + MSB, offs, num_bits); } sb->start += num_bits; @@ -472,13 +472,13 @@ erts_bs_get_float_2(Process *p, Uint num_bits, unsigned flags, ErlSubBits *sb) } if (BIT_IS_MACHINE_ENDIAN(flags)) { - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, - fptr, 0, 1, - num_bits); + erts_copy_bits_fwd(erl_sub_bits_get_base(sb), sb->start, + fptr, 0, + num_bits); } else { - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, - fptr + NBYTES(num_bits) - 1, 0, -1, - num_bits); + erts_copy_bits_rev(erl_sub_bits_get_base(sb), sb->start, + fptr + NBYTES(num_bits) - 1, 0, + num_bits); } ERTS_FP_CHECK_INIT(p); if (num_bits == 16) { @@ -532,237 +532,438 @@ erts_bs_get_binary_all_2(Process *p, ErlSubBits *sb) ****************************************************************/ -/* COPY_VAL: - * copy sz byte from val to dst buffer, - * dst, val are updated!!! +/* FMT_COPY_VAL: + * Copy sz bytes from val to dst buffer; + * dst and val are updated. */ -#define COPY_VAL(dst,ddir,val,sz) do { \ - Uint __sz = (sz); \ - while(__sz) { \ - switch(__sz) { \ - default: \ - case 4: *dst = (val&0xff); dst += ddir; val >>= 8; __sz--; \ - case 3: *dst = (val&0xff); dst += ddir; val >>= 8; __sz--; \ - case 2: *dst = (val&0xff); dst += ddir; val >>= 8; __sz--; \ - case 1: *dst = (val&0xff); dst += ddir; val >>= 8; __sz--; \ - } \ - } \ +#define FMT_COPY_VAL(dst,ddir,val,sz) do { \ + Uint __sz = (sz); \ + while (__sz) { \ + switch(__sz) { \ + default: \ + case 8: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 7: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 6: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 5: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 4: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 3: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 2: *dst = val; dst += ddir; val >>= 8; __sz--; ERTS_FALLTHROUGH(); \ + case 1: *dst = val; dst += ddir; val >>= 8; __sz--; \ + } \ + } \ } while(0) static void -fmt_small(byte *buf, Uint num_bytes, Eterm arg, Uint num_bits, Uint flags) +fmt_small_be(byte *buf, Eterm arg, Uint num_bits) { Uint bit_offset; Sint val; + Uint num_bytes; ASSERT(is_small(arg)); ASSERT(num_bits != 0); /* Tested by caller */ + num_bytes = NBYTES(num_bits); bit_offset = BIT_OFFSET(num_bits); val = signed_val(arg); - if (flags & BSF_LITTLE) { /* Little endian */ + buf += num_bytes - 1; + if (bit_offset) { + *buf-- = val << (8-bit_offset); num_bytes--; - COPY_VAL(buf, 1, val, num_bytes); - *buf = bit_offset ? (val << (8-bit_offset)) : val; - } else { /* Big endian */ - buf += num_bytes - 1; - if (bit_offset) { - *buf-- = val << (8-bit_offset); - num_bytes--; - val >>= bit_offset; - } - COPY_VAL(buf, -1, val, num_bytes); + val >>= bit_offset; } + FMT_COPY_VAL(buf, -1, val, num_bytes); } -/* calculate a - *cp (carry) (store result in b), *cp is updated! */ -#define SUBc(a, cp, b) do { \ - byte __x = (a); \ - byte __y = (__x - (*(cp))); \ - (*cp) = (__y > __x); \ - *(b) = ~__y; \ - } while(0) +static void +fmt_small_le(byte *buf, Eterm arg, Uint num_bits) +{ + Uint bit_offset; + Sint val; + Uint num_bytes; + + ASSERT(is_small(arg)); + ASSERT(num_bits != 0); /* Tested by caller */ + + num_bytes = NBYTES(num_bits); + bit_offset = BIT_OFFSET(num_bits); + val = signed_val(arg); + num_bytes--; + FMT_COPY_VAL(buf, 1, val, num_bytes); + *buf = bit_offset ? (val << (8-bit_offset)) : val; +} + +#undef FMT_COPY_VAL + +/* + * Calculate a - c (carry), storing the result in b; set c + * to the new carry. + */ +#if __has_builtin(__builtin_subc) && !defined(DEBUG) +#define SUBc(a, c, b) \ + do { \ + *(b) = __builtin_subc(0, (a), c, &c); \ + } while(0) +#else +#define SUBc(a, c, b) \ + do { \ + byte __x = (a); \ + byte __y = (__x - !(c)); \ + c = !(__y > __x); \ + *(b) = ~__y; \ + } while(0) +#endif static void -fmt_big(byte *buf, Uint num_bytes, Eterm val, Uint num_bits, Uint flags) +fmt_big_be(byte *buf, Eterm val, Uint num_bits) { unsigned long offs; int sign; Uint ds; ErtsDigit* dp; int n; + ErtsDigit acc = 0; + ErtsDigit d; + Uint num_bytes; ASSERT(is_big(val)); + ASSERT(num_bits != 0); - if (num_bits == 0) { - return; - } - + num_bytes = NBYTES(num_bits); sign = big_sign(val); ds = big_size(val)*sizeof(ErtsDigit); /* number of digits bytes */ dp = big_v(val); n = MIN(num_bytes, ds); offs = BIT_OFFSET(num_bits); - if (flags & BSF_LITTLE) { - num_bytes -= n; /* pad with this amount */ - if (sign) { /* negative */ - int c = 1; - while (n >= sizeof(ErtsDigit)) { - ErtsDigit d = *dp++; - int i; - for (i = 0; i < sizeof(ErtsDigit); i++) { - SUBc(d & 0xff, &c, buf); - buf++; - d >>= 8; - } - n -= sizeof(ErtsDigit); + + buf += num_bytes - 1; /* end of buffer */ + num_bytes -= n; /* pad with this amount */ + offs = offs ? (8-offs) : 0; /* shift offset */ + + if (sign) { /* negative bignum */ + unsigned int c = 0; + + while (n >= sizeof(ErtsDigit)) { + int i; + + d = *dp++; + acc |= d << offs; + SUBc(acc & 0xff, c, buf); + buf--; + acc = d >> (8-offs); + for (i = 0; i < sizeof(ErtsDigit)-1; i++) { + SUBc(acc & 0xff, c, buf); + buf--; + acc >>= 8; } - if (n) { - ErtsDigit d = *dp; - do { - SUBc(d & 0xff, &c, buf); - buf++; - d >>= 8; - } while (--n > 0); + n -= sizeof(ErtsDigit); + } + if (n) { + acc |= ((ErtsDigit)*dp << offs); + do { + SUBc(acc & 0xff, c, buf); + buf--; + acc >>= 8; + } while (--n > 0); + } + /* pad */ + while (num_bytes--) { + SUBc(acc & 0xff, c, buf); + buf--; + acc >>= 8; + } + } else { /* positive bignum */ + while (n >= sizeof(ErtsDigit)) { + int i; + + d = *dp++; + acc |= d << offs; + *buf-- = acc; + acc = d >> (8-offs); + for (i = 0; i < sizeof(ErtsDigit)-1; i++) { + *buf-- = acc; + acc >>= 8; } - /* pad */ - while (num_bytes--) { - SUBc(0, &c, buf); + n -= sizeof(ErtsDigit); + } + if (n) { + acc |= (*dp << offs); + do { + *buf-- = acc; + acc >>= 8; + } while (--n > 0); + } + while (num_bytes--) { + *buf-- = acc; + acc >>= 8; + } + } +} + +static void +fmt_big_le(byte *buf, Eterm val, Uint num_bits) +{ + unsigned long offs; + int sign; + Uint ds; + ErtsDigit* dp; + int n; + Uint num_bytes; + + ASSERT(is_big(val)); + ASSERT(num_bits != 0); + + num_bytes = NBYTES(num_bits); + sign = big_sign(val); + ds = big_size(val)*sizeof(ErtsDigit); /* number of digits bytes */ + dp = big_v(val); + n = MIN(num_bytes, ds); + + offs = BIT_OFFSET(num_bits); + num_bytes -= n; /* pad with this amount */ + if (sign) { /* negative */ + unsigned int c = 0; + while (n >= sizeof(ErtsDigit)) { + ErtsDigit d = *dp++; + int i; + for (i = 0; i < sizeof(ErtsDigit); i++) { + SUBc(d & 0xff, c, buf); buf++; + d >>= 8; } - } else { /* positive */ - while (n >= sizeof(ErtsDigit)) { - ErtsDigit d = *dp++; - int i; - for(i = 0; i < sizeof(ErtsDigit); i++) { - *buf++ = d; - d >>= 8; - } - n -= sizeof(ErtsDigit); - } - if (n) { - ErtsDigit d = *dp; - do { - *buf++ = d; - d >>= 8; - } while (--n > 0); - } - /* pad */ - while (num_bytes) { - *buf++ = 0; - num_bytes--; + n -= sizeof(ErtsDigit); + } + if (n) { + ErtsDigit d = *dp; + do { + SUBc(d & 0xff, c, buf); + buf++; + d >>= 8; + } while (--n > 0); + } + /* pad */ + while (num_bytes--) { + SUBc(0, c, buf); + buf++; + } + } else { /* positive */ + while (n >= sizeof(ErtsDigit)) { + ErtsDigit d = *dp++; + int i; + for(i = 0; i < sizeof(ErtsDigit); i++) { + *buf++ = d; + d >>= 8; } + n -= sizeof(ErtsDigit); } + if (n) { + ErtsDigit d = *dp; + do { + *buf++ = d; + d >>= 8; + } while (--n > 0); + } + /* pad */ + while (num_bytes) { + *buf++ = 0; + num_bytes--; + } + } - /* adjust MSB */ - if (offs) { - buf--; - *buf <<= (8 - offs); + /* adjust MSB */ + if (offs) { + buf--; + *buf <<= (8 - offs); + } +} + +#undef SUBc + +static void +restore_and_shift(byte *buf, Uint orig_byte, Uint bit_offset, Uint num_bits) +{ + Uint rshift = bit_offset; + Uint lshift = 8 - bit_offset; + Uint deoffs = BIT_OFFSET(bit_offset + num_bits); + Uint lmask = MAKE_MASK(8 - bit_offset); + Uint count = (num_bits - lshift) / 8; + Uint bits, bits1; + + ASSERT(num_bits - lshift >= 0); + + bits = *buf; + bits1 = bits >> rshift; + *buf = MASK_BITS(bits1, orig_byte, lmask); + buf++; + + while (count--) { + bits1 = bits << lshift; + bits = *buf; + *buf++ = bits1 | (bits >> rshift); + } + + if (deoffs) { + Uint rmask = MAKE_MASK(deoffs) << (8 - deoffs); + + bits1 = bits << lshift; + if ((rmask << rshift) & 0xff) { + bits = *buf; + bits1 |= (bits >> rshift); } - } else { /* BIG ENDIAN */ - ErtsDigit acc = 0; - ErtsDigit d; + *buf = MASK_BITS(bits1, *buf, rmask); + } +} - buf += num_bytes - 1; /* end of buffer */ - num_bytes -= n; /* pad with this amount */ - offs = offs ? (8-offs) : 0; /* shift offset */ +int +erts_bs_put_integer_be(ErlBitsState *EBS, Eterm arg, Uint num_bits) +{ + byte* dst_bin = EBS->erts_current_bin; + Uint bin_offset = EBS->erts_bin_offset; + Uint bit_offset; + byte b; + byte *iptr; - if (sign) { /* negative bignum */ - int c = 1; + if (ERTS_UNLIKELY(num_bits == 0)) { + return is_small(arg) || is_big(arg); + } - while (n >= sizeof(ErtsDigit)) { - int i; + iptr = dst_bin + BYTE_OFFSET(bin_offset); + bit_offset = BIT_OFFSET(bin_offset); + if (is_small(arg)) { + Uint rbits = 8 - bit_offset; - d = *dp++; - acc |= d << offs; - SUBc(acc & 0xff, &c, buf); - buf--; - acc = d >> (8-offs); - for (i = 0; i < sizeof(ErtsDigit)-1; i++) { - SUBc(acc & 0xff, &c, buf); - buf--; - acc >>= 8; - } - n -= sizeof(ErtsDigit); - } - if (n) { - acc |= ((ErtsDigit)*dp << offs); - do { - SUBc(acc & 0xff, &c, buf); - buf--; - acc >>= 8; - } while (--n > 0); - } - /* pad */ - while (num_bytes--) { - SUBc(acc & 0xff, &c, buf); - buf--; - acc >>= 8; + if (bit_offset == 0) { + /* Aligned on a byte boundary. */ + if (num_bits <= 8) { + /* All bits are in the same byte. */ + b = (signed_val(arg) & MAKE_MASK(num_bits)) << (rbits-num_bits); + *iptr = b; + } else { + /* More than one byte. */ + fmt_small_be(iptr, arg, num_bits); } - } else { /* positive bignum */ - while (n >= sizeof(ErtsDigit)) { - int i; + } else if (bit_offset + num_bits <= 8) { + /* + * All bits are in the same byte. + */ + b = *iptr & (0xff << rbits); + b |= (signed_val(arg) & MAKE_MASK(num_bits)) << (rbits-num_bits); + *iptr = b; + } else { /* Big endian */ + /* + * Big-endian, more than one byte, but not aligned on a byte boundary. + * Handle the bits up to the next byte boundary specially, + * then let fmt_small_be() handle the rest. + */ + Uint shift_count = num_bits - rbits; + Sint val = signed_val(arg); - d = *dp++; - acc |= d << offs; - *buf-- = acc; - acc = d >> (8-offs); - for (i = 0; i < sizeof(ErtsDigit)-1; i++) { - *buf-- = acc; - acc >>= 8; - } - n -= sizeof(ErtsDigit); - } - if (n) { - acc |= (*dp << offs); - do { - *buf-- = acc; - acc >>= 8; - } while (--n > 0); - } - while (num_bytes--) { - *buf-- = acc; - acc >>= 8; + ASSERT(num_bits > rbits); + b = *iptr & (0xff << rbits); + + /* + * Shifting with a shift count greater than or equal to the word + * size may be a no-op (instead of 0 the result may be the unshifted + * value). Therefore, only do the shift and the OR if the shift count + * is less than the word size if the number is positive; if negative, + * we must simulate the sign extension. + */ + if (shift_count < sizeof(Uint)*8) { + b |= (val >> shift_count) & MAKE_MASK(rbits); + } else if (val < 0) { + /* Simulate sign extension. */ + b |= (-1) & MAKE_MASK(rbits); } + *iptr++ = b; + + fmt_small_be(iptr, arg, shift_count); } + } else if (is_big(arg) && bit_offset == 0) { + /* + * Big number, aligned on a byte boundary. We can format the + * integer directly into the binary. + */ + fmt_big_be(iptr, arg, num_bits); + } else if (is_big(arg) && bit_offset + num_bits <= 8) { + /* + * All bits are in the same byte. + */ + Uint rbits = 8 - bit_offset; + Sint sign = big_sign(arg); + ErtsDigit* dp = big_v(arg); + Uint val = sign ? -*dp : *dp; + + b = *iptr & (0xff << rbits); + b |= (val & MAKE_MASK(num_bits)) << (rbits-num_bits); + *iptr = b; + } else if (is_big(arg)) { + /* + * Big number, not aligned on a byte boundary. + * + * Format the integer byte-aligned using the binary itself as + * a temporary buffer. + */ + b = *iptr; + fmt_big_be(iptr, arg, num_bits); + + /* + * Now restore the overwritten bits of the first byte and + * shift everything to the right. + */ + restore_and_shift(iptr, b, bit_offset, num_bits); + } else { + /* Not an integer. */ + return 0; } + EBS->erts_bin_offset = bin_offset + num_bits; + return 1; } int -erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flags)) +erts_bs_put_integer_le(ErlBitsState *EBS, Eterm arg, Uint num_bits) { - Uint bin_offset = erts_bin_offset; + byte* dst_bin = EBS->erts_current_bin; + Uint bin_offset = EBS->erts_bin_offset; Uint bit_offset; - Uint b; + byte b; byte *iptr; + if (ERTS_UNLIKELY(num_bits == 0)) { + return is_small(arg) || is_big(arg); + } + + iptr = dst_bin + BYTE_OFFSET(bin_offset); bit_offset = BIT_OFFSET(bin_offset); if (is_small(arg)) { - Uint rbits = 8 - bit_offset; - - if (num_bits == 0) { - return 1; - } else if (bit_offset + num_bits <= 8) { - /* - * All bits are in the same byte. - */ - iptr = erts_current_bin+BYTE_OFFSET(bin_offset); - b = *iptr & (0xff << rbits); - b |= (signed_val(arg) & ((1 << num_bits)-1)) << (rbits-num_bits); - *iptr = b; - } else if (bit_offset == 0) { - /* - * More than one bit, starting at a byte boundary. - */ - iptr = erts_current_bin + BYTE_OFFSET(bin_offset); - fmt_small(iptr, NBYTES(num_bits), arg, num_bits, flags); - } else if (flags & BSF_LITTLE) { + Uint rbits = 8 - bit_offset; + + if (bit_offset == 0) { + /* Aligned on a byte boundary. */ + if (num_bits <= 8) { + /* All bits are in the same byte. */ + b = (signed_val(arg) & MAKE_MASK(num_bits)) << (rbits-num_bits); + *iptr = b; + } else { + /* More than one byte. */ + fmt_small_le(iptr, arg, num_bits); + } + } else if (bit_offset + num_bits <= 8) { + /* + * All bits are in the same byte. + */ + b = *iptr & (0xff << rbits); + b |= (signed_val(arg) & MAKE_MASK(num_bits)) << (rbits-num_bits); + *iptr = b; + } else if (BIT_OFFSET(num_bits) == 0) { /* * Little endian small in more than one byte, not - * aligned on a byte boundary. + * aligned on a byte boundary. The size is evenly + * divisible by 8, which means that there will be + * one partial byte, followed by zero or more + * complete bytes, followed by a final partial byte. */ Sint val = signed_val(arg); Uint rshift = bit_offset; @@ -771,92 +972,51 @@ erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flag Uint count = (num_bits - rbits) / 8; Uint bits, bits1; - iptr = erts_current_bin+BYTE_OFFSET(bin_offset); - - if (BIT_OFFSET(num_bits) == 0) { - bits = val; - bits1 = bits >> rshift; - *iptr = MASK_BITS(bits1, *iptr, lmask); - iptr++; - val >>= 8; - - while (count--) { - bits1 = bits << lshift; - bits = val & 0xff; - *iptr++ = bits1 | (bits >> rshift); - val >>= 8; - } - - *iptr = bits << lshift; - } else { - Sint num_bytes = NBYTES(num_bits) - 1; - Uint deoffs = BIT_OFFSET(bit_offset + num_bits); - - if (num_bytes-- > 0) { - bits = val; - } else { - bits = (val << (8 - BIT_OFFSET(num_bits))); - } - bits1 = bits >> rshift; - *iptr = MASK_BITS(bits1, *iptr, lmask); - iptr++; + /* Handle the first partial byte. */ + bits = val; + bits1 = bits >> rshift; + *iptr = MASK_BITS(bits1, *iptr, lmask); + iptr++; + val >>= 8; + + /* Handle all complete bytes. */ + while (count--) { + bits1 = bits << lshift; + bits = val & 0xff; + *iptr++ = bits1 | (bits >> rshift); val >>= 8; - - while (count--) { - bits1 = bits << lshift; - if (num_bytes-- > 0) { - bits = val & 0xff; - } else { - bits = (val << (8 - BIT_OFFSET(num_bits))) & 0xff; - } - *iptr++ = bits1 | (bits >> rshift); - val >>= 8; - } - - if (deoffs) { - bits1 = bits << lshift; - if (rshift < deoffs) { - bits = (val << (8 - BIT_OFFSET(num_bits))) & 0xff; - bits1 |= bits >> rshift; - } - *iptr = bits1; - } } - } else { /* Big endian */ - /* - * Big-endian, more than one byte, but not aligned on a byte boundary. - * Handle the bits up to the next byte boundary specially, - * then let fmt_int() handle the rest. - */ - Uint shift_count = num_bits - rbits; - Sint val = signed_val(arg); - iptr = erts_current_bin+BYTE_OFFSET(bin_offset); - b = *iptr & (0xff << rbits); - - /* - * Shifting with a shift count greater than or equal to the word - * size may be a no-op (instead of 0 the result may be the unshifted - * value). Therefore, only do the shift and the OR if the shift count - * is less than the word size if the number is positive; if negative, - * we must simulate the sign extension. - */ - if (shift_count < sizeof(Uint)*8) { - b |= (val >> shift_count) & ((1 << rbits) - 1); - } else if (val < 0) { - /* Simulate sign extension. */ - b |= (-1) & ((1 << rbits) - 1); - } - *iptr++ = b; - fmt_small(iptr, NBYTES(num_bits-rbits), arg, num_bits-rbits, flags); - } + /* Handle the final partial byte. */ + *iptr = bits << lshift; + } else { + /* + * Little endian small in more than one byte, not aligned + * on a byte boundary, and the size is not evenly + * divisible by 8. + * + * Now this gets complicated. We used to handle this + * directly, but since this case is presumably uncommon, + * we do this in a simpler way in two steps. + * + * First format the integer byte-aligned using the binary + * itself as a temporary buffer. + */ + b = *iptr; + fmt_small_le(iptr, arg, num_bits); + + /* + * Now restore the overwritten bits of the first byte and + * shift everything to the right. + */ + restore_and_shift(iptr, b, bit_offset, num_bits); + } } else if (is_big(arg) && bit_offset == 0) { - /* - * Big number, aligned on a byte boundary. We can format the - * integer directly into the binary. - */ - fmt_big(erts_current_bin+BYTE_OFFSET(bin_offset), - NBYTES(num_bits), arg, num_bits, flags); + /* + * Big number, aligned on a byte boundary. We can format the + * integer directly into the binary. + */ + fmt_big_le(iptr, arg, num_bits); } else if (is_big(arg) && bit_offset + num_bits <= 8) { /* * All bits are in the same byte. @@ -866,67 +1026,37 @@ erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm arg, Uint num_bits, unsigned flag ErtsDigit* dp = big_v(arg); Uint val = sign ? -*dp : *dp; - iptr = erts_current_bin+BYTE_OFFSET(bin_offset); b = *iptr & (0xff << rbits); - b |= (val & ((1 << num_bits)-1)) << (rbits-num_bits); + b |= (val & MAKE_MASK(num_bits)) << (rbits-num_bits); *iptr = b; } else if (is_big(arg)) { /* * Big number, not aligned on a byte boundary. - */ - Uint rshift = bit_offset; - Uint lshift = 8 - bit_offset; - Uint deoffs = BIT_OFFSET(bit_offset + num_bits); - Uint lmask = MAKE_MASK(8 - bit_offset); - Uint rmask = (deoffs) ? (MAKE_MASK(deoffs)<<(8-deoffs)) : 0; - Uint count = (num_bits - lshift) / 8; - Uint bits, bits1; - - ASSERT(num_bits - lshift >= 0); - - /* + * * Format the integer byte-aligned using the binary itself as * a temporary buffer. */ - iptr = erts_current_bin + BYTE_OFFSET(bin_offset); b = *iptr; - fmt_big(iptr, NBYTES(num_bits), arg, num_bits, flags); + fmt_big_le(iptr, arg, num_bits); /* * Now restore the overwritten bits of the first byte and * shift everything to the right. */ - bits = *iptr; - bits1 = bits >> rshift; - *iptr = MASK_BITS(bits1, b, lmask); - iptr++; - - while (count--) { - bits1 = bits << lshift; - bits = *iptr; - *iptr++ = bits1 | (bits >> rshift); - } - - if (rmask) { - bits1 = bits << lshift; - if ((rmask << rshift) & 0xff) { - bits = *iptr; - bits1 |= (bits >> rshift); - } - *iptr = MASK_BITS(bits1, *iptr, rmask); - } + restore_and_shift(iptr, b, bit_offset, num_bits); } else { /* Not an integer. */ return 0; } - erts_bin_offset = bin_offset + num_bits; + EBS->erts_bin_offset = bin_offset + num_bits; return 1; } +#if !defined(BEAMASM) int -erts_bs_put_utf8(ERL_BITS_PROTO_1(Eterm arg)) +erts_bs_put_utf8(ErlBitsState *EBS, Eterm arg) { - Uint bin_offset = erts_bin_offset; + Uint bin_offset = EBS->erts_bin_offset; Uint bit_offset; Uint num_bits; byte tmp_buf[4]; @@ -943,7 +1073,7 @@ erts_bs_put_utf8(ERL_BITS_PROTO_1(Eterm arg)) if ((bit_offset = BIT_OFFSET(bin_offset)) == 0) { /* We can write directly into the destination binary. */ - dst = erts_current_bin+BYTE_OFFSET(bin_offset); + dst = EBS->erts_current_bin + BYTE_OFFSET(bin_offset); } else { /* Unaligned destination binary. Must use a temporary buffer. */ dst = tmp_buf; @@ -974,18 +1104,19 @@ erts_bs_put_utf8(ERL_BITS_PROTO_1(Eterm arg)) } if (bin_offset != 0) { - erts_copy_bits(dst, 0, 1, erts_current_bin, bin_offset, 1, num_bits); + erts_copy_bits_fwd(dst, 0, EBS->erts_current_bin, bin_offset, num_bits); } - erts_bin_offset += num_bits; + EBS->erts_bin_offset += num_bits; return 1; } +#endif int -erts_bs_put_utf16(ERL_BITS_PROTO_2(Eterm arg, Uint flags)) +erts_bs_put_utf16(ErlBitsState *EBS, Eterm arg, Uint flags) { - Uint bin_offset = erts_bin_offset; + Uint bin_offset = EBS->erts_bin_offset; Uint bit_offset; Uint num_bits; byte tmp_buf[4]; @@ -1002,7 +1133,7 @@ erts_bs_put_utf16(ERL_BITS_PROTO_2(Eterm arg, Uint flags)) if ((bit_offset = BIT_OFFSET(bin_offset)) == 0) { /* We can write directly into the destination binary. */ - dst = erts_current_bin+BYTE_OFFSET(bin_offset); + dst = EBS->erts_current_bin + BYTE_OFFSET(bin_offset); } else { /* Unaligned destination binary. Must use a temporary buffer. */ dst = tmp_buf; @@ -1038,17 +1169,16 @@ erts_bs_put_utf16(ERL_BITS_PROTO_2(Eterm arg, Uint flags)) } if (bin_offset != 0) { - erts_copy_bits(dst, 0, 1, erts_current_bin, bin_offset, 1, num_bits); + erts_copy_bits_fwd(dst, 0, EBS->erts_current_bin, bin_offset, num_bits); } - erts_bin_offset += num_bits; + EBS->erts_bin_offset += num_bits; return 1; } int -erts_new_bs_put_binary(Process *c_p, Eterm arg, Uint num_bits) +erts_bs_put_binary(ErlBitsState *EBS, Process *c_p, Eterm arg, Uint num_bits) { - ERL_BITS_DEFINE_STATEP(c_p); Uint offset, size; byte *base; @@ -1064,18 +1194,17 @@ erts_new_bs_put_binary(Process *c_p, Eterm arg, Uint num_bits) return 0; } - copy_binary_to_buffer(erts_current_bin, erts_bin_offset, + copy_binary_to_buffer(EBS->erts_current_bin, EBS->erts_bin_offset, base, offset, num_bits); - erts_bin_offset += num_bits; + EBS->erts_bin_offset += num_bits; BUMP_REDS(c_p, num_bits / BITS_PER_REDUCTION); return 1; } int -erts_new_bs_put_binary_all(Process *c_p, Eterm arg, Uint unit) +erts_bs_put_binary_all(ErlBitsState *EBS, Process *c_p, Eterm arg, Uint unit) { - ERL_BITS_DEFINE_STATEP(c_p); Uint offset, size; byte *base; @@ -1089,9 +1218,9 @@ erts_new_bs_put_binary_all(Process *c_p, Eterm arg, Uint unit) return 0; } - copy_binary_to_buffer(erts_current_bin, erts_bin_offset, + copy_binary_to_buffer(EBS->erts_current_bin, EBS->erts_bin_offset, base, offset, size); - erts_bin_offset += size; + EBS->erts_bin_offset += size; BUMP_REDS(c_p, size / BITS_PER_REDUCTION); return 1; @@ -1104,11 +1233,9 @@ erts_new_bs_put_binary_all(Process *c_p, Eterm arg, Uint unit) * and sets c_p-fvalue to 'type', 'no_float', or 'invalid'. */ Eterm -erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) +erts_bs_put_float(ErlBitsState *EBS, Process *c_p, Eterm arg, Uint num_bits, int flags) { - ERL_BITS_DEFINE_STATEP(c_p); - - if (BIT_OFFSET(erts_bin_offset) == 0) { + if (BIT_OFFSET(EBS->erts_bin_offset) == 0) { Uint32 a; Uint32 b; @@ -1220,7 +1347,7 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) } if (BIT_IS_MACHINE_ENDIAN(flags)) { - byte* t = erts_current_bin+BYTE_OFFSET(erts_bin_offset); + byte* t = EBS->erts_current_bin + BYTE_OFFSET(EBS->erts_bin_offset); #ifdef WORDS_BIGENDIAN if (num_bits == 16) { t[0] = a >> 8; @@ -1253,7 +1380,9 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) } #endif } else { - byte* t = erts_current_bin+BYTE_OFFSET(erts_bin_offset) + NBYTES(num_bits); + byte* t = EBS->erts_current_bin + + BYTE_OFFSET(EBS->erts_bin_offset) + + NBYTES(num_bits); #ifdef WORDS_BIGENDIAN if (num_bits == 16) { t[-1] = a >> 8; @@ -1382,28 +1511,41 @@ erts_new_bs_put_float(Process *c_p, Eterm arg, Uint num_bits, int flags) return make_small(num_bits); } if (BIT_IS_MACHINE_ENDIAN(flags)) { - erts_copy_bits(bptr, 0, 1, - erts_current_bin, - erts_bin_offset, 1, num_bits); + erts_copy_bits_fwd(bptr, 0, + EBS->erts_current_bin, + EBS->erts_bin_offset, num_bits); } else { - erts_copy_bits(bptr+NBYTES(num_bits)-1, 0, -1, - erts_current_bin, erts_bin_offset, 1, - num_bits); + byte tmp_buf[8]; + Uint n = BYTE_OFFSET(num_bits); + byte *dst = tmp_buf + n; + + do { + *--dst = *bptr++; + } while (--n != 0); + + erts_copy_bits_fwd(tmp_buf, 0, + EBS->erts_current_bin, + EBS->erts_bin_offset, num_bits); } } - erts_bin_offset += num_bits; + EBS->erts_bin_offset += num_bits; return THE_NON_VALUE; } -void -erts_new_bs_put_string(ERL_BITS_PROTO_2(byte* iptr, Uint num_bytes)) +void +erts_bs_put_string(ErlBitsState* EBS, byte* iptr, Uint num_bytes) { - if (BIT_OFFSET(erts_bin_offset) != 0) { - erts_copy_bits(iptr, 0, 1, erts_current_bin, erts_bin_offset, 1, num_bytes*8); + byte* dst_bin = EBS->erts_current_bin; + Uint dst_offset = EBS->erts_bin_offset; + + EBS->erts_bin_offset = dst_offset + num_bytes * 8; + if (BIT_OFFSET(dst_offset) != 0) { + erts_copy_bits_fwd(iptr, 0, + dst_bin, dst_offset, + num_bytes * 8); } else { - sys_memcpy(erts_current_bin+BYTE_OFFSET(erts_bin_offset), iptr, num_bytes); + sys_memcpy(dst_bin + BYTE_OFFSET(dst_offset), iptr, num_bytes); } - erts_bin_offset += num_bytes*8; } static ERTS_INLINE @@ -1475,36 +1617,6 @@ build_writable_bitstring(Process *p, * raise an exception. */ Eterm -erts_bs_append(Process* c_p, Eterm* reg, Uint live, Eterm build_size_term, - Uint extra_words, Uint unit) -{ - Uint unsigned_bits; - Uint build_size_in_bits; - - /* - * Check and untag the requested build size. - */ - if (is_small(build_size_term)) { - Sint signed_bits = signed_val(build_size_term); - if (signed_bits < 0) { - c_p->freason = BADARG; - return THE_NON_VALUE; - } - build_size_in_bits = (Uint) signed_bits; - } else if (term_to_Uint(build_size_term, &unsigned_bits)) { - build_size_in_bits = unsigned_bits; - } else { - c_p->freason = unsigned_bits; - return THE_NON_VALUE; - } - return erts_bs_append_checked(c_p, reg, live, build_size_in_bits, - extra_words, unit); -} - -/* - * See erts_bs_append(). - */ -Eterm erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, Uint build_size_in_bits, Uint extra_words, Uint unit) @@ -1516,8 +1628,9 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, BinRef* br; Binary* binp; Uint heap_need; + Uint position; Uint used_size_in_bits; - ERL_BITS_DEFINE_STATEP(c_p); + ErlBitsState* EBS = ERL_BITS_EBS_FROM_REG(reg); /* * Check the binary argument. @@ -1556,10 +1669,10 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, * OK, the binary is writable. */ ASSERT(sb->start == 0); - erts_bin_offset = sb->end; + EBS->erts_bin_offset = position = sb->end; if (unit > 1) { - if ((unit == 8 && (erts_bin_offset & 7) != 0) || - (unit != 8 && (erts_bin_offset % unit) != 0)) { + if ((unit == 8 && (position & 7) != 0) || + (unit != 8 && (position % unit) != 0)) { c_p->fvalue = am_unit; goto badarg; } @@ -1576,13 +1689,13 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, return bin; } - if((ERTS_UINT_MAX - build_size_in_bits) < erts_bin_offset) { + if ((ERTS_UINT_MAX - build_size_in_bits) < position) { c_p->fvalue = am_size; c_p->freason = SYSTEM_LIMIT; return THE_NON_VALUE; } - used_size_in_bits = erts_bin_offset + build_size_in_bits; + used_size_in_bits = position + build_size_in_bits; /* Make sure that no one else can append to the incoming bitstring. */ erl_sub_bits_clear_writable(sb); @@ -1597,11 +1710,11 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, binp = erts_bin_realloc(binp, new_size); br->val = binp; - BUMP_REDS(c_p, erts_bin_offset / BITS_PER_REDUCTION); + BUMP_REDS(c_p, position / BITS_PER_REDUCTION); } binp->intern.apparent_size = NBYTES(used_size_in_bits); - erts_current_bin = (byte*)binp->orig_bytes; + EBS->erts_current_bin = (byte*)binp->orig_bytes; /* Allocate heap space and build a new sub binary. */ reg[live] = sb->orig; @@ -1620,7 +1733,7 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, erl_sub_bits_init(sb, ERL_SUB_BITS_FLAGS_WRITABLE, reg[live], - erts_current_bin, + EBS->erts_current_bin, 0, used_size_in_bits); @@ -1684,10 +1797,10 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, &br, &sb); - erts_current_bin = (byte*)(br->val)->orig_bytes; - erts_bin_offset = src_size; + EBS->erts_current_bin = (byte*)(br->val)->orig_bytes; + EBS->erts_bin_offset = src_size; - copy_binary_to_buffer(erts_current_bin, + copy_binary_to_buffer(EBS->erts_current_bin, 0, src_bytes, src_offset, @@ -1699,40 +1812,14 @@ erts_bs_append_checked(Process* c_p, Eterm* reg, Uint live, } Eterm -erts_bs_private_append(Process* p, Eterm bin, Eterm build_size_term, Uint unit) +erts_bs_private_append_checked(ErlBitsState* EBS, Process* p, + Eterm bin, Uint build_size_in_bits) { - Uint unsigned_bits; - Uint build_size_in_bits; - - /* - * Check and untag the requested build size. - */ - if (is_small(build_size_term)) { - Sint signed_bits = signed_val(build_size_term); - if (signed_bits < 0) { - p->freason = BADARG; - return THE_NON_VALUE; - } - build_size_in_bits = (Uint) signed_bits; - } else if (term_to_Uint(build_size_term, &unsigned_bits)) { - build_size_in_bits = unsigned_bits; - } else { - p->freason = unsigned_bits; - return THE_NON_VALUE; - } - return erts_bs_private_append_checked(p, bin, build_size_in_bits, unit); -} - -Eterm -erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, Uint unit) -{ - Uint new_position, new_size, used_size; + Uint old_position, new_position, used_size; Binary *refc_binary; ErlSubBits *sb; BinRef *br; - ERL_BITS_DEFINE_STATEP(p); - sb = (ErlSubBits*)bitstring_val(bin); ASSERT(sb->thing_word == HEADER_SUB_BITS); @@ -1741,21 +1828,24 @@ erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, U /* Calculate new size in bits. */ ASSERT(sb->start == 0); - erts_bin_offset = sb->end; + EBS->erts_bin_offset = old_position = sb->end; - if((ERTS_UINT_MAX - build_size_in_bits) < erts_bin_offset) { +#ifdef BEAMASM + ASSERT(ERTS_UINT_MAX - build_size_in_bits >= old_position); +#else + if (ERTS_UINT_MAX - build_size_in_bits < old_position) { p->fvalue = am_size; p->freason = SYSTEM_LIMIT; return THE_NON_VALUE; } +#endif refc_binary = br->val; - new_position = erts_bin_offset + build_size_in_bits; - update_wb_overhead(p, br, sb->end, new_position); - + new_position = old_position + build_size_in_bits; used_size = NBYTES(new_position); - new_size = GROW_PROC_BIN_SIZE(used_size); + + update_wb_overhead(p, br, old_position, new_position); if (refc_binary->intern.flags & BIN_FLAG_WRITABLE) { /* This is the normal case - the binary is writable. There are no other @@ -1764,10 +1854,11 @@ erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, U ASSERT(erl_sub_bits_is_writable(sb)); ASSERT(erts_refc_read(&refc_binary->intern.refc, 1) == 1); if (refc_binary->orig_size < used_size) { + Uint new_size = GROW_PROC_BIN_SIZE(used_size); refc_binary = erts_bin_realloc(refc_binary, new_size); br->val = refc_binary; - BUMP_REDS(p, erts_bin_offset / BITS_PER_REDUCTION); + BUMP_REDS(p, EBS->erts_bin_offset / BITS_PER_REDUCTION); } ASSERT(sb->start == 0); @@ -1783,10 +1874,11 @@ erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, U * binary and make a copy of the data. * * We'll also make a new BinRef as the old one may have been moved from - * the `wrt_bins` list to the regular `off_heap` list by the GC. To + * the `wrt_bins` list to the regular `off_heap` list by the GC. * To move it back would mean traversing the `off_heap` list from the * start, so we'll create a new BinRef instead for this (hopefully) * rare case. */ + Uint new_size = GROW_PROC_BIN_SIZE(used_size); Binary *new_binary = erts_bin_nrml_alloc(new_size); Eterm *hp = HeapFragOnlyAlloc(p, ERL_REFC_BITS_SIZE); @@ -1802,12 +1894,12 @@ erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, U refc_binary->orig_bytes, MIN(refc_binary->orig_size, new_size)); - BUMP_REDS(p, erts_bin_offset / BITS_PER_REDUCTION); + BUMP_REDS(p, EBS->erts_bin_offset / BITS_PER_REDUCTION); refc_binary = new_binary; } ASSERT(refc_binary->intern.flags & BIN_FLAG_WRITABLE); - erts_current_bin = (byte*)&refc_binary->orig_bytes[0]; + EBS->erts_current_bin = (byte*)&refc_binary->orig_bytes[0]; return make_bitstring(sb); } @@ -1882,7 +1974,7 @@ erts_bs_get_unaligned_uint32(ErlSubBits* sb) byte bigbuf[4]; byte* LSB; byte* MSB; - + CHECK_MATCH_BUFFER(sb); ASSERT((sb->start & 7) != 0); ASSERT(sb->end - sb->start >= 32); @@ -1894,7 +1986,7 @@ erts_bs_get_unaligned_uint32(ErlSubBits* sb) MSB = LSB + bytes - 1; *MSB = 0; - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, MSB, offs, -1, 32); + erts_copy_bits_rev(erl_sub_bits_get_base(sb), sb->start, MSB, offs, 32); return LSB[0] | (LSB[1]<<8) | (LSB[2]<<16) | (LSB[3]<<24); } @@ -1917,7 +2009,7 @@ erts_align_utf8_bytes(ErlSubBits *sb, byte* buf) } else { bits = 16; } - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, buf, 0, 1, bits); + erts_copy_bits_fwd(erl_sub_bits_get_base(sb), sb->start, buf, 0, bits); } Eterm @@ -2042,8 +2134,8 @@ erts_bs_get_utf16(ErlSubBits *sb, Uint flags) * get 4 bytes, otherwise two bytes. */ Uint n = num_bits < 32 ? 16 : 32; - erts_copy_bits(erl_sub_bits_get_base(sb), sb->start, 1, - tmp_buf, 0, 1, n); + erts_copy_bits_fwd(erl_sub_bits_get_base(sb), sb->start, + tmp_buf, 0, n); src = tmp_buf; } @@ -2177,18 +2269,141 @@ int erts_cmp_bits__(const byte *a_ptr, /* * The basic bit copy operation. Copies n bits from the source buffer to - * the destination buffer. Depending on the directions, it can reverse the - * copied bits. + * the destination buffer. */ +void +erts_copy_bits_fwd(const byte* src, /* Base pointer to source. */ + size_t soffs, /* Bit offset for source relative to src. */ + byte* dst, /* Base pointer to destination. */ + size_t doffs, /* Bit offset for destination relative to dst. */ + size_t n) /* Number of bits to copy. */ +{ + Uint lmask; + Uint rmask; + Uint count; + Uint deoffs; + + if (n == 0) { + return; + } + + src += BYTE_OFFSET(soffs); + dst += BYTE_OFFSET(doffs); + soffs = BIT_OFFSET(soffs); + doffs = BIT_OFFSET(doffs); + deoffs = BIT_OFFSET(doffs+n); + lmask = (doffs) ? MAKE_MASK(8-doffs) : 0; + rmask = (deoffs) ? (MAKE_MASK(deoffs)<<(8-deoffs)) : 0; + + /* + * Take care of the case that all bits are in the same byte. + */ + + if (doffs+n < 8) { /* All bits are in the same byte */ + lmask = (lmask & rmask) ? (lmask & rmask) : (lmask | rmask); + + if (soffs == doffs) { + *dst = MASK_BITS(*src, *dst, lmask); + } else if (soffs > doffs) { + Uint bits = (*src << (soffs-doffs)); + if (soffs+n > 8) { + src++; + bits |= (*src >> (8-(soffs-doffs))); + } + *dst = MASK_BITS(bits, *dst, lmask); + } else { + *dst = MASK_BITS((*src >> (doffs-soffs)), *dst, lmask); + } + return; /* We are done! */ + } + + /* + * At this point, we know that the bits are in 2 or more bytes. + */ + + count = (lmask ? (n - (8 - doffs)) : n) >> 3; -void -erts_copy_bits(const byte* src, /* Base pointer to source. */ + if (soffs == doffs) { + /* + * The bits are aligned in the same way. We can just copy the bytes + * (except for the first and last bytes). + */ + + if (lmask) { + *dst = MASK_BITS(*src, *dst, lmask); + dst++, src++; + } + + sys_memcpy(dst, src, count); + + if (rmask) { + dst += count; + src += count; + *dst = MASK_BITS(*src, *dst, rmask); + } + } else { + Uint bits; + Uint bits1; + Uint rshift; + Uint lshift; + + /* + * The tricky case. The bits must be shifted into position. + */ + + if (soffs > doffs) { + lshift = soffs - doffs; + rshift = 8 - lshift; + bits = *src; + if (soffs + n > 8) { + src++; + } + } else { + rshift = doffs - soffs; + lshift = 8 - rshift; + bits = 0; + } + + if (lmask) { + bits1 = bits << lshift; + bits = *src++; + bits1 |= (bits >> rshift); + *dst = MASK_BITS(bits1, *dst, lmask); + dst++; + } + + while (count--) { + bits1 = bits << lshift; + bits = *src++; + *dst = bits1 | (bits >> rshift); + dst++; + } + + if (rmask) { + bits1 = bits << lshift; + if ((rmask << rshift) & 0xff) { + bits = *src; + bits1 |= (bits >> rshift); + } + *dst = MASK_BITS(bits1, *dst, rmask); + } + } +} + +/* + * The reverse bit copy operation. Copies n bits from the source + * buffer to the destination buffer. The bits are read 8 bits at the + * time from the source buffer, while incrementing the source buffer + * pointer. The 8 bit groups are stored into the destination buffer, + * while decrementing the destination buffer pointer. + */ + +void +erts_copy_bits_rev(const byte* src, /* Base pointer to source. */ size_t soffs, /* Bit offset for source relative to src. */ - int sdir, /* Direction: 1 (forward) or -1 (backward). */ byte* dst, /* Base pointer to destination. */ size_t doffs, /* Bit offset for destination relative to dst. */ - int ddir, /* Direction: 1 (forward) or -1 (backward). */ size_t n) /* Number of bits to copy. */ { Uint lmask; @@ -2197,11 +2412,11 @@ erts_copy_bits(const byte* src, /* Base pointer to source. */ Uint deoffs; if (n == 0) { - return; + return; } - src += sdir*BYTE_OFFSET(soffs); - dst += ddir*BYTE_OFFSET(doffs); + src += BYTE_OFFSET(soffs); + dst -= BYTE_OFFSET(doffs); soffs = BIT_OFFSET(soffs); doffs = BIT_OFFSET(doffs); deoffs = BIT_OFFSET(doffs+n); @@ -2213,21 +2428,21 @@ erts_copy_bits(const byte* src, /* Base pointer to source. */ */ if (doffs+n < 8) { /* All bits are in the same byte */ - lmask = (lmask & rmask) ? (lmask & rmask) : (lmask | rmask); - - if (soffs == doffs) { - *dst = MASK_BITS(*src,*dst,lmask); - } else if (soffs > doffs) { - Uint bits = (*src << (soffs-doffs)); - if (soffs+n > 8) { - src += sdir; - bits |= (*src >> (8-(soffs-doffs))); - } - *dst = MASK_BITS(bits,*dst,lmask); - } else { - *dst = MASK_BITS((*src >> (doffs-soffs)),*dst,lmask); - } - return; /* We are done! */ + lmask = (lmask & rmask) ? (lmask & rmask) : (lmask | rmask); + + if (soffs == doffs) { + *dst = MASK_BITS(*src,*dst,lmask); + } else if (soffs > doffs) { + Uint bits = (*src << (soffs-doffs)); + if (soffs+n > 8) { + src++; + bits |= (*src >> (8-(soffs-doffs))); + } + *dst = MASK_BITS(bits,*dst,lmask); + } else { + *dst = MASK_BITS((*src >> (doffs-soffs)),*dst,lmask); + } + return; /* We are done! */ } /* @@ -2237,75 +2452,70 @@ erts_copy_bits(const byte* src, /* Base pointer to source. */ count = ((lmask) ? (n - (8 - doffs)) : n) >> 3; if (soffs == doffs) { - /* - * The bits are aligned in the same way. We can just copy the bytes - * (except for the first and last bytes). Note that the directions - * might be different, so we can't just use memcpy(). - */ + /* + * The bits are aligned in the same way. We can just copy the bytes + * (except for the first and last bytes). + */ - if (lmask) { - *dst = MASK_BITS(*src, *dst, lmask); - dst += ddir; - src += sdir; - } + if (lmask) { + *dst = MASK_BITS(*src, *dst, lmask); + dst--, src++; + } - while (count--) { - *dst = *src; - dst += ddir; - src += sdir; - } + while (count--) { + *dst-- = *src++; + } - if (rmask) { - *dst = MASK_BITS(*src,*dst,rmask); - } + if (rmask) { + *dst = MASK_BITS(*src, *dst, rmask); + } } else { - Uint bits; - Uint bits1; - Uint rshift; - Uint lshift; + Uint bits; + Uint bits1; + Uint rshift; + Uint lshift; - /* - * The tricky case. The bits must be shifted into position. - */ - - if (soffs > doffs) { - lshift = (soffs - doffs); - rshift = 8 - lshift; - bits = *src; - if (soffs + n > 8) { - src += sdir; - } - } else { - rshift = (doffs - soffs); - lshift = 8 - rshift; - bits = 0; - } - - if (lmask) { - bits1 = bits << lshift; - bits = *src; - src += sdir; - bits1 |= (bits >> rshift); - *dst = MASK_BITS(bits1,*dst,lmask); - dst += ddir; - } + /* + * The tricky case. The bits must be shifted into position. + */ - while (count--) { - bits1 = bits << lshift; - bits = *src; - src += sdir; - *dst = bits1 | (bits >> rshift); - dst += ddir; - } - - if (rmask) { - bits1 = bits << lshift; - if ((rmask << rshift) & 0xff) { - bits = *src; - bits1 |= (bits >> rshift); - } - *dst = MASK_BITS(bits1,*dst,rmask); - } + if (soffs > doffs) { + lshift = (soffs - doffs); + rshift = 8 - lshift; + bits = *src; + if (soffs + n > 8) { + src++; + } + } else { + rshift = doffs - soffs; + lshift = 8 - rshift; + bits = 0; + } + + if (lmask) { + bits1 = bits << lshift; + bits = *src; + src++; + bits1 |= (bits >> rshift); + *dst = MASK_BITS(bits1, *dst, lmask); + dst--; + } + + while (count--) { + bits1 = bits << lshift; + bits = *src++; + *dst = bits1 | (bits >> rshift); + dst--; + } + + if (rmask) { + bits1 = bits << lshift; + if ((rmask << rshift) & 0xff) { + bits = *src; + bits1 |= (bits >> rshift); + } + *dst = MASK_BITS(bits1, *dst, rmask); + } } } diff --git a/erts/emulator/beam/erl_bits.h b/erts/emulator/beam/erl_bits.h index 38bcb7781b41..6d4200e4a2b1 100644 --- a/erts/emulator/beam/erl_bits.h +++ b/erts/emulator/beam/erl_bits.h @@ -168,43 +168,28 @@ struct erl_bits_state { /* * Pointer to the beginning of the current binary. */ - byte* erts_current_bin_; + byte* erts_current_bin; /* * Offset in bits into the current binary. */ - Uint erts_bin_offset_; + Uint erts_bin_offset; }; +typedef struct erl_bits_state ErlBitsState; + /* - * Reentrant API with the state passed as a parameter. - * (Except when the current Process* already is a parameter.) + * The bit syntax construction state resides in the current process's + * schduler data. The following macro retrieves the pointer to that + * state given a pointer to the X register array. */ -/* the state resides in the current process' scheduler data */ -#define ERL_BITS_DECLARE_STATEP struct erl_bits_state *EBS - -#define ERL_BITS_RELOAD_STATEP(P) \ - do { \ - EBS = &erts_proc_sched_data((P))->registers->aux_regs.d.erl_bits_state; \ - } while(0) - -#define ERL_BITS_DEFINE_STATEP(P) \ - struct erl_bits_state *EBS = \ - &erts_proc_sched_data((P))->registers->aux_regs.d.erl_bits_state -#define ErlBitsState (*EBS) - -#define ERL_BITS_PROTO_0 struct erl_bits_state *EBS -#define ERL_BITS_PROTO_1(PARM1) struct erl_bits_state *EBS, PARM1 -#define ERL_BITS_PROTO_2(PARM1,PARM2) struct erl_bits_state *EBS, PARM1, PARM2 -#define ERL_BITS_PROTO_3(PARM1,PARM2,PARM3) struct erl_bits_state *EBS, PARM1, PARM2, PARM3 -#define ERL_BITS_ARGS_0 EBS -#define ERL_BITS_ARGS_1(ARG1) EBS, ARG1 -#define ERL_BITS_ARGS_2(ARG1,ARG2) EBS, ARG1, ARG2 -#define ERL_BITS_ARGS_3(ARG1,ARG2,ARG3) EBS, ARG1, ARG2, ARG3 - -#define erts_bin_offset (ErlBitsState.erts_bin_offset_) -#define erts_current_bin (ErlBitsState.erts_current_bin_) +#define ERL_BITS_EBS_FROM_REG(Reg) \ + ((ErlBitsState *) ((char *)(Reg) + \ + (offsetof(ErtsSchedulerRegisters, \ + aux_regs.d.erl_bits_state) - \ + offsetof(ErtsSchedulerRegisters, \ + x_reg_array.d)))) /* * Return number of Eterm words needed for allocation with HAlloc(), @@ -231,23 +216,25 @@ Eterm erts_bs_get_binary_2(Process *p, Uint num_bits, unsigned flags, ErlSubBits Eterm erts_bs_get_binary_all_2(Process *p, ErlSubBits* sb); /* Binary construction, new instruction set. */ -int erts_new_bs_put_integer(ERL_BITS_PROTO_3(Eterm Integer, Uint num_bits, unsigned flags)); -int erts_bs_put_utf8(ERL_BITS_PROTO_1(Eterm Integer)); -int erts_bs_put_utf16(ERL_BITS_PROTO_2(Eterm Integer, Uint flags)); -int erts_new_bs_put_binary(Process *c_p, Eterm Bin, Uint num_bits); -int erts_new_bs_put_binary_all(Process *c_p, Eterm Bin, Uint unit); -Eterm erts_new_bs_put_float(Process *c_p, Eterm Float, Uint num_bits, int flags); -void erts_new_bs_put_string(ERL_BITS_PROTO_2(byte* iptr, Uint num_bytes)); +int erts_bs_put_integer_be(ErlBitsState *EBS, Eterm Integer, Uint num_bits); +int erts_bs_put_integer_le(ErlBitsState *EBS, Eterm Integer, Uint num_bits); +#if !defined(BEAMASM) +int erts_bs_put_utf8(ErlBitsState *EBS, Eterm Integer); +#endif +int erts_bs_put_utf16(ErlBitsState *EBS, Eterm Integer, Uint flags); +int erts_bs_put_binary(ErlBitsState *EBS, Process *c_p, Eterm Bin, Uint num_bits); +int erts_bs_put_binary_all(ErlBitsState* EBS, Process *c_p, Eterm Bin, Uint unit); +Eterm erts_bs_put_float(ErlBitsState *EBS, Process *c_p, Eterm Float, + Uint num_bits, int flags); +void erts_bs_put_string(ErlBitsState *EBS, byte* iptr, Uint num_bytes); Uint32 erts_bs_get_unaligned_uint32(ErlSubBits* sb); Eterm erts_bs_get_utf8(ErlSubBits* sb); Eterm erts_bs_get_utf16(ErlSubBits* sb, Uint flags); -Eterm erts_bs_append(Process* p, Eterm* reg, Uint live, Eterm build_size_term, - Uint extra_words, Uint unit); Eterm erts_bs_append_checked(Process* p, Eterm* reg, Uint live, Uint size, Uint extra_words, Uint unit); -Eterm erts_bs_private_append(Process* p, Eterm bin, Eterm sz, Uint unit); -Eterm erts_bs_private_append_checked(Process* p, Eterm bin, Uint size, Uint unit); +Eterm erts_bs_private_append_checked(ErlBitsState* EBS, Process* p, + Eterm bin, Uint size); Eterm erts_bs_init_writable(Process* p, Eterm sz); /* ************************************************************************* */ @@ -258,8 +245,10 @@ copy_binary_to_buffer(byte *dst_base, Uint dst_offset, const byte *src_base, Uint src_offset, Uint size); -void erts_copy_bits(const byte* src, size_t soffs, int sdir, - byte* dst, size_t doffs, int ddir, size_t n); +void erts_copy_bits_fwd(const byte* src, size_t soffs, + byte* dst, size_t doffs, size_t n); +void erts_copy_bits_rev(const byte* src, size_t soffs, + byte* dst, size_t doffs, size_t n); ERTS_GLB_INLINE int erts_cmp_bits(const byte* a_ptr, Uint a_offs, @@ -545,9 +534,9 @@ copy_binary_to_buffer(byte *dst_base, Uint dst_offset, if (((dst_offset | src_offset | size) & 7) == 0) { sys_memcpy(dst_base, src_base, BYTE_SIZE(size)); } else { - erts_copy_bits(src_base, BIT_OFFSET(src_offset), 1, - dst_base, BIT_OFFSET(dst_offset), 1, - size); + erts_copy_bits_fwd(src_base, BIT_OFFSET(src_offset), + dst_base, BIT_OFFSET(dst_offset), + size); } } } @@ -619,7 +608,7 @@ erts_get_aligned_binary_bytes_extra(Eterm bin, NBYTES(size) + extra); *base_ptr = bytes; - erts_copy_bits(base, offset, 1, &bytes[extra], 0, 1, size); + erts_copy_bits_fwd(base, offset, &bytes[extra], 0, size); return &bytes[extra]; } diff --git a/erts/emulator/beam/erl_code_staged.h b/erts/emulator/beam/erl_code_staged.h new file mode 100644 index 000000000000..182d491fef7f --- /dev/null +++ b/erts/emulator/beam/erl_code_staged.h @@ -0,0 +1,536 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1996-2024. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * %CopyrightEnd% + */ + +#ifndef ERTS_CODE_STAGED_PREFIX +# error Missing definition of ERTS_CODE_STAGED_PREFIX +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_TYPE +# error Missing definition of ERTS_CODE_STAGED_OBJECT_TYPE +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_HASH +# error Missing definition of ERTS_CODE_STAGED_OBJECT_HASH +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_COMPARE +# error Missing definition of ERTS_CODE_STAGED_OBJECT_COMPARE +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_INITIALIZE +# error Missing definition of ERTS_CODE_STAGED_OBJECT_INITIALIZE +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_STAGE +# error Missing definition of ERTS_CODE_STAGED_OBJECT_STAGE +#endif +#ifndef ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE +# error Missing definition of ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE +#endif +#ifndef ERTS_CODE_STAGED_TABLE_ALLOC_TYPE +# error Missing definition of ERTS_CODE_STAGED_TABLE_ALLOC_TYPE +#endif +#ifndef ERTS_CODE_STAGED_TABLE_INITIAL_SIZE +# error Missing definition of ERTS_CODE_STAGED_TABLE_INITIAL_SIZE +#endif +#ifndef ERTS_CODE_STAGED_TABLE_LIMIT +# error Missing definition of ERTS_CODE_STAGED_TABLE_LIMIT +#endif + +#undef ERTS_CODE_STAGED_PREFIX_STRING__2 +#define ERTS_CODE_STAGED_PREFIX_STRING__2(x) \ + #x +#undef ERTS_CODE_STAGED_PREFIX_STRING__1 +#define ERTS_CODE_STAGED_PREFIX_STRING__1(x) \ + ERTS_CODE_STAGED_PREFIX_STRING__2(x) +#undef ERTS_CODE_STAGED_PREFIX_STRING +#define ERTS_CODE_STAGED_PREFIX_STRING \ + ERTS_CODE_STAGED_PREFIX_STRING__1(ERTS_CODE_STAGED_PREFIX) + +#undef ERTS_CODE_STAGED_CONCAT_MACRO_VALUES___ +#define ERTS_CODE_STAGED_CONCAT_MACRO_VALUES___(X, Y) \ + X ## Y +#undef ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ +#define ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__(X, Y) \ + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES___(X, Y) + +#undef ERTS_CODE_STAGED_BLOB_T__ +#define ERTS_CODE_STAGED_BLOB_T__ \ + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__(ERTS_CODE_STAGED_PREFIX, _blob_t) + +#undef ERTS_CODE_STAGED_ENTRY_T__ +#define ERTS_CODE_STAGED_ENTRY_T__ \ + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__(ERTS_CODE_STAGED_PREFIX, _entry_t) + +#undef ERTS_CODE_STAGED_TEMPLATE_T__ +#define ERTS_CODE_STAGED_TEMPLATE_T__ \ + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__(ERTS_CODE_STAGED_PREFIX, _template_t) + +#undef ERTS_CODE_STAGED_FUNC__ +#define ERTS_CODE_STAGED_FUNC__(Name) \ + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__(ERTS_CODE_STAGED_PREFIX, \ + _staged_ ## Name) + +typedef struct { + IndexSlot slot; /* MUST BE LOCATED AT TOP OF STRUCT!!! */ + ERTS_CODE_STAGED_OBJECT_TYPE *object; +} ERTS_CODE_STAGED_ENTRY_T__; + +typedef struct { + ERTS_CODE_STAGED_OBJECT_TYPE object; + ERTS_CODE_STAGED_ENTRY_T__ entryv[ERTS_NUM_CODE_IX]; +} ERTS_CODE_STAGED_BLOB_T__; + +typedef struct { + ERTS_CODE_STAGED_ENTRY_T__ entry; + ERTS_CODE_STAGED_OBJECT_TYPE object; +} ERTS_CODE_STAGED_TEMPLATE_T__; + +/* Active code index is not locked */ +static IndexTable ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables)[ERTS_NUM_CODE_IX]; + +static erts_rwmtx_t ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex); + +#ifdef ERTS_CODE_STAGED_WANT_ENTRY_BYTES +static erts_atomic_t ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _total_entries_bytes); +#endif + +#ifdef DEBUG +static int ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _debug_stage_ix); +#endif + +static ERTS_CODE_STAGED_BLOB_T__* +ERTS_CODE_STAGED_FUNC__(entry_to_blob)(ERTS_CODE_STAGED_ENTRY_T__ *entry) +{ + return ErtsContainerStruct(entry->object, + ERTS_CODE_STAGED_BLOB_T__, + object); +} + +/* This lock must be taken in `erts_commit_staging_code_ix` to guarantee that + * upserts do not break. */ +void ERTS_CODE_STAGED_FUNC__(write_lock)(void); +void ERTS_CODE_STAGED_FUNC__(write_lock)(void) +{ + erts_rwmtx_t * const lock = &ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex); + erts_rwmtx_rwlock(lock); +} + +void ERTS_CODE_STAGED_FUNC__(write_unlock)(void); +void ERTS_CODE_STAGED_FUNC__(write_unlock)(void) +{ + erts_rwmtx_t * const lock = &ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex); + erts_rwmtx_rwunlock(lock); +} + +static void +ERTS_CODE_STAGED_FUNC__(read_lock)(void) +{ + erts_rwmtx_t * const lock = &ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex); + erts_rwmtx_rlock(lock); +} + +static void +ERTS_CODE_STAGED_FUNC__(read_unlock)(void) +{ + erts_rwmtx_t * const lock = &ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex); + erts_rwmtx_runlock(lock); +} + +static void +ERTS_CODE_STAGED_FUNC__(info)(fmtfn_t to, void *to_arg) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + const int lock = !ERTS_IS_CRASH_DUMPING; + + if (lock) { + ERTS_CODE_STAGED_FUNC__(write_lock)(); + } + + index_info(to, to_arg, &tables[erts_active_code_ix()]); + hash_info(to, to_arg, &tables[erts_staging_code_ix()].htable); + + if (lock) { + ERTS_CODE_STAGED_FUNC__(write_unlock)(); + } +} + +static HashValue +ERTS_CODE_STAGED_FUNC__(hash)(ERTS_CODE_STAGED_ENTRY_T__ *entry) +{ + return ERTS_CODE_STAGED_OBJECT_HASH(entry->object); +} + +static int +ERTS_CODE_STAGED_FUNC__(cmp)(ERTS_CODE_STAGED_ENTRY_T__ *lhs, + ERTS_CODE_STAGED_ENTRY_T__ *rhs) +{ + return ERTS_CODE_STAGED_OBJECT_COMPARE(lhs->object, rhs->object); +} + +static ERTS_CODE_STAGED_OBJECT_TYPE * +ERTS_CODE_STAGED_FUNC__(init_template)(ERTS_CODE_STAGED_TEMPLATE_T__ *template) +{ + template->entry.object = &template->object; + template->entry.slot.index = -1; + return &template->object; +} + +static ERTS_CODE_STAGED_OBJECT_TYPE * +ERTS_CODE_STAGED_FUNC__(upsert)(ERTS_CODE_STAGED_TEMPLATE_T__ *template) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + ERTS_CODE_STAGED_ENTRY_T__ *entry; + int requires_insertion = 0; +#ifdef DEBUG + int retry_after_race = 0; +#endif + + do { + ErtsCodeIndex active_ix = erts_active_code_ix(); + + entry = hash_get(&tables[active_ix].htable, &template->entry); + if (entry != NULL) { + break; + } + + /* The entry is not active yet, so we need to consult or insert + * into the staging table, which is protected by the staging + * lock. + * + * To be absolutely certain that we're working on the _current_ + * staging table, we take the lock and double-check the active code + * index in case we've raced with a code index change. This works + * because code index changes acquire the same lock. */ + if (!requires_insertion) { + ERTS_CODE_STAGED_FUNC__(read_lock)(); + } else { + ERTS_CODE_STAGED_FUNC__(write_lock)(); + } + + if (active_ix == erts_active_code_ix()) { + ErtsCodeIndex staging_ix = erts_staging_code_ix(); + + if (!requires_insertion) { + entry = (ERTS_CODE_STAGED_ENTRY_T__*) + hash_get(&tables[staging_ix].htable, + &template->entry); + ERTS_CODE_STAGED_FUNC__(read_unlock)(); + + /* If the staging table did not contain the entry, try to + * insert it under a write lock on the next pass. */ + requires_insertion = (entry == NULL); + } else { + entry = (ERTS_CODE_STAGED_ENTRY_T__*) + index_put_entry(&tables[staging_ix], + &template->entry); + ERTS_CODE_STAGED_FUNC__(write_unlock)(); + } + } else { + /* Raced with code index change, try again. This can only happen + * once per thread progress tick. */ +#ifdef DEBUG + ASSERT(retry_after_race == 0); + retry_after_race = 1; +#endif + + if (!requires_insertion) { + ERTS_CODE_STAGED_FUNC__(read_unlock)(); + } else { + ERTS_CODE_STAGED_FUNC__(write_unlock)(); + } + } + } while (entry == NULL); + + return entry->object; +} + +static ERTS_CODE_STAGED_ENTRY_T__ * +ERTS_CODE_STAGED_FUNC__(alloc)(ERTS_CODE_STAGED_ENTRY_T__ *template) +{ + ERTS_CODE_STAGED_BLOB_T__ *blob; + + if (template->slot.index == -1) { + /* Template, allocate blob */ + blob = (ERTS_CODE_STAGED_BLOB_T__*) + erts_alloc(ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE, sizeof(*blob)); + +#ifdef ERTS_CODE_STAGED_WANT_ENTRY_BYTES + erts_atomic_add_nob(&ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _total_entries_bytes), + sizeof(*blob)); +#endif + + ERTS_CODE_STAGED_OBJECT_INITIALIZE(&blob->object, template->object); + + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + blob->entryv[ix].slot.index = -1; + blob->entryv[ix].object = &blob->object; + } + + return &blob->entryv[0]; + } else { + /* Existing entry in another table, use free entry in blob */ + int ix; + + blob = ERTS_CODE_STAGED_FUNC__(entry_to_blob)(template); + for (ix = 0; blob->entryv[ix].slot.index >= 0; ix++) { + ASSERT(ix < ERTS_NUM_CODE_IX); + } + + return &blob->entryv[ix]; + } +} + +static void +ERTS_CODE_STAGED_FUNC__(free)(ERTS_CODE_STAGED_ENTRY_T__ *entry) +{ + ERTS_CODE_STAGED_BLOB_T__ *blob = + ERTS_CODE_STAGED_FUNC__(entry_to_blob)(entry); + + entry->slot.index = -1; + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + if (blob->entryv[ix].slot.index >= 0) { + return; + } + } + +#ifdef ERTS_CODE_STAGED_WANT_ENTRY_BYTES + erts_atomic_add_nob(&ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _total_entries_bytes), + -sizeof(*blob)); +#endif + + erts_free(ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE, blob); +} + +static void +ERTS_CODE_STAGED_FUNC__(init)(void) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + HashFunctions f; + + erts_rwmtx_opt_t rwmtx_opt = ERTS_RWMTX_OPT_DEFAULT_INITER; + rwmtx_opt.type = ERTS_RWMTX_TYPE_FREQUENT_READ; + rwmtx_opt.lived = ERTS_RWMTX_LONG_LIVED; + + erts_rwmtx_init_opt(&ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _rwmutex), + &rwmtx_opt, + ERTS_CODE_STAGED_PREFIX_STRING "_staging_lock", + NIL, + (ERTS_LOCK_FLAGS_PROPERTY_STATIC | + ERTS_LOCK_FLAGS_CATEGORY_GENERIC)); + +#ifdef ERTS_CODE_STAGED_WANT_ENTRY_BYTES + erts_atomic_init_nob(&ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _total_entries_bytes), + 0); +#endif + + f.hash = (H_FUN) ERTS_CODE_STAGED_FUNC__(hash); + f.cmp = (HCMP_FUN) ERTS_CODE_STAGED_FUNC__(cmp); + f.alloc = (HALLOC_FUN) ERTS_CODE_STAGED_FUNC__(alloc); + f.free = (HFREE_FUN) ERTS_CODE_STAGED_FUNC__(free); + f.meta_alloc = (HMALLOC_FUN)erts_alloc; + f.meta_free = (HMFREE_FUN)erts_free; + f.meta_print = (HMPRINT_FUN)erts_print; + + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + erts_index_init(ERTS_CODE_STAGED_TABLE_ALLOC_TYPE, + &tables[ix], + ERTS_CODE_STAGED_PREFIX_STRING "_staged_index", + ERTS_CODE_STAGED_TABLE_INITIAL_SIZE, + ERTS_CODE_STAGED_TABLE_LIMIT, + f); + } +} + +static void +ERTS_CODE_STAGED_FUNC__(start_staging)(void) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + const ErtsCodeIndex dst_ix = erts_staging_code_ix(); + const ErtsCodeIndex src_ix = erts_active_code_ix(); + IndexTable *dst = &tables[dst_ix]; + IndexTable *src = &tables[src_ix]; + + ASSERT(dst_ix != src_ix); + ASSERT(ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _debug_stage_ix) == ~0); + + ERTS_CODE_STAGED_FUNC__(write_lock)(); + + /* Insert all entries in src into dst table */ + for (int ix = 0; ix < src->entries; ix++) { + ERTS_CODE_STAGED_ENTRY_T__ *src_entry; + + src_entry = (ERTS_CODE_STAGED_ENTRY_T__*)erts_index_lookup(src, ix); + ERTS_CODE_STAGED_OBJECT_STAGE(src_entry->object, src_ix, dst_ix); + +#ifndef DEBUG + index_put_entry(dst, src_entry); +#else /* DEBUG */ + { + ERTS_CODE_STAGED_ENTRY_T__* dst_entry = + (ERTS_CODE_STAGED_ENTRY_T__*)index_put_entry(dst, src_entry); + ASSERT(ERTS_CODE_STAGED_FUNC__(entry_to_blob)(src_entry) + == ERTS_CODE_STAGED_FUNC__(entry_to_blob)(dst_entry)); + } +#endif + } + + ERTS_CODE_STAGED_FUNC__(write_unlock)(); + +#ifdef DEBUG + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _debug_stage_ix) = dst_ix; +#endif +} + +static void +ERTS_CODE_STAGED_FUNC__(end_staging)(int commit) +{ +#ifdef DEBUG + ASSERT(ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _debug_stage_ix) == erts_staging_code_ix()); + ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _debug_stage_ix) = ~0; +#endif +} + +#ifdef ERTS_CODE_STAGED_WANT_GET +static const ERTS_CODE_STAGED_OBJECT_TYPE * +ERTS_CODE_STAGED_FUNC__(get)(ERTS_CODE_STAGED_TEMPLATE_T__ *template, + ErtsCodeIndex code_ix) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + ERTS_CODE_STAGED_ENTRY_T__ *entry; + + entry = hash_get(&tables[code_ix].htable, &template->entry); + if (entry) { + return entry->object; + } + + return NULL; +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_PUT +static ERTS_CODE_STAGED_OBJECT_TYPE * +ERTS_CODE_STAGED_FUNC__(put)(ERTS_CODE_STAGED_TEMPLATE_T__ *template) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + const ErtsCodeIndex code_ix = erts_staging_code_ix(); + ERTS_CODE_STAGED_ENTRY_T__ *entry; + + ERTS_CODE_STAGED_FUNC__(write_lock)(); + entry = (ERTS_CODE_STAGED_ENTRY_T__*)index_put_entry(&tables[code_ix], + &template->entry); + ERTS_CODE_STAGED_FUNC__(write_unlock)(); + + return entry->object; +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_FOREACH_ACTIVE +static void +ERTS_CODE_STAGED_FUNC__(foreach_active)( + void (*callback)(ERTS_CODE_STAGED_OBJECT_TYPE *object, + void *arg), + void *arg) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + IndexTable *table = &tables[erts_active_code_ix()]; + + for (int ix = 0; ix < table->entries; ix++) { + ERTS_CODE_STAGED_ENTRY_T__ *src_entry = + (ERTS_CODE_STAGED_ENTRY_T__*)erts_index_lookup(table, ix); + callback(src_entry->object, arg); + } +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_LIST +static ERTS_CODE_STAGED_OBJECT_TYPE * +ERTS_CODE_STAGED_FUNC__(list)(int i, ErtsCodeIndex code_ix) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + ERTS_CODE_STAGED_ENTRY_T__ *entry = + (ERTS_CODE_STAGED_ENTRY_T__*)erts_index_lookup(&tables[code_ix], i); + return entry->object; +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_LIST_SIZE +static int +ERTS_CODE_STAGED_FUNC__(list_size)(ErtsCodeIndex code_ix) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + return erts_index_num_entries(&tables[code_ix]); +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_TABLE_SIZE +static int +ERTS_CODE_STAGED_FUNC__(table_size)(void) +{ + IndexTable * const tables = ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, _tables); + const int lock = !ERTS_IS_CRASH_DUMPING; + UWord size = 0; + + if (lock) { + ERTS_CODE_STAGED_FUNC__(read_lock)(); + } + + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + size += index_table_sz(&tables[ix]); + } + + if (lock) { + ERTS_CODE_STAGED_FUNC__(read_unlock)(); + } + + return size; +} +#endif + +#ifdef ERTS_CODE_STAGED_WANT_ENTRY_BYTES +static int +ERTS_CODE_STAGED_FUNC__(entry_bytes)(void) +{ + return erts_atomic_read_nob(&ERTS_CODE_STAGED_CONCAT_MACRO_VALUES__ + (ERTS_CODE_STAGED_PREFIX, + _total_entries_bytes)); +} +#endif diff --git a/erts/emulator/beam/erl_db.c b/erts/emulator/beam/erl_db.c index b8ea7a3e63af..654edec0c14a 100644 --- a/erts/emulator/beam/erl_db.c +++ b/erts/emulator/beam/erl_db.c @@ -126,7 +126,7 @@ static BIF_RETTYPE db_bif_fail(Process* p, Uint freason, * "fixed_tabs": list of all fixed tables for a process */ #ifdef DEBUG -static int fixed_tabs_find(DbFixation* first, DbFixation* fix); +static bool fixed_tabs_find(DbFixation* first, DbFixation* fix); #endif static void fixed_tabs_insert(Process* p, DbFixation* fix) @@ -167,7 +167,7 @@ static void fixed_tabs_delete(Process *p, DbFixation* fix) } #ifdef DEBUG -static int fixed_tabs_find(DbFixation* first, DbFixation* fix) +static bool fixed_tabs_find(DbFixation* first, DbFixation* fix) { DbFixation* p; @@ -193,7 +193,7 @@ static int fixed_tabs_find(DbFixation* first, DbFixation* fix) #define ERTS_RBT_PREFIX fixing_procs #define ERTS_RBT_T DbFixation #define ERTS_RBT_KEY_T Process* -#define ERTS_RBT_FLAGS_T int +#define ERTS_RBT_FLAGS_T bool #define ERTS_RBT_INIT_EMPTY_TNODE(T) \ do { \ (T)->procs.parent = NULL; \ @@ -201,9 +201,9 @@ static int fixed_tabs_find(DbFixation* first, DbFixation* fix) (T)->procs.left = NULL; \ } while (0) #define ERTS_RBT_IS_RED(T) ((T)->procs.is_red) -#define ERTS_RBT_SET_RED(T) ((T)->procs.is_red = 1) +#define ERTS_RBT_SET_RED(T) ((T)->procs.is_red = true) #define ERTS_RBT_IS_BLACK(T) (!(T)->procs.is_red) -#define ERTS_RBT_SET_BLACK(T) ((T)->procs.is_red = 0) +#define ERTS_RBT_SET_BLACK(T) ((T)->procs.is_red = false) #define ERTS_RBT_GET_FLAGS(T) ((T)->procs.is_red) #define ERTS_RBT_SET_FLAGS(T, F) ((T)->procs.is_red = (F)) #define ERTS_RBT_GET_PARENT(T) ((T)->procs.parent) @@ -304,7 +304,7 @@ tid2tab(Eterm tid, Eterm *error_info_p) return tb; } -static ERTS_INLINE int +static ERTS_INLINE bool is_table_alive(DbTable *tb) { erts_atomic_t *tbref; @@ -318,7 +318,7 @@ is_table_alive(DbTable *tb) return !!rtb; } -static ERTS_INLINE int +static ERTS_INLINE bool is_table_named(DbTable *tb) { return tb->common.type & DB_NAMED_TABLE; @@ -413,8 +413,8 @@ extern DbTableMethod db_tree; extern DbTableMethod db_catree; int user_requested_db_max_tabs; -int erts_ets_realloc_always_moves; -int erts_ets_always_compress; +bool erts_ets_realloc_always_moves; +bool erts_ets_always_compress; static int db_max_tabs; /* @@ -429,7 +429,7 @@ static SWord free_fixations_locked(Process* p, DbTable *tb); static void delete_all_objects_continue(Process* p, DbTable* tb); static SWord free_table_continue(Process *p, DbTable *tb, SWord reds); -static void print_table(fmtfn_t to, void *to_arg, int show, DbTable* tb); +static void print_table(fmtfn_t to, void *to_arg, bool show, DbTable* tb); static BIF_RETTYPE ets_select_delete_trap_1(BIF_ALIST_1); static BIF_RETTYPE ets_select_count_1(BIF_ALIST_1); static BIF_RETTYPE ets_select_replace_1(BIF_ALIST_1); @@ -674,7 +674,7 @@ static ERTS_INLINE void db_lock(DbTable* tb, db_lock_kind_t kind) if (tb->common.type & DB_FINE_LOCKED) { if (kind == LCK_WRITE) { erts_rwmtx_rwlock(&tb->common.rwlock); - tb->common.is_thread_safe = 1; + tb->common.is_thread_safe = true; } else { erts_rwmtx_rlock(&tb->common.rwlock); @@ -702,7 +702,7 @@ static ERTS_INLINE void db_unlock(DbTable* tb, db_lock_kind_t kind) if (tb->common.type & DB_FINE_LOCKED) { if (kind == LCK_WRITE) { ASSERT(tb->common.is_thread_safe); - tb->common.is_thread_safe = 0; + tb->common.is_thread_safe = false; erts_rwmtx_rwunlock(&tb->common.rwlock); } else { @@ -1782,7 +1782,7 @@ static int ets_insert_2_list_from_p_heap(DbTable* tb, Eterm list) /* This function is called both as is, and as YCF transformed. */ static void ets_insert_2_list_destroy_copied_dbterms(DbTableMethod* meth, - int compressed, + bool compressed, void* db_term_list) { void* lst = db_term_list; @@ -1795,7 +1795,7 @@ static void ets_insert_2_list_destroy_copied_dbterms(DbTableMethod* meth, #ifdef YCF_FUNCTIONS static void* ets_insert_2_list_copy_term_list(DbTableMethod* meth, - int compress, + bool compress, int keypos, Eterm list) { @@ -1946,7 +1946,7 @@ static BIF_RETTYPE ets_insert_2_list(Process* p, void* db_term_list = NULL; void* destroy_list = NULL; DbTableMethod* meth = tb->common.meth; - int compressed = tb->common.compress; + bool compressed = tb->common.compress; int keypos = tb->common.keypos; Uint32 tb_type = tb->common.type; Uint bif_ix = (is_insert_new ? BIF_ets_insert_new_2 : BIF_ets_insert_2); @@ -2482,13 +2482,13 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) UWord heir_data; Uint32 status; Sint keypos; - int is_named, is_compressed; - int is_fine_locked, frequent_read; - int number_of_locks; - int is_decentralized_counters; - int is_decentralized_counters_option; - int is_explicit_lock_granularity; - int is_write_concurrency_auto; + bool is_named, is_compressed; + bool is_fine_locked, frequent_read; + UWord number_of_locks; + bool is_decentralized_counters; + int decentralized_counters_option; + bool is_explicit_lock_granularity; + bool is_write_concurrency_auto; int cret; DbTableMethod* meth; @@ -2501,17 +2501,17 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) status = DB_SET | DB_PROTECTED; keypos = 1; - is_named = 0; - is_fine_locked = 0; - frequent_read = 0; - is_decentralized_counters = 0; - is_decentralized_counters_option = -1; + is_named = false; + is_fine_locked = false; + frequent_read = false; + is_decentralized_counters = false; + decentralized_counters_option = -1; heir = am_none; heir_data = (UWord) am_undefined; is_compressed = erts_ets_always_compress; - number_of_locks = -1; - is_explicit_lock_granularity = 0; - is_write_concurrency_auto = 0; + number_of_locks = 0; + is_explicit_lock_granularity = false; + is_write_concurrency_auto = false; list = BIF_ARG_2; while(is_list(list)) { @@ -2525,7 +2525,7 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) status &= ~(DB_SET | DB_BAG | DB_ORDERED_SET | DB_CA_ORDERED_SET); } else if (val == am_ordered_set) { - is_decentralized_counters = 1; + is_decentralized_counters = true; status |= DB_ORDERED_SET; status &= ~(DB_SET | DB_BAG | DB_DUPLICATE_BAG | DB_CA_ORDERED_SET); } @@ -2538,49 +2538,49 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) } else if (tp[1] == am_write_concurrency) { if (tp[2] == am_auto) { - is_decentralized_counters = 1; - is_write_concurrency_auto = 1; - is_fine_locked = 1; - is_explicit_lock_granularity = 0; - number_of_locks = -1; + is_decentralized_counters = true; + is_write_concurrency_auto = true; + is_fine_locked = true; + is_explicit_lock_granularity = false; + number_of_locks = 0; } else if (tp[2] == am_true) { if (!(status & DB_ORDERED_SET)) { - is_decentralized_counters = 0; + is_decentralized_counters = false; } - is_fine_locked = 1; - is_explicit_lock_granularity = 0; - is_write_concurrency_auto = 0; - number_of_locks = -1; + is_fine_locked = true; + is_explicit_lock_granularity = false; + is_write_concurrency_auto = false; + number_of_locks = 0; } else if (tp[2] == am_false) { - is_fine_locked = 0; - is_explicit_lock_granularity = 0; - is_write_concurrency_auto = 0; - number_of_locks = -1; + is_fine_locked = false; + is_explicit_lock_granularity = false; + is_write_concurrency_auto = false; + number_of_locks = 0; } else if (is_tuple(tp[2])) { Eterm *stp = tuple_val(tp[2]); - Sint number_of_locks_param; + UWord number_of_locks_param; if (arityval(stp[0]) == 2 && stp[1] == am_debug_hash_fixed_number_of_locks && - term_to_Sint(stp[2], &number_of_locks_param) && + term_to_UWord(stp[2], &number_of_locks_param) && number_of_locks_param >= DB_WRITE_CONCURRENCY_MIN_LOCKS && number_of_locks_param <= DB_WRITE_CONCURRENCY_MAX_LOCKS) { - is_decentralized_counters = 1; - is_fine_locked = 1; - is_explicit_lock_granularity = 1; - is_write_concurrency_auto = 0; + is_decentralized_counters = true; + is_fine_locked = true; + is_explicit_lock_granularity = true; + is_write_concurrency_auto = false; number_of_locks = number_of_locks_param; } else break; } else break; if (DB_LOCK_FREE(NULL)) - is_fine_locked = 0; + is_fine_locked = false; } else if (tp[1] == am_read_concurrency) { if (tp[2] == am_true) { - frequent_read = 1; + frequent_read = true; } else if (tp[2] == am_false) { - frequent_read = 0; + frequent_read = false; } else break; } else if (tp[1] == am_heir && tp[2] == am_none) { @@ -2589,9 +2589,9 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) } else if (tp[1] == am_decentralized_counters) { if (tp[2] == am_true) { - is_decentralized_counters_option = 1; + decentralized_counters_option = 1; } else if (tp[2] == am_false) { - is_decentralized_counters_option = 0; + decentralized_counters_option = 0; } else break; } else break; @@ -2612,11 +2612,11 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) status &= ~(DB_PROTECTED|DB_PUBLIC); } else if (val == am_named_table) { - is_named = 1; + is_named = true; status |= DB_NAMED_TABLE; } else if (val == am_compressed) { - is_compressed = 1; + is_compressed = true; } else if (val == am_set || val == am_protected) ; @@ -2627,8 +2627,8 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) if (is_not_nil(list)) { /* bad opt or not a well formed list */ BIF_ERROR(BIF_P, BADARG); } - if (-1 != is_decentralized_counters_option) { - is_decentralized_counters = is_decentralized_counters_option; + if (decentralized_counters_option != -1) { + is_decentralized_counters = decentralized_counters_option; } if (IS_TREE_TABLE(status) && is_fine_locked && !(status & DB_PRIVATE)) { meth = &db_catree; @@ -2664,7 +2664,7 @@ BIF_RETTYPE ets_new_2(BIF_ALIST_2) status |= DB_FINE_LOCKED_AUTO; } } else { - number_of_locks = -1; + number_of_locks = 0; } } else if (IS_TREE_TABLE(status)) { @@ -4324,7 +4324,7 @@ BIF_RETTYPE ets_info_1(BIF_ALIST_1) Sint size = -1; Sint memory = -1; Eterm table; - int is_ctrs_read_result_set = 0; + bool is_ctrs_read_result_set = false; /*Process* rp = NULL;*/ /* If/when we implement lockless private tables: Eterm owner; @@ -4338,7 +4338,7 @@ BIF_RETTYPE ets_info_1(BIF_ALIST_1) ERTS_DB_TABLE_NITEMS_COUNTER_ID); memory = erts_flxctr_get_snapshot_result_after_trap(counter_read_result, ERTS_DB_TABLE_MEM_COUNTER_ID); - is_ctrs_read_result_set = 1; + is_ctrs_read_result_set = true; } else { table = BIF_ARG_1; } @@ -4393,7 +4393,7 @@ BIF_RETTYPE ets_info_1(BIF_ALIST_1) } else { size = res.result[ERTS_DB_TABLE_NITEMS_COUNTER_ID]; memory = res.result[ERTS_DB_TABLE_MEM_COUNTER_ID]; - is_ctrs_read_result_set = 1; + is_ctrs_read_result_set = true; } } for (i = 0; i < sizeof(fields)/sizeof(Eterm); i++) { @@ -5423,7 +5423,7 @@ static Eterm table_info(ErtsHeapFactory *hf, DbTable* tb, Eterm What) * For debugging purposes */ else if (What == am_data) { - print_table(ERTS_PRINT_STDOUT, NULL, 1, tb); + print_table(ERTS_PRINT_STDOUT, NULL, true, tb); ret = am_true; } else if (ERTS_IS_ATOM_STR("fixed",What)) { if (IS_FIXED(tb)) @@ -5527,7 +5527,7 @@ static Eterm table_info(ErtsHeapFactory *hf, DbTable* tb, Eterm What) return ret; } -static void print_table(fmtfn_t to, void *to_arg, int show, DbTable* tb) +static void print_table(fmtfn_t to, void *to_arg, bool show, DbTable* tb) { Eterm tid; ErtsHeapFactory hf; @@ -5565,7 +5565,7 @@ static void print_table(fmtfn_t to, void *to_arg, int show, DbTable* tb) typedef struct { fmtfn_t to; void *to_arg; - int show; + bool show; } ErtsPrintDbInfo; static void @@ -5577,7 +5577,7 @@ db_info_print(DbTable *tb, void *vpdbip) print_table(pdbip->to, pdbip->to_arg, pdbip->show, tb); } -void db_info(fmtfn_t to, void *to_arg, int show) /* Called by break handler */ +void db_info(fmtfn_t to, void *to_arg, bool show) /* Called by break handler */ { ErtsPrintDbInfo pdbi; @@ -5585,7 +5585,7 @@ void db_info(fmtfn_t to, void *to_arg, int show) /* Called by break handler * pdbi.to_arg = to_arg; pdbi.show = show; - erts_db_foreach_table(db_info_print, &pdbi, !0); + erts_db_foreach_table(db_info_print, &pdbi, true); } Uint @@ -5598,7 +5598,7 @@ erts_get_ets_misc_mem_size(void) /* SMP Note: May only be used when system is locked */ void -erts_db_foreach_table(void (*func)(DbTable *, void *), void *arg, int alive_only) +erts_db_foreach_table(void (*func)(DbTable *, void *), void *arg, bool alive_only) { int ix; diff --git a/erts/emulator/beam/erl_db.h b/erts/emulator/beam/erl_db.h index 19379dcdbed3..313eecc18eee 100644 --- a/erts/emulator/beam/erl_db.h +++ b/erts/emulator/beam/erl_db.h @@ -111,8 +111,8 @@ typedef enum { void init_db(ErtsDbSpinCount); int erts_db_process_exiting(Process *, ErtsProcLocks, void **); int erts_db_execute_free_fixation(Process*, DbFixation*); -void db_info(fmtfn_t, void *, int); -void erts_db_foreach_table(void (*)(DbTable *, void *), void *, int); +void db_info(fmtfn_t, void *, bool); +void erts_db_foreach_table(void (*)(DbTable *, void *), void *, bool); void erts_db_foreach_offheap(DbTable *, void (*func)(ErlOffHeap *, void *), void *); @@ -121,8 +121,8 @@ void erts_db_foreach_thr_prgr_offheap(void (*func)(ErlOffHeap *, void *), extern int erts_ets_rwmtx_spin_count; extern int user_requested_db_max_tabs; /* set in erl_init */ -extern int erts_ets_realloc_always_moves; /* set in erl_init */ -extern int erts_ets_always_compress; /* set in erl_init */ +extern bool erts_ets_realloc_always_moves; /* set in erl_init */ +extern bool erts_ets_always_compress; /* set in erl_init */ extern Export ets_select_delete_continue_exp; extern Export ets_select_count_continue_exp; extern Export ets_select_replace_continue_exp; diff --git a/erts/emulator/beam/erl_db_catree.c b/erts/emulator/beam/erl_db_catree.c index e441faf0bd92..85c32a69da5b 100644 --- a/erts/emulator/beam/erl_db_catree.c +++ b/erts/emulator/beam/erl_db_catree.c @@ -114,7 +114,7 @@ static int db_prev_catree(Process *p, DbTable *tbl, static int db_prev_lookup_catree(Process *p, DbTable *tbl, Eterm key, Eterm *ret); -static int db_put_catree(DbTable *tbl, Eterm obj, int key_clash_fail, +static int db_put_catree(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord *consumed_reds_p); static int db_get_catree(Process *p, DbTable *tbl, Eterm key, Eterm *ret); @@ -154,7 +154,7 @@ static int db_select_replace_continue_catree(Process *p, DbTable *tbl, enum DbIterSafety*); static int db_take_catree(Process *, DbTable *, Eterm, Eterm *); static void db_print_catree(fmtfn_t to, void *to_arg, - int show, DbTable *tbl); + bool show, DbTable *tbl); static int db_free_table_catree(DbTable *tbl); static SWord db_free_table_continue_catree(DbTable *tbl, SWord); static void db_foreach_offheap_catree(DbTable *, @@ -166,14 +166,14 @@ static SWord db_delete_all_objects_catree(Process* p, Eterm* nitems_holder_wb); static Eterm db_delete_all_objects_get_nitems_from_holder_catree(Process* p, Eterm nitems_holder); -static int +static bool db_lookup_dbterm_catree(Process *, DbTable *, Eterm key, Eterm obj, DbUpdateHandle*); static void db_finalize_dbterm_catree(int cret, DbUpdateHandle *); static int db_get_binary_info_catree(Process*, DbTable*, Eterm key, Eterm *ret); static int db_put_dbterm_catree(DbTable* tbl, void* obj, - int key_clash_fail, + bool key_clash_fail, SWord *consumed_reds_p); static void split_catree(DbTableCATree *tb, @@ -497,7 +497,7 @@ static ERTS_INLINE int compute_tree_hight(TreeDbTerm * root) * Used by the join_trees function */ static ERTS_INLINE -TreeDbTerm* linkout_min_or_max_tree_node(TreeDbTerm **root, int is_min) +TreeDbTerm* linkout_min_or_max_tree_node(TreeDbTerm **root, bool is_min) { TreeDbTerm **tstack[STACK_NEED]; int tpos = 0; @@ -543,8 +543,8 @@ TreeDbTerm* linkout_min_or_max_tree_node(TreeDbTerm **root, int is_min) return q; } -#define LINKOUT_MIN_TREE_NODE(root) linkout_min_or_max_tree_node(root, 1) -#define LINKOUT_MAX_TREE_NODE(root) linkout_min_or_max_tree_node(root, 0) +#define LINKOUT_MIN_TREE_NODE(root) linkout_min_or_max_tree_node(root, true) +#define LINKOUT_MAX_TREE_NODE(root) linkout_min_or_max_tree_node(root, false) /* * Joins two AVL trees where all the keys in the left one are smaller @@ -907,7 +907,7 @@ void destroy_route_key(DbRouteKey* key) static ERTS_INLINE void init_root_iterator(DbTableCATree* tb, CATreeRootIterator* iter, - int read_only) + bool read_only) { iter->tb = tb; iter->read_only = read_only; @@ -1036,7 +1036,7 @@ static DbTableCATreeNode *create_base_node(DbTableCATree *tb, p = erts_db_alloc(ERTS_ALC_T_DB_TABLE, (DbTable *) tb, sizeof_base_node()); - p->is_base_node = 1; + p->is_base_node = true; p->u.base.root = root; if (tb->common.type & DB_FREQ_READ) rwmtx_opt.type = ERTS_RWMTX_TYPE_FREQUENT_READ; @@ -1050,7 +1050,7 @@ static DbTableCATreeNode *create_base_node(DbTableCATree *tb, ERTS_DB_ALC_MEM_UPDATE_((DbTable *) tb, 0, erts_rwmtx_size(&p->u.base.lock)); BASE_NODE_STAT_SET(p, ((tb->common.status & DB_CATREE_FORCE_SPLIT) ? INT_MAX : 0)); - p->u.base.is_valid = 1; + p->u.base.is_valid = true; return p; } @@ -1074,8 +1074,8 @@ create_route_node(DbTableCATree *tb, sizeof_route_node(key_size)); copy_route_key(&p->u.route.key, key, key_size); - p->is_base_node = 0; - p->u.route.is_valid = 1; + p->is_base_node = false; + p->u.route.is_valid = true; erts_atomic_init_nob(&p->u.route.left, (erts_aint_t)left); erts_atomic_init_nob(&p->u.route.right, (erts_aint_t)right); #ifdef ERTS_ENABLE_LOCK_CHECK @@ -1238,9 +1238,9 @@ static void join_catree(DbTableCATree *tb, return; } else { lock_route_node(parent); - parent->u.route.is_valid = 0; - neighbor->u.base.is_valid = 0; - thiz->u.base.is_valid = 0; + parent->u.route.is_valid = false; + neighbor->u.base.is_valid = false; + thiz->u.base.is_valid = false; gparent = NULL; do { if (gparent != NULL) { @@ -1288,9 +1288,9 @@ static void join_catree(DbTableCATree *tb, return; } else { lock_route_node(parent); - parent->u.route.is_valid = 0; - neighbor->u.base.is_valid = 0; - thiz->u.base.is_valid = 0; + parent->u.route.is_valid = false; + neighbor->u.base.is_valid = false; + thiz->u.base.is_valid = false; gparent = NULL; do { if (gparent != NULL) { @@ -1392,7 +1392,7 @@ static void split_catree(DbTableCATree *tb, } else { SET_RIGHT_RELB(parent, new_route); } - base->u.base.is_valid = 0; + base->u.base.is_valid = false; wunlock_base_node(base); erts_schedule_db_free(&tb->common, do_free_base_node, @@ -1418,7 +1418,7 @@ static SWord db_free_table_continue_catree(DbTable *tbl, SWord reds) if (!tb->deletion) { /* First call */ - tb->deletion = 1; + tb->deletion = true; tb->nr_of_deleted_items = 0; } @@ -1571,7 +1571,7 @@ int db_create_catree(Process *p, DbTable *tbl) DbTableCATreeNode *root; root = create_base_node(tb, NULL); - tb->deletion = 0; + tb->deletion = false; tb->nr_of_deleted_items = 0; #ifdef DEBUG tbl->common.status |= DB_CATREE_DEBUG_RANDOM_SPLIT_JOIN; @@ -1586,7 +1586,7 @@ static int db_first_catree_common(Process *p, DbTable *tbl, Eterm *ret, Eterm (* CATreeRootIterator iter; int result; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); root = *catree_find_first_root(&iter); if (!root) { TreeDbTerm **pp = catree_find_next_root(&iter, NULL); @@ -1617,7 +1617,7 @@ static int db_next_catree_common(Process *p, DbTable *tbl, Eterm key, Eterm *ret CATreeRootIterator iter; int result; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); iter.next_route_key = key; rootp = catree_find_next_root(&iter, NULL); @@ -1650,7 +1650,7 @@ static int db_last_catree_common(Process *p, DbTable *tbl, Eterm *ret, Eterm (*f CATreeRootIterator iter; int result; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); root = *catree_find_last_root(&iter); if (!root) { TreeDbTerm **pp = catree_find_prev_root(&iter, NULL); @@ -1681,7 +1681,7 @@ static int db_prev_catree_common(Process *p, DbTable *tbl, Eterm key, Eterm *ret CATreeRootIterator iter; int result; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); iter.next_route_key = key; rootp = catree_find_prev_root(&iter, NULL); @@ -1710,7 +1710,7 @@ static int db_prev_lookup_catree(Process *p, DbTable *tbl, Eterm key, Eterm *ret static int db_put_dbterm_catree(DbTable* tbl, void* obj, - int key_clash_fail, + bool key_clash_fail, SWord *consumed_reds_p) { TreeDbTerm *value_to_insert = obj; @@ -1727,7 +1727,7 @@ static int db_put_dbterm_catree(DbTable* tbl, return result; } -static int db_put_catree(DbTable *tbl, Eterm obj, int key_clash_fail, +static int db_put_catree(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord *consumed_reds_p) { DbTableCATree *tb = &tbl->catree; @@ -2079,7 +2079,7 @@ static int db_slot_catree(Process *p, DbTable *tbl, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_slot_tree_common(p, tbl, *catree_find_first_root(&iter), slot_term, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2095,7 +2095,7 @@ static int db_select_continue_catree(Process *p, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_select_continue_tree_common(p, &tbl->common, continuation, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2109,7 +2109,7 @@ static int db_select_catree(Process *p, DbTable *tbl, Eterm tid, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_select_tree_common(p, tbl, tid, pattern, reverse, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2125,7 +2125,7 @@ static int db_select_count_continue_catree(Process *p, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_select_count_continue_tree_common(p, tbl, continuation, ret, NULL, &iter); @@ -2140,7 +2140,7 @@ static int db_select_count_catree(Process *p, DbTable *tbl, Eterm tid, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_select_count_tree_common(p, tbl, tid, pattern, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2155,7 +2155,7 @@ static int db_select_chunk_catree(Process *p, DbTable *tbl, Eterm tid, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); result = db_select_chunk_tree_common(p, tbl, tid, pattern, chunk_size, reversed, ret, NULL, &iter); @@ -2174,7 +2174,7 @@ static int db_select_delete_continue_catree(Process *p, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 0); + init_root_iterator(&tbl->catree, &iter, false); init_tree_stack(&stack, stack_array, 0); result = db_select_delete_continue_tree_common(p, tbl, continuation, ret, &stack, &iter); @@ -2191,7 +2191,7 @@ static int db_select_delete_catree(Process *p, DbTable *tbl, Eterm tid, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 0); + init_root_iterator(&tbl->catree, &iter, false); init_tree_stack(&stack, stack_array, 0); result = db_select_delete_tree_common(p, tbl, tid, pattern, ret, &stack, @@ -2207,7 +2207,7 @@ static int db_select_replace_catree(Process *p, DbTable *tbl, Eterm tid, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 0); + init_root_iterator(&tbl->catree, &iter, false); result = db_select_replace_tree_common(p, tbl, tid, pattern, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2221,7 +2221,7 @@ static int db_select_replace_continue_catree(Process *p, DbTable *tbl, int result; CATreeRootIterator iter; - init_root_iterator(&tbl->catree, &iter, 0); + init_root_iterator(&tbl->catree, &iter, false); result = db_select_replace_continue_tree_common(p, tbl, continuation, ret, NULL, &iter); destroy_root_iterator(&iter); @@ -2246,12 +2246,12 @@ static int db_take_catree(Process *p, DbTable *tbl, Eterm key, Eterm *ret) /* Display tree contents (for dump) */ static void db_print_catree(fmtfn_t to, void *to_arg, - int show, DbTable *tbl) + bool show, DbTable *tbl) { CATreeRootIterator iter; TreeDbTerm** root; - init_root_iterator(&tbl->catree, &iter, 1); + init_root_iterator(&tbl->catree, &iter, true); root = catree_find_first_root(&iter); do { db_print_tree_common(to, to_arg, show, *root, tbl); @@ -2352,7 +2352,7 @@ static void db_foreach_offheap_catree(DbTable *tbl, ASSERT(tb->common.status & DB_DELETE); return; } - init_root_iterator(tb, &iter, 1); + init_root_iterator(tb, &iter, true); root = catree_find_first_root(&iter); do { db_foreach_offheap_tree_common(*root, func, arg); @@ -2363,15 +2363,15 @@ static void db_foreach_offheap_catree(DbTable *tbl, do_for_route_nodes(GET_ROOT(tb), func, arg); } -static int db_lookup_dbterm_catree(Process *p, DbTable *tbl, Eterm key, Eterm obj, +static bool db_lookup_dbterm_catree(Process *p, DbTable *tbl, Eterm key, Eterm obj, DbUpdateHandle *handle) { DbTableCATree *tb = &tbl->catree; FindBaseNode fbn; DbTableCATreeNode* node = find_wlock_valid_base_node(tb, key, &fbn); - int res = db_lookup_dbterm_tree_common(p, tbl, &node->u.base.root, key, + bool res = db_lookup_dbterm_tree_common(p, tbl, &node->u.base.root, key, obj, handle, NULL); - if (res == 0) { + if (!res) { wunlock_adapt_base_node(tb, node, fbn.parent, fbn.current_level); } else { /* db_finalize_dbterm_catree will unlock */ @@ -2443,7 +2443,7 @@ void db_catree_force_split(DbTableCATree* tb, int on) CATreeRootIterator iter; TreeDbTerm** root; - init_root_iterator(tb, &iter, 1); + init_root_iterator(tb, &iter, true); root = catree_find_first_root(&iter); do { BASE_NODE_STAT_SET(iter.locked_bnode, (on ? INT_MAX : 0)); diff --git a/erts/emulator/beam/erl_db_catree.h b/erts/emulator/beam/erl_db_catree.h index 9499b46f009a..e409a100f9bf 100644 --- a/erts/emulator/beam/erl_db_catree.h +++ b/erts/emulator/beam/erl_db_catree.h @@ -43,7 +43,7 @@ typedef struct { typedef struct { erts_rwmtx_t lock; /* The lock for this base node */ erts_atomic_t lock_statistics; - int is_valid; /* If this base node is still valid */ + bool is_valid; /* If this base node is still valid */ TreeDbTerm *root; /* The root of the sequential tree */ ErtsThrPrgrLaterOp free_item; /* Used when freeing using thread progress */ @@ -56,14 +56,14 @@ typedef struct { #endif ErtsThrPrgrLaterOp free_item; /* Used when freeing using thread progress */ erts_mtx_t lock; /* Used when joining route nodes */ - int is_valid; /* If this route node is still valid */ + bool is_valid; /* If this route node is still valid */ erts_atomic_t left; erts_atomic_t right; DbRouteKey key; } DbTableCATreeRouteNode; typedef struct DbTableCATreeNode { - int is_base_node; + bool is_base_node; union { DbTableCATreeRouteNode route; DbTableCATreeBaseNode base; @@ -81,8 +81,7 @@ typedef struct db_table_catree { /* CA Tree-specific fields */ erts_atomic_t root; /* The tree root (DbTableCATreeNode*) */ - Uint deletion; /* Being deleted */ - int is_routing_nodes_freed; + bool deletion; /* Being deleted */ /* The fields below are used by delete_all_objects and select_delete(DeleteAll)*/ Uint nr_of_deleted_items; @@ -95,7 +94,7 @@ typedef struct { DbTableCATreeNode* locked_bnode; DbTableCATreeNode* bnode_parent; int bnode_level; - int read_only; + bool read_only; DbRouteKey* search_key; } CATreeRootIterator; diff --git a/erts/emulator/beam/erl_db_hash.c b/erts/emulator/beam/erl_db_hash.c index 7def06e96bdd..9f50e1f57734 100644 --- a/erts/emulator/beam/erl_db_hash.c +++ b/erts/emulator/beam/erl_db_hash.c @@ -71,6 +71,7 @@ # include "config.h" #endif +#include #include "sys.h" #include "erl_vm.h" #include "global.h" @@ -100,7 +101,7 @@ #define LCK_AUTO_MAX_LOCKS_FREQ_READ_RW_LOCKS 128 -static ERTS_INLINE int +static ERTS_INLINE Sint NITEMS_ESTIMATE(DbTableHash* DB, DbTableHashLockAndCounter* LCK_CTR, HashValue HASH) { if (IS_DECENTRALIZED_CTRS(DB)) { @@ -181,7 +182,7 @@ DEC_NITEMS(DbTableHash* DB, DbTableHashLockAndCounter* LCK_CTR, HashValue HASH) ? ((struct segment**) erts_atomic_read_ddrb(&(tb)->segtab)) \ : ((struct segment**) erts_atomic_read_nob(&(tb)->segtab))) #endif -#define NACTIVE(tb) ((int)erts_atomic_read_nob(&(tb)->nactive)) +#define NACTIVE(tb) ((UWord)erts_atomic_read_nob(&(tb)->nactive)) #define SLOT_IX_TO_SEG_IX(i) (((i)+(EXT_SEGSZ-FIRST_SEGSZ)) >> EXT_SEGSZ_EXP) @@ -231,7 +232,7 @@ static ERTS_INLINE void free_fixdel(DbTableHash* tb, FixedDeletion* fixd) ERTS_ETS_MISC_MEM_ADD(-sizeof(FixedDeletion)); } -static ERTS_INLINE int link_fixdel(DbTableHash* tb, +static ERTS_INLINE bool link_fixdel(DbTableHash* tb, FixedDeletion* fixd, erts_aint_t fixated_by_me) { @@ -257,17 +258,17 @@ static ERTS_INLINE int link_fixdel(DbTableHash* tb, * Return false if we got raced by unfixing thread * and the object should be deleted for real. */ -static int add_fixed_deletion(DbTableHash* tb, int ix, +static bool add_fixed_deletion(DbTableHash* tb, UWord ix, erts_aint_t fixated_by_me) { FixedDeletion* fixd = alloc_fixdel(tb); fixd->slot = ix; - fixd->all = 0; + fixd->all = false; return link_fixdel(tb, fixd, fixated_by_me); } -static ERTS_INLINE int is_pseudo_deleted(HashDbTerm* p) +static ERTS_INLINE bool is_pseudo_deleted(HashDbTerm* p) { return p->pseudo_deleted; } @@ -276,7 +277,7 @@ static ERTS_INLINE int is_pseudo_deleted(HashDbTerm* p) /* optimised version of make_hash (normal case? atomic key) */ #define MAKE_HASH(term) \ ((is_atom(term) ? (atom_tab(atom_val(term))->slot.bucket.hvalue) : \ - erts_internal_hash(term)) & MAX_HASH_MASK) + erts_internal_hash(term)) >> 1) # define GET_LOCK_MASK(NUMBER_OF_LOCKS) ((NUMBER_OF_LOCKS)-1) @@ -294,7 +295,7 @@ static void calc_shrink_limit(DbTableHash* tb); void db_hash_adapt_number_of_locks(DbTable* tb) { db_hash_lock_array_resize_state current_state; DbTableHash* tbl; - int new_number_of_locks; + UWord new_number_of_locks; ASSERT(IS_HASH_WITH_AUTO_TABLE(tb->common.type)); @@ -332,7 +333,7 @@ void db_hash_adapt_number_of_locks(DbTable* tb) { We do not want to make the table unnecessary large just to potentially reduce contention. */ - int i; + UWord i; for (i = 0; i < tbl->nlocks; i++) { tbl->locks[i].u.lck_ctr.lck_stat = 0; } @@ -343,7 +344,7 @@ void db_hash_adapt_number_of_locks(DbTable* tb) { } { erts_rwmtx_opt_t rwmtx_opt = ERTS_RWMTX_OPT_DEFAULT_INITER; - int i; + UWord i; DbTableHashFineLockSlot* old_locks = tbl->locks; Uint old_number_of_locks = tbl->nlocks; ASSERT(new_number_of_locks != 0); @@ -373,7 +374,7 @@ void db_hash_adapt_number_of_locks(DbTable* tb) { { Sint total_old = 0; Sint total_new = 0; - int i; + UWord i; for (i=0; i < old_number_of_locks; i++) { total_old += old_locks[i].u.lck_ctr.nitems; } @@ -584,12 +585,12 @@ static ERTS_INLINE void free_term_list(DbTableHash *tb, HashDbTerm* p) */ struct mp_prefound { HashDbTerm** bucket; - int ix; + UWord ix; }; struct mp_info { - int something_can_match; /* The match_spec is not "impossible" */ - int key_given; + bool something_can_match; /* The match_spec is not "impossible" */ + bool key_given; struct mp_prefound dlists[10]; /* Default list of "pre-found" buckets */ struct mp_prefound* lists; /* Buckets to search if keys are given, * = dlists initially */ @@ -609,8 +610,8 @@ struct segment { struct ext_segtab { ErtsThrPrgrLaterOp lop; struct segment** prev_segtab; /* Used when table is shrinking */ - int prev_nsegs; /* Size of prev_segtab */ - int nsegs; /* Size of this segtab */ + UWord prev_nsegs; /* Size of prev_segtab */ + UWord nsegs; /* Size of this segtab */ struct segment* segtab[1]; /* The segment table */ }; #define SIZEOF_EXT_SEGTAB(NSEGS) \ @@ -627,20 +628,20 @@ static ERTS_INLINE void SET_SEGTAB(DbTableHash* tb, } /* Used by select_replace on analyze_pattern */ -typedef int ExtraMatchValidatorF(int keypos, Eterm match, Eterm guard, Eterm body); +typedef bool ExtraMatchValidatorF(int keypos, Eterm match, Eterm guard, Eterm body); /* ** Forward decl's (static functions) */ -static struct ext_segtab* alloc_ext_segtab(DbTableHash* tb, unsigned seg_ix); -static void alloc_seg(DbTableHash *tb, int activate_new_seg); +static struct ext_segtab* alloc_ext_segtab(DbTableHash* tb, UWord seg_ix); +static void alloc_seg(DbTableHash *tb, bool activate_new_seg); static int free_seg(DbTableHash *tb); -static HashDbTerm* next_live(DbTableHash *tb, Uint *iptr, erts_rwmtx_t** lck_ptr, +static HashDbTerm* next_live(DbTableHash *tb, UWord *iptr, erts_rwmtx_t** lck_ptr, HashDbTerm *list); static HashDbTerm* search_list(DbTableHash* tb, Eterm key, HashValue hval, HashDbTerm *list); -static void shrink(DbTableHash* tb, int nitems); -static void grow(DbTableHash* tb, int nitems); +static void shrink(DbTableHash* tb, UWord nitems); +static void grow(DbTableHash* tb, UWord nitems); static Eterm build_term_list(Process* p, HashDbTerm* ptr1, HashDbTerm* ptr2, Uint sz, DbTableHash*); static Eterm get_term_list(Process *p, DbTableHash *tb, Eterm key, HashValue hval, @@ -673,7 +674,7 @@ static int db_next_lookup_hash(Process *p, static int db_member_hash(DbTable *tbl, Eterm key, Eterm *ret); static int db_get_element_hash(Process *p, DbTable *tbl, - Eterm key, int ndex, Eterm *ret); + Eterm key, int pos, Eterm *ret); static int db_erase_object_hash(DbTable *tbl, Eterm object,Eterm *ret); @@ -711,7 +712,7 @@ static int db_select_replace_continue_hash(Process *p, DbTable *tbl, static int db_take_hash(Process *, DbTable *, Eterm, Eterm *); static void db_print_hash(fmtfn_t to, void *to_arg, - int show, + bool show, DbTable *tbl); static int db_free_empty_table_hash(DbTable *tbl); @@ -731,19 +732,19 @@ static Eterm db_delete_all_objects_get_nitems_from_holder_hash(Process* p, #ifdef HARDDEBUG static void db_check_table_hash(DbTableHash *tb); #endif -static int +static bool db_lookup_dbterm_hash(Process *p, DbTable *tbl, Eterm key, Eterm obj, DbUpdateHandle* handle); static void db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle); -static void* db_eterm_to_dbterm_hash(int compress, int keypos, Eterm obj); +static void* db_eterm_to_dbterm_hash(bool compress, int keypos, Eterm obj); static void* db_dbterm_list_append_hash(void* last_term, void* db_term); static void* db_dbterm_list_remove_first_hash(void** list); static int db_put_dbterm_hash(DbTable* tb, void* obj, - int key_clash_fail, + bool key_clash_fail, SWord *consumed_reds_p); -static void db_free_dbterm_hash(int compressed, void* obj); +static void db_free_dbterm_hash(bool compressed, void* obj); static Eterm db_get_dbterm_key_hash(DbTable* tb, void* db_term); static int @@ -760,7 +761,7 @@ static ERTS_INLINE void try_shrink(DbTableHash* tb, Sint nitems) /* Is this a live object (not pseodo-deleted) with the specified key? */ -static ERTS_INLINE int has_live_key(DbTableHash* tb, HashDbTerm* b, +static ERTS_INLINE bool has_live_key(DbTableHash* tb, HashDbTerm* b, Eterm key, HashValue hval) { if (b->hvalue != hval || is_pseudo_deleted(b)) @@ -774,7 +775,7 @@ static ERTS_INLINE int has_live_key(DbTableHash* tb, HashDbTerm* b, /* Has this object the specified key? Can be pseudo-deleted. */ -static ERTS_INLINE int has_key(DbTableHash* tb, HashDbTerm* b, +static ERTS_INLINE bool has_key(DbTableHash* tb, HashDbTerm* b, Eterm key, HashValue hval) { if (b->hvalue != hval) @@ -802,7 +803,7 @@ static ERTS_INLINE HashDbTerm* new_dbterm_hash(DbTableCommon* tb, Eterm obj) * This function only differ from new_dbterm_hash in that it does not * adjust the memory size of a given table. */ -static ERTS_INLINE HashDbTerm* new_dbterm_hash_no_tab(int compress, int keypos, Eterm obj) +static ERTS_INLINE HashDbTerm* new_dbterm_hash_no_tab(bool compress, int keypos, Eterm obj) { HashDbTerm* p; if (compress) { @@ -906,7 +907,6 @@ static void DEBUG_WAIT(void) when "unfixer" gets interrupted by "fixer" */ static void restore_fixdel(DbTableHash* tb, FixedDeletion* fixdel) { - /*int tries = 0;*/ DEBUG_WAIT(); if (erts_atomic_cmpxchg_relb(&tb->fixdel, (erts_aint_t) fixdel, @@ -1029,20 +1029,20 @@ int db_create_hash(Process *p, DbTable *tbl) } else { erts_rwmtx_opt_t rwmtx_opt = ERTS_RWMTX_OPT_DEFAULT_INITER; - int i; + UWord i; if (tb->common.type & DB_FINE_LOCKED_AUTO) { tb->nlocks = LCK_AUTO_DEFAULT_NUMBER_OF_LOCKS; } else { - if (tb->nlocks < 1) { + if (tb->nlocks == 0) { tb->nlocks = DB_HASH_LOCK_CNT; } /* * nlocks needs to be a power of two so we round down to * nearest power of two */ - tb->nlocks = 1 << (erts_fit_in_bits_int64(tb->nlocks)-1); + tb->nlocks = 1 << (erts_fit_in_bits_uint(tb->nlocks)-1); if (tb->nlocks < NLOCKS_WITH_ITEM_COUNTERS) { tb->nlocks = NLOCKS_WITH_ITEM_COUNTERS; } @@ -1063,7 +1063,7 @@ int db_create_hash(Process *p, DbTable *tbl) tb->locks = (DbTableHashFineLockSlot*) erts_db_alloc(ERTS_ALC_T_DB_SEG, /* Other type maybe? */ (DbTable *) tb, sizeof(DbTableHashFineLockSlot) * tb->nlocks); - for (i=0; inlocks; ++i) { + for (i=0; i < tb->nlocks; ++i) { erts_rwmtx_init_opt( GET_LOCK(tb,i), &rwmtx_opt, "db_hash_slot", tb->common.the_name, ERTS_LOCK_FLAGS_CATEGORY_DB); @@ -1115,11 +1115,11 @@ static ERTS_INLINE Eterm db_copy_key_and_objects_hash(Process* p, DbTable* tbl, static int db_first_hash_common(Process *p, DbTable *tbl, Eterm *ret, Eterm (*func)(Process *, DbTable *, HashDbTerm *)) { DbTableHash *tb = &tbl->hash; - Uint ix = 0; + UWord ix = 0; erts_rwmtx_t* lck = RLOCK_HASH(tb,ix); HashDbTerm* list; - list = BUCKET(tb,ix); + list = BUCKET(tb, ix); list = next_live(tb, &ix, &lck, list); if (list != NULL) { @@ -1146,7 +1146,7 @@ static int db_next_hash_common(Process *p, DbTable *tbl, Eterm key, Eterm *ret, { DbTableHash *tb = &tbl->hash; HashValue hval; - Uint ix; + UWord ix; HashDbTerm* b; erts_rwmtx_t* lck; @@ -1241,18 +1241,18 @@ static ERTS_INLINE int db_terms_eq(DbTableCommon* tb, DbTerm* a, DbTerm* b, static int db_put_dbterm_hash(DbTable* tbl, void* ob, - int key_clash_fail, + bool key_clash_fail, SWord *consumed_reds_p) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; Eterm key; HashDbTerm** bp; HashDbTerm* b; HashDbTerm* q; DbTableHashLockAndCounter* lck_ctr; - int nitems; + UWord nitems; int ret = DB_ERROR_NONE; HashDbTerm *value_to_insert = ob; Uint size_to_insert = db_term_size(tbl, value_to_insert, offsetof(HashDbTerm, dbterm)); @@ -1281,7 +1281,7 @@ static int db_put_dbterm_hash(DbTable* tbl, HashDbTerm* bnext = b->next; if (is_pseudo_deleted(b)) { INC_NITEMS(tb, lck_ctr, hval); - b->pseudo_deleted = 0; + b->pseudo_deleted = false; } else if (key_clash_fail) { ret = DB_ERROR_BADKEY; @@ -1316,7 +1316,7 @@ static int db_put_dbterm_hash(DbTable* tbl, &tmp)) { if (is_pseudo_deleted(q)) { INC_NITEMS(tb, lck_ctr, hval); - q->pseudo_deleted = 0; + q->pseudo_deleted = false; ASSERT(q->hvalue == hval); if (q != b) { /* must move to preserve key insertion order */ *qp = q->next; @@ -1339,14 +1339,14 @@ static int db_put_dbterm_hash(DbTable* tbl, Lnew: q = value_to_insert; q->hvalue = hval; - q->pseudo_deleted = 0; + q->pseudo_deleted = false; q->next = b; *bp = q; INC_NITEMS(tb, lck_ctr, hval); nitems = NITEMS_ESTIMATE(tb, lck_ctr, hval); WUNLOCK_HASH_LCK_CTR(lck_ctr); { - int nactive = NACTIVE(tb); + UWord nactive = NACTIVE(tb); if (nitems > GROW_LIMIT(nactive) && !IS_FIXED(tb)) { grow(tb, nitems); } @@ -1358,12 +1358,12 @@ static int db_put_dbterm_hash(DbTable* tbl, return ret; } -int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail, +int db_put_hash(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord *consumed_reds_p) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; Eterm key; HashDbTerm** bp; HashDbTerm* b; @@ -1395,7 +1395,7 @@ int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail, HashDbTerm* bnext = b->next; if (is_pseudo_deleted(b)) { INC_NITEMS(tb, lck_ctr, hval); - b->pseudo_deleted = 0; + b->pseudo_deleted = false; } else if (key_clash_fail) { ret = DB_ERROR_BADKEY; @@ -1424,7 +1424,7 @@ int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail, if (db_eq(&tb->common,obj,&q->dbterm)) { if (is_pseudo_deleted(q)) { INC_NITEMS(tb, lck_ctr, hval); - q->pseudo_deleted = 0; + q->pseudo_deleted = false; ASSERT(q->hvalue == hval); if (q != b) { /* must move to preserve key insertion order */ *qp = q->next; @@ -1445,14 +1445,14 @@ int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail, Lnew: q = new_dbterm(tb, obj); q->hvalue = hval; - q->pseudo_deleted = 0; + q->pseudo_deleted = false; q->next = b; *bp = q; INC_NITEMS(tb, lck_ctr, hval); nitems = NITEMS_ESTIMATE(tb, lck_ctr, hval); WUNLOCK_HASH_LCK_CTR(lck_ctr); { - int nactive = NACTIVE(tb); + const UWord nactive = NACTIVE(tb); if (nitems > GROW_LIMIT(nactive) && !IS_FIXED(tb)) { grow(tb, nitems); } @@ -1491,7 +1491,7 @@ int db_get_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm* b; erts_rwmtx_t* lck; @@ -1517,7 +1517,7 @@ static int db_member_hash(DbTable *tbl, Eterm key, Eterm *ret) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm* b1; erts_rwmtx_t* lck; @@ -1541,12 +1541,12 @@ static int db_member_hash(DbTable *tbl, Eterm key, Eterm *ret) static int db_get_element_hash(Process *p, DbTable *tbl, Eterm key, - int ndex, + int pos, Eterm *ret) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm* b1; erts_rwmtx_t* lck; int retval; @@ -1559,7 +1559,7 @@ static int db_get_element_hash(Process *p, DbTable *tbl, while(b1 != 0) { if (has_live_key(tb,b1,key,hval)) { - if (ndex > arityval(b1->dbterm.tpl[0])) { + if (pos > arityval(b1->dbterm.tpl[0])) { retval = DB_ERROR_BADITEM; goto done; } @@ -1569,7 +1569,7 @@ static int db_get_element_hash(Process *p, DbTable *tbl, Eterm elem_list = NIL; while(b2 != NULL && has_key(tb,b2,key,hval)) { - if (ndex > arityval(b2->dbterm.tpl[0]) + if (pos > arityval(b2->dbterm.tpl[0]) && !is_pseudo_deleted(b2)) { retval = DB_ERROR_BADITEM; goto done; @@ -1581,7 +1581,8 @@ static int db_get_element_hash(Process *p, DbTable *tbl, if (!is_pseudo_deleted(b)) { Eterm *hp; Eterm copy = db_copy_element_from_ets(&tb->common, p, - &b->dbterm, ndex, &hp, 2); + &b->dbterm, pos, + &hp, 2); elem_list = CONS(hp, copy, elem_list); } b = b->next; @@ -1590,7 +1591,8 @@ static int db_get_element_hash(Process *p, DbTable *tbl, } else { Eterm* hp; - *ret = db_copy_element_from_ets(&tb->common, p, &b1->dbterm, ndex, &hp, 0); + *ret = db_copy_element_from_ets(&tb->common, p, &b1->dbterm, + pos, &hp, 0); } retval = DB_ERROR_NONE; goto done; @@ -1610,7 +1612,7 @@ int db_erase_hash(DbTable *tbl, Eterm key, Eterm *ret) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm** bp; HashDbTerm* b; HashDbTerm* free_us = NULL; @@ -1629,7 +1631,7 @@ int db_erase_hash(DbTable *tbl, Eterm key, Eterm *ret) if (nitems_diff == -1 && IS_FIXED(tb) && add_fixed_deletion(tb, ix, 0)) { /* Pseudo remove (no need to keep several of same key) */ - b->pseudo_deleted = 1; + b->pseudo_deleted = true; } else { HashDbTerm* next = b->next; b->next = free_us; @@ -1665,7 +1667,7 @@ static int db_erase_object_hash(DbTable *tbl, Eterm object, Eterm *ret) { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm** bp; HashDbTerm* b; HashDbTerm* free_us = NULL; @@ -1688,7 +1690,7 @@ static int db_erase_object_hash(DbTable *tbl, Eterm object, Eterm *ret) if (db_eq(&tb->common,object, &b->dbterm)) { --nitems_diff; if (nkeys==1 && IS_FIXED(tb) && add_fixed_deletion(tb,ix,0)) { - b->pseudo_deleted = 1; + b->pseudo_deleted = true; bp = &b->next; b = b->next; } else { @@ -1730,7 +1732,7 @@ static int db_slot_hash(Process *p, DbTable *tbl, Eterm slot_term, Eterm *ret) erts_rwmtx_t* lck; Sint slot; int retval; - int nactive; + UWord nactive; if (is_not_small(slot_term) || ((slot = signed_val(slot_term)) < 0)) { return DB_ERROR_BADPARAM; @@ -2076,7 +2078,7 @@ static ERTS_INLINE int on_simple_trap(Export* trap_function, Eterm egot; Eterm mpb; Eterm continuation; - int is_first_trap = (ctx->prev_continuation_tptr == NULL); + const bool is_first_trap = (ctx->prev_continuation_tptr == NULL); size_t base_halloc_sz = (is_first_trap ? ERTS_MAGIC_REF_THING_SIZE : 0); BUMP_ALL_REDS(ctx->p); @@ -2113,7 +2115,7 @@ static ERTS_INLINE int on_simple_trap(Export* trap_function, return DB_ERROR_NONE; } -static ERTS_INLINE int unpack_simple_continuation(Eterm continuation, +static ERTS_INLINE bool unpack_simple_continuation(Eterm continuation, Eterm** tptr_ptr, Eterm* tid_ptr, Sint* slot_ix_p, @@ -2621,7 +2623,7 @@ static int select_delete_on_match_res(traverse_context_t* ctx_base, Sint slot_ix select_delete_context_t* ctx = (select_delete_context_t*) ctx_base; HashDbTerm* del; DbTableHashLockAndCounter* lck_ctr; - Uint32 hval; + UWord hval; if (match_res != am_true) return 0; hval = (*current_ptr)->hvalue; @@ -2631,7 +2633,7 @@ static int select_delete_on_match_res(traverse_context_t* ctx_base, Sint slot_ix goto do_erase; ctx->last_pseudo_delete = slot_ix; } - (*current_ptr)->pseudo_deleted = 1; + (*current_ptr)->pseudo_deleted = true; } else { do_erase: @@ -2651,7 +2653,7 @@ static int select_delete_on_match_res(traverse_context_t* ctx_base, Sint slot_ix static Sint get_nitems_from_locks_or_counter(DbTableHash* tb) { if (IS_DECENTRALIZED_CTRS(tb)) { - int i; + UWord i; Sint total = 0; for (i=0; i < NLOCKS_WITH_ITEM_COUNTERS; ++i) { total += erts_atomic_read_nob(&tb->locks[i].u.lck_ctr.nitems); @@ -2830,7 +2832,7 @@ static int select_replace_on_match_res(traverse_context_t* ctx, Sint slot_ix, new = new_dbterm(tb, match_res); new->next = next; new->hvalue = hval; - new->pseudo_deleted = 0; + new->pseudo_deleted = false; free_term(tb, **current_ptr_ptr); **current_ptr_ptr = new; /* replace 'next' pointer in previous object */ *current_ptr_ptr = &((**current_ptr_ptr)->next); /* advance to next object */ @@ -2947,7 +2949,7 @@ static int db_take_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret) HashDbTerm *free_us = NULL; HashValue hval = MAKE_HASH(key); DbTableHashLockAndCounter *lck_ctr = WLOCK_HASH_GET_LCK_AND_CTR(tb, hval); - int ix = hash_to_ix(tb, hval); + UWord ix = hash_to_ix(tb, hval); int nitems_diff = 0; Sint nitems; @@ -2963,7 +2965,7 @@ static int db_take_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret) && add_fixed_deletion(tb, ix, 0)) { /* Pseudo remove (no need to keep several of same key) */ bp = &b->next; - b->pseudo_deleted = 1; + b->pseudo_deleted = true; b = b->next; } else { HashDbTerm* next = b->next; @@ -3003,7 +3005,7 @@ static SWord db_mark_all_deleted_hash(DbTable *tbl, SWord reds) DbTableHash *tb = &tbl->hash; FixedDeletion* fixdel; SWord loops = reds * LOOPS_PER_REDUCTION; - int i; + UWord i; ERTS_LC_ASSERT(IS_TAB_WLOCKED(tb)); @@ -3016,7 +3018,7 @@ static SWord db_mark_all_deleted_hash(DbTable *tbl, SWord reds) } else { /* First call */ - int ok; + bool ok; fixdel = alloc_fixdel(tb); ok = link_fixdel(tb, fixdel, 0); ASSERT(ok); (void)ok; @@ -3026,43 +3028,43 @@ static SWord db_mark_all_deleted_hash(DbTable *tbl, SWord reds) do { HashDbTerm* b; for (b = BUCKET(tb,i); b; b = b->next) - b->pseudo_deleted = 1; + b->pseudo_deleted = true; } while (++i < NACTIVE(tb) && --loops > 0); if (i < NACTIVE(tb)) { /* Yield */ fixdel->slot = i; - fixdel->all = 1; - fixdel->trap = 1; + fixdel->all = true; + fixdel->trap = true; return -1; } fixdel->slot = NACTIVE(tb) - 1; - fixdel->all = 1; - fixdel->trap = 0; + fixdel->all = true; + fixdel->trap = false; RESET_NITEMS(tb); return loops < 0 ? 0 : loops / LOOPS_PER_REDUCTION; } /* Display hash table contents (for dump) */ -static void db_print_hash(fmtfn_t to, void *to_arg, int show, DbTable *tbl) +static void db_print_hash(fmtfn_t to, void *to_arg, bool show, DbTable *tbl) { DbTableHash *tb = &tbl->hash; DbHashStats stats; - int i; + bool was_thread_safe; erts_print(to, to_arg, "Buckets: %d\n", NACTIVE(tb)); - i = tbl->common.is_thread_safe; + was_thread_safe = tbl->common.is_thread_safe; /* If crash dumping we set table to thread safe in order to avoid taking any locks */ if (ERTS_IS_CRASH_DUMPING) - tbl->common.is_thread_safe = 1; + tbl->common.is_thread_safe = true; db_calc_stats_hash(&tbl->hash, &stats); - tbl->common.is_thread_safe = i; + tbl->common.is_thread_safe = was_thread_safe; erts_print(to, to_arg, "Chain Length Avg: %f\n", stats.avg_chain_len); erts_print(to, to_arg, "Chain Length Max: %d\n", stats.max_chain_len); @@ -3078,6 +3080,7 @@ static void db_print_hash(fmtfn_t to, void *to_arg, int show, DbTable *tbl) erts_print(to, to_arg, "Fixed: false\n"); if (show) { + UWord i; for (i = 0; i < NACTIVE(tb); i++) { HashDbTerm* list = BUCKET(tb,i); if (list == NULL) @@ -3140,8 +3143,8 @@ static SWord db_free_table_continue_hash(DbTable *tbl, SWord reds) } } if (tb->locks != NULL) { - int i; - for (i=0; inlocks; ++i) { + UWord i; + for (i=0; i < tb->nlocks; ++i) { ERTS_DB_ALC_MEM_UPDATE_(tb, erts_rwmtx_size(GET_LOCK(tb,i)), 0); erts_rwmtx_destroy(GET_LOCK(tb,i)); } @@ -3183,8 +3186,8 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern, mpi->lists = mpi->dlists; mpi->num_lists = 0; - mpi->key_given = 1; - mpi->something_can_match = 0; + mpi->key_given = true; + mpi->something_can_match = false; mpi->mp = NULL; for (lst = pattern; is_list(lst); lst = CDR(list_val(lst))) @@ -3243,13 +3246,14 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern, continue; } if (tpl == am_Underscore || db_is_variable(tpl) != -1) { - (mpi->key_given) = 0; - (mpi->something_can_match) = 1; + mpi->key_given = false; + mpi->something_can_match = true; } else { key = db_getkey(tb->common.keypos, tpl); if (is_value(key)) { if (db_is_fully_bound(key)) { - int ix, search_slot; + UWord ix; + bool search_slot; HashDbTerm** bp; erts_rwmtx_t* lck; hval = MAKE_HASH(key); @@ -3257,12 +3261,12 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern, ix = hash_to_ix(tb, hval); bp = &BUCKET(tb,ix); if (lck == NULL) { - search_slot = search_list(tb,key,hval,*bp) != NULL; + search_slot = (search_list(tb,key,hval,*bp) != NULL); } else { /* No point to verify if key exist now as there may be concurrent inserters/deleters anyway */ RUNLOCK_HASH(lck); - search_slot = 1; + search_slot = true; } if (search_slot) { int j; @@ -3279,11 +3283,11 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern, } ASSERT(mpi->lists[j].ix != ix); } - mpi->something_can_match = 1; + mpi->something_can_match = true; } } else { - mpi->key_given = 0; - mpi->something_can_match = 1; + mpi->key_given = false; + mpi->something_can_match = true; } } } @@ -3313,10 +3317,10 @@ static int analyze_pattern(DbTableHash *tb, Eterm pattern, return DB_ERROR_NONE; } -static struct ext_segtab* alloc_ext_segtab(DbTableHash* tb, unsigned seg_ix) +static struct ext_segtab* alloc_ext_segtab(DbTableHash* tb, UWord seg_ix) { struct segment** old_segtab = SEGTAB(tb); - int nsegs = 0; + UWord nsegs = 0; struct ext_segtab* est; ASSERT(seg_ix >= NSEG_1); @@ -3341,7 +3345,7 @@ static struct ext_segtab* alloc_ext_segtab(DbTableHash* tb, unsigned seg_ix) static void calc_shrink_limit(DbTableHash* tb) { erts_aint_t shrink_limit; - int sample_size_is_enough = 1; + bool sample_size_is_enough = true; if (IS_DECENTRALIZED_CTRS(tb)) { /* @@ -3363,9 +3367,9 @@ static void calc_shrink_limit(DbTableHash* tb) /* const double d = n*x / (x + n - 1) + 1; */ /* printf("Cochran_formula=%f size=%d mod_with_size=%f\n", x, n, d); */ /* } */ - const int needed_slots = 100 * NLOCKS_WITH_ITEM_COUNTERS; + const UWord needed_slots = 100 * NLOCKS_WITH_ITEM_COUNTERS; if (tb->nslots < needed_slots) { - sample_size_is_enough = 0; + sample_size_is_enough = false; } } @@ -3397,9 +3401,9 @@ static void calc_shrink_limit(DbTableHash* tb) /* Extend table with one new segment */ -static void alloc_seg(DbTableHash *tb, int activate_buckets) +static void alloc_seg(DbTableHash *tb, bool activate_buckets) { - int seg_ix = SLOT_IX_TO_SEG_IX(tb->nslots); + UWord seg_ix = SLOT_IX_TO_SEG_IX(tb->nslots); struct segment** segtab; ASSERT(seg_ix > 0); @@ -3415,7 +3419,7 @@ static void alloc_seg(DbTableHash *tb, int activate_buckets) SIZEOF_SEGMENT(EXT_SEGSZ)); #ifdef DEBUG { - int i; + UWord i; for (i = 0; i < EXT_SEGSZ; i++) { segtab[seg_ix]->buckets[i] = DBG_BUCKET_INACTIVE; } @@ -3456,10 +3460,10 @@ struct dealloc_seg_ops { ** free_records: 1=free any records in segment, 0=assume segment is empty ** ds_ops: (out) Instructions for dealloc_seg(). */ -static int remove_seg(DbTableHash *tb, int free_records, +static int remove_seg(DbTableHash *tb, bool free_records, struct dealloc_seg_ops *ds_ops) { - const int seg_ix = SLOT_IX_TO_SEG_IX(tb->nslots) - 1; + const UWord seg_ix = SLOT_IX_TO_SEG_IX(tb->nslots) - 1; struct segment** const segtab = SEGTAB(tb); struct segment* const segp = segtab[seg_ix]; Uint seg_sz; @@ -3470,7 +3474,7 @@ static int remove_seg(DbTableHash *tb, int free_records, ASSERT(segp != NULL); if (free_records) { - int ix, n; + UWord ix, n; if (seg_ix == 0) { /* First segment (always fully active) */ n = FIRST_SEGSZ; @@ -3498,7 +3502,7 @@ static int remove_seg(DbTableHash *tb, int free_records, } #ifdef DEBUG else { - int ix = (seg_ix == 0) ? FIRST_SEGSZ-1 : EXT_SEGSZ-1; + SWord ix = (seg_ix == 0) ? FIRST_SEGSZ-1 : EXT_SEGSZ-1; for ( ; ix >= 0; ix--) { ASSERT(segp->buckets[ix] == DBG_BUCKET_INACTIVE); } @@ -3568,7 +3572,7 @@ static int free_seg(DbTableHash *tb) struct dealloc_seg_ops ds_ops; int reds; - reds = remove_seg(tb, 1, &ds_ops); + reds = remove_seg(tb, true, &ds_ops); dealloc_seg(tb, &ds_ops); return reds; } @@ -3613,15 +3617,16 @@ static Eterm build_term_list(Process* p, HashDbTerm* ptr1, HashDbTerm* ptr2, return list; } -static ERTS_INLINE int +static ERTS_INLINE bool begin_resizing(DbTableHash* tb) { if (DB_USING_FINE_LOCKING(tb)) { return !erts_atomic_read_acqb(&tb->is_resizing) && !erts_atomic_xchg_acqb(&tb->is_resizing, 1); - } else + } else { ERTS_LC_ASSERT(IS_TAB_WLOCKED(tb)); + } return 1; } @@ -3635,15 +3640,15 @@ done_resizing(DbTableHash* tb) /* Grow table with one or more new buckets. ** Allocate new segment if needed. */ -static void grow(DbTableHash* tb, int nitems) +static void grow(DbTableHash* tb, UWord nitems) { HashDbTerm** pnext; HashDbTerm** to_pnext; HashDbTerm* p; erts_rwmtx_t* lck; - int nactive; - int from_ix, to_ix; - int szm; + UWord nactive; + UWord from_ix, to_ix; + UWord szm; int loop_limit = 5; do { @@ -3703,7 +3708,7 @@ static void grow(DbTableHash* tb, int nitems) p = *pnext; } else { - int ix = p->hvalue & szm; + const UWord ix = p->hvalue & szm; if (ix != from_ix) { ASSERT(ix == (from_ix ^ ((szm+1)>>1))); *to_pnext = p; @@ -3730,15 +3735,15 @@ static void grow(DbTableHash* tb, int nitems) /* Shrink table by joining top bucket. ** Remove top segment if it gets empty. */ -static void shrink(DbTableHash* tb, int nitems) +static void shrink(DbTableHash* tb, UWord nitems) { struct dealloc_seg_ops ds_ops; HashDbTerm* src; HashDbTerm* tail; HashDbTerm** bp; erts_rwmtx_t* lck; - int src_ix, dst_ix, low_szm; - int nactive; + UWord src_ix, dst_ix, low_szm; + UWord nactive; int loop_limit = 5; ds_ops.segp = NULL; @@ -3773,7 +3778,7 @@ static void shrink(DbTableHash* tb, int nitems) erts_atomic_set_relb(&tb->szm, low_szm); } if (tb->nslots - src_ix >= EXT_SEGSZ) { - remove_seg(tb, 0, &ds_ops); + remove_seg(tb, false, &ds_ops); } done_resizing(tb); @@ -3826,14 +3831,14 @@ static HashDbTerm* search_list(DbTableHash* tb, Eterm key, } -/* This function is called by the next AND the select BIF */ +/* This function is called by the 'next' AND the 'select' BIF */ /* It return the next live object in a table, NULL if no more */ /* In-bucket: RLOCKED */ /* Out-bucket: RLOCKED unless NULL */ -static HashDbTerm* next_live(DbTableHash *tb, Uint *iptr, erts_rwmtx_t** lck_ptr, +static HashDbTerm* next_live(DbTableHash *tb, UWord *iptr, erts_rwmtx_t** lck_ptr, HashDbTerm *list) { - int i; + UWord i; ERTS_LC_ASSERT(IS_HASH_RLOCKED(tb,*iptr)); @@ -3858,7 +3863,7 @@ static HashDbTerm* next_live(DbTableHash *tb, Uint *iptr, erts_rwmtx_t** lck_ptr return NULL; } -static int +static bool db_lookup_dbterm_hash(Process *p, DbTable *tbl, Eterm key, Eterm obj, DbUpdateHandle* handle) { @@ -3910,7 +3915,7 @@ db_lookup_dbterm_hash(Process *p, DbTable *tbl, Eterm key, Eterm obj, HashDbTerm *q = new_dbterm(tb, obj); q->hvalue = hval; - q->pseudo_deleted = 0; + q->pseudo_deleted = false; q->next = NULL; *bp = b = q; flags |= DB_INC_TRY_GROW; @@ -3921,7 +3926,7 @@ db_lookup_dbterm_hash(Process *p, DbTable *tbl, Eterm key, Eterm obj, q = replace_dbterm(tb, b, obj); q->next = next; ASSERT(q->hvalue == hval); - q->pseudo_deleted = 0; + q->pseudo_deleted = false; *bp = b = q; INC_NITEMS(tb, lck_ctr, hval); } @@ -3950,7 +3955,7 @@ db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle) DbTableHash *tb = &tbl->hash; HashDbTerm **bp = (HashDbTerm **) handle->bp; HashDbTerm *b = *bp; - Uint32 hval = b->hvalue; + const UWord hval = b->hvalue; DbTableHashLockAndCounter* lck_ctr = handle->u.hash.lck_ctr; HashDbTerm* free_me = NULL; Sint nitems; @@ -3962,7 +3967,7 @@ db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle) if (handle->flags & DB_NEW_OBJECT && cret != DB_ERROR_NONE) { if (IS_FIXED(tb) && add_fixed_deletion(tb, hash_to_ix(tb, b->hvalue), 0)) { - b->pseudo_deleted = 1; + b->pseudo_deleted = true; } else { *bp = b->next; free_me = b; @@ -3979,8 +3984,8 @@ db_finalize_dbterm_hash(int cret, DbUpdateHandle* handle) free_me = b; } if (handle->flags & DB_INC_TRY_GROW) { - int nactive; - int nitems; + UWord nactive; + UWord nitems; ASSERT(cret == DB_ERROR_NONE); INC_NITEMS(tb, lck_ctr, hval); nitems = NITEMS_ESTIMATE(tb, lck_ctr, hval); @@ -4037,8 +4042,8 @@ void db_foreach_offheap_hash(DbTable *tbl, { DbTableHash *tb = &tbl->hash; HashDbTerm* list; - int i; - int nactive = NACTIVE(tb); + UWord i; + UWord nactive = NACTIVE(tb); if (nactive > tb->nslots) { /* Table is being emptied by delete/1 or delete_all_objects/1 */ @@ -4063,11 +4068,11 @@ void db_calc_stats_hash(DbTableHash* tb, DbHashStats* stats) { HashDbTerm* b; erts_rwmtx_t* lck; - int sum = 0; - int sq_sum = 0; - int kept_items = 0; - int ix; - int len; + UWord sum = 0; + UWord sq_sum = 0; + UWord kept_items = 0; + UWord ix; + UWord len; if (tb->nslots < NACTIVE(tb)) { ASSERT(ERTS_IS_CRASH_DUMPING); @@ -4108,7 +4113,7 @@ static int db_get_binary_info_hash(Process *p, DbTable *tbl, Eterm key, Eterm *r { DbTableHash *tb = &tbl->hash; HashValue hval; - int ix; + UWord ix; HashDbTerm *b, *first, *end; erts_rwmtx_t* lck; Eterm *hp, *hp_end; @@ -4224,7 +4229,7 @@ static int db_raw_next_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret) return DB_ERROR_NONE; } -static void* db_eterm_to_dbterm_hash(int compress, int keypos, Eterm obj) +static void* db_eterm_to_dbterm_hash(bool compress, int keypos, Eterm obj) { HashDbTerm* term = new_dbterm_hash_no_tab(compress, keypos, obj); term->next = NULL; @@ -4255,7 +4260,7 @@ static void* db_dbterm_list_remove_first_hash(void** list) * Frees a HashDbTerm without updating the memory footprint of the * table. */ -static void db_free_dbterm_hash(int compressed, void* obj) +static void db_free_dbterm_hash(bool compressed, void* obj) { HashDbTerm* p = obj; db_free_term_no_tab(compressed, p, offsetof(HashDbTerm, dbterm)); @@ -4281,7 +4286,7 @@ erts_db_foreach_thr_prgr_offheap_hash(void (*func)(ErlOffHeap *, void *), #ifdef ERTS_ENABLE_LOCK_COUNT void erts_lcnt_enable_db_hash_lock_count(DbTableHash *tb, int enable) { - int i; + UWord i; if(tb->locks == NULL) { return; diff --git a/erts/emulator/beam/erl_db_hash.h b/erts/emulator/beam/erl_db_hash.h index 974715f5d2ea..7e6cbf524580 100644 --- a/erts/emulator/beam/erl_db_hash.h +++ b/erts/emulator/beam/erl_db_hash.h @@ -27,8 +27,8 @@ typedef struct fixed_deletion { UWord slot : sizeof(UWord)*8 - 2; /* Used by delete_all_objects: */ - UWord all : 1; /* marks [0 -> slot] */ - UWord trap : 1; + bool all : 1; /* marks [0 -> slot] */ + bool trap : 1; struct fixed_deletion *next; } FixedDeletion; @@ -38,15 +38,11 @@ typedef Uint32 HashVal; typedef struct hash_db_term { struct hash_db_term* next; /* next bucket */ -#if SIZEOF_VOID_P == 4 - Uint32 hvalue : 31; /* stored hash value */ - Uint32 pseudo_deleted : 1; -# define MAX_HASH_MASK (((Uint32)1 << 31)-1) -#elif SIZEOF_VOID_P == 8 - Uint32 hvalue; - Uint32 pseudo_deleted; -# define MAX_HASH_MASK ((Uint32)(Sint32)-1) -#endif + UWord hvalue : sizeof(UWord)*8 - 1; /* stored hash value */ + UWord pseudo_deleted : 1; /* delete marked in fixed table */ + /* Note: 'pseudo_deleted' could be bool if Windows compiler would + * pack it into same word as 'hvalue'. */ + DbTerm dbterm; /* The actual term */ } HashDbTerm; @@ -81,9 +77,9 @@ typedef struct db_table_hash { struct segment* first_segtab[1]; /* SMP: nslots and nsegs are protected by is_resizing or table write lock */ - int nlocks; /* Needs to be smaller or equal to nactive */ - int nslots; /* Total number of slots */ - int nsegs; /* Size of segment table */ + UWord nlocks; /* Needs to be smaller or equal to nactive */ + UWord nslots; /* Total number of slots */ + UWord nsegs; /* Size of segment table */ /* List of slots where elements have been deleted while table was fixed */ erts_atomic_t fixdel; /* (FixedDeletion*) */ @@ -119,7 +115,7 @@ Uint db_kept_items_hash(DbTableHash *tb); int db_create_hash(Process *p, DbTable *tbl /* [in out] */); -int db_put_hash(DbTable *tbl, Eterm obj, int key_clash_fail, SWord* consumed_reds_p); +int db_put_hash(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord* consumed_reds_p); int db_get_hash(Process *p, DbTable *tbl, Eterm key, Eterm *ret); @@ -131,7 +127,7 @@ typedef struct { float std_dev_expected; int max_chain_len; int min_chain_len; - int kept_items; + UWord kept_items; }DbHashStats; void db_calc_stats_hash(DbTableHash* tb, DbHashStats*); diff --git a/erts/emulator/beam/erl_db_tree.c b/erts/emulator/beam/erl_db_tree.c index 040e6b0cfb94..9714851ca695 100644 --- a/erts/emulator/beam/erl_db_tree.c +++ b/erts/emulator/beam/erl_db_tree.c @@ -150,7 +150,7 @@ static ERTS_INLINE TreeDbTerm* new_dbterm(DbTableCommon *tb, Eterm obj) return p; } -static ERTS_INLINE TreeDbTerm* new_dbterm_no_tab(int compress, int keypos, Eterm obj) +static ERTS_INLINE TreeDbTerm* new_dbterm_no_tab(bool compress, int keypos, Eterm obj) { TreeDbTerm* p; if (compress) { @@ -282,7 +282,7 @@ struct select_delete_context { Uint accum; Binary *mp; Eterm end_condition; - int erase_lastterm; + bool erase_lastterm; TreeDbTerm *lastterm; Sint32 max; int keypos; @@ -303,9 +303,6 @@ struct select_replace_context { Sint replaced; }; -/* Used by select_replace on analyze_pattern */ -typedef int (*extra_match_validator_t)(int keypos, Eterm match, Eterm guard, Eterm body); - /* ** Forward declarations */ @@ -320,7 +317,7 @@ int tree_balance_right(TreeDbTerm **this); static int delsub(TreeDbTerm **this); static TreeDbTerm *slot_search(Process *p, TreeDbTerm *root, Sint slot, DbTable *tb, DbTableTree *stack_container, - CATreeRootIterator *iter, int* is_EOT); + CATreeRootIterator *iter, bool* is_EOT); static TreeDbTerm *find_node(DbTableCommon *tb, TreeDbTerm *root, Eterm key, DbTableTree *stack_container); static TreeDbTerm **find_node2(DbTableCommon *tb, TreeDbTerm **root, Eterm key); @@ -364,8 +361,11 @@ static enum ms_key_boundness key_boundness(DbTableCommon *tb, Eterm pattern, Eterm *keyp); static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done); +/* Used by select_replace on analyze_pattern */ +typedef bool ExtraMatchValidatorFn(int keypos, Eterm match, Eterm guard, Eterm body); + static int analyze_pattern(DbTableCommon *tb, Eterm pattern, - extra_match_validator_t extra_validator, /* Optional callback */ + ExtraMatchValidatorFn*, /* Optional callback */ struct mp_info *mpi); static int doit_select(DbTableCommon *tb, TreeDbTerm *this, @@ -418,7 +418,7 @@ static int db_prev_tree(Process *p, DbTable *tbl, static int db_prev_lookup_tree(Process *p, DbTable *tbl, Eterm key, Eterm *ret); -static int db_put_tree(DbTable *tbl, Eterm obj, int key_clash_fail, SWord *consumed_reds_p); +static int db_put_tree(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord *consumed_reds_p); static int db_get_tree(Process *p, DbTable *tbl, Eterm key, Eterm *ret); static int db_member_tree(DbTable *tbl, Eterm key, Eterm *ret); @@ -457,7 +457,7 @@ static int db_select_replace_continue_tree(Process *p, DbTable *tbl, enum DbIterSafety*); static int db_take_tree(Process *, DbTable *, Eterm, Eterm *); static void db_print_tree(fmtfn_t to, void *to_arg, - int show, DbTable *tbl); + bool show, DbTable *tbl); static int db_free_empty_table_tree(DbTable *tbl); static SWord db_free_table_continue_tree(DbTable *tbl, SWord); @@ -475,7 +475,7 @@ static Eterm db_delete_all_objects_get_nitems_from_holder_tree(Process* p, #ifdef HARDDEBUG static void db_check_table_tree(DbTable *tbl); #endif -static int +static bool db_lookup_dbterm_tree(Process *, DbTable *, Eterm key, Eterm obj, DbUpdateHandle*); static void @@ -483,7 +483,7 @@ db_finalize_dbterm_tree(int cret, DbUpdateHandle *); static int db_get_binary_info_tree(Process*, DbTable*, Eterm key, Eterm *ret); static int db_put_dbterm_tree(DbTable* tbl, /* [in out] */ void* obj, - int key_clash_fail, + bool key_clash_fail, SWord *consumed_reds_p); /* @@ -765,7 +765,7 @@ static ERTS_INLINE int cmp_key_eq(DbTableCommon* tb, Eterm key, TreeDbTerm* obj) int db_put_dbterm_tree_common(DbTableCommon *tb, TreeDbTerm **root, TreeDbTerm *value_to_insert, - int key_clash_fail, + bool key_clash_fail, DbTableTree *stack_container) { /* Non recursive insertion in AVL tree, building our own stack */ @@ -886,7 +886,7 @@ int db_put_dbterm_tree_common(DbTableCommon *tb, static int db_put_dbterm_tree(DbTable* tbl, /* [in out] */ void* obj, - int key_clash_fail, /* DB_ERROR_BADKEY if key exists */ + bool key_clash_fail, /* DB_ERROR_BADKEY if key exists */ SWord *consumed_reds_p) { DbTableTree *tb = &tbl->tree; @@ -894,7 +894,7 @@ static int db_put_dbterm_tree(DbTable* tbl, /* [in out] */ } int db_put_tree_common(DbTableCommon *tb, TreeDbTerm **root, Eterm obj, - int key_clash_fail, DbTableTree *stack_container) + bool key_clash_fail, DbTableTree *stack_container) { /* Non recursive insertion in AVL tree, building our own stack */ TreeDbTerm **tstack[STACK_NEED]; @@ -1007,7 +1007,7 @@ int db_put_tree_common(DbTableCommon *tb, TreeDbTerm **root, Eterm obj, return DB_ERROR_NONE; } -static int db_put_tree(DbTable *tbl, Eterm obj, int key_clash_fail, +static int db_put_tree(DbTable *tbl, Eterm obj, bool key_clash_fail, SWord *consumed_reds_p) { DbTableTree *tb = &tbl->tree; @@ -1143,7 +1143,7 @@ int db_slot_tree_common(Process *p, DbTable *tbl, TreeDbTerm *root, TreeDbTerm *st; Eterm *hp, *hend; Eterm copy; - int is_EOT = 0; + bool is_EOT = false; /* * The notion of a "slot" is not natural in a tree, but we try to * simulate it by giving the n'th node in the tree instead. @@ -2016,7 +2016,7 @@ int db_select_delete_continue_tree_common(Process *p, lastkey = tptr[2]; end_condition = tptr[3]; - sc.erase_lastterm = 0; /* Before first RET_TO_BIF */ + sc.erase_lastterm = false; /* Before first RET_TO_BIF */ sc.lastterm = NULL; mp = erts_db_get_match_prog_binary_unchecked(tptr[4]); @@ -2124,7 +2124,7 @@ int db_select_delete_tree_common(Process *p, DbTable *tbl, mpi.mp = NULL; sc.accum = 0; - sc.erase_lastterm = 0; + sc.erase_lastterm = false; sc.lastterm = NULL; sc.p = p; sc.max = 1000; @@ -2510,7 +2510,7 @@ void db_print_tree_common(fmtfn_t to, void *to_arg, /* Display tree contents (for dump) */ static void db_print_tree(fmtfn_t to, void *to_arg, - int show, + bool show, DbTable *tbl) { DbTableTree *tb = &tbl->tree; @@ -2752,7 +2752,7 @@ static TreeDbTerm *linkout_object_tree(DbTableCommon *tb, TreeDbTerm **root, ** part of the tree should be searched. Also compiles the match program */ static int analyze_pattern(DbTableCommon *tb, Eterm pattern, - extra_match_validator_t extra_validator, /* Optional callback */ + ExtraMatchValidatorFn *extra_validator, /* Optional callback */ struct mp_info *mpi) { Eterm lst, tpl, ttpl; @@ -3034,7 +3034,7 @@ static TreeDbTerm *slot_search(Process *p, TreeDbTerm *root, Sint slot, DbTable *tb, DbTableTree *stack_container, CATreeRootIterator *iter, - int* is_EOT) + bool* is_EOT) { TreeDbTerm *this; TreeDbTerm *tmp; @@ -3128,7 +3128,7 @@ static TreeDbTerm *slot_search(Process *p, TreeDbTerm *root, next_root: if (!iter) { if (stack->slot == (slot-1)) { - *is_EOT = 1; + *is_EOT = true; } break; /* EOT */ } @@ -3141,7 +3141,7 @@ static TreeDbTerm *slot_search(Process *p, TreeDbTerm *root, pp = catree_find_next_root(iter, &lastkey); if (!pp) { if (stack->slot == (slot-1)) { - *is_EOT = 1; + *is_EOT = true; } break; /* EOT */ } @@ -3484,7 +3484,7 @@ static TreeDbTerm **find_ptr(DbTableCommon *tb, TreeDbTerm **root, return NULL; } -int db_lookup_dbterm_tree_common(Process *p, DbTable *tbl, TreeDbTerm **root, +bool db_lookup_dbterm_tree_common(Process *p, DbTable *tbl, TreeDbTerm **root, Eterm key, Eterm obj, DbUpdateHandle* handle, DbTableTree *stack_container) { @@ -3527,7 +3527,7 @@ int db_lookup_dbterm_tree_common(Process *p, DbTable *tbl, TreeDbTerm **root, return 1; } -static int +static bool db_lookup_dbterm_tree(Process *p, DbTable *tbl, Eterm key, Eterm obj, DbUpdateHandle* handle) { @@ -3603,7 +3603,7 @@ Eterm db_binary_info_tree_common(Process* p, TreeDbTerm* this) } -void* db_eterm_to_dbterm_tree_common(int compress, int keypos, Eterm obj) +void* db_eterm_to_dbterm_tree_common(bool compress, int keypos, Eterm obj) { TreeDbTerm* term = new_dbterm_no_tab(compress, keypos, obj); term->left = NULL; @@ -3635,7 +3635,7 @@ void* db_dbterm_list_remove_first_tree_common(void **list) * Frees a TreeDbTerm without updating the memory footprint of the * table. */ -void db_free_dbterm_tree_common(int compressed, void* obj) +void db_free_dbterm_tree_common(bool compressed, void* obj) { TreeDbTerm* p = obj; db_free_term_no_tab(compressed, p, offsetof(TreeDbTerm, dbterm)); @@ -3902,6 +3902,7 @@ static Sint do_cmp_partly_bound(Eterm a, Eterm b, int *done) return 0; } /* Drop through */ + ERTS_FALLTHROUGH(); default: return CMP(a,b); } @@ -4220,7 +4221,7 @@ static int doit_select_delete(DbTableCommon *tb, TreeDbTerm *this, if (sc->erase_lastterm) free_term((DbTable*)tb, sc->lastterm); - sc->erase_lastterm = 0; + sc->erase_lastterm = false; sc->lastterm = this; if (sc->end_condition != NIL && @@ -4231,7 +4232,7 @@ static int doit_select_delete(DbTableCommon *tb, TreeDbTerm *this, if (ret == am_true) { key = GETKEY(sc->tb, this->dbterm.tpl); linkout_tree(sc->tb, sc->common.root, key, sc->stack); - sc->erase_lastterm = 1; + sc->erase_lastterm = true; ++sc->accum; } if (--(sc->max) <= 0) { diff --git a/erts/emulator/beam/erl_db_tree_util.h b/erts/emulator/beam/erl_db_tree_util.h index 4cb238298fd6..8b2dd8e6f978 100644 --- a/erts/emulator/beam/erl_db_tree_util.h +++ b/erts/emulator/beam/erl_db_tree_util.h @@ -99,7 +99,7 @@ int db_prev_tree_common(Process *p, DbTable *tbl, TreeDbTerm *root, Eterm key, Eterm *ret, DbTreeStack* stack, Eterm (*func)(Process *, DbTable *, TreeDbTerm *)); int db_put_tree_common(DbTableCommon *tb, TreeDbTerm **root, Eterm obj, - int key_clash_fail, DbTableTree *stack_container); + bool key_clash_fail, DbTableTree *stack_container); int db_get_tree_common(Process *p, DbTableCommon *tb, TreeDbTerm *root, Eterm key, Eterm *ret, DbTableTree *stack_container); int db_get_element_tree_common(Process *p, DbTableCommon *tb, TreeDbTerm *root, Eterm key, @@ -168,19 +168,19 @@ void db_print_tree_common(fmtfn_t to, void *to_arg, void db_foreach_offheap_tree_common(TreeDbTerm *root, void (*func)(ErlOffHeap *, void *), void * arg); -int db_lookup_dbterm_tree_common(Process *p, DbTable *tbl, TreeDbTerm **root, +bool db_lookup_dbterm_tree_common(Process *p, DbTable *tbl, TreeDbTerm **root, Eterm key, Eterm obj, DbUpdateHandle* handle, DbTableTree *stack_container); void db_finalize_dbterm_tree_common(int cret, DbUpdateHandle *handle, TreeDbTerm **root, DbTableTree *stack_container); -void* db_eterm_to_dbterm_tree_common(int compress, int keypos, Eterm obj); +void* db_eterm_to_dbterm_tree_common(bool compress, int keypos, Eterm obj); void* db_dbterm_list_append_tree_common(void* last_term, void* db_term); void* db_dbterm_list_remove_first_tree_common(void **list); int db_put_dbterm_tree_common(DbTableCommon *tb, TreeDbTerm **root, TreeDbTerm *value_to_insert, - int key_clash_fail, DbTableTree *stack_container); -void db_free_dbterm_tree_common(int compressed, void* obj); + bool key_clash_fail, DbTableTree *stack_container); +void db_free_dbterm_tree_common(bool compressed, void* obj); Eterm db_get_dbterm_key_tree_common(DbTable* tb, void* db_term); Sint cmp_partly_bound(Eterm partly_bound_key, Eterm bound_key); diff --git a/erts/emulator/beam/erl_db_util.c b/erts/emulator/beam/erl_db_util.c index cf5e96f22105..0d7c9d420c89 100644 --- a/erts/emulator/beam/erl_db_util.c +++ b/erts/emulator/beam/erl_db_util.c @@ -368,8 +368,8 @@ DMC_DECLARE_STACK_TYPE(unsigned); */ typedef struct DMCVariable { - int is_bound; - int is_in_body; + bool is_bound; + bool is_in_body; } DMCVariable; typedef struct DMCHeap { @@ -404,8 +404,8 @@ typedef struct dmc_context { int num_match; int current_match; Uint cflags; - int is_guard; /* 1 if in guard, 0 if in body */ - int special; /* 1 if the head in the match was a single expression */ + bool is_guard; /* true if in guard, false if in body */ + bool special; /* true if the head in the match was a single expression */ DMCErrInfo *err_info; char *stack_limit; Uint freason; @@ -449,7 +449,7 @@ typedef struct { static erts_tsd_key_t match_pseudo_process_key; static ERTS_INLINE void -cleanup_match_pseudo_process(ErtsMatchPseudoProcess *mpsp, int keep_heap) +cleanup_match_pseudo_process(ErtsMatchPseudoProcess *mpsp, bool keep_heap) { if (mpsp->process.mbuf || mpsp->process.off_heap.first) { erts_cleanup_empty_process(&mpsp->process); @@ -505,7 +505,7 @@ get_match_pseudo_process(Process *c_p, Uint heap_size) if (mpsp) { ASSERT(mpsp == erts_tsd_get(match_pseudo_process_key)); ASSERT(mpsp->process.scheduler_data == esdp); - cleanup_match_pseudo_process(mpsp, 0); + cleanup_match_pseudo_process(mpsp, false); } else { ASSERT(erts_tsd_get(match_pseudo_process_key) == NULL); @@ -531,7 +531,7 @@ destroy_match_pseudo_process(void) ErtsMatchPseudoProcess *mpsp; mpsp = (ErtsMatchPseudoProcess *)erts_tsd_get(match_pseudo_process_key); if (mpsp) { - cleanup_match_pseudo_process(mpsp, 0); + cleanup_match_pseudo_process(mpsp, false); erts_free(ERTS_ALC_T_DB_MS_PSDO_PROC, (void *) mpsp); erts_tsd_set(match_pseudo_process_key, (void *) NULL); } @@ -987,8 +987,8 @@ static Eterm dmc_lookup_bif_reversed(void *f); static int cmp_uint(void *a, void *b); static int cmp_guard_bif(void *a, void *b); static int match_compact(ErlHeapFragment *expr, DMCErrInfo *err_info); -static Uint my_size_object(Eterm t, int is_hashmap_node); -static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, int); +static Uint my_size_object(Eterm t, bool is_hashmap_node); +static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, bool); /* Guard subroutines */ static void @@ -996,7 +996,7 @@ dmc_rearrange_constants(DMCContext *context, DMC_STACK_TYPE(UWord) *text, int textpos, Eterm *p, Uint nelems); static DMCRet dmc_array(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, - Eterm *p, Uint nelems, int *constant); + Eterm *p, Uint nelems, bool *constant); /* Guard compilation */ static void do_emit_constant(DMCContext *context, DMC_STACK_TYPE(UWord) *text, Eterm t); @@ -1004,30 +1004,30 @@ static DMCRet dmc_list(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant); + bool *constant); static DMCRet dmc_tuple(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant); + bool *constant); static DMCRet dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, - Eterm t, int *constant); + Eterm t, bool *constant); static DMCRet dmc_variable(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant); + bool *constant); static DMCRet dmc_fun(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant); + bool *constant); static DMCRet dmc_expr(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant); + bool *constant); static DMCRet compile_guard_expr(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, @@ -1056,7 +1056,7 @@ static void vadd_dmc_err(DMCErrInfo*, DMCErrorSeverity, int var, const char *str static Eterm dpm_array_to_list(Process *psp, Eterm *arr, int arity); -static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace); +static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, bool trace); static Eterm seq_trace_fake(Process *p, Eterm arg1); @@ -1306,7 +1306,7 @@ Binary *db_match_set_compile(Process *p, Eterm matchexpr, * Returns true if 'b' is guaranteed to always construct * the same term as 'a' has matched. */ -static int db_match_eq_body(Eterm a, Eterm b, int const_mode) +static bool db_match_eq_body(Eterm a, Eterm b, bool const_mode) { DECLARE_ESTACK(s); Uint arity; @@ -1317,7 +1317,7 @@ static int db_match_eq_body(Eterm a, Eterm b, int const_mode) switch(b & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_LIST: if (!is_list(a)) - return 0; + return false; ESTACK_PUSH2(s, CDR(list_val(a)), CDR(list_val(b))); a = CAR(list_val(a)); b = CAR(list_val(b)); @@ -1332,20 +1332,20 @@ static int db_match_eq_body(Eterm a, Eterm b, int const_mode) } else if (bp[0] == make_arityval(2) && bp[1] == am_const) { ESTACK_PUSH(s, CONST_MODE_OFF); - const_mode = 1; /* {const, term()} syntax */ + const_mode = true; /* {const, term()} syntax */ b = bp[2]; continue; /* loop without pop */ } else - return 0; /* function call or invalid tuple syntax */ + return false; /* function call or invalid tuple syntax */ } if (!is_tuple(a)) - return 0; + return false; ap = tuple_val(a); bp = tuple_val(b); if (ap[0] != bp[0]) - return 0; + return false; arity = arityval(ap[0]); if (arity > 0) { a = *(++ap); @@ -1358,10 +1358,10 @@ static int db_match_eq_body(Eterm a, Eterm b, int const_mode) } else if (is_map(b)) { /* We don't know what other pairs the matched map may contain */ - return 0; + return false; } else if (!eq(a,b)) /* other boxed */ - return 0; + return false; break; case TAG_PRIMARY_IMMED1: @@ -1369,7 +1369,7 @@ static int db_match_eq_body(Eterm a, Eterm b, int const_mode) || a == am_DollarUnderscore || (const_mode && db_is_variable(a) >= 0)) { - return 0; + return false; } break; default: @@ -1384,18 +1384,18 @@ static int db_match_eq_body(Eterm a, Eterm b, int const_mode) b = ESTACK_POP(s); if (b == CONST_MODE_OFF) { ASSERT(const_mode); - const_mode = 0; + const_mode = false; goto pop_next; } a = ESTACK_POP(s); } DESTROY_ESTACK(s); - return 1; + return true; } /* This is used by select_replace */ -int db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body) +bool db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body) { Eterm match_key; Eterm* body_list; @@ -1404,7 +1404,7 @@ int db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body) Eterm single_body_subterm; Eterm single_body_subterm_key; Eterm* single_body_subterm_key_tpl; - int const_mode; + bool const_mode; if (!is_list(body)) { return 0; @@ -1436,12 +1436,12 @@ int db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body) single_body_term_tpl[1] == am_const) { /* {const, {"ets-tuple constant"}} */ single_body_subterm = single_body_term_tpl[2]; - const_mode = 1; + const_mode = true; } else if (*single_body_term_tpl == make_arityval(1)) { /* {{"ets-tuple construction"}} */ single_body_subterm = single_body_term_tpl[1]; - const_mode = 0; + const_mode = false; } else { /* not a tuple construction */ @@ -1694,7 +1694,7 @@ Binary *db_match_compile(Eterm *matchexpr, Eterm t; Uint i; Uint num_iters; - int structure_checked; + bool structure_checked; DMCRet res; int current_try_label; Binary *bp = NULL; @@ -1730,7 +1730,7 @@ Binary *db_match_compile(Eterm *matchexpr, sys_memset(heap.vars, 0, heap.size * sizeof(*heap.vars)); t = context.matchexpr[context.current_match]; context.stack_used = 0; - structure_checked = 0; + structure_checked = false; if (context.current_match < num_progs - 1) { DMC_PUSH(text,matchTryMeElse); current_try_label = DMC_STACK_NUM(text); @@ -1748,7 +1748,7 @@ Binary *db_match_compile(Eterm *matchexpr, if (!structure_checked) { DMC_PUSH2(text, matchMap, num_iters); } - structure_checked = 0; + structure_checked = false; for (i = 0; i < num_iters; ++i) { Eterm key = flatmap_get_keys(flatmap_val(t))[i]; if (db_is_variable(key) >= 0) { @@ -1796,7 +1796,7 @@ Binary *db_match_compile(Eterm *matchexpr, if (!structure_checked) { DMC_PUSH2(text, matchMap, num_iters); } - structure_checked = 0; + structure_checked = false; hashmap_iterator_init(&wstack, t, 0); @@ -1852,7 +1852,7 @@ Binary *db_match_compile(Eterm *matchexpr, pop it */ DMC_PUSH2(text, matchTuple, num_iters); } - structure_checked = 0; + structure_checked = false; for (i = 1; i <= num_iters; ++i) { if ((res = dmc_one_term(&context, &heap, @@ -1872,7 +1872,7 @@ Binary *db_match_compile(Eterm *matchexpr, if (!structure_checked) { DMC_PUSH(text, matchList); } - structure_checked = 0; /* Whatever it is, we did + structure_checked = false; /* Whatever it is, we did not pop it */ if ((res = dmc_one_term(&context, &heap, &stack, &text, CAR(list_val(t)))) @@ -1887,7 +1887,7 @@ Binary *db_match_compile(Eterm *matchexpr, single terms as match expressions */ simple_term: - structure_checked = 0; + structure_checked = false; if ((res = dmc_one_term(&context, &heap, &stack, &text, t)) != retOk) { @@ -1912,10 +1912,10 @@ Binary *db_match_compile(Eterm *matchexpr, break; } else { DMC_PUSH(text, matchPop); - structure_checked = 1; /* - * Checked with matchPushT - * or matchPushL - */ + structure_checked = true; /* + * Checked with matchPushT + * or matchPushL + */ --(context.stack_used); } } @@ -1959,14 +1959,14 @@ Binary *db_match_compile(Eterm *matchexpr, /* ** ... and the guards */ - context.is_guard = 1; + context.is_guard = true; if (compile_guard_expr (&context, &heap, &text, context.guardexpr[context.current_match]) != retOk) goto error; - context.is_guard = 0; + context.is_guard = false; if ((context.cflags & DCOMP_TABLE) && !is_list(context.bodyexpr[context.current_match])) { if (context.err_info) { @@ -3068,7 +3068,7 @@ Eterm db_prog_match(Process *c_p, lets restart, with the next match program */ pc = (prog->text) + fail_label; - cleanup_match_pseudo_process(mpsp, 1); + cleanup_match_pseudo_process(mpsp, true); goto restart; } ret = THE_NON_VALUE; @@ -3366,7 +3366,7 @@ Uint db_term_size(DbTable *tb, void* basep, Uint offset) } } -void db_free_term_no_tab(int compress, void* basep, Uint offset) +void db_free_term_no_tab(bool compress, void* basep, Uint offset) { DbTerm* db = (DbTerm*) ((byte*)basep + offset); Uint size; @@ -3804,11 +3804,6 @@ void db_cleanup_offheap_comp(DbTerm* obj) case BIN_REF_SUBTAG: erts_bin_release(u.br->val); break; - case FUN_REF_SUBTAG: - if (erts_refc_dectest(&(u.fref->entry)->refc, 0) == 0) { - erts_erase_fun_entry(u.fref->entry); - } - break; case REF_SUBTAG: ASSERT(is_magic_ref_thing(u.hdr)); erts_bin_release((Binary *)u.mref->mb); @@ -3828,13 +3823,13 @@ void db_cleanup_offheap_comp(DbTerm* obj) #endif } -int db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b) +bool db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b) { ErlOffHeap tmp_offheap; Eterm* allocp; Eterm* hp; Eterm tmp_b; - int is_eq; + bool is_eq; ASSERT(tb->compress); hp = allocp = erts_alloc(ERTS_ALC_T_TMP, b->size*sizeof(Eterm)); @@ -3854,13 +3849,13 @@ int db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b) int db_is_variable(Eterm obj) { - byte *b; + const byte *b; int n; int N; if (is_not_atom(obj)) return -1; - b = atom_tab(atom_val(obj))->name; + b = erts_atom_get_name(atom_tab(atom_val(obj))); if ((n = atom_tab(atom_val(obj))->len) < 2) return -1; if (*b++ != '$') @@ -3918,7 +3913,7 @@ int db_has_map(Eterm node) { } /* Check if obj is fully bound (contains no variables, underscores, or maps) */ -int db_is_fully_bound(Eterm node) { +bool db_is_fully_bound(Eterm node) { DECLARE_ESTACK(s); ESTACK_PUSH(s,node); @@ -3944,19 +3939,19 @@ int db_is_fully_bound(Eterm node) { * map that has the given elements, so they must be considered * variable. */ DESTROY_ESTACK(s); - return 0; + return false; } break; case TAG_PRIMARY_IMMED1: if (node == am_Underscore || db_is_variable(node) >= 0) { DESTROY_ESTACK(s); - return 0; + return false; } break; } } DESTROY_ESTACK(s); - return 1; + return true; } /* @@ -4074,7 +4069,7 @@ static DMCRet dmc_one_term(DMCContext *context, if (n >= heap->vars_used) heap->vars_used = n + 1; DMC_PUSH2(*text, matchBind, n); - heap->vars[n].is_bound = 1; + heap->vars[n].is_bound = true; } } else if (c == am_Underscore) { DMC_PUSH(*text, matchSkip); @@ -4180,11 +4175,11 @@ static void do_emit_constant(DMCContext *context, DMC_STACK_TYPE(UWord) *text, if (is_immed(t)) { tmp = t; } else { - sz = my_size_object(t, 0); + sz = my_size_object(t, false); if (sz) { emb = new_message_buffer(sz); hp = emb->mem; - tmp = my_copy_struct(t,&hp,&(emb->off_heap), 0); + tmp = my_copy_struct(t,&hp,&(emb->off_heap), false); emb->next = context->save; context->save = emb; } @@ -4229,10 +4224,10 @@ static DMCRet dmc_list(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { - int c1; - int c2; + bool c1; + bool c2; int ret; if ((ret = dmc_expr(context, heap, text, CAR(list_val(t)), &c1)) != retOk) @@ -4242,10 +4237,10 @@ static DMCRet dmc_list(DMCContext *context, return ret; if (c1 && c2) { - *constant = 1; + *constant = true; return retOk; } - *constant = 0; + *constant = false; if (!c1) { /* The CAR is not a constant, so if the CDR is, we just push it, otherwise it is already pushed. */ @@ -4282,9 +4277,9 @@ dmc_rearrange_constants(DMCContext *context, DMC_STACK_TYPE(UWord) *text, static DMCRet dmc_array(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, - Eterm *p, Uint nelems, int *constant) + Eterm *p, Uint nelems, bool *constant) { - int all_constant = 1; + bool all_constant = true; int textpos = DMC_STACK_NUM(*text); int preventive_bumps = 0; Uint i; @@ -4297,14 +4292,14 @@ dmc_array(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, */ for (i = nelems; i--;) { DMCRet ret; - int c; + bool c; ret = dmc_expr(context, heap, text, p[i], &c); if (ret != retOk) { return ret; } if (!c && all_constant) { - all_constant = 0; + all_constant = false; if (i < nelems - 1) { /* Revert preventive stack bumps as they will now be done again * for real by do_emit_constant() */ @@ -4341,9 +4336,9 @@ dmc_array(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, static DMCRet dmc_tuple(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, - Eterm t, int *constant) + Eterm t, bool *constant) { - int all_constant; + bool all_constant; Eterm *p = tuple_val(t); Uint nelems = arityval(*p); DMCRet ret; @@ -4353,12 +4348,12 @@ dmc_tuple(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, return ret; } if (all_constant) { - *constant = 1; + *constant = true; return retOk; } DMC_PUSH2(*text, matchMkTuple, nelems); context->stack_used -= (nelems - 1); - *constant = 0; + *constant = false; return retOk; } @@ -4368,12 +4363,12 @@ dmc_tuple(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, */ static DMCRet dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, - Eterm t, int *constant) + Eterm t, bool *constant) { int nelems; DMCRet ret; if (is_flatmap(t)) { - int constant_values, constant_keys; + bool constant_values, constant_keys; flatmap_t *m = (flatmap_t *)flatmap_val(t); Eterm *values = flatmap_get_values(m); int textpos = DMC_STACK_NUM(*text); @@ -4401,7 +4396,7 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, } if (constant_values && constant_keys) { - *constant = 1; + *constant = true; return retOk; } @@ -4420,13 +4415,13 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, DMC_PUSH2(*text, matchMkFlatMap, nelems); context->stack_used -= (nelems + 1) - 1; /* n values + 1 key-tuple - 1 map ptr => 1 map */ - *constant = 0; + *constant = false; return retOk; } else { DECLARE_WSTACK(wstack); DMC_STACK_TYPE(UWord) instr_save; Eterm *kv; - int c = 0; + bool c = false; int textpos = DMC_STACK_NUM(*text); int preventive_bumps = 0; @@ -4467,7 +4462,7 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, encountering any variables */ if (c) { ASSERT(DMC_STACK_NUM(*text) == textpos); - *constant = 1; + *constant = true; DESTROY_WSTACK(wstack); return retOk; } @@ -4550,7 +4545,7 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, DMC_PUSH2(*text, matchMkHashMap, nelems); context->stack_used -= 2*nelems - 1; /* n keys & values => 1 map */ DESTROY_WSTACK(wstack); - *constant = 0; + *constant = false; return retOk; } } @@ -4559,7 +4554,7 @@ static DMCRet dmc_whole_expression(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { if (context->cflags & DCOMP_TRACE) { /* Hmmm, convert array to list... */ @@ -4576,7 +4571,7 @@ static DMCRet dmc_whole_expression(DMCContext *context, ++context->stack_used; if (context->stack_used > context->stack_need) context->stack_need = context->stack_used; - *constant = 0; + *constant = false; return retOk; } @@ -4592,7 +4587,7 @@ static void dmc_add_pushv_variant(DMCContext *context, DMCHeap *heap, if (!context->is_guard) { if(!v->is_in_body) { instr = matchPushVResult; - v->is_in_body = 1; + v->is_in_body = true; } } DMC_PUSH(*text, instr); @@ -4603,7 +4598,7 @@ static DMCRet dmc_variable(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Uint n = db_is_variable(t); @@ -4616,7 +4611,7 @@ static DMCRet dmc_variable(DMCContext *context, ++context->stack_used; if (context->stack_used > context->stack_need) context->stack_need = context->stack_used; - *constant = 0; + *constant = false; return retOk; } @@ -4624,7 +4619,7 @@ static DMCRet dmc_all_bindings(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { int i; @@ -4639,7 +4634,7 @@ static DMCRet dmc_all_bindings(DMCContext *context, ++context->stack_used; if ((context->stack_used + 1) > context->stack_need) context->stack_need = (context->stack_used + 1); - *constant = 0; + *constant = false; return retOk; } @@ -4647,13 +4642,13 @@ static DMCRet dmc_const(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { if (tuple_val(t)[0] != make_arityval(2)) { RETURN_TERM_ERROR("Special form 'const' called with more than one " "argument in %T.", t, context, *constant); } - *constant = 1; + *constant = true; return retOk; } @@ -4661,19 +4656,19 @@ static DMCRet dmc_and(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; int i; - int c; + bool c; if (a < 2) { RETURN_TERM_ERROR("Special form 'and' called without arguments " "in %T.", t, context, *constant); } - *constant = 0; + *constant = false; for (i = a; i > 1; --i) { if ((ret = dmc_expr(context, heap, text, p[i], &c)) != retOk) return ret; @@ -4690,19 +4685,19 @@ static DMCRet dmc_or(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; int i; - int c; + bool c; if (a < 2) { RETURN_TERM_ERROR("Special form 'or' called without arguments " "in %T.", t, context, *constant); } - *constant = 0; + *constant = false; for (i = a; i > 1; --i) { if ((ret = dmc_expr(context, heap, text, p[i], &c)) != retOk) return ret; @@ -4720,13 +4715,13 @@ static DMCRet dmc_andalso(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; int i; - int c; + bool c; Uint lbl; Uint lbl_next; Uint lbl_val; @@ -4736,7 +4731,7 @@ static DMCRet dmc_andalso(DMCContext *context, " arguments " "in %T.", t, context, *constant); } - *constant = 0; + *constant = false; lbl = 0; for (i = 2; i <= a; ++i) { if ((ret = dmc_expr(context, heap, text, p[i], &c)) != retOk) @@ -4769,13 +4764,13 @@ static DMCRet dmc_orelse(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; int i; - int c; + bool c; Uint lbl; Uint lbl_next; Uint lbl_val; @@ -4784,7 +4779,7 @@ static DMCRet dmc_orelse(DMCContext *context, RETURN_TERM_ERROR("Special form 'orelse' called without arguments " "in %T.", t, context, *constant); } - *constant = 0; + *constant = false; lbl = 0; for (i = 2; i <= a; ++i) { if ((ret = dmc_expr(context, heap, text, p[i], &c)) != retOk) @@ -4817,11 +4812,11 @@ static DMCRet dmc_message(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - int c; + bool c; if (!(context->cflags & DCOMP_TRACE)) { @@ -4840,7 +4835,7 @@ static DMCRet dmc_message(DMCContext *context, "number of arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[2], &c)) != retOk) { return ret; } @@ -4858,7 +4853,7 @@ static DMCRet dmc_self(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); @@ -4866,7 +4861,7 @@ static DMCRet dmc_self(DMCContext *context, RETURN_TERM_ERROR("Special form 'self' called with arguments " "in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchSelf); if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -4877,7 +4872,7 @@ static DMCRet dmc_return_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); @@ -4895,7 +4890,7 @@ static DMCRet dmc_return_trace(DMCContext *context, RETURN_TERM_ERROR("Special form 'return_trace' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchSetReturnTrace); /* Pushes 'true' on the stack */ if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -4906,7 +4901,7 @@ static DMCRet dmc_exception_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); @@ -4924,55 +4919,56 @@ static DMCRet dmc_exception_trace(DMCContext *context, RETURN_TERM_ERROR("Special form 'exception_trace' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchSetExceptionTrace); /* Pushes 'true' on the stack */ if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; return retOk; } -static int check_trace(const char* op, +static bool check_trace(const char* op, DMCContext *context, - int *constant, + bool *constant, int need_cflags, - int allow_in_guard, + bool allow_in_guard, DMCRet* retp) { if (!(context->cflags & DCOMP_TRACE)) { *retp = RETURN_ERROR_X(-1, context, *constant, "Special form '%s' " "used in wrong dialect.", op); - return 0; + return false; } if ((context->cflags & need_cflags) != need_cflags) { *retp = RETURN_ERROR_X(-1, context, *constant, "Special form '%s' " "not allow for this trace event.", op); - return 0; + return false; } if (context->is_guard && !allow_in_guard) { *retp = RETURN_ERROR_X(-1, context, *constant, "Special form '%s' " "called in guard context.", op); - return 0; + return false; } - return 1; + return true; } static DMCRet dmc_is_seq_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - if (!check_trace("is_seq_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, 1, &ret)) + if (!check_trace("is_seq_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, + true, &ret)) return ret; if (p[0] != make_arityval(1)) { RETURN_TERM_ERROR("Special form 'is_seq_trace' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchIsSeqTrace); /* Pushes 'true' or 'false' on the stack */ if (++context->stack_used > context->stack_need) @@ -4984,13 +4980,14 @@ static DMCRet dmc_set_seq_token(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - int c; + bool c; - if (!check_trace("set_seq_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("set_seq_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; if (p[0] != make_arityval(3)) { @@ -4998,7 +4995,7 @@ static DMCRet dmc_set_seq_token(DMCContext *context, "number of arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[3], &c)) != retOk) { return ret; } @@ -5024,12 +5021,13 @@ static DMCRet dmc_get_seq_token(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - if (!check_trace("get_seq_token", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("get_seq_token", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; if (p[0] != make_arityval(1)) { @@ -5038,7 +5036,7 @@ static DMCRet dmc_get_seq_token(DMCContext *context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchGetSeqToken); if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -5051,11 +5049,11 @@ static DMCRet dmc_display(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - int c; + bool c; if (!(context->cflags & DCOMP_TRACE)) { @@ -5074,7 +5072,7 @@ static DMCRet dmc_display(DMCContext *context, "number of arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[2], &c)) != retOk) { return ret; } @@ -5090,19 +5088,20 @@ static DMCRet dmc_process_dump(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - if (!check_trace("process_dump", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("process_dump", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; if (p[0] != make_arityval(1)) { RETURN_TERM_ERROR("Special form 'process_dump' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchProcessDump); /* Creates binary */ if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -5113,19 +5112,20 @@ static DMCRet dmc_enable_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; - int c; + bool c; - if (!check_trace("enable_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("enable_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; switch (a) { case 2: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[2], &c)) != retOk) { return ret; } @@ -5136,7 +5136,7 @@ static DMCRet dmc_enable_trace(DMCContext *context, /* Push as much as we remove, stack_need is untouched */ break; case 3: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[3], &c)) != retOk) { return ret; } @@ -5164,19 +5164,20 @@ static DMCRet dmc_disable_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; - int c; + bool c; - if (!check_trace("disable_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("disable_trace", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; switch (a) { case 2: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[2], &c)) != retOk) { return ret; } @@ -5187,7 +5188,7 @@ static DMCRet dmc_disable_trace(DMCContext *context, /* Push as much as we remove, stack_need is untouched */ break; case 3: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[3], &c)) != retOk) { return ret; } @@ -5215,19 +5216,20 @@ static DMCRet dmc_trace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); DMCRet ret; - int c; + bool c; - if (!check_trace("trace", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("trace", context, constant, DCOMP_ALLOW_TRACE_OPS, + false, &ret)) return ret; switch (a) { case 3: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[3], &c)) != retOk) { return ret; } @@ -5244,7 +5246,7 @@ static DMCRet dmc_trace(DMCContext *context, --context->stack_used; /* Remove two and add one */ break; case 4: - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[4], &c)) != retOk) { return ret; } @@ -5280,20 +5282,20 @@ static DMCRet dmc_caller(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; if (!check_trace("caller", context, constant, - (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), 0, &ret)) + (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), false, &ret)) return ret; if (p[0] != make_arityval(1)) { RETURN_TERM_ERROR("Special form 'caller' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchCaller); /* Creates binary */ if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -5304,20 +5306,20 @@ static DMCRet dmc_caller_line(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; if (!check_trace("caller_line", context, constant, - (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), 0, &ret)) + (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), false, &ret)) return ret; if (p[0] != make_arityval(1)) { RETURN_TERM_ERROR("Special form 'caller_line' called with " "arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; DMC_PUSH(*text, matchCallerLine); /* Creates binary */ if (++context->stack_used > context->stack_need) context->stack_need = context->stack_used; @@ -5328,7 +5330,7 @@ static DMCRet dmc_current_stacktrace(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { const Eterm *p = tuple_val(t); Uint a = arityval(*p); @@ -5336,17 +5338,17 @@ static DMCRet dmc_current_stacktrace(DMCContext *context, int depth; if (!check_trace("current_stacktrace", context, constant, - (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), 0, &ret)) + (DCOMP_CALL_TRACE|DCOMP_ALLOW_TRACE_OPS), false, &ret)) return ret; switch (a) { case 1: - *constant = 0; + *constant = false; do_emit_constant(context, text, make_small(erts_backtrace_depth)); DMC_PUSH(*text, matchCurrentStacktrace); break; case 2: - *constant = 0; + *constant = false; if (!is_small(p[2])) { RETURN_ERROR("Special form 'current_stacktrace' called with non " @@ -5379,13 +5381,13 @@ static DMCRet dmc_silent(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); DMCRet ret; - int c; + bool c; - if (!check_trace("silent", context, constant, DCOMP_ALLOW_TRACE_OPS, 0, &ret)) + if (!check_trace("silent", context, constant, DCOMP_ALLOW_TRACE_OPS, false, &ret)) return ret; if (p[0] != make_arityval(2)) { @@ -5393,7 +5395,7 @@ static DMCRet dmc_silent(DMCContext *context, "number of arguments in %T.", t, context, *constant); } - *constant = 0; + *constant = false; if ((ret = dmc_expr(context, heap, text, p[2], &c)) != retOk) { return ret; } @@ -5413,11 +5415,11 @@ static DMCRet dmc_fun(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { Eterm *p = tuple_val(t); Uint a = arityval(*p); - int c; + bool c; int i; DMCRet ret; DMCGuardBif *b; @@ -5509,7 +5511,7 @@ static DMCRet dmc_fun(DMCContext *context, } } - *constant = 0; + *constant = false; for (i = a; i > 1; --i) { if ((ret = dmc_expr(context, heap, text, p[i], &c)) != retOk) @@ -5545,7 +5547,7 @@ static DMCRet dmc_expr(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text, Eterm t, - int *constant) + bool *constant) { DMCRet ret; Eterm tmp; @@ -5606,7 +5608,7 @@ static DMCRet dmc_expr(DMCContext *context, /* Fall through */ default: simple_term: - *constant = 1; + *constant = true; } return retOk; } @@ -5618,7 +5620,7 @@ static DMCRet compile_guard_expr(DMCContext *context, Eterm l) { DMCRet ret; - int constant; + bool constant; Eterm t; if (l != NIL) { @@ -5629,7 +5631,7 @@ static DMCRet compile_guard_expr(DMCContext *context, DMC_PUSH(*text, matchCatch); } while (is_list(l)) { - constant = 0; + constant = false; t = CAR(list_val(l)); if ((ret = dmc_expr(context, heap, text, t, &constant)) != retOk) @@ -5787,14 +5789,14 @@ static int match_compact(ErlHeapFragment *expr, DMCErrInfo *err_info) /* ** Simple size object that takes care of function calls and constant tuples */ -static Uint my_size_object(Eterm t, int is_hashmap_node) +static Uint my_size_object(Eterm t, bool is_hashmap_node) { Uint sum = 0; Eterm *p; switch (t & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_LIST: - sum += 2 + my_size_object(CAR(list_val(t)), 0) + - my_size_object(CDR(list_val(t)), 0); + sum += 2 + my_size_object(CAR(list_val(t)), false) + + my_size_object(CDR(list_val(t)), false); break; case TAG_PRIMARY_BOXED: if (is_tuple(t)) { @@ -5819,7 +5821,7 @@ static Uint my_size_object(Eterm t, int is_hashmap_node) n = arityval(tpl[0]); sum += 1 + n; for (i = 1; i <= n; ++i) - sum += my_size_object(tpl[i], 0); + sum += my_size_object(tpl[i], false); break; } else if (is_map(t)) { if (is_flatmap(t)) { @@ -5832,7 +5834,7 @@ static Uint my_size_object(Eterm t, int is_hashmap_node) n = arityval(p[0]); sum += 1 + n; for (int i = 1; i <= n; ++i) - sum += my_size_object(p[i], 0); + sum += my_size_object(p[i], false); /* Calculate size of values */ p = (Eterm *)mp; @@ -5840,7 +5842,7 @@ static Uint my_size_object(Eterm t, int is_hashmap_node) sum += n + 3; p += 3; /* hdr + size + keys words */ while (n--) { - sum += my_size_object(*p++, 0); + sum += my_size_object(*p++, false); } } else { Eterm *head = (Eterm *)hashmap_val(t); @@ -5852,7 +5854,7 @@ static Uint my_size_object(Eterm t, int is_hashmap_node) head += 1 + header_arity(hdr); while(sz-- > 0) { - sum += my_size_object(head[sz], 1); + sum += my_size_object(head[sz], true); } } break; @@ -5866,15 +5868,15 @@ static Uint my_size_object(Eterm t, int is_hashmap_node) } static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, - int is_hashmap_node) + bool is_hashmap_node) { Eterm ret = NIL, a, b; Eterm *p; Uint sz; switch (t & _TAG_PRIMARY_MASK) { case TAG_PRIMARY_LIST: - a = my_copy_struct(CAR(list_val(t)), hp, off_heap, 0); - b = my_copy_struct(CDR(list_val(t)), hp, off_heap, 0); + a = my_copy_struct(CAR(list_val(t)), hp, off_heap, false); + b = my_copy_struct(CDR(list_val(t)), hp, off_heap, false); ret = CONS(*hp, a, b); *hp += 2; break; @@ -5910,7 +5912,7 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, *hp += n + 1; *savep++ = tpl[0]; for(i = 1; i <= n; ++i) - *savep++ = my_copy_struct(tpl[i], hp, off_heap, 0); + *savep++ = my_copy_struct(tpl[i], hp, off_heap, false); } } else if (is_map(t)) { @@ -5933,7 +5935,7 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, *hp += n + 1; *savep++ = make_arityval(n); for(i = 1; i <= n; ++i) - *savep++ = my_copy_struct(p[i], hp, off_heap, 0); + *savep++ = my_copy_struct(p[i], hp, off_heap, false); } savep = *hp; ret = make_flatmap(savep); @@ -5945,7 +5947,7 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, *savep++ = keys; p += 3; /* hdr + size + keys words */ for (i = 0; i < n; i++) - *savep++ = my_copy_struct(p[i], hp, off_heap, 0); + *savep++ = my_copy_struct(p[i], hp, off_heap, false); erts_usort_flatmap((flatmap_t*)flatmap_val(ret)); } else { Eterm *head = hashmap_val(t); @@ -5962,7 +5964,7 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap, *savep++ = *head++; /* map size */ for (int i = 0; i < sz; i++) { - *savep++ = my_copy_struct(head[i],hp,off_heap, 1); + *savep++ = my_copy_struct(head[i],hp,off_heap, true); } } } else { @@ -6004,12 +6006,12 @@ BIF_RETTYPE match_spec_test_3(BIF_ALIST_3) } else #endif if (BIF_ARG_3 == am_trace) { - res = match_spec_test(BIF_P, BIF_ARG_1, BIF_ARG_2, 1); + res = match_spec_test(BIF_P, BIF_ARG_1, BIF_ARG_2, true); if (is_value(res)) { BIF_RET(res); } } else if (BIF_ARG_3 == am_table) { - res = match_spec_test(BIF_P, BIF_ARG_1, BIF_ARG_2, 0); + res = match_spec_test(BIF_P, BIF_ARG_1, BIF_ARG_2, false); if (is_value(res)) { BIF_RET(res); } @@ -6017,7 +6019,7 @@ BIF_RETTYPE match_spec_test_3(BIF_ALIST_3) BIF_ERROR(BIF_P, BADARG); } -static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, int trace) +static Eterm match_spec_test(Process *p, Eterm against, Eterm spec, bool trace) { Eterm lint_res; Binary *mps; @@ -6186,7 +6188,7 @@ void db_match_dis(Binary *bp) UWord *t = prog->text; Uint n; Eterm p; - int first; + bool first; ErlHeapFragment *tmp; while (t < prog->prog_end) { @@ -6293,10 +6295,10 @@ void db_match_dis(Binary *bp) } erts_printf("EqRef\t(%d) {", (int) ERTS_REF_NUMBERS); - first = 1; + first = true; for (ri = 0; ri < ERTS_REF_NUMBERS; ++ri) { if (first) - first = 0; + first = false; else erts_printf(", "); #if defined(ARCH_64) @@ -6315,11 +6317,11 @@ void db_match_dis(Binary *bp) Eterm *et = (Eterm *) t; t += n+1; erts_printf("EqBig\t(%d) {", (int) n); - first = 1; + first = true; ++n; while (n--) { if (first) - first = 0; + first = false; else erts_printf(", "); #if defined(ARCH_64) @@ -6557,10 +6559,10 @@ void db_match_dis(Binary *bp) } } erts_printf("\n\nterm_save: {"); - first = 1; + first = true; for (tmp = prog->term_save; tmp; tmp = tmp->next) { if (first) - first = 0; + first = false; else erts_printf(", "); erts_printf("%p", tmp); diff --git a/erts/emulator/beam/erl_db_util.h b/erts/emulator/beam/erl_db_util.h index 339875973372..badc80b81caa 100644 --- a/erts/emulator/beam/erl_db_util.h +++ b/erts/emulator/beam/erl_db_util.h @@ -21,6 +21,7 @@ #ifndef _DB_UTIL_H #define _DB_UTIL_H +#include #include "erl_flxctr.h" #include "global.h" #include "erl_message.h" @@ -137,7 +138,7 @@ typedef struct db_table_method Eterm* ret); int (*db_put)(DbTable* tb, /* [in out] */ Eterm obj, - int key_clash_fail, /* DB_ERROR_BADKEY if key exists */ + bool key_clash_fail, /* DB_ERROR_BADKEY if key exists */ SWord *consumed_reds_p); int (*db_get)(Process* p, DbTable* tb, /* [in out] */ @@ -227,7 +228,7 @@ typedef struct db_table_method void (*db_print)(fmtfn_t to, void* to_arg, - int show, + bool show, DbTable* tb /* [in out] */ ); void (*db_foreach_offheap)(DbTable* db, /* [in out] */ @@ -235,21 +236,21 @@ typedef struct db_table_method void *arg); /* Lookup a dbterm for updating. Return false if not found. */ - int (*db_lookup_dbterm)(Process *, DbTable *, Eterm key, Eterm obj, + bool (*db_lookup_dbterm)(Process *, DbTable *, Eterm key, Eterm obj, DbUpdateHandle* handle); /* Must be called for each db_lookup_dbterm that returned true, even if ** dbterm was not updated. If the handle was of a new object and cret is ** not DB_ERROR_NONE, the object is removed from the table. */ void (*db_finalize_dbterm)(int cret, DbUpdateHandle* handle); - void* (*db_eterm_to_dbterm)(int compress, int keypos, Eterm obj); + void* (*db_eterm_to_dbterm)(bool compress, int keypos, Eterm obj); void* (*db_dbterm_list_append)(void* last_term, void* db_term); void* (*db_dbterm_list_remove_first)(void** list); int (*db_put_dbterm)(DbTable* tb, /* [in out] */ void* obj, - int key_clash_fail, /* DB_ERROR_BADKEY if key exists */ + bool key_clash_fail, /* DB_ERROR_BADKEY if key exists */ SWord *consumed_reds_p); - void (*db_free_dbterm)(int compressed, void* obj); + void (*db_free_dbterm)(bool compressed, void* obj); Eterm (*db_get_dbterm_key)(DbTable* tb, void* db_term); int (*db_get_binary_info)(Process*, DbTable* tb, Eterm key, Eterm* ret); /* Raw first/next same as first/next but also return pseudo deleted keys. @@ -283,7 +284,7 @@ typedef struct db_fixation { /* Node in fixing_procs tree */ struct { struct db_fixation *left, *right, *parent; - int is_red; + bool is_red; Process* p; } procs; @@ -316,7 +317,7 @@ typedef struct db_table_common { DbTableList owned; erts_rwmtx_t rwlock; /* rw lock on table */ erts_mtx_t fixlock; /* Protects fixing_procs and time */ - int is_thread_safe; /* No fine locking inside table needed */ + bool is_thread_safe; /* No fine locking inside table needed */ Uint32 type; /* table type, *read only* after creation */ Eterm owner; /* Pid of the creator */ Eterm heir; /* Pid of the heir */ @@ -339,7 +340,7 @@ typedef struct db_table_common { /* All 32-bit fields */ Uint32 status; /* bit masks defined below */ int keypos; /* defaults to 1 */ - int compress; + bool compress; /* For unfinished operations that needs to be helped */ struct ets_insert_2_list_info* continuation_ctx; @@ -393,13 +394,13 @@ typedef struct db_table_common { ERTS_GLB_INLINE Eterm db_copy_key(Process* p, DbTable* tb, DbTerm* obj); Eterm db_copy_from_comp(DbTableCommon* tb, DbTerm* bp, Eterm** hpp, ErlOffHeap* off_heap); -int db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b); +bool db_eq_comp(DbTableCommon* tb, Eterm a, DbTerm* b); DbTerm* db_alloc_tmp_uncompressed(DbTableCommon* tb, DbTerm* org); void db_free_tmp_uncompressed(DbTerm* obj); ERTS_GLB_INLINE Eterm db_copy_object_from_ets(DbTableCommon* tb, DbTerm* bp, Eterm** hpp, ErlOffHeap* off_heap); -ERTS_GLB_INLINE int db_eq(DbTableCommon* tb, Eterm a, DbTerm* b); +ERTS_GLB_INLINE bool db_eq(DbTableCommon* tb, Eterm a, DbTerm* b); Eterm db_do_read_element(DbUpdateHandle* handle, Sint position); #if ERTS_GLB_INLINE_INCL_FUNC_DEF @@ -428,7 +429,7 @@ ERTS_GLB_INLINE Eterm db_copy_object_from_ets(DbTableCommon* tb, DbTerm* bp, } } -ERTS_GLB_INLINE int db_eq(DbTableCommon* tb, Eterm a, DbTerm* b) +ERTS_GLB_INLINE bool db_eq(DbTableCommon* tb, Eterm a, DbTerm* b) { if (!tb->compress) { return EQ(a, make_tuple(b->tpl)); @@ -462,7 +463,7 @@ void db_initialize_util(void); Eterm db_getkey(int keypos, Eterm obj); void db_cleanup_offheap_comp(DbTerm* p); void db_free_term(DbTable *tb, void* basep, Uint offset); -void db_free_term_no_tab(int compress, void* basep, Uint offset); +void db_free_term_no_tab(bool compress, void* basep, Uint offset); Uint db_term_size(DbTable *tb, void* basep, Uint offset); void* db_store_term(DbTableCommon *tb, DbTerm* old, Uint offset, Eterm obj); void* db_store_term_comp(DbTableCommon *tb, /*May be NULL*/ @@ -472,7 +473,7 @@ void* db_store_term_comp(DbTableCommon *tb, /*May be NULL*/ Eterm db_copy_element_from_ets(DbTableCommon* tb, Process* p, DbTerm* obj, Uint pos, Eterm** hpp, Uint extra); int db_has_map(Eterm obj); -int db_is_fully_bound(Eterm obj); +bool db_is_fully_bound(Eterm obj); int db_is_variable(Eterm obj); void db_do_update_element(DbUpdateHandle* handle, Sint position, @@ -481,7 +482,7 @@ void db_finalize_resize(DbUpdateHandle* handle, Uint offset); Eterm db_add_counter(Eterm** hpp, Eterm counter, Eterm incr); Binary *db_match_set_compile(Process *p, Eterm matchexpr, Uint flags, Uint *freasonp); -int db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body); +bool db_match_keeps_key(int keypos, Eterm match, Eterm guard, Eterm body); int erts_db_match_prog_destructor(Binary *); typedef struct match_prog { diff --git a/erts/emulator/beam/erl_debug.c b/erts/emulator/beam/erl_debug.c index 7ce27b8916f9..278f2f5e7bdb 100644 --- a/erts/emulator/beam/erl_debug.c +++ b/erts/emulator/beam/erl_debug.c @@ -192,9 +192,6 @@ pdisplay1(fmtfn_t to, void *to_arg, Process* p, Eterm obj) case BIN_REF_DEF: erts_print(to, to_arg, "#BinRef"); break; - case FUN_REF_DEF: - erts_print(to, to_arg, "#FunRef"); - break; default: erts_print(to, to_arg, "unknown object %x", obj); } diff --git a/erts/emulator/beam/erl_etp.c b/erts/emulator/beam/erl_etp.c index 1654304c9bd0..9105e643fcd0 100644 --- a/erts/emulator/beam/erl_etp.c +++ b/erts/emulator/beam/erl_etp.c @@ -98,7 +98,6 @@ const Eterm etp_pos_big_subtag = POS_BIG_SUBTAG; const Eterm etp_neg_big_subtag = NEG_BIG_SUBTAG; const Eterm etp_ref_subtag = REF_SUBTAG; const Eterm etp_fun_subtag = FUN_SUBTAG; -const Eterm etp_fun_ref_subtag = FUN_REF_SUBTAG; const Eterm etp_float_subtag = FLOAT_SUBTAG; const Eterm etp_bitstring_tag_mask = _BITSTRING_TAG_MASK; const Eterm etp_heap_bits_subtag = HEAP_BITS_SUBTAG; diff --git a/erts/emulator/beam/erl_flxctr.c b/erts/emulator/beam/erl_flxctr.c index 35c4de1a2737..e2224e2fd615 100644 --- a/erts/emulator/beam/erl_flxctr.c +++ b/erts/emulator/beam/erl_flxctr.c @@ -215,7 +215,7 @@ void erts_flxctr_setup(int decentralized_counter_groups) } void erts_flxctr_init(ErtsFlxCtr* c, - int is_decentralized, + bool is_decentralized, Uint nr_of_counters, ErtsAlcType_t alloc_type) { @@ -341,12 +341,13 @@ Sint erts_flxctr_get_snapshot_result_after_trap(Eterm result_holder, return data->result[counter_nr]; } -int erts_flxctr_is_snapshot_result(Eterm term) +bool erts_flxctr_is_snapshot_result(Eterm term) { if (is_internal_magic_ref(term)) { Binary* bin = erts_magic_ref2bin(term); return ERTS_MAGIC_BIN_DESTRUCTOR(bin) == erts_flxctr_read_ctx_bin_dtor; - } else return 0; + } else + return false; } Sint erts_flxctr_read_approx(ErtsFlxCtr* c, @@ -365,7 +366,7 @@ Sint erts_flxctr_read_approx(ErtsFlxCtr* c, } } -int erts_flxctr_is_snapshot_ongoing(ErtsFlxCtr* c) +bool erts_flxctr_is_snapshot_ongoing(ErtsFlxCtr* c) { return c->is_decentralized && (ERTS_FLXCTR_SNAPSHOT_NOT_ONGOING != diff --git a/erts/emulator/beam/erl_flxctr.h b/erts/emulator/beam/erl_flxctr.h index 6065a5cb3ae4..b1924c4c7555 100644 --- a/erts/emulator/beam/erl_flxctr.h +++ b/erts/emulator/beam/erl_flxctr.h @@ -48,6 +48,7 @@ #include "erl_binary.h" #include "bif.h" #include +#include /* Public Interface */ @@ -56,7 +57,7 @@ typedef struct { int nr_of_counters; - int is_decentralized; + bool is_decentralized; union { erts_atomic_t counters_ptr; erts_atomic_t counters[1]; @@ -82,13 +83,13 @@ void erts_flxctr_setup(int decentralized_counter_groups); * ErtsFlxCtr that should be operated on. * * @param c The counter to initialize - * @param is_decentralized Non-zero value to make c decentralized + * @param is_decentralized true to make c decentralized * @param nr_of_counters The number of counters included in c * (max ERTS_FLXCTR_ATOMICS_PER_CACHE_LINE) * @param alloc_type */ void erts_flxctr_init(ErtsFlxCtr* c, - int is_decentralized, + bool is_decentralized, Uint nr_of_counters, ErtsAlcType_t alloc_type); @@ -243,9 +244,9 @@ erts_flxctr_snapshot(ErtsFlxCtr* c, * * @param term The term to check * - * @return A nonzero value iff the term is a snapshot result + * @return true iff the term is a snapshot result */ -int erts_flxctr_is_snapshot_result(Eterm term); +bool erts_flxctr_is_snapshot_result(Eterm term); /** * @brief Returns the result of a snapshot for a counter given a @@ -269,10 +270,10 @@ void erts_flxctr_reset(ErtsFlxCtr* c, * @brief Checks if a snapshot operation is active (snapshots are * initiated with the erts_flxctr_snapshot function). * - * @return nonzero value iff a snapshot was active at some point + * @return true iff a snapshot was active at some point * between the invocation and return of the function */ -int erts_flxctr_is_snapshot_ongoing(ErtsFlxCtr* c); +bool erts_flxctr_is_snapshot_ongoing(ErtsFlxCtr* c); /** * @brief This function checks if a snapshot operation is ongoing diff --git a/erts/emulator/beam/erl_fun.c b/erts/emulator/beam/erl_fun.c index e6c1744fb6ba..f1c97be08fe0 100644 --- a/erts/emulator/beam/erl_fun.c +++ b/erts/emulator/beam/erl_fun.c @@ -29,199 +29,123 @@ #include "hash.h" #include "beam_common.h" -#ifdef DEBUG -# define IF_DEBUG(x) x -#else -# define IF_DEBUG(x) -#endif - -/* Container structure for fun entries, allowing us to start `ErlFunEntry` with - * a field other than its `HashBucket`. */ -typedef struct erl_fun_entry_container { - /* !! MUST BE THE FIRST FIELD !! */ - HashBucket bucket; - - ErlFunEntry entry; -} ErlFunEntryContainer; - -static Hash erts_fun_table; - -static erts_rwmtx_t erts_fun_table_lock; +#define FUN_INITIAL_SIZE 512 +#define FUN_LIMIT (512*1024) -#define erts_fun_read_lock() erts_rwmtx_rlock(&erts_fun_table_lock) -#define erts_fun_read_unlock() erts_rwmtx_runlock(&erts_fun_table_lock) -#define erts_fun_write_lock() erts_rwmtx_rwlock(&erts_fun_table_lock) -#define erts_fun_write_unlock() erts_rwmtx_rwunlock(&erts_fun_table_lock) - -static HashValue fun_hash(ErlFunEntryContainer* obj); -static int fun_cmp(ErlFunEntryContainer* obj1, ErlFunEntryContainer* obj2); -static ErlFunEntryContainer* fun_alloc(ErlFunEntryContainer* template); -static void fun_free(ErlFunEntryContainer* obj); - -void -erts_init_fun_table(void) +const ErtsCodeMFA *erts_get_fun_mfa(const ErlFunEntry *fe, ErtsCodeIndex ix) { - HashFunctions f; - erts_rwmtx_opt_t rwmtx_opt = ERTS_RWMTX_OPT_DEFAULT_INITER; - rwmtx_opt.type = ERTS_RWMTX_TYPE_FREQUENT_READ; - rwmtx_opt.lived = ERTS_RWMTX_LONG_LIVED; - - erts_rwmtx_init_opt(&erts_fun_table_lock, &rwmtx_opt, "fun_tab", NIL, - ERTS_LOCK_FLAGS_PROPERTY_STATIC | ERTS_LOCK_FLAGS_CATEGORY_GENERIC); - - f.hash = (H_FUN) fun_hash; - f.cmp = (HCMP_FUN) fun_cmp; - f.alloc = (HALLOC_FUN) fun_alloc; - f.free = (HFREE_FUN) fun_free; - f.meta_alloc = (HMALLOC_FUN) erts_alloc; - f.meta_free = (HMFREE_FUN) erts_free; - f.meta_print = (HMPRINT_FUN) erts_print; - - hash_init(ERTS_ALC_T_FUN_TABLE, &erts_fun_table, "fun_table", 16, f); + ErtsCodePtr address = fe->dispatch.addresses[ix]; + + if (address != beam_unloaded_fun) { + return erts_find_function_from_pc(address); + } + + return NULL; } - -void -erts_fun_info(fmtfn_t to, void *to_arg) + +void erts_set_fun_code(ErlFunEntry *fe, ErtsCodeIndex ix, ErtsCodePtr address) { - int lock = !ERTS_IS_CRASH_DUMPING; - - if (lock) { - erts_fun_read_lock(); - } - - hash_info(to, to_arg, &erts_fun_table); - - if (lock) { - erts_fun_read_unlock(); - } + /* Fun entries MUST NOT be updated during a purge! */ + ASSERT(fe->pend_purge_address == NULL); + fe->dispatch.addresses[ix] = address; } - -int erts_fun_table_sz(void) + +int erts_is_fun_loaded(const ErlFunEntry* fe, ErtsCodeIndex ix) { - int sz; - int lock = !ERTS_IS_CRASH_DUMPING; + return fe->dispatch.addresses[ix] != beam_unloaded_fun; +} - if (lock) { - erts_fun_read_lock(); - } +/* ************************************************************************* */ - sz = hash_table_sz(&erts_fun_table); +static HashValue fun_hash(ErlFunEntry *fe) +{ + HashValue components[2]; - if (lock) { - erts_fun_read_unlock(); - } +#ifdef ARCH_64 + ERTS_CT_ASSERT(sizeof(HashValue) == sizeof(Uint64)); + sys_memcpy(&components[0], &fe->uniq[0], sizeof(Uint64)); + sys_memcpy(&components[1], &fe->uniq[8], sizeof(Uint64)); +#else + ERTS_CT_ASSERT(sizeof(HashValue) == sizeof(Uint32)); + sys_memcpy(&components[0], &fe->uniq[0], sizeof(Uint32)); + sys_memcpy(&components[1], &fe->uniq[4], sizeof(Uint32)); +#endif - return sz; + return components[0] ^ components[1] ^ (HashValue)fe->index; } -ErlFunEntry* -erts_put_fun_entry2(Eterm mod, int old_uniq, int old_index, - const byte* uniq, int index, int arity) +static int fun_cmp(ErlFunEntry *lhs, ErlFunEntry *rhs) { - ErlFunEntryContainer template; - ErlFunEntryContainer *fc; - ErlFunEntry *tp; - erts_aint_t refc; - int is_read_lock; + return !(lhs->module == rhs->module && + lhs->index == rhs->index && + lhs->arity == rhs->arity && + !sys_memcmp(lhs->uniq, rhs->uniq, sizeof(lhs->uniq))); +} - tp = &template.entry; +static void fun_init(ErlFunEntry *dst, const ErlFunEntry *template) +{ + ErtsDispatchable *dispatch = &dst->dispatch; - /* All fields are copied from the template when inserting a new entry. */ - ASSERT(is_atom(mod)); - tp->old_index = old_index; - tp->old_uniq = old_uniq; - tp->index = index; - tp->module = mod; - tp->arity = arity; - - sys_memcpy(tp->uniq, uniq, sizeof(tp->uniq)); - - /* - * Start with a shared, reader-lock which avoids contention when an insert - * is not required. - */ - is_read_lock = 1; - erts_fun_read_lock(); - fc = (ErlFunEntryContainer*)hash_get(&erts_fun_table, (void*)&template); - if (fc == NULL) { - /* - * Key is not present. Acquire an exclusive, writer-lock and retry with - * a lookup that will insert if the key is still not present. - */ - erts_fun_read_unlock(); - is_read_lock = 0; - erts_fun_write_lock(); - fc = (ErlFunEntryContainer*)hash_put(&erts_fun_table, (void*)&template); - } + sys_memcpy(dst, template, sizeof(ErlFunEntry)); - refc = erts_refc_inctest(&fc->entry.refc, 0); - if (refc < 2) { - /* New or pending delete */ - erts_refc_inc(&fc->entry.refc, 1); + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + dispatch->addresses[ix] = beam_unloaded_fun; } - if (is_read_lock) - erts_fun_read_unlock(); - else - erts_fun_write_unlock(); +#ifdef BEAMASM + dispatch->addresses[ERTS_SAVE_CALLS_CODE_IX] = beam_save_calls_fun; +#endif - return &fc->entry; + dst->pend_purge_address = NULL; } -const ErtsCodeMFA *erts_get_fun_mfa(const ErlFunEntry *fe, ErtsCodeIndex ix) +static void fun_stage(ErlFunEntry *entry, + ErtsCodeIndex src_ix, + ErtsCodeIndex dst_ix) { - ErtsCodePtr address = fe->dispatch.addresses[ix]; + ErtsDispatchable *dispatch = &entry->dispatch; - if (address != beam_unloaded_fun) { - return erts_find_function_from_pc(address); - } + /* Fun entries MUST NOT be updated during a purge! */ + ASSERT(entry->pend_purge_address == NULL); - return NULL; + dispatch->addresses[dst_ix] = dispatch->addresses[src_ix]; } -void erts_set_fun_code(ErlFunEntry *fe, ErtsCodeIndex ix, ErtsCodePtr address) +#define ERTS_CODE_STAGED_PREFIX fun +#define ERTS_CODE_STAGED_OBJECT_TYPE ErlFunEntry +#define ERTS_CODE_STAGED_OBJECT_HASH fun_hash +#define ERTS_CODE_STAGED_OBJECT_COMPARE fun_cmp +#define ERTS_CODE_STAGED_OBJECT_INITIALIZE fun_init +#define ERTS_CODE_STAGED_OBJECT_STAGE fun_stage +#define ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE ERTS_ALC_T_EXPORT +#define ERTS_CODE_STAGED_TABLE_ALLOC_TYPE ERTS_ALC_T_EXPORT_TABLE +#define ERTS_CODE_STAGED_TABLE_INITIAL_SIZE FUN_INITIAL_SIZE +#define ERTS_CODE_STAGED_TABLE_LIMIT FUN_LIMIT + +#define ERTS_CODE_STAGED_WANT_FOREACH_ACTIVE +#define ERTS_CODE_STAGED_WANT_ENTRY_BYTES +#define ERTS_CODE_STAGED_WANT_TABLE_SIZE + +#include "erl_code_staged.h" + +void erts_init_fun_table(void) { - /* Fun entries MUST NOT be updated during a purge! */ - ASSERT(fe->pend_purge_address == NULL); - fe->dispatch.addresses[ix] = address; + fun_staged_init(); } -int erts_is_fun_loaded(const ErlFunEntry* fe, ErtsCodeIndex ix) +void erts_fun_info(fmtfn_t to, void *to_arg) { - return fe->dispatch.addresses[ix] != beam_unloaded_fun; + fun_staged_info(to, to_arg); } -static void -erts_erase_fun_entry_unlocked(ErlFunEntry* fe) +int erts_fun_table_sz(void) { - ErlFunEntryContainer *fc = ErtsContainerStruct(fe, ErlFunEntryContainer, - entry); - - hash_erase(&erts_fun_table, (void *) fc); + return fun_staged_table_size(); } -void -erts_erase_fun_entry(ErlFunEntry* fe) +int erts_fun_entries_sz(void) { - erts_fun_write_lock(); - - /* We have to check refc again since someone might have looked up - * the fun entry and incremented refc after last check. */ - if (erts_refc_dectest(&fe->refc, -1) <= 0) { - ErtsCodeIndex code_ix = erts_active_code_ix(); - - if (erts_is_fun_loaded(fe, code_ix)) { - erts_exit(ERTS_ERROR_EXIT, - "Internal error: " - "Invalid reference count found on #Fun<%T.%d.%d>: " - " About to erase fun still referred by code.\n", - fe->module, fe->old_index, fe->old_uniq); - } - - erts_erase_fun_entry_unlocked(fe); - } - - erts_fun_write_unlock(); + return fun_staged_entry_bytes(); } struct fun_prepare_purge_args { @@ -229,11 +153,10 @@ struct fun_prepare_purge_args { ErtsCodeIndex code_ix; }; -static void fun_purge_foreach(ErlFunEntryContainer *fc, - struct fun_prepare_purge_args *args) +static void fun_purge_foreach(ErlFunEntry *fe, void *args_) { + struct fun_prepare_purge_args *args = args_; struct erl_module_instance* modp = args->modp; - ErlFunEntry *fe = &fc->entry; const char *mod_start; ErtsCodePtr fun_addr; @@ -252,20 +175,16 @@ static void fun_purge_foreach(ErlFunEntryContainer *fc, } } -void -erts_fun_purge_prepare(struct erl_module_instance* modp) +void erts_fun_purge_prepare(struct erl_module_instance* modp) { struct fun_prepare_purge_args args = {modp, erts_active_code_ix()}; ERTS_LC_ASSERT(erts_has_code_stage_permission()); - erts_fun_write_lock(); - hash_foreach(&erts_fun_table, (HFOREACH_FUN)fun_purge_foreach, &args); - erts_fun_write_unlock(); + fun_staged_foreach_active(fun_purge_foreach, &args); } -void -erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no) +void erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no) { ErtsCodeIndex code_ix = erts_active_code_ix(); Uint fun_ix; @@ -280,10 +199,11 @@ erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no) } } -void -erts_fun_purge_abort_finalize(ErlFunEntry **funs, Uint no) +void erts_fun_purge_abort_finalize(ErlFunEntry **funs, Uint no) { - IF_DEBUG(ErtsCodeIndex code_ix = erts_active_code_ix();) +#ifdef DEBUG + ErtsCodeIndex code_ix = erts_active_code_ix(); +#endif Uint fun_ix; ERTS_LC_ASSERT(erts_has_code_stage_permission()); @@ -298,10 +218,11 @@ erts_fun_purge_abort_finalize(ErlFunEntry **funs, Uint no) } } -void -erts_fun_purge_complete(ErlFunEntry **funs, Uint no) +void erts_fun_purge_complete(ErlFunEntry **funs, Uint no) { - IF_DEBUG(ErtsCodeIndex code_ix = erts_active_code_ix();) +#ifdef DEBUG + ErtsCodeIndex code_ix = erts_active_code_ix(); +#endif Uint ix; ERTS_LC_ASSERT(erts_has_code_stage_permission()); @@ -311,10 +232,6 @@ erts_fun_purge_complete(ErlFunEntry **funs, Uint no) ASSERT(fe->dispatch.addresses[code_ix] == beam_unloaded_fun); fe->pend_purge_address = NULL; - - if (erts_refc_dectest(&fe->refc, 0) == 0) { - erts_erase_fun_entry(fe); - } } ERTS_THR_WRITE_MEMORY_BARRIER; @@ -327,9 +244,9 @@ struct dump_fun_foreach_args { }; static void -dump_fun_foreach(ErlFunEntryContainer *fc, struct dump_fun_foreach_args *args) +dump_fun_foreach(ErlFunEntry *fe, void *_args) { - ErlFunEntry *fe = &fc->entry; + struct dump_fun_foreach_args *args = _args; erts_print(args->to, args->to_arg, "=fun\n"); erts_print(args->to, args->to_arg, "Module: %T\n", fe->module); @@ -337,120 +254,67 @@ dump_fun_foreach(ErlFunEntryContainer *fc, struct dump_fun_foreach_args *args) erts_print(args->to, args->to_arg, "Index: %d\n",fe->old_index); erts_print(args->to, args->to_arg, "Address: %p\n", fe->dispatch.addresses[args->code_ix]); - erts_print(args->to, args->to_arg, "Refc: %ld\n", - erts_refc_read(&fe->refc, 1)); + erts_print(args->to, args->to_arg, "Refc: 1\n"); } void erts_dump_fun_entries(fmtfn_t to, void *to_arg) { struct dump_fun_foreach_args args = {to, to_arg, erts_active_code_ix()}; - int lock = !ERTS_IS_CRASH_DUMPING; - - if (lock) { - erts_fun_read_lock(); - } - - hash_foreach(&erts_fun_table, (HFOREACH_FUN)dump_fun_foreach, &args); - - if (lock) { - erts_fun_read_unlock(); - } -} - -static HashValue -fun_hash(ErlFunEntryContainer* obj) -{ - ErlFunEntry *fe = &obj->entry; - - return (HashValue) (fe->old_uniq ^ fe->index ^ atom_val(fe->module)); -} - -static int -fun_cmp(ErlFunEntryContainer* obj1, ErlFunEntryContainer* obj2) -{ - ErlFunEntry* fe1 = &obj1->entry; - ErlFunEntry* fe2 = &obj2->entry; - - return !(fe1->module == fe2->module && - fe1->index == fe2->index && - fe1->arity == fe2->arity && - !sys_memcmp(fe1->uniq, fe2->uniq, sizeof(fe1->uniq))); + fun_staged_foreach_active(dump_fun_foreach, &args); } -static ErlFunEntryContainer* -fun_alloc(ErlFunEntryContainer* template) +static void init_fun_template(fun_template_t *template, + Eterm mod, int old_uniq, int old_index, + const byte* uniq, int index, int arity) { - ErlFunEntryContainer *obj; - ErtsDispatchable *disp; - ErtsCodeIndex ix; + ErlFunEntry *object; - obj = (ErlFunEntryContainer *) erts_alloc(ERTS_ALC_T_FUN_ENTRY, - sizeof(ErlFunEntryContainer)); - - sys_memcpy(obj, template, sizeof(ErlFunEntryContainer)); - - erts_refc_init(&obj->entry.refc, -1); - - disp = &obj->entry.dispatch; - for (ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { - disp->addresses[ix] = beam_unloaded_fun; - } - -#ifdef BEAMASM - disp->addresses[ERTS_SAVE_CALLS_CODE_IX] = beam_save_calls_fun; -#endif - - obj->entry.pend_purge_address = NULL; + ASSERT(is_atom(mod)); - return obj; + object = fun_staged_init_template(template); + object->old_index = old_index; + object->old_uniq = old_uniq; + object->index = index; + object->module = mod; + object->arity = arity; + sys_memcpy(object->uniq, uniq, sizeof(object->uniq)); } -static void -fun_free(ErlFunEntryContainer* obj) +ErlFunEntry *erts_fun_entry_put(Eterm mod, + int old_uniq, + int old_index, + const byte* uniq, + int index, + int arity) { - erts_free(ERTS_ALC_T_FUN_ENTRY, (void *) obj); + fun_template_t template; + init_fun_template(&template, mod, old_uniq, old_index, uniq, index, arity); + return fun_staged_upsert(&template); } -struct fun_stage_args { - ErtsCodeIndex src_ix; - ErtsCodeIndex dst_ix; -}; - -static void fun_stage_foreach(ErlFunEntryContainer *fc, - struct fun_stage_args *args) +const ErlFunEntry *erts_fun_entry_get_or_make_stub(Eterm mod, + int old_uniq, + int old_index, + const byte* uniq, + int index, + int arity) { - ErtsDispatchable *disp = &fc->entry.dispatch; - - /* Fun entries MUST NOT be updated during a purge! */ - ASSERT(fc->entry.pend_purge_address == NULL); - - disp->addresses[args->dst_ix] = disp->addresses[args->src_ix]; + fun_template_t template; + init_fun_template(&template, mod, old_uniq, old_index, uniq, index, arity); + return fun_staged_upsert(&template); } -IF_DEBUG(static ErtsCodeIndex debug_fun_load_ix = 0;) - void erts_fun_start_staging(void) { - ErtsCodeIndex dst_ix = erts_staging_code_ix(); - ErtsCodeIndex src_ix = erts_active_code_ix(); - struct fun_stage_args args = {src_ix, dst_ix}; - ERTS_LC_ASSERT(erts_has_code_stage_permission()); - ASSERT(dst_ix != src_ix); - ASSERT(debug_fun_load_ix == ~0); - - erts_fun_write_lock(); - hash_foreach(&erts_fun_table, (HFOREACH_FUN)fun_stage_foreach, &args); - erts_fun_write_unlock(); - - IF_DEBUG(debug_fun_load_ix = dst_ix); + fun_staged_start_staging(); } void erts_fun_end_staging(int commit) { - ERTS_LC_ASSERT((erts_active_code_ix() == erts_active_code_ix()) || + ERTS_LC_ASSERT((erts_active_code_ix() == erts_staging_code_ix()) || erts_has_code_stage_permission()); - ASSERT(debug_fun_load_ix == erts_staging_code_ix()); - IF_DEBUG(debug_fun_load_ix = ~0); + fun_staged_end_staging(commit); } + diff --git a/erts/emulator/beam/erl_fun.h b/erts/emulator/beam/erl_fun.h index 2dce49180799..705bb7cd2935 100644 --- a/erts/emulator/beam/erl_fun.h +++ b/erts/emulator/beam/erl_fun.h @@ -32,37 +32,20 @@ typedef struct erl_fun_entry { * complexity of instructions like `call_fun` and `is_function2`. */ ErtsDispatchable dispatch; + ErtsCodePtr pend_purge_address; /* Address during a pending purge */ + /* These fields identify the function and must not be altered after fun * creation. */ Eterm module; /* Tagged atom for module. */ - Uint arity; /* The arity of the fun. */ - int index; /* New style index. */ byte uniq[16]; /* MD5 for module. */ + int arity; /* The arity of the fun. */ + int index; /* New style index. */ + + /* These have been prepared for removal in OTP 29. */ int old_uniq; /* Unique number (old_style) */ int old_index; /* Old style index */ - - erts_refc_t refc; /* Reference count: One for code + one for - * each FunRef. */ - ErtsCodePtr pend_purge_address; /* Address during a pending purge */ } ErlFunEntry; -/* Reference-holding structure for funs. As these normally live in the literal - * area of their module instance and are shared with all lambdas pointing to - * the same function, having it separated like this saves us from having to - * reference-count every single lambda. - * - * These references copied onto the heap under some circumstances, for example - * trips through ETS or the external term format, but generally they'll live - * off-heap. */ -typedef struct erl_fun_ref { - Eterm thing_word; - ErlFunEntry *entry; - struct erl_off_heap_header *next; -} FunRef; - -#define ERL_FUN_REF_SIZE ((sizeof(FunRef)/sizeof(Eterm))) -#define HEADER_FUN_REF _make_header(ERL_FUN_REF_SIZE-1,_TAG_HEADER_FUN_REF) - /* This structure represents a 'fun' (lambda), whether local or external. It is * stored on process heaps, and has variable size depending on the size of the * environment. */ @@ -76,32 +59,28 @@ typedef struct erl_fun_thing { /* Both `ErlFunEntry` and `Export` begin with an `ErtsDispatchable`, so * code that doesn't really care which (e.g. calls) can use this * pointer to improve performance. */ - ErtsDispatchable *disp; + const ErtsDispatchable *disp; /* Pointer to function entry, valid iff this is local fun. */ - ErlFunEntry *fun; + const ErlFunEntry *fun; /* Pointer to export entry, valid iff this is an external fun. */ - Export *exp; + const Export *exp; } entry; - /* Environment (free variables), may be compound terms. - * - * External funs lack this altogether, and local funs _always_ reference a - * `FunRef` just past the last free variable. This ensures that the - * `ErlFunEntry` above will always be valid. */ + /* Environment (free variables), may be compound terms. */ Eterm env[]; } ErlFunThing; -#define is_external_fun(FunThing) (fun_env_size(FunThing) == 0) -#define is_local_fun(FunThing) (!is_external_fun(FunThing)) +#define is_external_fun(FunThing) \ + (!!((FunThing)->thing_word >> FUN_HEADER_KIND_OFFS)) +#define is_local_fun(FunThing) \ + (!is_external_fun(FunThing)) #define fun_arity(FunThing) \ (((FunThing)->thing_word >> FUN_HEADER_ARITY_OFFS) & 0xFF) -#define fun_env_size(FunThing) \ - ((FunThing)->thing_word >> FUN_HEADER_ENV_SIZE_OFFS) #define fun_num_free(FunThing) \ - (ASSERT(is_local_fun(FunThing)), fun_env_size(FunThing) - 1) + (((FunThing)->thing_word >> FUN_HEADER_ENV_SIZE_OFFS) & 0xFF) /* ERL_FUN_SIZE does _not_ include space for the environment which is a * C99-style flexible array */ @@ -110,10 +89,17 @@ typedef struct erl_fun_thing { void erts_init_fun_table(void); void erts_fun_info(fmtfn_t, void *); int erts_fun_table_sz(void); +int erts_fun_entries_sz(void); /* Finds or inserts a fun entry that matches the given signature. */ -ErlFunEntry* erts_put_fun_entry2(Eterm mod, int old_uniq, int old_index, - const byte* uniq, int index, int arity); +ErlFunEntry *erts_fun_entry_put(Eterm mod, int old_uniq, int old_index, + const byte* uniq, int index, int arity); +const ErlFunEntry *erts_fun_entry_get_or_make_stub(Eterm mod, + int old_uniq, + int old_index, + const byte* uniq, + int index, + int arity); const ErtsCodeMFA *erts_get_fun_mfa(const ErlFunEntry *fe, ErtsCodeIndex ix); @@ -124,9 +110,6 @@ ErtsCodePtr erts_get_fun_code(ErlFunEntry *fe, ErtsCodeIndex ix); int erts_is_fun_loaded(const ErlFunEntry* fe, ErtsCodeIndex ix); -void erts_erase_fun_entry(ErlFunEntry* fe); -void erts_cleanup_funs(ErlFunThing* funp); - struct erl_module_instance; void erts_fun_purge_prepare(struct erl_module_instance* modi); void erts_fun_purge_abort_prepare(ErlFunEntry **funs, Uint no); @@ -134,7 +117,6 @@ void erts_fun_purge_abort_finalize(ErlFunEntry **funs, Uint no); void erts_fun_purge_complete(ErlFunEntry **funs, Uint no); void erts_dump_fun_entries(fmtfn_t, void *); - void erts_fun_start_staging(void); void erts_fun_end_staging(int commit); diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index 910b4dd8a524..20585d75f78a 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -243,7 +243,6 @@ erts_init_gc(void) ERTS_CT_ASSERT(offsetof(BinRef,thing_word) == offsetof(ErlFunThing,thing_word)); ERTS_CT_ASSERT(offsetof(BinRef,thing_word) == offsetof(ExternalThing,header)); ERTS_CT_ASSERT(offsetof(BinRef,next) == offsetof(struct erl_off_heap_header,next)); - ERTS_CT_ASSERT(offsetof(BinRef,next) == offsetof(FunRef,next)); ERTS_CT_ASSERT(offsetof(BinRef,next) == offsetof(ExternalThing,next)); erts_test_long_gc_sleep = 0; @@ -731,7 +730,7 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, Uint ext_msg_usage = 0; Eterm gc_trace_end_tag; int reds; - ErtsMonotonicTime start_time; + ErtsMonotonicTime start_time = 0; ErtsSchedulerData *esdp = erts_proc_sched_data(p); erts_aint32_t state; #ifdef USE_VM_PROBES @@ -739,7 +738,6 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, #endif ERTS_MSACC_PUSH_STATE(); - ERTS_UNDEF(start_time, 0); ERTS_CHK_MBUF_SZ(p); ASSERT(CONTEXT_REDS - ERTS_REDS_LEFT(p, fcalls) >= esdp->virtual_reds); @@ -767,7 +765,7 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, ERTS_MSACC_SET_STATE_CACHED(ERTS_MSACC_STATE_GC); erts_atomic32_read_bor_nob(&p->state, ERTS_PSFLG_GC); - if (erts_system_monitor_long_gc != 0) + if (erts_system_monitor_long_gc) start_time = erts_get_monotonic_time(esdp); ERTS_CHK_OFFHEAP(p); @@ -868,7 +866,7 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, trace_gc(p, gc_trace_end_tag, reclaimed_now, THE_NON_VALUE); } - if (erts_system_monitor_long_gc != 0) { + if (start_time && erts_system_monitor_long_gc) { ErtsMonotonicTime end_time; Uint gc_time; if (erts_test_long_gc_sleep) @@ -883,7 +881,7 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, Uint size = HEAP_SIZE(p); size += OLD_HEAP(p) ? OLD_HEND(p) - OLD_HEAP(p) : 0; if (size >= erts_system_monitor_large_heap) - monitor_large_heap(p); + monitor_large_heap(p, size); } if (ERTS_SCHEDULER_IS_DIRTY(esdp)) { @@ -1348,12 +1346,6 @@ erts_garbage_collect_literals(Process* p, Eterm* literals, erts_refc_inc(&refc_binary->intern.refc, 2); break; } - case FUN_REF_SUBTAG: - { - ErlFunEntry *fe = ((FunRef*)ptr)->entry; - erts_refc_inc(&fe->refc, 2); - break; - } case REF_SUBTAG: { ErtsMagicBinary *bptr; @@ -2570,11 +2562,11 @@ erts_copy_one_frag(Eterm** hpp, ErlOffHeap* off_heap, case REF_SUBTAG: if (!is_magic_ref_thing(fhp - 1)) goto the_default; + ERTS_FALLTHROUGH(); case BIN_REF_SUBTAG: case EXTERNAL_PID_SUBTAG: case EXTERNAL_PORT_SUBTAG: case EXTERNAL_REF_SUBTAG: - case FUN_REF_SUBTAG: oh = (struct erl_off_heap_header*) (hp-1); cpy_sz = thing_arityval(val); goto cpy_words; @@ -3067,7 +3059,7 @@ sweep_off_heap(Process *p, int fullsweep) bin_vheap += size / sizeof(Eterm); else p->bin_old_vheap += size / sizeof(Eterm); /* for binary gc (words)*/ - /* fall through... */ + ERTS_FALLTHROUGH(); } default: if (is_external_header(ptr->thing_word)) { @@ -3095,14 +3087,6 @@ sweep_off_heap(Process *p, int fullsweep) erts_bin_release(((BinRef*)ptr)->val); break; } - case FUN_REF_SUBTAG: - { - FunRef *refp = ((FunRef*)ptr); - if (erts_refc_dectest(&(refp->entry)->refc, 0) == 0) { - erts_erase_fun_entry(refp->entry); - } - break; - } case REF_SUBTAG: { ErtsMagicBinary *bptr; @@ -3145,8 +3129,7 @@ sweep_off_heap(Process *p, int fullsweep) break; } default: - ASSERT(ptr->thing_word == HEADER_FUN_REF || - is_external_header(ptr->thing_word) || + ASSERT(is_external_header(ptr->thing_word) || is_magic_ref_thing(ptr)); break; } @@ -3330,11 +3313,11 @@ offset_heap(Eterm* hp, Uint sz, Sint offs, char* area, Uint area_size) case REF_SUBTAG: if (!is_magic_ref_thing(hp)) break; + ERTS_FALLTHROUGH(); case BIN_REF_SUBTAG: case EXTERNAL_PID_SUBTAG: case EXTERNAL_PORT_SUBTAG: case EXTERNAL_REF_SUBTAG: - case FUN_REF_SUBTAG: { struct erl_off_heap_header* oh = (struct erl_off_heap_header*) hp; @@ -4031,7 +4014,6 @@ check_all_heap_terms_in_range(int (*check_eterm)(Eterm), case EXTERNAL_PID_SUBTAG: case EXTERNAL_PORT_SUBTAG: case EXTERNAL_REF_SUBTAG: - case FUN_REF_SUBTAG: off_heap_common: { int tari = thing_arityval(val); @@ -4043,7 +4025,7 @@ check_all_heap_terms_in_range(int (*check_eterm)(Eterm), if (is_magic_ref_thing(rtp)) { goto off_heap_common; } - /* Fall through... */ + ERTS_FALLTHROUGH(); } default: { @@ -4183,9 +4165,6 @@ erts_check_off_heap2(Process *p, Eterm *htop) case EXTERNAL_REF_SUBTAG: refc = erts_refc_read(&u.ext->node->refc, 1); break; - case FUN_REF_SUBTAG: - refc = erts_refc_read(&(u.fref->entry)->refc, 1); - break; case REF_SUBTAG: ASSERT(is_magic_ref_thing(u.hdr)); refc = erts_refc_read(&u.mref->mb->intern.refc, 1); diff --git a/erts/emulator/beam/erl_gc.h b/erts/emulator/beam/erl_gc.h index b21a08337f25..aa8afd8d7123 100644 --- a/erts/emulator/beam/erl_gc.h +++ b/erts/emulator/beam/erl_gc.h @@ -74,7 +74,7 @@ ERTS_GLB_INLINE Eterm* move_boxed(Eterm *ERTS_RESTRICT ptr, Eterm hdr, Eterm **h } break; case FUN_SUBTAG: - nelts += fun_env_size((ErlFunThing*)(ptr)); + nelts += fun_num_free((ErlFunThing*)(ptr)); break; } diff --git a/erts/emulator/beam/erl_global_literals.c b/erts/emulator/beam/erl_global_literals.c index a05c1031426b..0db33920870c 100644 --- a/erts/emulator/beam/erl_global_literals.c +++ b/erts/emulator/beam/erl_global_literals.c @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 2020-2021. All Rights Reserved. + * Copyright Ericsson AB 2020-2024. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,51 +25,167 @@ #include "sys.h" #include "global.h" #include "erl_global_literals.h" +#include "erl_mmap.h" -struct literal { - Eterm term; - ErtsLiteralArea* area; -}; -static struct literal literals[ERTS_NUM_GLOBAL_LITERALS]; +#define GLOBAL_LITERAL_INITIAL_SIZE (1<<16) +#define GLOBAL_LITERAL_EXPAND_SIZE 512 + /* * Global Constant Literals */ +Eterm ERTS_WRITE_UNLIKELY(ERTS_GLOBAL_LIT_OS_TYPE); +Eterm ERTS_WRITE_UNLIKELY(ERTS_GLOBAL_LIT_OS_VERSION); +Eterm ERTS_WRITE_UNLIKELY(ERTS_GLOBAL_LIT_DFLAGS_RECORD); +Eterm ERTS_WRITE_UNLIKELY(ERTS_GLOBAL_LIT_ERL_FILE_SUFFIX); Eterm ERTS_WRITE_UNLIKELY(ERTS_GLOBAL_LIT_EMPTY_TUPLE); +/* This lock is taken in the beginning of erts_global_literal_allocate, + * released at the end of erts_global_literal_register. It protects the + * allocated literal chunk, and the heap pointer from concurrent access until + * the literal tag is set. + */ +erts_mtx_t global_literal_lock; + +/* Bump allocator for global literal chunks, allocating them in + * reasonably large chunks to simplify crash dumping and avoid fragmenting the + * literal heap too much. + * + * This is protected by the global literal lock. */ +struct global_literal_chunk { + struct global_literal_chunk *next; + Eterm *chunk_end; + + ErtsLiteralArea area; +} *global_literal_chunk = NULL; + +/* The size of the global literal term that is being built */ +Uint global_literal_build_size; -Eterm* erts_alloc_global_literal(Uint index, Uint sz) + +ErtsLiteralArea *erts_global_literal_iterate_area(ErtsLiteralArea *prev) { - ErtsLiteralArea* area; - Uint area_sz; - - ASSERT(index < ERTS_NUM_GLOBAL_LITERALS); - area_sz = sizeof(ErtsLiteralArea) + (sz-1)*sizeof(Eterm); - area = erts_alloc(ERTS_ALC_T_LITERAL, area_sz); - area->end = area->start + sz; - literals[index].area = area; - return area->start; + struct global_literal_chunk *next; + + ASSERT(ERTS_IS_CRASH_DUMPING); + + if (prev != NULL) { + struct global_literal_chunk *chunk = ErtsContainerStruct(prev, + struct global_literal_chunk, + area); + next = chunk->next; + + if (next == NULL) { + return NULL; + } + } else { + next = global_literal_chunk; + } + + return &next->area; } -void erts_register_global_literal(Uint index, Eterm term) +static void expand_shared_global_literal_area(Uint heap_size) { - Eterm* start; + const size_t size = sizeof(struct global_literal_chunk) + + (heap_size - 1) * sizeof(Eterm); + struct global_literal_chunk *chunk; + +#ifndef DEBUG + chunk = (struct global_literal_chunk *) erts_alloc(ERTS_ALC_T_LITERAL, size); +#else + /* erts_mem_guard requires the memory area to be page aligned. Overallocate + * and align the address to ensure that is the case. */ + UWord address; + address = (UWord) erts_alloc(ERTS_ALC_T_LITERAL, size + sys_page_size * 2); + address = (address + (sys_page_size - 1)) & ~(sys_page_size - 1); + chunk = (struct global_literal_chunk *) address; + + for (int i = 0; i < heap_size; i++) { + chunk->area.start[i] = ERTS_HOLE_MARKER; + } +#endif + + chunk->area.end = &(chunk->area.start[0]); + chunk->chunk_end = &(chunk->area.start[heap_size]); + chunk->area.off_heap = NULL; + chunk->next = global_literal_chunk; - ASSERT(index < ERTS_NUM_GLOBAL_LITERALS); - start = literals[index].area->start; - erts_set_literal_tag(&term, start, literals[index].area->end - start); - literals[index].term = term; + global_literal_chunk = chunk; } -Eterm erts_get_global_literal(Uint index) +Eterm *erts_global_literal_allocate(Uint heap_size, struct erl_off_heap_header ***ohp) { - ASSERT(index < ERTS_NUM_GLOBAL_LITERALS); - return literals[index].term; + erts_mtx_lock(&global_literal_lock); + + ASSERT(global_literal_chunk->area.end <= global_literal_chunk->chunk_end && + global_literal_chunk->area.end >= global_literal_chunk->area.start); + if (global_literal_chunk->chunk_end - global_literal_chunk->area.end < heap_size) { + expand_shared_global_literal_area(heap_size + GLOBAL_LITERAL_EXPAND_SIZE); + } + + *ohp = &global_literal_chunk->area.off_heap; + +#ifdef DEBUG + { + struct global_literal_chunk *chunk = global_literal_chunk; + erts_mem_guard(chunk, + (byte*)(chunk->area.end + heap_size) - (byte*)chunk, + 1, + 1); + } +#endif + + global_literal_build_size = heap_size; + + return global_literal_chunk->area.end; } -ErtsLiteralArea* erts_get_global_literal_area(Uint index) -{ - ASSERT(index < ERTS_NUM_GLOBAL_LITERALS); - return literals[index].area; +void erts_global_literal_register(Eterm *variable) { + struct global_literal_chunk *chunk = global_literal_chunk; + + ASSERT(ptr_val(*variable) >= chunk->area.end && + ptr_val(*variable) < (chunk->area.end + global_literal_build_size)); + + erts_set_literal_tag(variable, + chunk->area.end, + global_literal_build_size); + + chunk->area.end += global_literal_build_size; + + ASSERT(chunk->area.end <= chunk->chunk_end && + chunk->area.end >= chunk->area.start); + ASSERT(chunk->area.end == chunk->chunk_end || + chunk->area.end[0] == ERTS_HOLE_MARKER); + +#ifdef DEBUG + erts_mem_guard(chunk, + (byte*)chunk->chunk_end - (byte*)chunk, + 1, + 0); +#endif + + erts_mtx_unlock(&global_literal_lock); } + +static void init_empty_tuple(void) { + struct erl_off_heap_header **ohp; + Eterm* hp = erts_global_literal_allocate(2, &ohp); + Eterm tuple; + hp[0] = make_arityval_zero(); + hp[1] = make_arityval_zero(); + tuple = make_tuple(hp); + erts_global_literal_register(&tuple); + ERTS_GLOBAL_LIT_EMPTY_TUPLE = tuple; +} + +void +init_global_literals(void) +{ + erts_mtx_init(&global_literal_lock, "global_literals", NIL, + ERTS_LOCK_FLAGS_PROPERTY_STATIC | ERTS_LOCK_FLAGS_CATEGORY_GENERIC); + + expand_shared_global_literal_area(GLOBAL_LITERAL_INITIAL_SIZE); + init_empty_tuple(); +} \ No newline at end of file diff --git a/erts/emulator/beam/erl_global_literals.h b/erts/emulator/beam/erl_global_literals.h index 9d17c16e66dc..bc8b44720118 100644 --- a/erts/emulator/beam/erl_global_literals.h +++ b/erts/emulator/beam/erl_global_literals.h @@ -1,7 +1,7 @@ /* * %CopyrightBegin% * - * Copyright Ericsson AB 1996-2021. All Rights Reserved. + * Copyright Ericsson AB 1996-2024. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,41 @@ * %CopyrightEnd% */ +/* Global literals are used to store Erlang terms that are never modified or + * deleted. They are commonly-used constants at compile or run-time. This is + * similar in spirit to persistent_term but for internal usage. + * + * Examples include lambdas associated with export entries, the bitstring + * representation of atoms, and certain constants. + */ + #ifndef __ERL_GLOBAL_LITERALS_H__ #define __ERL_GLOBAL_LITERALS_H__ -#define ERTS_LIT_OS_TYPE 0 -#define ERTS_LIT_OS_VERSION 1 -#define ERTS_LIT_DFLAGS_RECORD 2 -#define ERTS_LIT_EMPTY_TUPLE 3 -#define ERTS_LIT_ERL_FILE_SUFFIX 4 +extern Eterm ERTS_GLOBAL_LIT_OS_TYPE; +extern Eterm ERTS_GLOBAL_LIT_OS_VERSION; +extern Eterm ERTS_GLOBAL_LIT_DFLAGS_RECORD; +extern Eterm ERTS_GLOBAL_LIT_ERL_FILE_SUFFIX; +extern Eterm ERTS_GLOBAL_LIT_EMPTY_TUPLE; -#define ERTS_NUM_GLOBAL_LITERALS 5 +/* Initializes global literals. Note that the literals terms mentioned in the + * examples above may be created elsewhere, and are only kept here for clarity. + */ +void init_global_literals(void); -extern Eterm ERTS_GLOBAL_LIT_EMPTY_TUPLE; +/* Allocates space for global literals. Users must call erts_global_literal_register + * when done creating the literal. + */ +Eterm *erts_global_literal_allocate(Uint sz, struct erl_off_heap_header ***ohp); -Eterm* erts_alloc_global_literal(Uint index, Uint sz); -void erts_register_global_literal(Uint index, Eterm term); -Eterm erts_get_global_literal(Uint index); -ErtsLiteralArea* erts_get_global_literal_area(Uint index); +/* Registers the pointed-to term as a global literal. Must be called for terms + * allocated using erts_global_literal_allocate.*/ +void erts_global_literal_register(Eterm *variable); + +/* Iterates between global literal areas. Can only be used when crash dumping. + * Iteration is started by passing NULL, then successively calling this function + * until it returns NULL. + */ +ErtsLiteralArea *erts_global_literal_iterate_area(ErtsLiteralArea *prev); #endif diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c index 45c10d1e236d..a875fba8958b 100644 --- a/erts/emulator/beam/erl_init.c +++ b/erts/emulator/beam/erl_init.c @@ -239,17 +239,6 @@ void erl_error(const char *fmt, va_list args) static int early_init(int *argc, char **argv); -static void init_constant_literals(void) { - Eterm* hp = erts_alloc_global_literal(ERTS_LIT_EMPTY_TUPLE, 2); - Eterm tuple; - hp[0] = make_arityval_zero(); - hp[1] = make_arityval_zero(); - tuple = make_tuple(hp); - erts_register_global_literal(ERTS_LIT_EMPTY_TUPLE, tuple); - ERTS_GLOBAL_LIT_EMPTY_TUPLE = - erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); -} - static void erl_init(int ncpu, int proc_tab_sz, @@ -263,7 +252,7 @@ erl_init(int ncpu, int node_tab_delete_delay, ErtsDbSpinCount db_spin_count) { - init_constant_literals(); + init_global_literals(); erts_monitor_link_init(); erts_bif_unique_init(); erts_proc_sig_queue_init(); /* Must be after erts_bif_unique_init(); */ @@ -539,7 +528,7 @@ load_preloaded(void) } /* be helpful (or maybe downright rude:-) */ -void erts_usage(void) +__decl_noreturn void __noreturn erts_usage(void) { int this_rel = this_rel_num(); erts_fprintf(stderr, "Usage: %s [flags] [ -- [init_args] ]\n", progname(program)); @@ -553,8 +542,8 @@ void erts_usage(void) ERTS_MAX_NO_OF_ASYNC_THREADS); erts_fprintf(stderr, "\n"); - erts_fprintf(stderr, "-B[c|d|i] set break (Ctrl-C) behavior; valid letters are:\n"); - erts_fprintf(stderr, " 'c' to have Ctrl-C interrupt the Erlang shell;\n"); + erts_fprintf(stderr, "-B[c|d|i] set break (Ctrl+C) behavior; valid letters are:\n"); + erts_fprintf(stderr, " 'c' to have Ctrl+C interrupt the Erlang shell;\n"); erts_fprintf(stderr, " 'd' (or no extra option) to disable the break handler;\n"); erts_fprintf(stderr, " 'i' to ignore break signals\n"); erts_fprintf(stderr, "\n"); @@ -1044,6 +1033,7 @@ early_init(int *argc, char **argv) /* case 1: onln = tot < dirty_cpu_scheds_online ? tot : dirty_cpu_scheds_online; + ERTS_FALLTHROUGH(); case 2: chk_SDcpu: if (tot > 0) @@ -1114,6 +1104,7 @@ early_init(int *argc, char **argv) /* } case 1: onln = tot < schdlrs_onln ? tot : schdlrs_onln; + ERTS_FALLTHROUGH(); case 2: chk_S: if (tot > 0) @@ -1279,8 +1270,8 @@ early_init(int *argc, char **argv) /* /* Creates threads on Windows that depend on the arguments, so has to be after erl_sys_args */ erl_sys_init(); - erts_ets_realloc_always_moves = 0; - erts_ets_always_compress = 0; + erts_ets_realloc_always_moves = false; + erts_ets_always_compress = false; erts_dist_buf_busy_limit = ERTS_DE_BUSY_LIMIT; return ncpu; @@ -1649,7 +1640,7 @@ erl_start(int argc, char **argv) case 'e': if (sys_strcmp("c", argv[i]+2) == 0) { - erts_ets_always_compress = 1; + erts_ets_always_compress = true; } else { /* set maximum number of ets tables */ @@ -2244,7 +2235,7 @@ erl_start(int argc, char **argv) /* already handled */ } else { - erts_ets_realloc_always_moves = 1; + erts_ets_realloc_always_moves = true; } break; } diff --git a/erts/emulator/beam/erl_lock_check.c b/erts/emulator/beam/erl_lock_check.c index e8861b078ce2..3ec2b1dffa18 100644 --- a/erts/emulator/beam/erl_lock_check.c +++ b/erts/emulator/beam/erl_lock_check.c @@ -43,8 +43,9 @@ #include "erl_utils.h" typedef struct { - char *name; - char *internal_order; + const char * const name; + const char * const internal_order; + Sint16 level; } erts_lc_lock_order_t; /* @@ -67,7 +68,19 @@ typedef struct { * spinlocks and rwlocks have been unlocked. This restriction is not * reflected by the lock order below, but the lock checker will still * check for violations of this restriction. + * + * OTP 28: Lock order LEVELs. Different named locks within the same level + * cannot be locked at the same time. Levels are separated by the macro LEVEL. + * This will hopefully make it easier to edit the lock order while also + * enforce that intentionally unordered locks are not locked together. + * + * For an even better understanding use erts_debug:lc_graph() + * to dump the actual recorded locking order to a file which can be converted + * to a nice viewable graph. Some of our test suites already calls + * erts_debug:lc_graph() before the beam exists. Search for files "lc_graph.*". */ +#define LEVEL {NULL,NULL} + static erts_lc_lock_order_t erts_lock_order[] = { /* * "Lock name" "Internal lock order @@ -75,104 +88,118 @@ static erts_lc_lock_order_t erts_lock_order[] = { * if only one lock use * the lock name)" */ - { "NO LOCK", NULL }, - { "driver_lock", "driver_name" }, - { "port_lock", "port_id" }, - { "port_data_lock", "address" }, - { "reg_tab", NULL }, - { "proc_main", "pid" }, - { "old_code", "address" }, - { "nif_call_tab", NULL }, - { "nodes_monitors", NULL }, - { "meta_name_tab", "address" }, - { "db_tab", "address" }, - { "db_tab_fix", "address" }, - { "db_hash_slot", "address" }, - { "erl_db_catree_base_node", NULL }, - { "erl_db_catree_route_node", "index" }, - { "resource_monitors", "address" }, - { "driver_list", NULL }, - { "dist_entry", "address" }, - { "proc_msgq", "pid" }, - { "proc_btm", "pid" }, - { "dist_entry_links", "address" }, - { "nif_load", NULL }, - { "update_persistent_term_permission", NULL }, - { "persistent_term_delete_permission", NULL }, - { "code_stage_permission", NULL }, - { "code_mod_permission", NULL }, - { "purge_state", NULL }, - { "proc_status", "pid" }, - { "proc_trace", "pid" }, - { "trace_session_list", NULL }, - { "trace_cleaner", NULL }, - { "node_table", NULL }, - { "dist_table", NULL }, - { "sys_tracers", NULL }, - { "export_tab", NULL }, - { "fun_tab", NULL }, - { "environ", NULL }, - { "release_literal_areas", NULL }, - { "on_halt", NULL }, - { "drv_ev_state_grow", NULL, }, - { "drv_ev_state", "address" }, - { "safe_hash", "address" }, - { "state_prealloc", NULL }, - { "schdlr_sspnd", NULL }, - { "migration_info_update", NULL }, - { "run_queue", "address" }, - { "dirty_run_queue_sleep_list", "address" }, - { "dirty_gc_info", NULL }, - { "dirty_break_point_index", NULL }, - { "process_table", NULL }, - { "cpu_info", NULL }, - { "pollset", "address" }, + {"NO LOCK", NULL}, + LEVEL, + {"driver_lock", "driver_name"}, + {"port_lock", "port_id"}, + {"async_enq_mtx", NULL}, + LEVEL, + {"port_data_lock", "address"}, + {"reg_tab", NULL}, + LEVEL, + {"proc_main", "pid"}, + LEVEL, + {"old_code", "address"}, + {"nif_call_tab", NULL}, + {"nodes_monitors", NULL}, + {"meta_name_tab", "address"}, + {"resource_monitors", "address"}, + {"driver_list", NULL}, + {"dist_entry", "address"}, + {"update_persistent_term_permission", NULL}, + {"persistent_term_delete_permission", NULL}, + {"code_stage_permission", NULL}, + {"code_mod_permission", NULL}, + {"trace_cleaner", NULL}, + {"export_staging_lock", NULL}, + {"release_literal_areas", NULL}, + {"drv_ev_state_grow", NULL}, + {"schdlr_sspnd", NULL}, + {"dirty_gc_info", NULL}, + {"dirty_break_point_index", NULL}, + {"cpu_info", NULL}, + {"block_poll_thread", "index"}, + {"alcu_init_atoms", NULL}, + {"mseg_init_atoms", NULL}, + {"mmap_init_atoms", NULL}, + {"port_table", NULL}, + LEVEL, + {"db_tab", "address"}, + {"proc_msgq", "pid"}, + {"dist_entry_links", "address"}, + {"dist_entry_out_queue", "address"}, + {"nif_load", NULL}, + {"purge_state", NULL}, + {"environ", NULL}, + {"drv_ev_state", "address"}, + {"migration_info_update", NULL}, + {"drv_tsd", NULL}, + {"msacc_list_mutex", NULL}, + {"on_halt", NULL}, + LEVEL, + {"db_tab_fix", "address"}, + {"db_hash_slot", "address"}, + {"erl_db_catree_base_node", NULL}, + {"proc_btm", "pid"}, + {"safe_hash", "address"}, + {"pollset", "address"}, + LEVEL, + {"erl_db_catree_route_node", "index"}, + {"proc_status", "pid"}, + {"node_table", NULL}, + LEVEL, + {"proc_trace", "pid"}, + {"dist_table", NULL}, + LEVEL, + {"trace_session_list", NULL}, + {"run_queue", "address"}, + {"magic_ref_table", "address"}, + {"proc_sig_queue_buffer", "address"}, + LEVEL, + {"sys_tracers", NULL}, + {"dirty_run_queue_sleep_list", "address"}, + {"process_table", NULL}, + {"port_sched_lock", "port_id"}, + {"msacc_unmanaged_mutex", NULL}, + LEVEL, #ifdef __WIN32__ - { "pollwaiter", "address" }, - { "break_waiter_lock", NULL }, + {"pollwaiter", "address"}, + {"break_waiter_lock", NULL}, #endif /* __WIN32__ */ - { "block_poll_thread", "index" }, - { "alcu_init_atoms", NULL }, - { "mseg_init_atoms", NULL }, - { "mmap_init_atoms", NULL }, - { "drv_tsd", NULL }, - { "async_enq_mtx", NULL }, - { "msacc_list_mutex", NULL }, - { "msacc_unmanaged_mutex", NULL }, - { "atom_tab", NULL }, - { "dist_entry_out_queue", "address" }, - { "port_sched_lock", "port_id" }, - { "sys_msg_q", NULL }, - { "tracer_mtx", NULL }, - { "port_table", NULL }, - { "magic_ref_table", "address" }, - { "pid_ref_table", "address" }, - { "instr_x", NULL }, - { "instr", NULL }, - { "dyn_lock_check", NULL }, - { "alcu_allocator", "index" }, - { "mseg", NULL }, - { "get_time", NULL }, - { "get_corrected_time", NULL }, - { "runtime", NULL }, - { "pix_lock", "address" }, - { "sched_stat", NULL }, - { "async_init_mtx", NULL }, -#ifdef __WIN32__ -#ifdef DEBUG - { "save_ops_lock", NULL }, + {"tracer_mtx", NULL}, + {"sys_msg_q", NULL}, + {"fun_staging_lock", NULL}, + {"atom_tab", NULL}, + LEVEL, + {"global_literals", NULL}, + LEVEL, + {"alcu_allocator", "index"}, + LEVEL, + {"mseg", NULL}, + {"perf", NULL}, + {"get_time", NULL}, + LEVEL, + {"runtime", NULL}, + LEVEL, + {"get_corrected_time", NULL}, + {"pix_lock", "address"}, + {"async_init_mtx", NULL}, +#if defined(__WIN32__) && defined(DEBUG) + {"save_ops_lock", NULL}, #endif -#endif - { "os_monotonic_time", NULL }, - { "erts_alloc_hard_debug", NULL }, - { "hard_dbg_mseg", NULL }, - { "perf", NULL }, - { "jit_debug_descriptor", NULL }, - { "erts_mmap", NULL }, - { "proc_sig_queue_buffer", "address" }, + {"os_monotonic_time", NULL}, + {"erts_alloc_hard_debug", NULL}, + {"hard_dbg_mseg", NULL}, + {"jit_debug_descriptor", NULL}, + {"erts_mmap", NULL}, #ifdef ERTS_ENSURE_OS_MONOTONIC_TIME - { "ensure_os_monotonic_time", NULL } + {"ensure_os_monotonic_time", NULL}, #endif + {"dyn_lock_check", NULL}, + LEVEL, + /* spin locks */ + {"state_prealloc", NULL}, + {"sched_stat", NULL} }; #define ERTS_LOCK_ORDER_SIZE \ @@ -223,11 +250,14 @@ union lc_free_block_t_ { lc_locked_lock_t lock; }; +#define DIRECT_AFTER 1 +#define INDIRECT_AFTER 2 + typedef struct { /* - * m[X][Y] & 1 if we locked X directly after Y was locked. - * m[X][Y] & 2 if we locked X indirectly after Y was locked. - * m[X][0] = 1 if we locked X when nothing else was locked. + * m[X][Y] & DIRECT_AFTER if we locked X directly after Y was locked. + * m[X][Y] & INDIRECT_AFTER if we locked X indirectly after Y was locked. + * m[X][0] = DIRECT_AFTER if we locked X when nothing else was locked. * m[0][] is unused as it would represent locking "NO LOCK" */ char m[ERTS_LOCK_ORDER_SIZE][ERTS_LOCK_ORDER_SIZE]; @@ -434,10 +464,15 @@ static void raw_print_lock(char *prefix, Sint16 id, Eterm extra, erts_lock_flags_t flags, const char* file, unsigned int line, char *suffix) { - char *lname = (1 <= id && id < ERTS_LOCK_ORDER_SIZE - ? erts_lock_order[id].name - : "unknown"); - erts_fprintf(stderr,"%s'%s:",prefix,lname); + if (1 <= id && id < ERTS_LOCK_ORDER_SIZE + && erts_lock_order[id].name) { + erts_fprintf(stderr, "%s'%d.%s:", prefix, + erts_lock_order[id].level, + erts_lock_order[id].name); + } + else { + erts_fprintf(stderr, "%s'unknown(%d):", prefix, id); + } if (is_not_immed(extra)) erts_fprintf(stderr,"%p",_unchecked_boxed_val(extra)); @@ -487,13 +522,19 @@ print_lock_order(void) int i; erts_fprintf(stderr, "Lock order:\n"); for (i = 1; i < ERTS_LOCK_ORDER_SIZE; i++) { + if (!erts_lock_order[i].name) { + continue; + } if (erts_lock_order[i].internal_order) erts_fprintf(stderr, - " %s:%s\n", + " %2d.%s:%s\n", + erts_lock_order[i].level, erts_lock_order[i].name, erts_lock_order[i].internal_order); else - erts_fprintf(stderr, " %s\n", erts_lock_order[i].name); + erts_fprintf(stderr, " %2d.%s\n", + erts_lock_order[i].level, + erts_lock_order[i].name); } } @@ -717,9 +758,11 @@ erts_lc_get_lock_order_id(const char *name) if (!name || name[0] == '\0') erts_fprintf(stderr, "Missing lock name\n"); else { - for (i = 0; i < ERTS_LOCK_ORDER_SIZE; i++) - if (sys_strcmp(erts_lock_order[i].name, name) == 0) - return i; + for (i = 0; i < ERTS_LOCK_ORDER_SIZE; i++) { + if (erts_lock_order[i].name + && sys_strcmp(erts_lock_order[i].name, name) == 0) + return i; + } erts_fprintf(stderr, "Lock name '%s' missing in lock order " "(update erl_lock_check.c)\n", @@ -737,6 +780,29 @@ lc_is_term_order(Sint16 id) } +static int compare_same_lock_id_extra(lc_locked_lock_t *, erts_lc_lock_t *); + +static int compare_lock_order(lc_locked_lock_t *locked_lock, + erts_lc_lock_t *want_lock) +{ + const Sint16 ll_level = erts_lock_order[locked_lock->id].level; + const Sint16 wl_level = erts_lock_order[want_lock->id].level; + + if (wl_level > ll_level) { + /* Want lock in higher level, ok */ + return -1; + } else if (wl_level < ll_level) { + /* Want lock in lower level, not ok*/ + return 1; + } else if (locked_lock->id != want_lock->id) { + /* Want different lock id in same level, not ok */ + return 1; + } + + /* Same lock id */ + return compare_same_lock_id_extra(locked_lock, want_lock); +} + static int compare_locked_by_id(lc_locked_lock_t *locked_lock, erts_lc_lock_t *comparand) { if(locked_lock->id < comparand->id) { @@ -755,6 +821,14 @@ static int compare_locked_by_id_extra(lc_locked_lock_t *ll, erts_lc_lock_t *comp if(order) { return order; } + + return compare_same_lock_id_extra(ll, comparand); +} + +static int compare_same_lock_id_extra(lc_locked_lock_t *ll, erts_lc_lock_t *comparand) +{ + ASSERT(ll->id == comparand->id); + if (ll->flags & ERTS_LOCK_FLAGS_PROPERTY_TERM_ORDER) { ASSERT(!is_header(ll->extra) && !is_header(comparand->extra)); return CMP(ll->extra, comparand->extra); @@ -1014,7 +1088,7 @@ erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, erts_lock_options_t options) #endif ll = thr->locked.last; - order = compare_locked_by_id_extra(ll, lck); + order = compare_lock_order(ll, lck); if (order < 0) return 0; @@ -1030,7 +1104,7 @@ erts_lc_trylock_force_busy_flg(erts_lc_lock_t *lck, erts_lock_options_t options) ll = ll->prev; if (!ll) break; - order = compare_locked_by_id_extra(ll, lck); + order = compare_lock_order(ll, lck); } while (order >= 0); #ifndef ERTS_LC_ALLWAYS_FORCE_BUSY_TRYLOCK_ON_LOCK_ORDER_VIOLATION @@ -1078,7 +1152,7 @@ void erts_lc_trylock_flg_x(int locked, erts_lc_lock_t *lck, erts_lock_options_t #endif for (tl_lck = thr->locked.last; tl_lck; tl_lck = tl_lck->prev) { - int order = compare_locked_by_id_extra(tl_lck, lck); + int order = compare_lock_order(tl_lck, lck); if (order <= 0) { if (order == 0 && (tl_lck->lck == lck || !tl_lck->lck)) lock_twice("Trylocking", thr, lck, options); @@ -1199,10 +1273,10 @@ void erts_lc_lock_flg_x(erts_lc_lock_t *lck, erts_lock_options_t options, ASSERT(!thr->locked.first); thr->locked.last = thr->locked.first = new_ll; ASSERT(0 < lck->id && lck->id < ERTS_LOCK_ORDER_SIZE); - thr->matrix.m[lck->id][0] = 1; + thr->matrix.m[lck->id][0] = DIRECT_AFTER; return; } - order = compare_locked_by_id_extra(thr->locked.last, lck); + order = compare_lock_order(thr->locked.last, lck); if (order < 0) { lc_locked_lock_t* ll; if (LOCK_IS_TYPE_ORDER_VIOLATION(lck->flags, thr->locked.last->flags)) { @@ -1211,10 +1285,10 @@ void erts_lc_lock_flg_x(erts_lc_lock_t *lck, erts_lock_options_t options, ASSERT(0 < lck->id && lck->id < ERTS_LOCK_ORDER_SIZE); ll = thr->locked.last; - thr->matrix.m[lck->id][ll->id] |= 1; + thr->matrix.m[lck->id][ll->id] |= DIRECT_AFTER; for (ll = ll->prev; ll; ll = ll->prev) { ASSERT(0 < ll->id && ll->id < ERTS_LOCK_ORDER_SIZE); - thr->matrix.m[lck->id][ll->id] |= 2; + thr->matrix.m[lck->id][ll->id] |= INDIRECT_AFTER; } new_ll->prev = thr->locked.last; @@ -1372,10 +1446,37 @@ erts_lc_destroy_lock(erts_lc_lock_t *lck) void erts_lc_init(void) { + int i, j, level; if (ethr_spinlock_init(&lc_threads_lock) != 0) ERTS_INTERNAL_ERROR("spinlock_init failed"); erts_tsd_key_create(&locks_key,"erts_lock_check_key"); + + /* Assert no duplicate lock names */ + for (i=0; i < ERTS_LOCK_ORDER_SIZE; i++) { + if (erts_lock_order[i].name) { + for (j = i + 1; j < ERTS_LOCK_ORDER_SIZE; j++) { + if (erts_lock_order[j].name) { + ERTS_ASSERT(sys_strcmp(erts_lock_order[i].name, + erts_lock_order[j].name) + != 0); + } + } + } + } + + /* Initialize lock levels */ + level = 0; + for (i = 0; i < ERTS_LOCK_ORDER_SIZE; i++) { + if (erts_lock_order[i].name) { + erts_lock_order[i].level = level; + } + else { + /* level separator */ + ASSERT(erts_lock_order[i].internal_order == NULL); + ++level; + } + } } void @@ -1412,6 +1513,16 @@ static void collect_matrix(lc_matrix_t* matrix) Eterm erts_lc_dump_graph(void) { + static const char comment[] = + "% This file was generated by erts_debug:lc_graph()\n" + "% It contains the recorded locking order from a running beam.\n" + "% Example to merge several files and generate a viewable graph:\n" + "%\n" + "% 1> erts_debug:lc_graph_merge(\"lc_graph\", \"lc_graph.*\").\n" + "% 2> erts_debug:lc_graph_to_dot(\"lc_graph.dot\", \"lc_graph\").\n" + "%\n" + "% $> dot -Tsvg -Nshape=box -Grankdir=LR -Granksep=2 lc_graph.dot > lc_graph.svg\n" + "\n"; const char* basename = "lc_graph."; char filename[40]; lc_matrix_t* tot = &tot_lc_matrix; @@ -1433,18 +1544,26 @@ erts_lc_dump_graph(void) return am_error; for (i = 1; i < ERTS_LOCK_ORDER_SIZE; i++) { - int len = strlen(erts_lock_order[i].name); + int len; + if (!erts_lock_order[i].name) + continue; + + len = strlen(erts_lock_order[i].name); if (name_max < len) name_max = len; } - fputs("%This file was generated by erts_debug:lc_graph()\n\n", ff); + fputs(comment, ff); + + fputs("%{ThisLockName, ThisLockId, LockedDirectlyBeforeThis, LockedIndirectlyBeforeThis}\n", ff); fprintf(ff, "[{%*s, %2d}", name_max, "\"NO LOCK\"", 0); for (i = 1; i < ERTS_LOCK_ORDER_SIZE; i++) { char* delim = ""; + if (!erts_lock_order[i].name) + continue; fprintf(ff, ",\n {%*s, %2d, [", name_max, erts_lock_order[i].name, i); for (j = 0; j < ERTS_LOCK_ORDER_SIZE; j++) { - if (tot->m[i][j] & 1) { + if (tot->m[i][j] & DIRECT_AFTER) { fprintf(ff, "%s%d", delim, j); delim = ","; } @@ -1452,7 +1571,7 @@ erts_lc_dump_graph(void) fprintf(ff, "], ["); delim = ""; for (j = 0; j < ERTS_LOCK_ORDER_SIZE; j++) { - if (tot->m[i][j] == 2) { + if (tot->m[i][j] == INDIRECT_AFTER) { fprintf(ff, "%s%d", delim, j); delim = ","; } diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c index bdbd10d22234..541d3c1220c2 100644 --- a/erts/emulator/beam/erl_map.c +++ b/erts/emulator/beam/erl_map.c @@ -1656,7 +1656,7 @@ static BIF_RETTYPE hashmap_merge(Process *p, Eterm map_A, Eterm map_B, sp->abm = 0xffff; break; } - case HAMT_SUBTAG_HEAD_BITMAP: sp->srcA++; + case HAMT_SUBTAG_HEAD_BITMAP: sp->srcA++; ERTS_FALLTHROUGH(); case HAMT_SUBTAG_NODE_BITMAP: { ASSERT(ctx->lvl < HAMT_MAX_LEVEL); sp->abm = MAP_HEADER_VAL(hdrA); @@ -1693,7 +1693,7 @@ static BIF_RETTYPE hashmap_merge(Process *p, Eterm map_A, Eterm map_B, sp->bbm = 0xffff; break; } - case HAMT_SUBTAG_HEAD_BITMAP: sp->srcB++; + case HAMT_SUBTAG_HEAD_BITMAP: sp->srcB++; ERTS_FALLTHROUGH(); case HAMT_SUBTAG_NODE_BITMAP: { ASSERT(ctx->lvl < HAMT_MAX_LEVEL); sp->bbm = MAP_HEADER_VAL(hdrB); @@ -2329,6 +2329,7 @@ Uint hashmap_node_size(Eterm hdr, Eterm **nodep) break; case HAMT_SUBTAG_HEAD_BITMAP: if (nodep) ++*nodep; + ERTS_FALLTHROUGH(); case HAMT_SUBTAG_NODE_BITMAP: sz = hashmap_bitcount(MAP_HEADER_VAL(hdr)); ASSERT(sz < 17); @@ -2711,6 +2712,7 @@ Eterm erts_hashmap_insert_up(Eterm *hp, Eterm key, Eterm value, /* subnodes, fake it */ fake = node; node = make_boxed(&fake); + ERTS_FALLTHROUGH(); case TAG_PRIMARY_BOXED: ptr = boxed_val(node); hdr = *ptr; @@ -3442,6 +3444,7 @@ BIF_RETTYPE erts_internal_map_hashmap_children_1(BIF_ALIST_1) { BIF_ERROR(BIF_P, BADARG); case HAMT_SUBTAG_HEAD_BITMAP: ptr++; + ERTS_FALLTHROUGH(); case HAMT_SUBTAG_NODE_BITMAP: ptr++; sz = hashmap_bitcount(MAP_HEADER_VAL(hdr)); diff --git a/erts/emulator/beam/erl_message.c b/erts/emulator/beam/erl_message.c index 6104858d54d4..3cb6b0a3da16 100644 --- a/erts/emulator/beam/erl_message.c +++ b/erts/emulator/beam/erl_message.c @@ -170,14 +170,6 @@ erts_cleanup_offheap_list(struct erl_off_heap_header* first) case BIN_REF_SUBTAG: erts_bin_release(u.br->val); break; - case FUN_REF_SUBTAG: - /* The pointer to the fun entry can be NULL if loading - * was aborted because of an invalid BEAM file. */ - if (u.fref->entry && - erts_refc_dectest(&(u.fref->entry)->refc, 0) == 0) { - erts_erase_fun_entry(u.fref->entry); - } - break; case REF_SUBTAG: ASSERT(is_magic_ref_thing(u.hdr)); erts_bin_release((Binary *)u.mref->mb); @@ -1517,7 +1509,7 @@ void erts_factory_trim_and_close(ErtsHeapFactory* factory, /*else we don't trim multi fragmented messages for now (off_heap...) */ break; } - /* Fall through... */ + ERTS_FALLTHROUGH(); } case FACTORY_HEAP_FRAGS: bp = factory->heap_frags; diff --git a/erts/emulator/beam/erl_monitor_link.c b/erts/emulator/beam/erl_monitor_link.c index 85d880dda354..59506b10510c 100644 --- a/erts/emulator/beam/erl_monitor_link.c +++ b/erts/emulator/beam/erl_monitor_link.c @@ -894,7 +894,8 @@ erts_monitor_create(Uint16 type, Eterm ref, Eterm orgn, Eterm trgt, Eterm name, mdp->u.target.type = type; erts_atomic32_init_nob(&mdp->refc, 2); break; - } + } /* end of "if (is_nil(name))"" */ + ERTS_FALLTHROUGH(); case ERTS_MON_TYPE_DIST_PROC: case ERTS_MON_TYPE_DIST_PORT: case ERTS_MON_TYPE_RESOURCE: diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c index c6d00f312d81..6c40b8290a8b 100644 --- a/erts/emulator/beam/erl_nif.c +++ b/erts/emulator/beam/erl_nif.c @@ -1352,7 +1352,7 @@ int enif_inspect_binary(ErlNifEnv* env, Eterm bin_term, ErlNifBinary* bin) env->tmp_obj_list = tmp_obj; bin->data = (byte*)&tmp_obj[1]; - erts_copy_bits(base, offset, 1, bin->data, 0, 1, size); + erts_copy_bits_fwd(base, offset, bin->data, 0, size); } else { bin->data = &base[BYTE_OFFSET(offset)]; } @@ -1799,9 +1799,9 @@ int enif_get_atom(ErlNifEnv* env, Eterm atom, char* buf, unsigned len, return 0; } if (ap->latin1_chars == ap->len) { - sys_memcpy(buf, ap->name, ap->len); + sys_memcpy(buf, erts_atom_get_name(ap), ap->len); } else { - int dlen = erts_utf8_to_latin1((byte*)buf, ap->name, ap->len); + int dlen = erts_utf8_to_latin1((byte*)buf, erts_atom_get_name(ap), ap->len); ASSERT(dlen == ap->latin1_chars); (void)dlen; } buf[ap->latin1_chars] = '\0'; @@ -1810,7 +1810,7 @@ int enif_get_atom(ErlNifEnv* env, Eterm atom, char* buf, unsigned len, if (ap->len >= len) { return 0; } - sys_memcpy(buf, ap->name, ap->len); + sys_memcpy(buf, erts_atom_get_name(ap), ap->len); buf[ap->len] = '\0'; return ap->len + 1; } @@ -2707,10 +2707,10 @@ ErlNifResourceType* open_resource_type(ErlNifEnv* env, ort->type = type; sys_memzero(&ort->new_callbacks, sizeof(ErlNifResourceTypeInit)); switch (init_members) { - case 4: ort->new_callbacks.dyncall = init->dyncall; - case 3: ort->new_callbacks.down = init->down; - case 2: ort->new_callbacks.stop = init->stop; - case 1: ort->new_callbacks.dtor = init->dtor; + case 4: ort->new_callbacks.dyncall = init->dyncall; ERTS_FALLTHROUGH(); + case 3: ort->new_callbacks.down = init->down; ERTS_FALLTHROUGH(); + case 2: ort->new_callbacks.stop = init->stop; ERTS_FALLTHROUGH(); + case 1: ort->new_callbacks.dtor = init->dtor; ERTS_FALLTHROUGH(); case 0: break; default: @@ -4480,8 +4480,8 @@ void erts_print_nif_taints(fmtfn_t to, void* to_arg) t = (struct tainted_module_t*) erts_atomic_read_nob(&first_taint); for ( ; t; t = t->next) { - const Atom* atom = atom_tab(atom_val(t->module_atom)); - erts_cbprintf(to,to_arg,"%s%.*s", delim, atom->len, atom->name); + Atom* atom = atom_tab(atom_val(t->module_atom)); + erts_cbprintf(to,to_arg,"%s%.*s", delim, atom->len, erts_atom_get_name(atom)); delim = ","; } erts_cbprintf(to,to_arg,"\n"); diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index a249ecb538e5..0ff3a0e36f4a 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -1570,7 +1570,6 @@ insert_offheap(ErlOffHeap *oh, int type, Eterm id) } break; case BIN_REF_SUBTAG: - case FUN_REF_SUBTAG: break; /* No need to */ default: ASSERT(is_external_header(u.hdr->thing_word)); @@ -2176,7 +2175,7 @@ setup_reference_table(void) } /* Insert all ets tables */ - erts_db_foreach_table(insert_ets_table, NULL, 0); + erts_db_foreach_table(insert_ets_table, NULL, false); erts_db_foreach_thr_prgr_offheap(insert_ets_offheap_thr_prgr, NULL); /* Insert all bif timers */ diff --git a/erts/emulator/beam/erl_printf_term.c b/erts/emulator/beam/erl_printf_term.c index fecbbc593b98..4de770869a0a 100644 --- a/erts/emulator/beam/erl_printf_term.c +++ b/erts/emulator/beam/erl_printf_term.c @@ -184,26 +184,42 @@ static int is_printable_ascii(byte* bytep, Uint bytesize, Uint bitoffs) } /* - * Helper function for print_atom_name(). Not generally useful. + * Helper function for print_atom_name() that decodes Utf8. After decoding a + * valid character, the offset is updated to point to the next character. size + * is only used for debugging. */ -static ERTS_INLINE int latin1_char(int c1, int c2) +static ERTS_INLINE int utf8_decode(const byte *text, int *offset, int size) { - if ((c1 & 0x80) == 0) { - /* Plain old 7-bit ASCII. */ - return c1; - } else if ((c1 & 0xE0) == 0xC0) { - /* Unicode code points from 0x80 through 0x7FF. */ - ASSERT((c2 & 0xC0) == 0x80); - return (c1 & 0x1F) << 6 | (c2 & 0x3F); - } else if ((c1 & 0xC0) == 0x80) { - /* A continutation byte in a utf8 sequence. Pretend that it is - * a character that is allowed in an atom. */ - return 'a'; + int component = text[*offset]; + int codepoint = 0; + int length = 0; + + if ((component & 0x80) == 0) { + codepoint = component; + length = 1; + } else if ((component & 0xE0) == 0xC0) { + codepoint = component & 0x1F; + length = 2; + } else if ((component & 0xF0) == 0xE0) { + codepoint = component & 0x0F; + length = 3; } else { - /* The start of a utf8 sequence comprising three or four - * bytes. Always needs quoting. */ - return 0; + ASSERT((component & 0xF8) == 0xF0); + codepoint = component & 0x07; + length = 4; + } + + /* Assert that there are enough bytes for decoding */ + ASSERT(*offset + length <= size); + + for (int i = 1; i < length; i++) { + component = text[*offset + i]; + ASSERT((component & 0xC0) == 0x80); + codepoint = (codepoint << 6) | (component & 0x3F); } + + *offset += length; + return codepoint; } /* @@ -215,34 +231,38 @@ static ERTS_INLINE int latin1_char(int c1, int c2) */ static int print_atom_name(fmtfn_t fn, void* arg, Eterm atom, long *dcount) { - int n, i; - int res; + int length, index; + const Atom *entry; + int result; int need_quote; - int pos; - byte *s; - byte *cpos; - int c; - int lc; + int position; + const byte *s; + int codepoint; - res = 0; - i = atom_val(atom); + result = 0; + index = atom_val(atom); + entry = NULL; - if ((i < 0) || (i >= atom_table_size()) || (atom_tab(i) == NULL)) { - PRINT_STRING(res, fn, arg, "'); - return res; + if ((index > 0) || (index <= atom_table_size()) ) { + entry = atom_tab(index); + } + + if (entry == NULL) { + PRINT_STRING(result, fn, arg, "'); + return result; } - s = atom_tab(i)->name; - n = atom_tab(i)->len; + s = erts_atom_get_name(entry); + length = entry->len; - *dcount -= atom_tab(i)->len; + *dcount -= entry->len; - if (n == 0) { + if (length == 0) { /* The empty atom: '' */ - PRINT_STRING(res, fn, arg, "''"); - return res; + PRINT_STRING(result, fn, arg, "''"); + return result; } /* @@ -256,22 +276,12 @@ static int print_atom_name(fmtfn_t fn, void* arg, Eterm atom, long *dcount) * the Latin-1 code block or the character '_'. */ - need_quote = 0; - cpos = s; - pos = n - 1; - c = *cpos++; - lc = latin1_char(c, *cpos); - if (!IS_LOWER(lc)) - need_quote++; - else { - while (pos--) { - c = *cpos++; - lc = latin1_char(c, *cpos); - if (!IS_ALNUM(lc) && lc != '_') { - need_quote++; - break; - } - } + position = 0; + codepoint = utf8_decode(s, &position, length); + need_quote = !IS_LOWER(codepoint); + while (position < length && !need_quote) { + codepoint = utf8_decode(s, &position, length); + need_quote = !IS_ALNUM(codepoint) && codepoint != '_'; } /* @@ -281,62 +291,36 @@ static int print_atom_name(fmtfn_t fn, void* arg, Eterm atom, long *dcount) * be specially printed. Therefore, we must do a partial * decoding of the utf8 encoding. */ - cpos = s; - pos = n; + position = 0; if (need_quote) - PRINT_CHAR(res, fn, arg, '\''); - while(pos--) { - c = *cpos++; - switch(c) { - case '\'': PRINT_STRING(res, fn, arg, "\\'"); break; - case '\\': PRINT_STRING(res, fn, arg, "\\\\"); break; - case '\n': PRINT_STRING(res, fn, arg, "\\n"); break; - case '\f': PRINT_STRING(res, fn, arg, "\\f"); break; - case '\t': PRINT_STRING(res, fn, arg, "\\t"); break; - case '\r': PRINT_STRING(res, fn, arg, "\\r"); break; - case '\b': PRINT_STRING(res, fn, arg, "\\b"); break; - case '\v': PRINT_STRING(res, fn, arg, "\\v"); break; - default: - if (c < ' ') { - /* ASCII control character (0-31). */ - PRINT_CHAR(res, fn, arg, '\\'); - PRINT_UWORD(res, fn, arg, 'o', 1, 3, (ErlPfUWord) c); - } else if (c >= 0x80) { - /* A multi-byte utf8-encoded code point. Determine the - * length of the sequence. */ - int n; - if ((c & 0xE0) == 0xC0) { - n = 2; - } else if ((c & 0xF0) == 0xE0) { - n = 3; - } else { - ASSERT((c & 0xF8) == 0xF0); - n = 4; - } - ASSERT(pos - n + 1 >= 0); - - if (c == 0xC2 && *cpos < 0xA0) { - /* Extended ASCII control character (128-159). */ - ASSERT(pos > 0); - ASSERT(0x80 <= *cpos); - PRINT_CHAR(res, fn, arg, '\\'); - PRINT_UWORD(res, fn, arg, 'o', 1, 3, (ErlPfUWord) *cpos); - pos--, cpos++; - } else { - PRINT_BUF(res, fn, arg, cpos-1, n); - cpos += n - 1; - pos -= n - 1; - } + PRINT_CHAR(result, fn, arg, '\''); + + while(position < length) { + int cp_start = position; + codepoint = utf8_decode(s, &position, length); + switch(codepoint) { + case '\'': PRINT_STRING(result, fn, arg, "\\'"); break; + case '\\': PRINT_STRING(result, fn, arg, "\\\\"); break; + case '\n': PRINT_STRING(result, fn, arg, "\\n"); break; + case '\f': PRINT_STRING(result, fn, arg, "\\f"); break; + case '\t': PRINT_STRING(result, fn, arg, "\\t"); break; + case '\r': PRINT_STRING(result, fn, arg, "\\r"); break; + case '\b': PRINT_STRING(result, fn, arg, "\\b"); break; + case '\v': PRINT_STRING(result, fn, arg, "\\v"); break; + default: + if (codepoint < 32 || (codepoint >= 128 && codepoint <= 159)) { + /* ASCII control character (0-31) or extended ASCII control character (128-159)*/ + PRINT_CHAR(result, fn, arg, '\\'); + PRINT_UWORD(result, fn, arg, 'o', 1, 3, (ErlPfUWord) codepoint); } else { - /* Printable ASCII character. */ - PRINT_CHAR(res, fn, arg, (char) c); + PRINT_BUF(result, fn, arg, &s[cp_start], position - cp_start); } - break; - } + break; + } } if (need_quote) - PRINT_CHAR(res, fn, arg, '\''); - return res; + PRINT_CHAR(result, fn, arg, '\''); + return result; } #define PRT_BAR ((Eterm) 0) @@ -653,11 +637,11 @@ print_term(fmtfn_t fn, void* arg, Eterm obj, long *dcount) { ErlFunThing *funp = (ErlFunThing *) fun_val(wobj); if (is_local_fun(funp)) { - ErlFunEntry *fe = funp->entry.fun; + const ErlFunEntry *fe = funp->entry.fun; Atom *ap = atom_tab(atom_val(fe->module)); PRINT_STRING(res, fn, arg, "#Fun<"); - PRINT_BUF(res, fn, arg, ap->name, ap->len); + PRINT_BUF(res, fn, arg, erts_atom_get_name(ap), ap->len); PRINT_CHAR(res, fn, arg, '.'); PRINT_SWORD(res, fn, arg, 'd', 0, 1, (ErlPfSWord) fe->old_index); @@ -666,7 +650,7 @@ print_term(fmtfn_t fn, void* arg, Eterm obj, long *dcount) { (ErlPfSWord) fe->old_uniq); PRINT_CHAR(res, fn, arg, '>'); } else { - Export* ep = funp->entry.exp; + const Export *ep = funp->entry.exp; long tdcount; int tres; @@ -773,9 +757,6 @@ print_term(fmtfn_t fn, void* arg, Eterm obj, long *dcount) { case BIN_REF_DEF: PRINT_STRING(res, fn, arg, "#BinRef"); break; - case FUN_REF_DEF: - PRINT_STRING(res, fn, arg, "#FunRef"); - break; default: PRINT_STRING(res, fn, arg, "sig_qs.flags & (FS_MON_MSGQ_LEN|FS_MON_MSGQ_LEN_LONG)) - == FS_MON_MSGQ_LEN) - && proc->sig_qs.mq_len >= erts_system_monitor_long_msgq_on) { - proc->sig_qs.flags |= FS_MON_MSGQ_LEN_LONG; - monitor_generic(proc, am_long_message_queue, am_true); + if ((proc->sig_qs.flags & FS_MON_MSGQ_LEN_HIGH) + && proc->sig_qs.mq_len >= (Sint)erts_system_monitor_long_msgq_on) { + monitor_long_msgq_on(proc); } } ERTS_GLB_INLINE void erts_chk_sys_mon_long_msgq_off(Process *proc) { - if (((proc->sig_qs.flags & (FS_MON_MSGQ_LEN|FS_MON_MSGQ_LEN_LONG)) - == (FS_MON_MSGQ_LEN|FS_MON_MSGQ_LEN_LONG)) + if ((proc->sig_qs.flags & FS_MON_MSGQ_LEN_LOW) && proc->sig_qs.mq_len <= erts_system_monitor_long_msgq_off) { - proc->sig_qs.flags &= ~FS_MON_MSGQ_LEN_LONG; - monitor_generic(proc, am_long_message_queue, am_false); + monitor_long_msgq_off(proc); } } diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index 230e4437cfd6..0798b8ea650b 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -111,9 +111,6 @@ #define ERTS_EMPTY_RUNQ(RQ) \ ERTS_IS_RUNQ_EMPTY_FLGS(ERTS_RUNQ_FLGS_GET_NOB((RQ))) -#define ERTS_EMPTY_RUNQ_PORTS(RQ) \ - ERTS_IS_RUNQ_EMPTY_FLGS(ERTS_RUNQ_FLGS_GET_NOB((RQ))) - static ERTS_INLINE int runq_got_work_to_execute_flags(Uint32 flags) { @@ -424,13 +421,25 @@ static ErtsAlignedBlockPollThreadData *ERTS_WRITE_UNLIKELY(block_poll_thread_dat static Uint last_reductions; static Uint last_exact_reductions; -Eterm ERTS_WRITE_UNLIKELY(erts_system_monitor); -Eterm ERTS_WRITE_UNLIKELY(erts_system_monitor_long_gc); + +/* + * Cached lowest limits for fast check if any trace sessions are interested + * in a particular system_monitor limit. Zero means limit disabled. + */ +Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_gc); Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_schedule); -Eterm ERTS_WRITE_UNLIKELY(erts_system_monitor_large_heap); -Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_on); +Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_large_heap); +Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_on); + +/* The highest msgq_off threshold of any trace session, -1 if disabled */ Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_off); -struct erts_system_monitor_flags_t erts_system_monitor_flags; + +/* + * The number of trace sessions that are interested in a particular + * system_monitor event. + */ +Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_busy_port_cnt); +Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_busy_dist_port_cnt); /* system performance monitor */ Eterm erts_system_profile; @@ -517,21 +526,6 @@ do { \ } \ } while (0) -#define ERTS_FOREACH_OP_RUNQ(RQVAR, DO) \ -do { \ - ErtsRunQueue *RQVAR; \ - int ix__; \ - int online__ = (int) schdlr_sspnd_get_nscheds(&schdlr_sspnd.online, \ - ERTS_SCHED_NORMAL); \ - ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&schdlr_sspnd.mtx)); \ - for (ix__ = 0; ix__ < online__; ix__++) { \ - RQVAR = ERTS_RUNQ_IX(ix__); \ - erts_runq_lock(RQVAR); \ - { DO; } \ - erts_runq_unlock(RQVAR); \ - } \ -} while (0) - #define ERTS_ATOMIC_FOREACH_RUNQ_X(RQVAR, NRQS, DO, DOX) \ do { \ ErtsRunQueue *RQVAR; \ @@ -9277,8 +9271,9 @@ erts_suspend(Process* c_p, ErtsProcLocks c_p_locks, Port *busy_port) if (!(c_p_locks & ERTS_PROC_LOCK_STATUS)) erts_proc_unlock(c_p, ERTS_PROC_LOCK_STATUS); - if (suspend && busy_port && erts_system_monitor_flags.busy_port) - monitor_generic(c_p, am_busy_port, busy_port->common.id); + if (suspend && busy_port && erts_system_monitor_busy_port_cnt) { + monitor_busy_port(c_p, busy_port->common.id); + } } void @@ -9588,7 +9583,7 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls) state = erts_atomic32_read_nob(&p->state); if ((state & ERTS_PSFLG_MSG_SIG_IN_Q) - && ((p->sig_qs.flags & FS_MON_MSGQ_LEN) + && ((p->sig_qs.flags & (FS_MON_MSGQ_LEN_HIGH | FS_MON_MSGQ_LEN_LOW)) || ERTS_MSG_RECV_TRACED(p)) && !(p->sig_qs.flags & FS_FLUSHING_SIGS)) { if (!(state & (ERTS_PSFLG_ACTIVE|ERTS_PSFLG_ACTIVE_SYS))) { @@ -10045,7 +10040,7 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls) erts_runq_unlock(rq); erts_proc_lock(p, (ERTS_PROC_LOCK_MAIN | ERTS_PROC_LOCK_MSGQ)); - if (((p->sig_qs.flags & FS_MON_MSGQ_LEN) + if (((p->sig_qs.flags & (FS_MON_MSGQ_LEN_HIGH|FS_MON_MSGQ_LEN_LOW)) || ERTS_MSG_RECV_TRACED(p)) && !(p->sig_qs.flags & FS_FLUSHING_SIGS)) { erts_proc_sig_fetch(p); @@ -10084,13 +10079,15 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls) erts_proc_lock(p, ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_STATUS); - if (erts_system_monitor_long_msgq_off < 0) { - if (p->sig_qs.flags & FS_MON_MSGQ_LEN) - p->sig_qs.flags &= ~(FS_MON_MSGQ_LEN|FS_MON_MSGQ_LEN_LONG); + if (!erts_system_monitor_long_msgq_on) { + erts_clear_all_msgq_low_sessions(p); + p->sig_qs.flags &= ~FS_MON_MSGQ_LEN_HIGH; } else { - if (!(p->sig_qs.flags & FS_MON_MSGQ_LEN)) - p->sig_qs.flags |= FS_MON_MSGQ_LEN; + if (p->sig_qs.flags & FS_MON_MSGQ_LEN_LOW) { + erts_consolidate_all_msgq_low_sessions(p); + } + p->sig_qs.flags |= FS_MON_MSGQ_LEN_HIGH; } state = erts_atomic32_read_nob(&p->state); @@ -13275,36 +13272,39 @@ delete_process(Process* p) /* free all pending messages */ erts_proc_sig_cleanup_queues(p); - scb = ERTS_PROC_SET_SAVED_CALLS_BUF(p, NULL); + /* Cleanup psd */ - if (scb) { + psd = (ErtsPSD *) erts_atomic_read_nob(&p->psd); + if (psd) { + scb = ERTS_PROC_SET_SAVED_CALLS_BUF(p, NULL); + + if (scb) { #ifndef BEAMASM - p->fcalls += CONTEXT_REDS; /* Reduction counting depends on this... */ + p->fcalls += CONTEXT_REDS; /* Reduction counting depends on this... */ #endif - erts_free(ERTS_ALC_T_CALLS_BUF, (void *) scb); - } - - pbt = ERTS_PROC_SET_CALL_TIME(p, NULL); - while (pbt) { - process_breakpoint_trace_t *next = pbt->next; - erts_free(ERTS_ALC_T_BPD, (void *) pbt); - pbt = next; - } - pbt = ERTS_PROC_SET_CALL_MEMORY(p, NULL); - while (pbt) { - process_breakpoint_trace_t *next = pbt->next; - erts_free(ERTS_ALC_T_BPD, (void *) pbt); - pbt = next; - } + erts_free(ERTS_ALC_T_CALLS_BUF, (void *) scb); + } - erts_destroy_nfunc(p); + pbt = ERTS_PROC_SET_CALL_TIME(p, NULL); + while (pbt) { + process_breakpoint_trace_t *next = pbt->next; + erts_free(ERTS_ALC_T_BPD, (void *) pbt); + pbt = next; + } + pbt = ERTS_PROC_SET_CALL_MEMORY(p, NULL); + while (pbt) { + process_breakpoint_trace_t *next = pbt->next; + erts_free(ERTS_ALC_T_BPD, (void *) pbt); + pbt = next; + } - /* Cleanup psd */ + erts_destroy_nfunc(p); - psd = (ErtsPSD *) erts_atomic_read_nob(&p->psd); + if (psd->data[ERTS_PSD_SYSMON_MSGQ_LEN_LOW]) { + erts_clear_all_msgq_low_sessions(p); + } - if (psd) { erts_atomic_set_nob(&p->psd, (erts_aint_t) NULL); /* Reduction counting depends on this... */ erts_free(ERTS_ALC_T_PSD, psd); } @@ -14163,6 +14163,7 @@ erts_continue_exit_process(Process *p) trap_state->phase = ERTS_CONTINUE_EXIT_BLCKD_MSHED; if (reds <= 0) goto yield; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_BLCKD_MSHED: if (p->flags & F_HAVE_BLCKD_MSCHED) { @@ -14183,6 +14184,7 @@ erts_continue_exit_process(Process *p) trap_state->phase = ERTS_CONTINUE_EXIT_BLCKD_NMSHED; if (reds <= 0) goto yield; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_BLCKD_NMSHED: if (p->flags & F_HAVE_BLCKD_NMSCHED) { @@ -14204,6 +14206,7 @@ erts_continue_exit_process(Process *p) trap_state->yield_state = NULL; trap_state->phase = ERTS_CONTINUE_EXIT_USING_DB; if (reds <= 0) goto yield; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_USING_DB: if (p->flags & F_USING_DB) { @@ -14213,6 +14216,7 @@ erts_continue_exit_process(Process *p) } trap_state->phase = ERTS_CONTINUE_EXIT_CLEAN_SYS_TASKS; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_CLEAN_SYS_TASKS: state = erts_atomic32_read_acqb(&p->state); @@ -14248,6 +14252,7 @@ erts_continue_exit_process(Process *p) } trap_state->phase = ERTS_CONTINUE_EXIT_FREE; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_FREE: #ifdef DEBUG @@ -14322,6 +14327,7 @@ erts_continue_exit_process(Process *p) erts_proc_unlock(p, ERTS_PROC_LOCKS_ALL_MINOR); curr_locks = ERTS_PROC_LOCK_MAIN; trap_state->phase = ERTS_CONTINUE_EXIT_CLEAN_SYS_TASKS_AFTER; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_CLEAN_SYS_TASKS_AFTER: /* * It might show up signal prio elevation tasks until we @@ -14385,6 +14391,7 @@ erts_continue_exit_process(Process *p) trap_state->yield_state = NULL; trap_state->phase = ERTS_CONTINUE_EXIT_LINKS; if (reds <= 0) goto yield; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_LINKS: reds = erts_link_tree_foreach_delete_yielding( @@ -14399,6 +14406,7 @@ erts_continue_exit_process(Process *p) ASSERT(!trap_state->links); trap_state->yield_state = NULL; trap_state->phase = ERTS_CONTINUE_EXIT_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_MONITORS: reds = erts_monitor_tree_foreach_delete_yielding( @@ -14413,6 +14421,7 @@ erts_continue_exit_process(Process *p) ASSERT(!trap_state->monitors); trap_state->yield_state = NULL; trap_state->phase = ERTS_CONTINUE_EXIT_LT_MONITORS; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_LT_MONITORS: reds = erts_monitor_list_foreach_delete_yielding( @@ -14426,6 +14435,7 @@ erts_continue_exit_process(Process *p) ASSERT(!trap_state->lt_monitors); trap_state->phase = ERTS_CONTINUE_EXIT_HANDLE_PROC_SIG; + ERTS_FALLTHROUGH(); case ERTS_CONTINUE_EXIT_HANDLE_PROC_SIG: { Sint r = reds; @@ -14436,6 +14446,7 @@ erts_continue_exit_process(Process *p) reds -= r; trap_state->phase = ERTS_CONTINUE_EXIT_DIST_SEND; + ERTS_FALLTHROUGH(); } case ERTS_CONTINUE_EXIT_DIST_SEND: { @@ -14474,6 +14485,7 @@ erts_continue_exit_process(Process *p) } trap_state->phase = ERTS_CONTINUE_EXIT_DIST_LINKS; + ERTS_FALLTHROUGH(); } case ERTS_CONTINUE_EXIT_DIST_LINKS: { @@ -14490,6 +14502,7 @@ erts_continue_exit_process(Process *p) goto yield; trap_state->phase = ERTS_CONTINUE_EXIT_DIST_MONITORS; + ERTS_FALLTHROUGH(); } case ERTS_CONTINUE_EXIT_DIST_MONITORS: { @@ -14506,6 +14519,7 @@ erts_continue_exit_process(Process *p) goto yield; trap_state->phase = ERTS_CONTINUE_EXIT_DIST_PEND_SPAWN_MONITORS; + ERTS_FALLTHROUGH(); } case ERTS_CONTINUE_EXIT_DIST_PEND_SPAWN_MONITORS: { @@ -14531,6 +14545,7 @@ erts_continue_exit_process(Process *p) goto yield; trap_state->phase = ERTS_CONTINUE_EXIT_DONE; + ERTS_FALLTHROUGH(); } case ERTS_CONTINUE_EXIT_DONE: { erts_aint_t state; diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h index a3fb22b84442..c84104bbaa14 100644 --- a/erts/emulator/beam/erl_process.h +++ b/erts/emulator/beam/erl_process.h @@ -95,7 +95,7 @@ struct saved_calls { int len; int n; int cur; - Export *ct[1]; + const Export *ct[1]; }; extern Export exp_send, exp_receive, exp_timeout; @@ -879,9 +879,10 @@ erts_reset_max_len(ErtsRunQueue *rq, ErtsRunQueueInfo *rqi) #define ERTS_PSD_DIST_ENTRY 8 #define ERTS_PSD_CALL_MEMORY_BP 9 #define ERTS_PSD_TS_EVENT 10 -#define ERTS_PSD_PENDING_SUSPEND 11 /* keep last... */ +#define ERTS_PSD_SYSMON_MSGQ_LEN_LOW 11 +#define ERTS_PSD_PENDING_SUSPEND 12 /* keep last... */ -#define ERTS_PSD_SIZE 12 +#define ERTS_PSD_SIZE 13 typedef struct { void *data[ERTS_PSD_SIZE]; @@ -1575,21 +1576,18 @@ ERTS_GLB_INLINE void erts_heap_frag_shrink(Process* p, Eterm* hp) Eterm* erts_heap_alloc(Process* p, Uint need, Uint xtra); extern erts_rwmtx_t erts_cpu_bind_rwmtx; -/* If any of the erts_system_monitor_* variables are set (enabled), -** erts_system_monitor must be != NIL, to allow testing on just -** the erts_system_monitor_* variables. -*/ -extern Eterm ERTS_WRITE_UNLIKELY(erts_system_monitor); + extern Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_gc); extern Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_schedule); extern Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_large_heap); -extern Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_on); +extern Uint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_on); extern Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_long_msgq_off); +extern Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_busy_port_cnt); +extern Sint ERTS_WRITE_UNLIKELY(erts_system_monitor_busy_dist_port_cnt); struct erts_system_monitor_flags_t { - unsigned int busy_port : 1; - unsigned int busy_dist_port : 1; + bool busy_port; + bool busy_dist_port; }; -extern struct erts_system_monitor_flags_t erts_system_monitor_flags; /* system_profile, same rules as for system_monitor. erts_profile must be != NIL when @@ -1647,8 +1645,8 @@ extern int erts_system_profile_ts_type; #define FS_NON_FETCH_CNT1 (1 << 9) /* First bit of non-fetch signals counter */ #define FS_NON_FETCH_CNT2 (1 << 10)/* Second bit of non-fetch signals counter */ #define FS_NON_FETCH_CNT4 (1 << 11)/* Third bit of non-fetch signals counter */ -#define FS_MON_MSGQ_LEN (1 << 12) /* Monitor of msgq len enabled */ -#define FS_MON_MSGQ_LEN_LONG (1 << 13)/* --"-- and it is currently long */ +#define FS_MON_MSGQ_LEN_HIGH (1 << 12)/* Monitor of msgq high limit for some session(s) */ +#define FS_MON_MSGQ_LEN_LOW (1 << 13)/* Monitor of msgq low limit for some session(s) */ #define FS_NON_FETCH_CNT_MASK \ (FS_NON_FETCH_CNT1|FS_NON_FETCH_CNT2|FS_NON_FETCH_CNT4) diff --git a/erts/emulator/beam/erl_process_dump.c b/erts/emulator/beam/erl_process_dump.c index cf6d03454262..8ab5f7619c72 100644 --- a/erts/emulator/beam/erl_process_dump.c +++ b/erts/emulator/beam/erl_process_dump.c @@ -323,7 +323,7 @@ dump_element(fmtfn_t to, void *to_arg, Eterm x) erts_print(to, to_arg, "H" PTR_FMT, boxed_val(x)); } else if (is_immed(x)) { if (is_atom(x)) { - unsigned char* s = atom_tab(atom_val(x))->name; + const byte* s = erts_atom_get_name(atom_tab(atom_val(x))); int len = atom_tab(atom_val(x))->len; int i; @@ -630,10 +630,6 @@ heap_dump(fmtfn_t to, void *to_arg, Eterm x) } else if (hdr == HEADER_BIN_REF) { dump_bin_ref(to, to_arg, (BinRef*)ptr); *ptr = OUR_NIL; - } else if (hdr == HEADER_FUN_REF) { - const FunRef *fref = (FunRef*)ptr; - erts_print(to, to_arg, "Rf" PTR_FMT "\n", fref->entry); - *ptr = OUR_NIL; } else if (is_external_pid_header(hdr)) { erts_print(to, to_arg, "P%T\n", x); *ptr = OUR_NIL; @@ -762,7 +758,7 @@ dump_externally(fmtfn_t to, void *to_arg, Eterm term) * The crashdump_viewer does not allow inspection of them anyway. */ ErlFunThing* funp = (ErlFunThing *) fun_val(term); - Uint env_size = fun_env_size(funp); + Uint env_size = fun_num_free(funp); Uint i; for (i = 0; i < env_size; i++) { @@ -888,8 +884,9 @@ dump_literals(fmtfn_t to, void *to_arg) erts_print(to, to_arg, "=literals\n"); - for (i = 0; i < ERTS_NUM_GLOBAL_LITERALS; i++) { - ErtsLiteralArea* area = erts_get_global_literal_area(i); + for (ErtsLiteralArea *area = erts_global_literal_iterate_area(NULL); + area != NULL; + area = erts_global_literal_iterate_area(area)) { dump_module_literals(to, to_arg, area); } @@ -905,11 +902,6 @@ dump_literals(fmtfn_t to, void *to_arg) dump_module_literals(to, to_arg, erts_persistent_areas[idx]); } - for (ErtsLiteralArea *lambda_area = erts_get_next_lambda_lit_area(NULL); - lambda_area != NULL; - lambda_area = erts_get_next_lambda_lit_area(lambda_area)) { - dump_module_literals(to, to_arg, lambda_area); - } } static void @@ -986,9 +978,6 @@ dump_module_literals(fmtfn_t to, void *to_arg, ErtsLiteralArea* lit_area) } } else if (w == HEADER_BIN_REF) { dump_bin_ref(to, to_arg, (BinRef*)htop); - } else if (w == HEADER_FUN_REF) { - const FunRef *fref = (FunRef*)htop; - erts_print(to, to_arg, "Rf" PTR_FMT "\n", fref->entry); } else if (is_map_header(w)) { if (is_flatmap_header(w)) { flatmap_t* fmp = (flatmap_t *) flatmap_val(term); @@ -1048,7 +1037,7 @@ dump_module_literals(fmtfn_t to, void *to_arg, ErtsLiteralArea* lit_area) case FUN_SUBTAG: { const ErlFunThing *funp = (ErlFunThing*)htop; - size += fun_env_size(funp); + size += fun_num_free(funp); } break; case MAP_SUBTAG: diff --git a/erts/emulator/beam/erl_ptab.h b/erts/emulator/beam/erl_ptab.h index d5e5da81818c..8753ae9365e2 100644 --- a/erts/emulator/beam/erl_ptab.h +++ b/erts/emulator/beam/erl_ptab.h @@ -49,8 +49,8 @@ typedef struct ErtsTracee_ { ErtsTracerRef *first_ref; } ErtsTracee; -#define ERTS_TRACER_MODULE(T) (CAR(list_val(T))) -#define ERTS_TRACER_STATE(T) (CDR(list_val(T))) +#define ERTS_TRACER_MODULE(T) (is_internal_pid(T) ? am_erl_tracer : CAR(list_val(T))) +#define ERTS_TRACER_STATE(T) (is_internal_pid(T) ? T : CDR(list_val(T))) #define ERTS_P_LINKS(P) ((P)->common.u.alive.links) #define ERTS_P_MONITORS(P) ((P)->common.u.alive.monitors) diff --git a/erts/emulator/beam/erl_term.c b/erts/emulator/beam/erl_term.c index 1e96d8abbe3f..ef832fae8dc8 100644 --- a/erts/emulator/beam/erl_term.c +++ b/erts/emulator/beam/erl_term.c @@ -118,7 +118,6 @@ erts_term_init(void) POS_BIG_SUBTAG, NEG_BIG_SUBTAG, REF_SUBTAG, - FUN_REF_SUBTAG, FUN_SUBTAG, FLOAT_SUBTAG, HEAP_BITS_SUBTAG, diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h index 036dd84979d6..9cff7c3b4992 100644 --- a/erts/emulator/beam/erl_term.h +++ b/erts/emulator/beam/erl_term.h @@ -97,7 +97,7 @@ struct erl_node_; /* Declared in erl_node_tables.h */ * HEADER tags: * * 0000 ARITYVAL - * 0001 FUN_REF | + * 0001 -- FREE -- | * 001x BIGNUM with sign bit | * 0100 REF | * 0101 FUN | THINGS @@ -122,7 +122,7 @@ struct erl_node_; /* Declared in erl_node_tables.h */ * XXX: globally replace XXX_SUBTAG with TAG_HEADER_XXX */ #define ARITYVAL_SUBTAG (0x0 << _TAG_PRIMARY_SIZE) /* TUPLE */ -#define FUN_REF_SUBTAG (0x1 << _TAG_PRIMARY_SIZE) /* FUN_REF */ +/* FREE */ #define _BIG_TAG_MASK (~(0x1 << _TAG_PRIMARY_SIZE) & _TAG_HEADER_MASK) #define _BIG_SIGN_BIT (0x1 << _TAG_PRIMARY_SIZE) #define POS_BIG_SUBTAG (0x2 << _TAG_PRIMARY_SIZE) /* BIGNUM */ @@ -142,7 +142,6 @@ struct erl_node_; /* Declared in erl_node_tables.h */ /* _EXTERNAL_TAG_MASK requires that 0xF is reserved for external terms. */ #define _TAG_HEADER_ARITYVAL (TAG_PRIMARY_HEADER|ARITYVAL_SUBTAG) -#define _TAG_HEADER_FUN_REF (TAG_PRIMARY_HEADER|FUN_REF_SUBTAG) #define _TAG_HEADER_FUN (TAG_PRIMARY_HEADER|FUN_SUBTAG) #define _TAG_HEADER_POS_BIG (TAG_PRIMARY_HEADER|POS_BIG_SUBTAG) #define _TAG_HEADER_NEG_BIG (TAG_PRIMARY_HEADER|NEG_BIG_SUBTAG) @@ -317,8 +316,8 @@ _ET_DECLARE_CHECKED(Uint,header_arity,Eterm) /* Due to an optimization that assumes that the word after the arity word is allocated, one should generally not create tuples of arity - zero. One should instead use the literal that can be obtained by - calling erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE). + zero. One should instead use the literal identified by + ERTS_GLOBAL_LIT_EMPTY_TUPLE. If one really wants to create a zero arityval one should use make_arityval_zero() or make_arityval_unchecked(sz) @@ -395,28 +394,24 @@ _ET_DECLARE_CHECKED(Eterm*,bitstring_val,Eterm) * Since the arity and number of free variables are both limited to 255, we can * fit them both into the header word. * - * 0000000eeeeeeeee aaaaaaaa00010100 environment_size:9, arity:8 + * 0000000keeeeeeee aaaaaaaa00010100 kind:1,environment:8,arity:8 * * Note that the lowest byte contains only the function subtag, and the next * byte after that contains only the arity. This lets us combine the type * and/or arity check into a single comparison without masking, by using 8- or - * 16-bit operations on the header word. - * - * Furthermore, as local funs always have at least one environment variable as - * the `FunRef` is treated as part of the environment, we can distinguish - * them by checking whether the environment size is zero. */ + * 16-bit operations on the header word. */ #define FUN_HEADER_ARITY_OFFS (_HEADER_ARITY_OFFS + 2) #define FUN_HEADER_ENV_SIZE_OFFS (FUN_HEADER_ARITY_OFFS + 8) +#define FUN_HEADER_KIND_OFFS (FUN_HEADER_ENV_SIZE_OFFS + 8) #define MAKE_FUN_HEADER(Arity, NumFree, External) \ (ASSERT((!(External)) || ((NumFree) == 0)), \ (_TAG_HEADER_FUN | \ (((Arity)) << FUN_HEADER_ARITY_OFFS) | \ - (((NumFree + !External)) << FUN_HEADER_ENV_SIZE_OFFS))) + (((NumFree)) << FUN_HEADER_ENV_SIZE_OFFS) | \ + ((!!(External)) << FUN_HEADER_KIND_OFFS))) -#define is_fun_ref(x) \ - (is_boxed((x)) && *boxed_val(x) == HEADER_FUN_REF) #define is_fun_header(x) (((x) & _HEADER_SUBTAG_MASK) == FUN_SUBTAG) #define make_fun(x) make_boxed((Eterm*)(x)) #define is_any_fun(x) (is_boxed((x)) && is_fun_header(*boxed_val((x)))) @@ -517,7 +512,7 @@ _ET_DECLARE_CHECKED(Eterm*,tuple_val,Eterm) Due to an optimization that assumes that the word after the arity word is allocated, one should generally not create tuples of arity zero on heaps. One should instead use the literal that can be - obtained by calling erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE). + obtained by use the literal identified by ERTS_GLOBAL_LIT_EMPTY_TUPLE. */ #define TUPLE1(t,e1) \ ((t)[0] = make_arityval(1), \ @@ -1425,9 +1420,8 @@ _ET_DECLARE_CHECKED(Uint,loader_y_reg_index,Uint) #define BIG_DEF 0xf #define SMALL_DEF 0x10 #define BIN_REF_DEF 0x11 /* not a "real" term */ -#define FUN_REF_DEF 0x12 /* not a "real" term */ -#define FIRST_VACANT_TAG_DEF 0x13 +#define FIRST_VACANT_TAG_DEF 0x12 #if ET_DEBUG ERTS_GLB_INLINE unsigned tag_val_def(Eterm, const char*, unsigned); @@ -1501,7 +1495,6 @@ ERTS_GLB_INLINE unsigned tag_val_def(Eterm x) case (_TAG_HEADER_EXTERNAL_REF >> _TAG_PRIMARY_SIZE): return EXTERNAL_REF_DEF; case (_TAG_HEADER_MAP >> _TAG_PRIMARY_SIZE): return MAP_DEF; case (_TAG_HEADER_BIN_REF >> _TAG_PRIMARY_SIZE): return BIN_REF_DEF; - case (_TAG_HEADER_FUN_REF >> _TAG_PRIMARY_SIZE): return FUN_REF_DEF; case (_TAG_HEADER_HEAP_BITS >> _TAG_PRIMARY_SIZE): return BITSTRING_DEF; case (_TAG_HEADER_SUB_BITS >> _TAG_PRIMARY_SIZE): return BITSTRING_DEF; } diff --git a/erts/emulator/beam/erl_term_hashing.c b/erts/emulator/beam/erl_term_hashing.c index 796dd9574b0c..3ada7f479c2e 100644 --- a/erts/emulator/beam/erl_term_hashing.c +++ b/erts/emulator/beam/erl_term_hashing.c @@ -236,7 +236,7 @@ Uint32 make_hash(Eterm term_arg) if (is_local_fun(funp)) { - ErlFunEntry* fe = funp->entry.fun; + const ErlFunEntry* fe = funp->entry.fun; Uint num_free = fun_num_free(funp); hash = hash * FUNNY_NUMBER10 + num_free; @@ -462,17 +462,17 @@ Uint32 block_hash_final_bytes(byte *buf, ctx->c += full_length; switch(len) { /* all the case statements fall through */ - case 11: ctx->c+=((Uint32)k[10]<<24); - case 10: ctx->c+=((Uint32)k[9]<<16); - case 9 : ctx->c+=((Uint32)k[8]<<8); + case 11: ctx->c+=((Uint32)k[10]<<24); ERTS_FALLTHROUGH(); + case 10: ctx->c+=((Uint32)k[9]<<16); ERTS_FALLTHROUGH(); + case 9 : ctx->c+=((Uint32)k[8]<<8); ERTS_FALLTHROUGH(); /* the first byte of c is reserved for the length */ - case 8 : ctx->b+=((Uint32)k[7]<<24); - case 7 : ctx->b+=((Uint32)k[6]<<16); - case 6 : ctx->b+=((Uint32)k[5]<<8); - case 5 : ctx->b+=k[4]; - case 4 : ctx->a+=((Uint32)k[3]<<24); - case 3 : ctx->a+=((Uint32)k[2]<<16); - case 2 : ctx->a+=((Uint32)k[1]<<8); + case 8 : ctx->b+=((Uint32)k[7]<<24); ERTS_FALLTHROUGH(); + case 7 : ctx->b+=((Uint32)k[6]<<16); ERTS_FALLTHROUGH(); + case 6 : ctx->b+=((Uint32)k[5]<<8); ERTS_FALLTHROUGH(); + case 5 : ctx->b+=k[4]; ERTS_FALLTHROUGH(); + case 4 : ctx->a+=((Uint32)k[3]<<24); ERTS_FALLTHROUGH(); + case 3 : ctx->a+=((Uint32)k[2]<<16); ERTS_FALLTHROUGH(); + case 2 : ctx->a+=((Uint32)k[1]<<8); ERTS_FALLTHROUGH(); case 1 : ctx->a+=k[0]; /* case 0: nothing left to add */ } @@ -1162,7 +1162,7 @@ make_hash2_helper(Eterm term_param, const int can_trap, Eterm* state_mref_write_ ErlFunThing* funp = (ErlFunThing *) fun_val(term); if (is_local_fun(funp)) { - ErlFunEntry* fe = funp->entry.fun; + const ErlFunEntry* fe = funp->entry.fun; ErtsMakeHash2Context_FUN_SUBTAG ctx = { .num_free = fun_num_free(funp), .bptr = NULL}; @@ -1185,7 +1185,7 @@ make_hash2_helper(Eterm term_param, const int can_trap, Eterm* state_mref_write_ term = *ctx.bptr; } } else { - Export *ep = funp->entry.exp; + const Export *ep = funp->entry.exp; UINT32_HASH_2 (ep->info.mfa.arity, @@ -1276,8 +1276,8 @@ make_hash2_helper(Eterm term_param, const int can_trap, Eterm* state_mref_write_ byte *buf = erts_alloc(ERTS_ALC_T_TMP, nr_of_bytes); Uint nr_of_bits_to_copy = ctx.sz*BYTE_BITS+ctx.bitsize; if (can_trap) iterations_until_trap -= iters_for_bin; - erts_copy_bits(ctx.bptr, - ctx.bitoffs, 1, buf, 0, 1, nr_of_bits_to_copy); + erts_copy_bits_fwd(ctx.bptr, ctx.bitoffs, + buf, 0, nr_of_bits_to_copy); hash = block_hash(buf, ctx.sz, con); if (ctx.bitsize > 0) { UINT32_HASH_2(ctx.bitsize, @@ -1312,9 +1312,9 @@ make_hash2_helper(Eterm term_param, const int can_trap, Eterm* state_mref_write_ Uint nr_of_bits_to_copy = MIN(nr_of_bits_left, BINARY_BUF_SIZE_BITS); ctx.done = nr_of_bits_left == nr_of_bits_to_copy; - erts_copy_bits(ctx.bptr + ctx.no_bytes_processed, - ctx.bitoffs, 1, ctx.buf, 0, 1, - nr_of_bits_to_copy); + erts_copy_bits_fwd(ctx.bptr + ctx.no_bytes_processed, + ctx.bitoffs, ctx.buf, 0, + nr_of_bits_to_copy); block_hash_buffer(ctx.buf, bytes_to_process, block_hash_ctx); @@ -1948,7 +1948,7 @@ make_internal_hash(Eterm term, erts_ihash_t salt) if (BIT_OFFSET(offset) != 0) { byte *tmp = (byte*)erts_alloc(ERTS_ALC_T_TMP, NBYTES(size)); - erts_copy_bits(data, offset, 1, tmp, 0, 1, size); + erts_copy_bits_fwd(data, offset, tmp, 0, size); bytes = tmp; } else { bytes = &data[BYTE_OFFSET(offset)]; @@ -1964,12 +1964,12 @@ make_internal_hash(Eterm term, erts_ihash_t salt) value = 0; switch(BYTE_SIZE(size) % sizeof(Uint64[2])) { - case 15: value ^= ((Uint64)bytes[it + 14]) << 0x30; - case 14: value ^= ((Uint64)bytes[it + 13]) << 0x28; - case 13: value ^= ((Uint64)bytes[it + 12]) << 0x20; - case 12: value ^= ((Uint64)bytes[it + 11]) << 0x18; - case 11: value ^= ((Uint64)bytes[it + 10]) << 0x10; - case 10: value ^= ((Uint64)bytes[it + 9]) << 0x08; + case 15: value ^= ((Uint64)bytes[it + 14]) << 0x30; ERTS_FALLTHROUGH(); + case 14: value ^= ((Uint64)bytes[it + 13]) << 0x28; ERTS_FALLTHROUGH(); + case 13: value ^= ((Uint64)bytes[it + 12]) << 0x20; ERTS_FALLTHROUGH(); + case 12: value ^= ((Uint64)bytes[it + 11]) << 0x18; ERTS_FALLTHROUGH(); + case 11: value ^= ((Uint64)bytes[it + 10]) << 0x10; ERTS_FALLTHROUGH(); + case 10: value ^= ((Uint64)bytes[it + 9]) << 0x08; ERTS_FALLTHROUGH(); case 9: value ^= ((Uint64)bytes[it + 8]) << 0x00; { value *= IHASH_C2; @@ -1977,15 +1977,15 @@ make_internal_hash(Eterm term, erts_ihash_t salt) value *= IHASH_C1; hash_beta ^= value; value = 0; - /* !! FALL THROUGH !! */ + ERTS_FALLTHROUGH(); } - case 8: value ^= ((Uint64)bytes[it + 7]) << 0x38; - case 7: value ^= ((Uint64)bytes[it + 6]) << 0x30; - case 6: value ^= ((Uint64)bytes[it + 5]) << 0x28; - case 5: value ^= ((Uint64)bytes[it + 4]) << 0x20; - case 4: value ^= ((Uint64)bytes[it + 3]) << 0x18; - case 3: value ^= ((Uint64)bytes[it + 2]) << 0x10; - case 2: value ^= ((Uint64)bytes[it + 1]) << 0x08; + case 8: value ^= ((Uint64)bytes[it + 7]) << 0x38; ERTS_FALLTHROUGH(); + case 7: value ^= ((Uint64)bytes[it + 6]) << 0x30; ERTS_FALLTHROUGH(); + case 6: value ^= ((Uint64)bytes[it + 5]) << 0x28; ERTS_FALLTHROUGH(); + case 5: value ^= ((Uint64)bytes[it + 4]) << 0x20; ERTS_FALLTHROUGH(); + case 4: value ^= ((Uint64)bytes[it + 3]) << 0x18; ERTS_FALLTHROUGH(); + case 3: value ^= ((Uint64)bytes[it + 2]) << 0x10; ERTS_FALLTHROUGH(); + case 2: value ^= ((Uint64)bytes[it + 1]) << 0x08; ERTS_FALLTHROUGH(); case 1: value ^= ((Uint64)bytes[it + 0]) << 0x00; { value *= IHASH_C1; diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c index c235c036d7bb..c814f81beb17 100644 --- a/erts/emulator/beam/erl_trace.c +++ b/erts/emulator/beam/erl_trace.c @@ -61,13 +61,15 @@ #undef DEBUG_PRINTOUTS #endif +erts_atomic32_t erts_active_bp_index; +erts_atomic32_t erts_staging_bp_index; + /* Pseudo export entries. Never filled in with data, only used to yield unique pointers of the correct type. */ Export exp_send, exp_receive, exp_timeout; static ErtsTracer system_seq_tracer; -static Eterm system_monitor; static Eterm system_profile; static erts_atomic_t system_logger; @@ -301,12 +303,14 @@ static void enqueue_sys_msg_unlocked(enum ErtsSysMsgType type, Eterm from, Eterm to, Eterm msg, - ErlHeapFragment *bp); + ErlHeapFragment *bp, + ErtsTraceSession*); static void enqueue_sys_msg(enum ErtsSysMsgType type, Eterm from, Eterm to, Eterm msg, - ErlHeapFragment *bp); + ErlHeapFragment *bp, + ErtsTraceSession*); static void init_sys_msg_dispatcher(void); static void init_tracer_nif(void); @@ -329,7 +333,6 @@ void erts_init_trace(void) { erts_cpu_timestamp = 0; #endif erts_bif_trace_init(); - erts_system_monitor_clear(NULL); erts_system_profile_clear(NULL); system_seq_tracer = erts_tracer_nil; erts_atomic_init_nob(&system_logger, am_logger); @@ -401,28 +404,42 @@ erts_system_profile_setup_active_schedulers(void) static void exiting_reset(Eterm exiting) { + erts_rwmtx_rwlock(&erts_trace_session_list_lock); erts_rwmtx_rwlock(&sys_trace_rwmtx); - if (exiting == system_monitor) { - system_monitor = NIL; - /* Let the trace message dispatcher clear flags, etc */ + + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (exiting == s->system_monitor.receiver) { + s->system_monitor.receiver = NIL; + /* Let the trace message dispatcher clear flags, etc */ + } } + if (exiting == system_profile) { system_profile = NIL; /* Let the trace message dispatcher clear flags, etc */ } erts_rwmtx_rwunlock(&sys_trace_rwmtx); + erts_rwmtx_rwunlock(&erts_trace_session_list_lock); } void erts_trace_check_exiting(Eterm exiting) { int reset = 0; + erts_rwmtx_rlock(&erts_trace_session_list_lock); erts_rwmtx_rlock(&sys_trace_rwmtx); - if (exiting == system_monitor) - reset = 1; - else if (exiting == system_profile) - reset = 1; + + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (exiting == s->system_monitor.receiver) { + reset = 1; + break; + } + } + + if (exiting == system_profile) + reset = 1; erts_rwmtx_runlock(&sys_trace_rwmtx); + erts_rwmtx_runlock(&erts_trace_session_list_lock); if (reset) exiting_reset(exiting); } @@ -616,19 +633,19 @@ erts_get_new_port_tracing(ErtsTraceSession* session, } void -erts_set_system_monitor(Eterm monitor) +erts_set_system_monitor(ErtsTraceSession *session, Eterm monitor) { erts_rwmtx_rwlock(&sys_trace_rwmtx); - system_monitor = monitor; + session->system_monitor.receiver = monitor; erts_rwmtx_rwunlock(&sys_trace_rwmtx); } Eterm -erts_get_system_monitor(void) +erts_get_system_monitor(ErtsTraceSession *session) { Eterm monitor; erts_rwmtx_rlock(&sys_trace_rwmtx); - monitor = system_monitor; + monitor = session->system_monitor.receiver; erts_rwmtx_runlock(&sys_trace_rwmtx); return monitor; } @@ -1209,7 +1226,7 @@ erts_call_trace(Process* p, ErtsCodeInfo *info, Binary *match_spec, &tnif, TRACE_FUN_ENABLED, am_trace_status, p->common.id)) { default: - case am_remove: *tracer_p = erts_tracer_nil; + case am_remove: *tracer_p = erts_tracer_nil; ERTS_FALLTHROUGH(); case am_discard: return 0; case am_trace: switch (call_enabled_tracer(tracer, @@ -1388,12 +1405,12 @@ trace_proc_spawn(Process *p, Eterm what, Eterm pid, ERTS_ASSERT_TRACER_REFS(&p->common); } -void save_calls(Process *p, Export *e) +void save_calls(Process *p, const Export *e) { if (!ERTS_IS_PROC_SENSITIVE(p)) { struct saved_calls *scb = ERTS_PROC_GET_SAVED_CALLS_BUF(p); if (scb) { - Export **ct = &scb->ct[0]; + const Export **ct = &scb->ct[0]; int len = scb->len; ct[scb->cur] = e; @@ -1455,9 +1472,10 @@ trace_gc(Process *p, Eterm what, Uint size, Eterm msg) erts_thr_progress_unmanaged_continue(dhndl); } -void -monitor_long_schedule_proc(Process *p, const ErtsCodeMFA *in_fp, - const ErtsCodeMFA *out_fp, Uint time) +static void +monitor_long_schedule_proc_session(Process *p, const ErtsCodeMFA *in_fp, + const ErtsCodeMFA *out_fp, Uint time, + ErtsTraceSession *session) { ErlHeapFragment *bp; ErlOffHeap *off_heap; @@ -1501,10 +1519,27 @@ monitor_long_schedule_proc(Process *p, const ErtsCodeMFA *in_fp, hp += 2; msg = TUPLE4(hp, am_monitor, p->common.id, am_long_schedule, list); hp += 5; - enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, + session->system_monitor.receiver, msg, bp, session); } + void -monitor_long_schedule_port(Port *pp, ErtsPortTaskType type, Uint time) +monitor_long_schedule_proc(Process *p, const ErtsCodeMFA *in_fp, + const ErtsCodeMFA *out_fp, Uint time) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (time-1 > s->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE]-1) { + monitor_long_schedule_proc_session(p, in_fp, out_fp, time, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + + +static void +monitor_long_schedule_port_session(Port *pp, ErtsPortTaskType type, Uint time, + ErtsTraceSession *session) { ErlHeapFragment *bp; ErlOffHeap *off_heap; @@ -1547,11 +1582,26 @@ monitor_long_schedule_port(Port *pp, ErtsPortTaskType type, Uint time) hp += 2; msg = TUPLE4(hp, am_monitor, pp->common.id, am_long_schedule, list); hp += 5; - enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, pp->common.id, NIL, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, pp->common.id, + session->system_monitor.receiver, msg, bp, session); } void -monitor_long_gc(Process *p, Uint time) { +monitor_long_schedule_port(Port *pp, ErtsPortTaskType type, Uint time) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (time-1 > s->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE]-1) { + monitor_long_schedule_port_session(pp, type, time, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + + +static void +monitor_long_gc_session(Process *p, Uint time, ErtsTraceSession* session) +{ ErlHeapFragment *bp; ErlOffHeap *off_heap; Uint hsz; @@ -1605,11 +1655,25 @@ monitor_long_gc(Process *p, Uint time) { ASSERT(hp == hp_end); #endif - enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, + session->system_monitor.receiver, msg, bp, session); } void -monitor_large_heap(Process *p) { +monitor_long_gc(Process *p, Uint time) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (time-1 > s->system_monitor.limits[ERTS_SYSMON_LONG_GC]-1) { + monitor_long_gc_session(p, time, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + +static void +monitor_large_heap_session(Process *p, ErtsTraceSession *session) +{ ErlHeapFragment *bp; ErlOffHeap *off_heap; Uint hsz; @@ -1662,11 +1726,25 @@ monitor_large_heap(Process *p) { ASSERT(hp == hp_end); #endif - enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, + session->system_monitor.receiver, msg, bp, session); } void -monitor_generic(Process *p, Eterm type, Eterm spec) { +monitor_large_heap(Process *p, Uint size) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (size-1 > s->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP]-1) { + monitor_large_heap_session(p, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + +static void +monitor_generic(Process *p, Eterm type, Eterm spec, ErtsTraceSession *session) +{ ErlHeapFragment *bp; ErlOffHeap *off_heap; Eterm *hp, msg; @@ -1677,10 +1755,199 @@ monitor_generic(Process *p, Eterm type, Eterm spec) { msg = TUPLE4(hp, am_monitor, p->common.id, type, spec); hp += 5; - enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, NIL, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_SYSMON, p->common.id, + session->system_monitor.receiver, msg, bp, session); +} + +/* + * ERTS_PSD_SYSMON_MSGQ_LEN_LOW + * A trace session where this process have reached the upper msgq limit + * and is "on its way down" to the lower limit. + */ +typedef struct ErtsSysMonMsgqLow { + struct ErtsSysMonMsgqLow *next; + struct ErtsSysMonMsgqLow *prev; + Eterm session_weak_id; +} ErtsSysMonMsgqLow; + +static ErtsSysMonMsgqLow* +get_msgq_low_session(Process *p, ErtsTraceSession *session) +{ + ErtsSysMonMsgqLow *that = + (ErtsSysMonMsgqLow*) erts_psd_get(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW); + + ASSERT(!!that == !!(p->sig_qs.flags & FS_MON_MSGQ_LEN_LOW)); + while (that) { + if (that->session_weak_id == session->weak_id) { + return that; + } + that = that->next; + } + return NULL; +} + +static void +add_msgq_low_session(Process *p, ErtsTraceSession *session) +{ + ErtsSysMonMsgqLow *thiz = erts_alloc(ERTS_ALC_T_HEAP_FRAG, // ToDo type? + sizeof(ErtsSysMonMsgqLow)); + ErtsSysMonMsgqLow *was_first; + + thiz->session_weak_id = session->weak_id; + was_first = erts_psd_set(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW, thiz); + ASSERT(!was_first || !was_first->prev); + + thiz->next = was_first; + thiz->prev = NULL; + if (was_first) { + was_first->prev = thiz; + } + + p->sig_qs.flags |= FS_MON_MSGQ_LEN_LOW; } +static void +remove_msgq_low_session(Process *p, ErtsSysMonMsgqLow *thiz) +{ + ErtsSysMonMsgqLow *was_first; + + if (thiz->prev) { + thiz->prev->next = thiz->next; +#ifdef DEBUG + was_first = erts_psd_get(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW); + ASSERT(was_first && was_first != thiz); +#endif + } + else { + was_first = erts_psd_set(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW, thiz->next); + ASSERT(was_first == thiz); (void)was_first; + if (!thiz->next) { + p->sig_qs.flags &= ~FS_MON_MSGQ_LEN_LOW; + } + } + if (thiz->next) { + thiz->next->prev = thiz->prev; + } + erts_free(ERTS_ALC_T_HEAP_FRAG, thiz); // ToDo type? +} + +void +erts_clear_all_msgq_low_sessions(Process *p) +{ + ErtsSysMonMsgqLow *that, *next; + + that = erts_psd_set(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW, NULL); + while (that) { + next = that->next; + erts_free(ERTS_ALC_T_HEAP_FRAG, that); // ToDo type? + that = next; + } + p->sig_qs.flags &= ~FS_MON_MSGQ_LEN_LOW; +} + +void +erts_consolidate_all_msgq_low_sessions(Process *p) +{ + ErtsSysMonMsgqLow *that, *next; + ErtsTraceSession *s; + + that = (ErtsSysMonMsgqLow*) erts_psd_get(p, ERTS_PSD_SYSMON_MSGQ_LEN_LOW); + while (that) { + next = that->next; + + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (s = &erts_trace_session_0; s; s = s->next) { + if (s->weak_id == that->session_weak_id) { + if (s->system_monitor.long_msgq_off < 0) { + s = NULL; + } + break; + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); + if (!s) { + remove_msgq_low_session(p, that); + } + that = next; + } +} + +void +monitor_long_msgq_on(Process *p) +{ + p->sig_qs.flags &= ~FS_MON_MSGQ_LEN_HIGH; + + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ]) { + ErtsSysMonMsgqLow *low = get_msgq_low_session(p, s); + + if (!low) { + if (p->sig_qs.mq_len >= s->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ]) { + monitor_generic(p, am_long_message_queue, am_true, s); + add_msgq_low_session(p, s); + } + else { + /* still a session with a limit we have not reached */ + p->sig_qs.flags |= FS_MON_MSGQ_LEN_HIGH; + } + } + /* else we have already reached the upper limit for this session */ + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + +void +monitor_long_msgq_off(Process *p) +{ + ASSERT(p->sig_qs.flags & FS_MON_MSGQ_LEN_LOW); + + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + ErtsSysMonMsgqLow *low = get_msgq_low_session(p, s); + + if (low) { + if (p->sig_qs.mq_len <= s->system_monitor.long_msgq_off) { + monitor_generic(p, am_long_message_queue, am_false, s); + remove_msgq_low_session(p, low); + p->sig_qs.flags |= FS_MON_MSGQ_LEN_HIGH; + } + else if (s->system_monitor.long_msgq_off < 0) { + /* disabled */ + remove_msgq_low_session(p, low); + } + + } + /* else we have not reached the upper limit for this session */ + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + +void +monitor_busy_port(Process *p, Eterm spec) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.flags.busy_port) { + monitor_generic(p, am_busy_port, spec, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} + +void +monitor_busy_dist_port(Process *p, Eterm spec) +{ + erts_rwmtx_rlock(&erts_trace_session_list_lock); + for (ErtsTraceSession *s = &erts_trace_session_0; s; s = s->next) { + if (s->system_monitor.flags.busy_dist_port) { + monitor_generic(p, am_busy_dist_port, spec, s); + } + } + erts_rwmtx_runlock(&erts_trace_session_list_lock); +} /* Begin system_profile tracing */ /* Scheduler profiling */ @@ -1719,7 +1986,7 @@ profile_scheduler(Eterm scheduler_id, Eterm state) { /* Write timestamp in element 6 of the 'msg' tuple */ hp[-1] = write_ts(erts_system_profile_ts_type, hp, bp, NULL); - enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp); + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, NIL, NIL, msg, bp, NULL); erts_mtx_unlock(&smq_mtx); } @@ -2080,7 +2347,7 @@ profile_runnable_port(Port *p, Eterm status) { /* Write timestamp in element 5 of the 'msg' tuple */ hp[-1] = write_ts(erts_system_profile_ts_type, hp, bp, NULL); - enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, p->common.id, NIL, msg, bp); + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, p->common.id, NIL, msg, bp, NULL); erts_mtx_unlock(&smq_mtx); } @@ -2134,7 +2401,7 @@ profile_runnable_proc(Process *p, Eterm status){ /* Write timestamp in element 5 of the 'msg' tuple */ hp[-1] = write_ts(erts_system_profile_ts_type, hp, bp, NULL); - enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, p->common.id, NIL, msg, bp); + enqueue_sys_msg_unlocked(SYS_MSG_TYPE_SYSPROF, p->common.id, NIL, msg, bp, NULL); erts_mtx_unlock(&smq_mtx); } /* End system_profile tracing */ @@ -2146,6 +2413,7 @@ typedef struct ErtsSysMsgQ_ ErtsSysMsgQ; struct ErtsSysMsgQ_ { ErtsSysMsgQ *next; enum ErtsSysMsgType type; + ErtsTraceSession *session; Eterm from; Eterm to; Eterm msg; @@ -2165,18 +2433,23 @@ enqueue_sys_msg_unlocked(enum ErtsSysMsgType type, Eterm from, Eterm to, Eterm msg, - ErlHeapFragment *bp) + ErlHeapFragment *bp, + ErtsTraceSession *session) { ErtsSysMsgQ *smqp; smqp = smq_element_alloc(); smqp->next = NULL; smqp->type = type; + smqp->session = session; + if (session) { + erts_ref_trace_session(session); + } smqp->from = from; smqp->to = to; smqp->msg = msg; smqp->bp = bp; - + if (sys_message_queue_end) { ASSERT(sys_message_queue); sys_message_queue_end->next = smqp; @@ -2194,10 +2467,11 @@ enqueue_sys_msg(enum ErtsSysMsgType type, Eterm from, Eterm to, Eterm msg, - ErlHeapFragment *bp) + ErlHeapFragment *bp, + ErtsTraceSession *session) { erts_mtx_lock(&smq_mtx); - enqueue_sys_msg_unlocked(type, from, to, msg, bp); + enqueue_sys_msg_unlocked(type, from, to, msg, bp, session); erts_mtx_unlock(&smq_mtx); } @@ -2218,14 +2492,14 @@ erts_set_system_logger(Eterm logger) void erts_queue_error_logger_message(Eterm from, Eterm msg, ErlHeapFragment *bp) { - enqueue_sys_msg(SYS_MSG_TYPE_ERRLGR, from, erts_get_system_logger(), msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_ERRLGR, from, erts_get_system_logger(), msg, bp, NULL); } void erts_send_sys_msg_proc(Eterm from, Eterm to, Eterm msg, ErlHeapFragment *bp) { ASSERT(is_internal_pid(to)); - enqueue_sys_msg(SYS_MSG_TYPE_PROC_MSG, from, to, msg, bp); + enqueue_sys_msg(SYS_MSG_TYPE_PROC_MSG, from, to, msg, bp, NULL); } #ifdef DEBUG_PRINTOUTS @@ -2258,18 +2532,21 @@ sys_msg_disp_failure(ErtsSysMsgQ *smqp, Eterm receiver) switch (smqp->type) { case SYS_MSG_TYPE_SYSMON: if (receiver == NIL - && !erts_system_monitor_long_gc - && !erts_system_monitor_long_schedule - && !erts_system_monitor_large_heap - && !erts_system_monitor_flags.busy_port - && !erts_system_monitor_flags.busy_dist_port) + && !smqp->session->system_monitor.limits[ERTS_SYSMON_LONG_GC] + && !smqp->session->system_monitor.limits[ERTS_SYSMON_LONG_SCHEDULE] + && !smqp->session->system_monitor.limits[ERTS_SYSMON_LARGE_HEAP] + && !smqp->session->system_monitor.limits[ERTS_SYSMON_LONG_MSGQ] + && !smqp->session->system_monitor.flags.busy_port + && !smqp->session->system_monitor.flags.busy_dist_port) break; /* Everything is disabled */ erts_thr_progress_block(); - if (system_monitor == receiver || receiver == NIL) - erts_system_monitor_clear(NULL); + if (receiver == smqp->session->system_monitor.receiver + || receiver == NIL) { + erts_system_monitor_clear(smqp->session); + } erts_thr_progress_unblock(); break; - case SYS_MSG_TYPE_SYSPROF: + case SYS_MSG_TYPE_SYSPROF: if (receiver == NIL && !erts_system_profile_flags.runnable_procs && !erts_system_profile_flags.runnable_ports @@ -2408,6 +2685,9 @@ sys_msg_dispatcher_func(void *unused) while (local_sys_message_queue) { smqp = local_sys_message_queue; local_sys_message_queue = smqp->next; + if (smqp->session) { + erts_deref_trace_session(smqp->session); + } smq_element_free(smqp); } @@ -2473,7 +2753,7 @@ sys_msg_dispatcher_func(void *unused) receiver = smqp->to; break; case SYS_MSG_TYPE_SYSMON: - receiver = erts_get_system_monitor(); + receiver = smqp->to; if (smqp->from == receiver) { #ifdef DEBUG_PRINTOUTS erts_fprintf(stderr, "MSG=%T to %T... ", @@ -2598,7 +2878,7 @@ erts_debug_foreach_sys_msg_in_q(void (*func)(Eterm, Eterm to; switch (sm->type) { case SYS_MSG_TYPE_SYSMON: - to = erts_get_system_monitor(); + to = erts_get_system_monitor(sm->session); break; case SYS_MSG_TYPE_SYSPROF: to = erts_get_system_profile(); @@ -2810,7 +3090,11 @@ erts_term_to_tracer(Eterm prefix, Eterm t) { ErtsTracer tracer = erts_tracer_nil; ASSERT(is_atom(prefix) || prefix == THE_NON_VALUE); - if (!is_nil(t)) { + + if (is_internal_pid(t)) { + tracer = t; + } + else if (!is_nil(t)) { Eterm module = am_erl_tracer, state = THE_NON_VALUE; Eterm hp[2]; if (is_tuple(t)) { @@ -3151,8 +3435,19 @@ static void free_tracer(void *p) } } +bool erts_get_tracer_pid(ErtsTracer tracer, Eterm* pid) +{ + if (is_list(tracer) && ERTS_TRACER_MODULE(tracer) == am_erl_tracer + && is_internal_pid(ERTS_TRACER_STATE(tracer))) { + + *pid = ERTS_TRACER_STATE(tracer); + return true; + } + return false; +} + /* - * ErtsTracer is either NIL, 'true' or [Mod | State] + * ErtsTracer is either NIL, 'true', local pid or [Mod | State] * * - If State is immediate then the memory for * the cons cell is just two words + sizeof(ErtsThrPrgrLaterOp) large. @@ -3177,15 +3472,15 @@ static void free_tracer(void *p) * the refc when *tracer is NIL. */ void -erts_tracer_update_impl(ErtsTracer *tracer, const ErtsTracer new_tracer) +erts_tracer_update_impl(ErtsTracer *tracer, ErtsTracer new_tracer) { ErlHeapFragment *hf; - if (is_not_nil(*tracer)) { + if (is_list(*tracer)) { Uint offs = 2; UWord size = 2 * sizeof(Eterm) + sizeof(ErtsThrPrgrLaterOp); ErtsThrPrgrLaterOp *lop; - ASSERT(is_list(*tracer)); + if (is_not_immed(ERTS_TRACER_STATE(*tracer))) { hf = ErtsContainerStruct_(ptr_val(*tracer), ErlHeapFragment, mem); offs = hf->used_size; @@ -3212,7 +3507,15 @@ erts_tracer_update_impl(ErtsTracer *tracer, const ErtsTracer new_tracer) free_tracer, (void*)(*tracer), lop, size); } - if (is_nil(new_tracer)) { + if (is_list(new_tracer)) { + const Eterm module = ERTS_TRACER_MODULE(new_tracer); + const Eterm state = ERTS_TRACER_STATE(new_tracer); + if (module == am_erl_tracer && is_internal_pid(state)) { + new_tracer = state; + } + } + if (is_immed(new_tracer)) { + ASSERT(is_nil(new_tracer) || is_internal_pid(new_tracer)); *tracer = new_tracer; } else if (is_immed(ERTS_TRACER_STATE(new_tracer))) { /* If tracer state is an immediate we only allocate a 2 Eterm heap. diff --git a/erts/emulator/beam/erl_trace.h b/erts/emulator/beam/erl_trace.h index d8762dd6d107..adbdd93099fb 100644 --- a/erts/emulator/beam/erl_trace.h +++ b/erts/emulator/beam/erl_trace.h @@ -62,10 +62,11 @@ typedef struct struct binary* match_spec; } ErtsTracingEvent; -#ifndef ERTS_NUM_BP_IX -//# include "beam_bp.h" -# define ERTS_NUM_BP_IX 2 // ToDo FIXME UGLY -#endif +#define ERTS_NUM_BP_IX 2 +typedef Uint32 ErtsBpIndex; +extern erts_atomic32_t erts_active_bp_index; +extern erts_atomic32_t erts_staging_bp_index; + struct trace_pattern_flags { unsigned int breakpoint : 1; /* Set if any other is set */ unsigned int local : 1; /* Local call trace breakpoint */ @@ -82,6 +83,15 @@ enum erts_trace_session_state { ERTS_TRACE_SESSION_DEAD }; +enum erts_sysmon_limit_index { + ERTS_SYSMON_LONG_GC = 0, + ERTS_SYSMON_LONG_SCHEDULE, + ERTS_SYSMON_LARGE_HEAP, + ERTS_SYSMON_LONG_MSGQ, + + ERTS_SYSMON_LIMIT_CNT +}; + typedef struct ErtsTraceSession { struct ErtsTraceSession* next; struct ErtsTraceSession* prev; @@ -105,6 +115,13 @@ typedef struct ErtsTraceSession { Uint32 new_ports_trace_flags; ErtsTracer new_ports_tracer; + struct system_monitor_session { + Eterm receiver; + Uint limits[ERTS_SYSMON_LIMIT_CNT]; + Sint long_msgq_off; + struct erts_system_monitor_flags_t flags; + } system_monitor; + #ifdef DEBUG erts_refc_t dbg_bp_refc; /* Number of breakpoints */ erts_refc_t dbg_p_refc; /* Number of processes and ports */ @@ -142,7 +159,7 @@ void erts_assert_tracer_refs(ErtsPTabElementCommon* t_p); /* erl_bif_trace.c */ Eterm erl_seq_trace_info(Process *p, Eterm arg1); -void erts_system_monitor_clear(Process *c_p); +void erts_system_monitor_clear(ErtsTraceSession*); void erts_system_profile_clear(Process *c_p); /* erl_trace.c */ @@ -162,8 +179,8 @@ void erts_change_new_ports_tracing(ErtsTraceSession* session, const ErtsTracer tracerp); void erts_get_new_port_tracing(ErtsTraceSession*, Uint32 *flagsp, ErtsTracer *tracerp); -void erts_set_system_monitor(Eterm monitor); -Eterm erts_get_system_monitor(void); +void erts_set_system_monitor(ErtsTraceSession*, Eterm monitor); +Eterm erts_get_system_monitor(ErtsTraceSession*); int erts_is_tracer_valid(Process* p); void erts_check_my_tracer_proc(Process *); @@ -191,7 +208,7 @@ void trace_sched(Process*, ErtsProcLocks, Eterm, Uint32 trace_flag); void trace_sched_session(Process*, ErtsProcLocks, Eterm what, ErtsTracerRef*); void trace_proc(Process*, ErtsProcLocks, Process*, Eterm, Eterm); void trace_proc_spawn(Process*, Eterm what, Eterm pid, Eterm mod, Eterm func, Eterm args); -void save_calls(Process *p, Export *); +void save_calls(Process *p, const Export *); void trace_gc(Process *p, Eterm what, Uint size, Eterm msg); /* port tracing */ void trace_virtual_sched(Process*, ErtsProcLocks, Eterm); @@ -217,8 +234,15 @@ void monitor_long_gc(Process *p, Uint time); void monitor_long_schedule_proc(Process *p, const ErtsCodeMFA *in_i, const ErtsCodeMFA *out_i, Uint time); void monitor_long_schedule_port(Port *pp, ErtsPortTaskType type, Uint time); -void monitor_large_heap(Process *p); -void monitor_generic(Process *p, Eterm type, Eterm spec); +void monitor_large_heap(Process *p, Uint size); +void monitor_busy_port(Process *p, Eterm spec); +void monitor_busy_dist_port(Process *p, Eterm spec); +void monitor_long_msgq_on(Process*); +void monitor_long_msgq_off(Process*); +void erts_clear_all_msgq_low_sessions(Process *p); +void erts_consolidate_all_msgq_low_sessions(Process *p); + + Uint erts_trace_flag2bit(Eterm flag); int erts_trace_flags(ErtsTraceSession*, Eterm List, Uint *pMask, ErtsTracer *pTracer, int *pCpuTimestamp); @@ -275,6 +299,7 @@ void erts_tracer_replace(ErtsPTabElementCommon *t_p, const ErtsTracer new_tracer); void erts_tracer_update_impl(ErtsTracer *tracer, const ErtsTracer new_tracer); int erts_tracer_nif_clear(void); +bool erts_get_tracer_pid(ErtsTracer, Eterm* pid); #define erts_tracer_update(t,n) do { if (*(t) != (n)) erts_tracer_update_impl(t,n); } while(0) #define ERTS_TRACER_CLEAR(t) erts_tracer_update(t, erts_tracer_nil) @@ -293,6 +318,7 @@ ERTS_DECLARE_DUMMY(erts_tracer_nil) = NIL; #define IS_TRACER_VALID(tracer) \ (ERTS_TRACER_COMPARE(tracer,erts_tracer_true) \ || ERTS_TRACER_IS_NIL(tracer) \ + || is_internal_pid(tracer) \ || (is_list(tracer) && is_atom(CAR(list_val(tracer))))) #define ERTS_TRACER_FROM_ETERM(termp) \ diff --git a/erts/emulator/beam/erl_unicode.c b/erts/emulator/beam/erl_unicode.c index 970ca89bd9c0..46f487bec44a 100644 --- a/erts/emulator/beam/erl_unicode.c +++ b/erts/emulator/beam/erl_unicode.c @@ -1347,7 +1347,7 @@ static Eterm do_utf8_to_list(Process *p, Uint num, const byte *bytes, Uint sz, num_built, num_eaten, tail); } -Eterm erts_utf8_to_list(Process *p, Uint num, byte *bytes, Uint sz, Uint left, +Eterm erts_utf8_to_list(Process *p, Uint num, const byte *bytes, Uint sz, Uint left, Uint *num_built, Uint *num_eaten, Eterm tail) { return do_utf8_to_list(p, num, bytes, sz, left, num_built, num_eaten, tail); @@ -1366,7 +1366,7 @@ Uint erts_atom_to_string_length(Eterm atom) const byte* err_pos; Uint num_chars; int ares = - erts_analyze_utf8(ap->name, ap->len, &err_pos, &num_chars, NULL); + erts_analyze_utf8(erts_atom_get_name(ap), ap->len, &err_pos, &num_chars, NULL); ASSERT(ares == ERTS_UTF8_OK); (void)ares; return num_chars; @@ -1380,7 +1380,7 @@ Eterm erts_atom_to_string(Eterm **hpp, Eterm atom, Eterm tail) ASSERT(is_atom(atom)); ap = atom_tab(atom_val(atom)); if (ap->latin1_chars >= 0) - return buf_to_intlist(hpp, (char*)ap->name, ap->len, tail); + return buf_to_intlist(hpp, (char*)erts_atom_get_name(ap), ap->len, tail); else { Eterm res; const byte* err_pos; @@ -1389,10 +1389,10 @@ Eterm erts_atom_to_string(Eterm **hpp, Eterm atom, Eterm tail) Eterm *hp_start = *hpp; int ares = #endif - erts_analyze_utf8(ap->name, ap->len, &err_pos, &num_chars, NULL); + erts_analyze_utf8(erts_atom_get_name(ap), ap->len, &err_pos, &num_chars, NULL); ASSERT(ares == ERTS_UTF8_OK); - res = erts_make_list_from_utf8_buf(hpp, num_chars, ap->name, ap->len, + res = erts_make_list_from_utf8_buf(hpp, num_chars, erts_atom_get_name(ap), ap->len, &num_built, &num_eaten, tail); ASSERT(num_built == num_chars); @@ -1924,26 +1924,23 @@ BIF_RETTYPE atom_to_binary_2(BIF_ALIST_2) ap = atom_tab(atom_val(BIF_ARG_1)); if (BIF_ARG_2 == am_latin1) { - Eterm bin_term; - + Eterm bin_term; if (ap->latin1_chars < 0) { goto error; } if (ap->latin1_chars == ap->len) { - bin_term = erts_new_binary_from_data(BIF_P, ap->len, ap->name); + BIF_RET(ap->u.bin); } else { byte* bin_p; int dbg_sz; - bin_term = erts_new_binary(BIF_P, ap->latin1_chars, &bin_p); - dbg_sz = erts_utf8_to_latin1(bin_p, ap->name, ap->len); + dbg_sz = erts_utf8_to_latin1(bin_p, erts_atom_get_name(ap), ap->len); ASSERT(dbg_sz == ap->latin1_chars); (void)dbg_sz; + BIF_RET(bin_term); } - - BIF_RET(bin_term); } else if (BIF_ARG_2 == am_utf8 || BIF_ARG_2 == am_unicode) { - BIF_RET(erts_new_binary_from_data(BIF_P, ap->len, ap->name)); + BIF_RET(ap->u.bin); } else { error: BIF_ERROR(BIF_P, BADARG); @@ -2167,6 +2164,7 @@ Eterm erts_convert_native_to_filename(Process *p, size_t size, byte *bytes) goto noconvert; case ERL_FILENAME_UTF8_MAC: mac = 1; + ERTS_FALLTHROUGH(); case ERL_FILENAME_UTF8: if (size == 0) return NIL; @@ -2233,12 +2231,13 @@ Sint erts_native_filename_need(Eterm ioterm, int encoding) need = 2* ap->latin1_chars; } else { + const byte * name = erts_atom_get_name(ap); for (i = 0; i < ap->len; ) { - if (ap->name[i] < 0x80) { + if (name[i] < 0x80) { i++; - } else if (ap->name[i] < 0xE0) { + } else if (name[i] < 0xE0) { i += 2; - } else if (ap->name[i] < 0xF0) { + } else if (name[i] < 0xF0) { i += 3; } else { need = -1; @@ -2256,7 +2255,7 @@ Sint erts_native_filename_need(Eterm ioterm, int encoding) * the middle of filenames */ if (need > 0) { - byte *name = ap->name; + const byte *name = erts_atom_get_name(ap); int len = ap->len; for (i = 0; i < len; i++) { if (name[i] == 0) { @@ -2336,6 +2335,7 @@ Sint erts_native_filename_need(Eterm ioterm, int encoding) need += 2; break; } /* else fall through to error */ + ERTS_FALLTHROUGH(); default: DESTROY_ESTACK(stack); return ((Sint) -1); @@ -2398,33 +2398,33 @@ void erts_native_filename_put(Eterm ioterm, int encoding, byte *p) switch (encoding) { case ERL_FILENAME_LATIN1: for (i = 0; i < ap->len; i++) { - if (ap->name[i] < 0x80) { - *p++ = ap->name[i]; + if (erts_atom_get_name(ap)[i] < 0x80) { + *p++ = erts_atom_get_name(ap)[i]; } else { - ASSERT(ap->name[i] < 0xC4); - *p++ = ((ap->name[i] & 3) << 6) | (ap->name[i+1] & 0x3F); + ASSERT(erts_atom_get_name(ap)[i] < 0xC4); + *p++ = ((erts_atom_get_name(ap)[i] & 3) << 6) | (erts_atom_get_name(ap)[i+1] & 0x3F); i++; } } break; case ERL_FILENAME_UTF8_MAC: case ERL_FILENAME_UTF8: - sys_memcpy(p, ap->name, ap->len); + sys_memcpy(p, erts_atom_get_name(ap), ap->len); break; case ERL_FILENAME_WIN_WCHAR: for (i = 0; i < ap->len; i++) { /* Little endian */ - if (ap->name[i] < 0x80) { - *p++ = ap->name[i]; + if (erts_atom_get_name(ap)[i] < 0x80) { + *p++ = erts_atom_get_name(ap)[i]; *p++ = 0; - } else if (ap->name[i] < 0xE0) { - *p++ = ((ap->name[i] & 3) << 6) | (ap->name[i+1] & 0x3F); - *p++ = ((ap->name[i] & 0x1C) >> 2); + } else if (erts_atom_get_name(ap)[i] < 0xE0) { + *p++ = ((erts_atom_get_name(ap)[i] & 3) << 6) | (erts_atom_get_name(ap)[i+1] & 0x3F); + *p++ = ((erts_atom_get_name(ap)[i] & 0x1C) >> 2); i++; } else { - ASSERT(ap->name[i] < 0xF0); - *p++ = ((ap->name[i+1] & 3) << 6) | (ap->name[i+2] & 0x3C); - *p++ = ((ap->name[i] & 0xF) << 4) | ((ap->name[i+1] & 0x3C) >> 2); + ASSERT(erts_atom_get_name(ap)[i] < 0xF0); + *p++ = ((erts_atom_get_name(ap)[i+1] & 3) << 6) | (erts_atom_get_name(ap)[i+2] & 0x3C); + *p++ = ((erts_atom_get_name(ap)[i] & 0xF) << 4) | ((erts_atom_get_name(ap)[i+1] & 0x3C) >> 2); i += 2; } } diff --git a/erts/emulator/beam/erl_utils.h b/erts/emulator/beam/erl_utils.h index e29555e0de47..d6ebc1c41dde 100644 --- a/erts/emulator/beam/erl_utils.h +++ b/erts/emulator/beam/erl_utils.h @@ -192,7 +192,7 @@ ERTS_GLB_INLINE int erts_cmp_atoms(Eterm a, Eterm b) { Atom *aa = atom_tab(atom_val(a)); Atom *bb = atom_tab(atom_val(b)); - byte *name_a, *name_b; + const byte *name_a, *name_b; int len_a, len_b, diff; diff = aa->ord0 - bb->ord0; @@ -201,8 +201,8 @@ ERTS_GLB_INLINE int erts_cmp_atoms(Eterm a, Eterm b) { return diff; } - name_a = &aa->name[3]; - name_b = &bb->name[3]; + name_a = &erts_atom_get_name(aa)[3]; + name_b = &erts_atom_get_name(bb)[3]; len_a = aa->len-3; len_b = bb->len-3; diff --git a/erts/emulator/beam/export.c b/erts/emulator/beam/export.c index 4805f3d48d9f..edccaaa2a86b 100644 --- a/erts/emulator/beam/export.c +++ b/erts/emulator/beam/export.c @@ -28,19 +28,10 @@ #include "export.h" #include "hash.h" #include "jit/beam_asm.h" +#include "erl_global_literals.h" #define EXPORT_INITIAL_SIZE 4000 -#define EXPORT_LIMIT (512*1024) - -#define EXPORT_HASH(m,f,a) ((atom_val(m) * atom_val(f)) ^ (a)) - -#ifndef DEBUG -# define SHARED_LAMBDA_INITIAL_SIZE EXPORT_INITIAL_SIZE -# define SHARED_LAMBDA_EXPAND_SIZE 512 -#else -# define SHARED_LAMBDA_INITIAL_SIZE 256 -# define SHARED_LAMBDA_EXPAND_SIZE 16 -#endif +#define EXPORT_LIMIT (512*1024) #ifdef DEBUG # define IF_DEBUG(x) x @@ -48,265 +39,101 @@ # define IF_DEBUG(x) #endif -static IndexTable export_tables[ERTS_NUM_CODE_IX]; /* Active not locked */ - -static erts_atomic_t total_entries_bytes; - -/* This lock protects the staging export table from concurrent access - * AND it protects the staging table from becoming active. - */ -erts_mtx_t export_staging_lock; - -/* Bump allocator for globally shared external funs, allocating them in - * reasonably large chunks to simplify crash dumping and avoid fragmenting the - * literal heap too much. - * - * This is protected by the export staging lock. */ -struct lambda_chunk { - struct lambda_chunk *next; - Eterm *hp; - - ErtsLiteralArea area; -} *lambda_chunk = NULL; - -struct export_entry -{ - IndexSlot slot; /* MUST BE LOCATED AT TOP OF STRUCT!!! */ - Export* ep; -}; - -/* Helper struct that brings things together in one allocation -*/ -struct export_blob -{ - Export exp; - struct export_entry entryv[ERTS_NUM_CODE_IX]; - /* Note that entryv is not indexed by "code_ix". - */ -}; - -/* Helper struct only used as template -*/ -struct export_templ +static void create_shared_lambda(Export *export) { - struct export_entry entry; - Export exp; -}; + ErlFunThing *lambda; + struct erl_off_heap_header **ohp; -static struct export_blob* entry_to_blob(struct export_entry* ee) -{ - return ErtsContainerStruct(ee->ep, struct export_blob, exp); -} + lambda = (ErlFunThing*)erts_global_literal_allocate(ERL_FUN_SIZE, &ohp); -void -export_info(fmtfn_t to, void *to_arg) -{ - int lock = !ERTS_IS_CRASH_DUMPING; - if (lock) - export_staging_lock(); - index_info(to, to_arg, &export_tables[erts_active_code_ix()]); - hash_info(to, to_arg, &export_tables[erts_staging_code_ix()].htable); - if (lock) - export_staging_unlock(); -} + lambda->thing_word = MAKE_FUN_HEADER(export->info.mfa.arity, 0, 1); + lambda->entry.exp = export; + export->lambda = make_fun(lambda); -static HashValue -export_hash(struct export_entry* ee) -{ - Export* x = ee->ep; - return EXPORT_HASH(x->info.mfa.module, x->info.mfa.function, - x->info.mfa.arity); + erts_global_literal_register(&export->lambda); } -static int -export_cmp(struct export_entry* tmpl_e, struct export_entry* obj_e) +static HashValue export_hash(const Export *export) { - Export* tmpl = tmpl_e->ep; - Export* obj = obj_e->ep; - return !(tmpl->info.mfa.module == obj->info.mfa.module && - tmpl->info.mfa.function == obj->info.mfa.function && - tmpl->info.mfa.arity == obj->info.mfa.arity); + return (atom_val(export->info.mfa.module) * + atom_val(export->info.mfa.function)) ^ + export->info.mfa.arity; } -ErtsLiteralArea *erts_get_next_lambda_lit_area(ErtsLiteralArea *prev) +static int export_cmp(const Export *lhs, const Export *rhs) { - struct lambda_chunk *next; - - ASSERT(ERTS_IS_CRASH_DUMPING); - - if (prev != NULL) { - struct lambda_chunk *chunk = ErtsContainerStruct(prev, - struct lambda_chunk, - area); - next = chunk->next; - - if (next == NULL) { - return NULL; - } - } else { - next = lambda_chunk; - } - - next->area.end = next->hp; - return &next->area; + return !(lhs->info.mfa.module == rhs->info.mfa.module && + lhs->info.mfa.function == rhs->info.mfa.function && + lhs->info.mfa.arity == rhs->info.mfa.arity); } -static void expand_shared_lambda_area(Uint count) +static void export_init(Export *dst, const Export *template) { - struct lambda_chunk *chunk; - Uint heap_size; - - ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&export_staging_lock)); + sys_memset(&dst->info.u, 0, sizeof(dst->info.u)); + dst->info.gen_bp = NULL; + dst->info.mfa.module = template->info.mfa.module; + dst->info.mfa.function = template->info.mfa.function; + dst->info.mfa.arity = template->info.mfa.arity; + dst->bif_number = -1; + dst->is_bif_traced = 0; - heap_size = count * ERL_FUN_SIZE; - chunk = erts_alloc(ERTS_ALC_T_LITERAL, - sizeof(struct lambda_chunk) + - (heap_size - 1) * sizeof(Eterm)); - chunk->hp = &chunk->area.start[0]; - chunk->area.end = &chunk->hp[heap_size]; - chunk->area.off_heap = NULL; - chunk->next = lambda_chunk; + create_shared_lambda(dst); - lambda_chunk = chunk; -} + sys_memset(&dst->trampoline, 0, sizeof(dst->trampoline)); -static void create_shared_lambda(Export *export) -{ - ErlFunThing *lambda; - - ERTS_LC_ASSERT(erts_lc_mtx_is_locked(&export_staging_lock)); - - ASSERT((lambda_chunk->hp <= lambda_chunk->area.end && - lambda_chunk->hp >= lambda_chunk->area.start) && - ((lambda_chunk->area.end - lambda_chunk->hp) % ERL_FUN_SIZE) == 0); - if (lambda_chunk->hp == lambda_chunk->area.end) { - expand_shared_lambda_area(SHARED_LAMBDA_EXPAND_SIZE); + if (BeamOpsAreInitialized()) { + dst->trampoline.common.op = BeamOpCodeAddr(op_call_error_handler); } - lambda = (ErlFunThing*)lambda_chunk->hp; - lambda_chunk->hp += ERL_FUN_SIZE; - - lambda->thing_word = MAKE_FUN_HEADER(export->info.mfa.arity, 0, 1); - lambda->entry.exp = export; - - export->lambda = make_fun(lambda); + for (int ix = 0; ix < ERTS_NUM_CODE_IX; ix++) { + erts_activate_export_trampoline(dst, ix); + } - erts_set_literal_tag(&export->lambda, (Eterm*)lambda, ERL_FUN_SIZE); +#ifdef BEAMASM + dst->dispatch.addresses[ERTS_SAVE_CALLS_CODE_IX] = + beam_save_calls_export; +#endif } -static struct export_entry* -export_alloc(struct export_entry* tmpl_e) +static void export_stage(Export *export, + ErtsCodeIndex src_ix, + ErtsCodeIndex dst_ix) { - struct export_blob* blob; - unsigned ix; - - if (tmpl_e->slot.index == -1) { /* Template, allocate blob */ - Export* tmpl = tmpl_e->ep; - Export* obj; - - blob = (struct export_blob*) erts_alloc(ERTS_ALC_T_EXPORT, sizeof(*blob)); - erts_atomic_add_nob(&total_entries_bytes, sizeof(*blob)); - obj = &blob->exp; - sys_memset(&obj->info.u, 0, sizeof(obj->info.u)); - obj->info.gen_bp = NULL; - obj->info.mfa.module = tmpl->info.mfa.module; - obj->info.mfa.function = tmpl->info.mfa.function; - obj->info.mfa.arity = tmpl->info.mfa.arity; - obj->bif_number = -1; - obj->is_bif_traced = 0; - - create_shared_lambda(obj); - - sys_memset(&obj->trampoline, 0, sizeof(obj->trampoline)); - - if (BeamOpsAreInitialized()) { - obj->trampoline.common.op = BeamOpCodeAddr(op_call_error_handler); - } - - for (ix=0; ixentryv[ix].slot.index = -1; - blob->entryv[ix].ep = &blob->exp; - } - - ix = 0; - - DBG_TRACE_MFA_P(&obj->info.mfa, "export allocation at %p", obj); - } - else { /* Existing entry in another table, use free entry in blob */ - blob = entry_to_blob(tmpl_e); - for (ix = 0; blob->entryv[ix].slot.index >= 0; ix++) { - ASSERT(ix < ERTS_NUM_CODE_IX); - } - } - return &blob->entryv[ix]; + ErtsDispatchable *dispatch = &export->dispatch; + dispatch->addresses[dst_ix] = dispatch->addresses[src_ix]; } -static void -export_free(struct export_entry* obj) -{ - struct export_blob* blob = entry_to_blob(obj); - int i; - obj->slot.index = -1; - for (i=0; i < ERTS_NUM_CODE_IX; i++) { - if (blob->entryv[i].slot.index >= 0) { - DBG_TRACE_MFA_P(&blob->exp.info.mfa, "export entry slot %u freed for %p", - (obj - blob->entryv), &blob->exp); - return; - } - } - DBG_TRACE_MFA_P(&blob->exp.info.mfa, "export blob deallocation at %p", &blob->exp); - erts_free(ERTS_ALC_T_EXPORT, blob); - erts_atomic_add_nob(&total_entries_bytes, -sizeof(*blob)); -} +#define ERTS_CODE_STAGED_PREFIX export +#define ERTS_CODE_STAGED_OBJECT_TYPE Export +#define ERTS_CODE_STAGED_OBJECT_HASH export_hash +#define ERTS_CODE_STAGED_OBJECT_COMPARE export_cmp +#define ERTS_CODE_STAGED_OBJECT_INITIALIZE export_init +#define ERTS_CODE_STAGED_OBJECT_STAGE export_stage +#define ERTS_CODE_STAGED_OBJECT_ALLOC_TYPE ERTS_ALC_T_EXPORT +#define ERTS_CODE_STAGED_TABLE_ALLOC_TYPE ERTS_ALC_T_EXPORT_TABLE +#define ERTS_CODE_STAGED_TABLE_INITIAL_SIZE EXPORT_INITIAL_SIZE +#define ERTS_CODE_STAGED_TABLE_LIMIT EXPORT_LIMIT + +#define ERTS_CODE_STAGED_WANT_GET +#define ERTS_CODE_STAGED_WANT_PUT +#define ERTS_CODE_STAGED_WANT_LIST +#define ERTS_CODE_STAGED_WANT_LIST_SIZE +#define ERTS_CODE_STAGED_WANT_ENTRY_BYTES +#define ERTS_CODE_STAGED_WANT_TABLE_SIZE + +#include "erl_code_staged.h" void init_export_table(void) { - HashFunctions f; - int i; - - erts_mtx_init(&export_staging_lock, "export_tab", NIL, - ERTS_LOCK_FLAGS_PROPERTY_STATIC | ERTS_LOCK_FLAGS_CATEGORY_GENERIC); - erts_atomic_init_nob(&total_entries_bytes, 0); - - f.hash = (H_FUN) export_hash; - f.cmp = (HCMP_FUN) export_cmp; - f.alloc = (HALLOC_FUN) export_alloc; - f.free = (HFREE_FUN) export_free; - f.meta_alloc = (HMALLOC_FUN) erts_alloc; - f.meta_free = (HMFREE_FUN) erts_free; - f.meta_print = (HMPRINT_FUN) erts_print; - - for (i=0; ientry.ep = &templ->exp; - templ->entry.slot.index = -1; - templ->exp.info.mfa.module = m; - templ->exp.info.mfa.function = f; - templ->exp.info.mfa.arity = a; - templ->exp.bif_number = -1; - templ->exp.is_bif_traced = 0; - return &templ->entry; + export_staged_info(to, to_arg); } /* @@ -321,19 +148,21 @@ static struct export_entry* init_template(struct export_templ* templ, * called through such an export entry. * 3) This function is suitable for the implementation of erlang:apply/3. */ -extern Export* /* inline-helper */ -erts_find_export_entry(Eterm m, Eterm f, unsigned int a,ErtsCodeIndex code_ix); +const Export *erts_find_export_entry(Eterm m, Eterm f, unsigned a, + ErtsCodeIndex code_ix); -Export* -erts_find_export_entry(Eterm m, Eterm f, unsigned int a, ErtsCodeIndex code_ix) +const Export *erts_find_export_entry(Eterm m, Eterm f, unsigned a, + ErtsCodeIndex code_ix) { - struct export_templ templ; - struct export_entry *ee = - hash_fetch(&export_tables[code_ix].htable, - init_template(&templ, m, f, a), - (H_FUN)export_hash, (HCMP_FUN)export_cmp); - if (ee) return ee->ep; - return NULL; + export_template_t template; + Export *object; + + object = export_staged_init_template(&template); + object->info.mfa.module = m; + object->info.mfa.function = f; + object->info.mfa.arity = a; + + return export_staged_get(&template, code_ix); } /* @@ -346,22 +175,19 @@ erts_find_export_entry(Eterm m, Eterm f, unsigned int a, ErtsCodeIndex code_ix) * for use by the erlang:function_exported/3 BIF or whenever you * cannot depend on the error_handler. */ - -Export* -erts_find_function(Eterm m, Eterm f, unsigned int a, ErtsCodeIndex code_ix) +const Export *erts_find_function(Eterm m, Eterm f, unsigned int a, + ErtsCodeIndex code_ix) { - struct export_templ templ; - struct export_entry* ee; - - ee = hash_get(&export_tables[code_ix].htable, init_template(&templ, m, f, a)); + const Export *export = erts_find_export_entry(m, f, a, code_ix); - if (ee == NULL - || (erts_is_export_trampoline_active(ee->ep, code_ix) && - !BeamIsOpCode(ee->ep->trampoline.common.op, op_i_generic_breakpoint))) { + if (export == NULL + || (erts_is_export_trampoline_active(export, code_ix) && + !BeamIsOpCode(export->trampoline.common.op, + op_i_generic_breakpoint))) { return NULL; } - return ee->ep; + return export; } /* @@ -372,28 +198,20 @@ erts_find_function(Eterm m, Eterm f, unsigned int a, ErtsCodeIndex code_ix) * to load new code. */ -Export* -erts_export_put(Eterm mod, Eterm func, unsigned int arity) +Export *erts_export_put(Eterm mod, Eterm func, unsigned int arity) { - ErtsCodeIndex code_ix = erts_staging_code_ix(); - struct export_templ templ; - struct export_entry* ee; - Export* res; + export_template_t template; + Export *object; ASSERT(is_atom(mod)); ASSERT(is_atom(func)); - export_staging_lock(); - ee = (struct export_entry*) index_put_entry(&export_tables[code_ix], - init_template(&templ, mod, func, arity)); - export_staging_unlock(); - res = ee->ep; - -#ifdef BEAMASM - res->dispatch.addresses[ERTS_SAVE_CALLS_CODE_IX] = beam_save_calls_export; -#endif + object = export_staged_init_template(&template); + object->info.mfa.module = mod; + object->info.mfa.function = func; + object->info.mfa.arity = arity; - return res; + return export_staged_put(&template); } /* @@ -401,139 +219,64 @@ erts_export_put(Eterm mod, Eterm func, unsigned int arity) * export entry (making a call through it will cause the error_handler to * be called). * - * Stub export entries will be placed in the loader export table. + * Stub export entries will be placed in the staging export table. */ -Export* -erts_export_get_or_make_stub(Eterm mod, Eterm func, unsigned int arity) +Export *erts_export_get_or_make_stub(Eterm mod, Eterm func, unsigned int arity) { - ErtsCodeIndex code_ix; - Export* ep; - IF_DEBUG(int retrying = 0;) - + export_template_t template; + Export *object; + ASSERT(is_atom(mod)); ASSERT(is_atom(func)); - do { - code_ix = erts_active_code_ix(); - ep = erts_find_export_entry(mod, func, arity, code_ix); - if (ep == 0) { - /* - * The code is not loaded (yet). Put the export in the staging - * export table, to avoid having to lock the active export table. - */ - export_staging_lock(); - if (erts_active_code_ix() == code_ix) { - struct export_templ templ; - struct export_entry* entry; - - IndexTable* tab = &export_tables[erts_staging_code_ix()]; - init_template(&templ, mod, func, arity); - entry = (struct export_entry *) index_put_entry(tab, &templ.entry); - ep = entry->ep; - -#ifdef BEAMASM - ep->dispatch.addresses[ERTS_SAVE_CALLS_CODE_IX] = - beam_save_calls_export; -#endif + object = export_staged_init_template(&template); + object->info.mfa.module = mod; + object->info.mfa.function = func; + object->info.mfa.arity = arity; - ASSERT(ep); - } - else { /* race */ - ASSERT(!retrying); - IF_DEBUG(retrying = 1); - } - export_staging_unlock(); - } - } while (!ep); - return ep; + return export_staged_upsert(&template); } Export *export_list(int i, ErtsCodeIndex code_ix) { - return ((struct export_entry*) erts_index_lookup(&export_tables[code_ix], i))->ep; + return export_staged_list(i, code_ix); } int export_list_size(ErtsCodeIndex code_ix) { - return erts_index_num_entries(&export_tables[code_ix]); + return export_staged_list_size(code_ix); } int export_table_sz(void) { - const int lock = !ERTS_IS_CRASH_DUMPING; - int i, bytes = 0; - - if (lock) { - export_staging_lock(); - } - for (i=0; iep : NULL; -} +const Export *export_get(const Export *e) +{ + export_template_t template; + Export *object; -IF_DEBUG(static ErtsCodeIndex debug_export_load_ix = 0;) + object = export_staged_init_template(&template); + object->info.mfa.module = e->info.mfa.module; + object->info.mfa.function = e->info.mfa.function; + object->info.mfa.arity = e->info.mfa.arity; + return export_staged_get(&template, erts_active_code_ix()); +} void export_start_staging(void) { - ErtsCodeIndex dst_ix = erts_staging_code_ix(); - ErtsCodeIndex src_ix = erts_active_code_ix(); - IndexTable* dst = &export_tables[dst_ix]; - IndexTable* src = &export_tables[src_ix]; - int i; - - ASSERT(dst_ix != src_ix); - ASSERT(debug_export_load_ix == ~0); - - export_staging_lock(); - /* - * Insert all entries in src into dst table - */ - for (i = 0; i < src->entries; i++) { - struct export_entry* src_entry; - ErtsDispatchable *disp; - - src_entry = (struct export_entry*) erts_index_lookup(src, i); - disp = &src_entry->ep->dispatch; - - disp->addresses[dst_ix] = disp->addresses[src_ix]; - -#ifndef DEBUG - index_put_entry(dst, src_entry); -#else /* DEBUG */ - { - struct export_entry* dst_entry = - (struct export_entry*)index_put_entry(dst, src_entry); - ASSERT(entry_to_blob(src_entry) == entry_to_blob(dst_entry)); - } -#endif - } - export_staging_unlock(); - - IF_DEBUG(debug_export_load_ix = dst_ix); + export_staged_start_staging(); } void export_end_staging(int commit) { - ASSERT(debug_export_load_ix == erts_staging_code_ix()); - IF_DEBUG(debug_export_load_ix = ~0); + export_staged_end_staging(commit); } - diff --git a/erts/emulator/beam/export.h b/erts/emulator/beam/export.h index 3b4d8dfa4c8d..4868410e6b52 100644 --- a/erts/emulator/beam/export.h +++ b/erts/emulator/beam/export.h @@ -124,9 +124,11 @@ void init_export_table(void); void export_info(fmtfn_t, void *); ERTS_GLB_INLINE void erts_activate_export_trampoline(Export *ep, int code_ix); -ERTS_GLB_INLINE int erts_is_export_trampoline_active(Export *ep, int code_ix); +ERTS_GLB_INLINE int erts_is_export_trampoline_active(const Export * const ep, int code_ix); -ERTS_GLB_INLINE Export* erts_active_export_entry(Eterm m, Eterm f, unsigned a); +ERTS_GLB_INLINE const Export *erts_active_export_entry(Eterm m, + Eterm f, + unsigned a); Export* erts_export_put(Eterm mod, Eterm func, unsigned int arity); Export* erts_export_get_or_make_stub(Eterm, Eterm, unsigned); @@ -135,14 +137,10 @@ Export *export_list(int,ErtsCodeIndex); int export_list_size(ErtsCodeIndex); int export_table_sz(void); int export_entries_sz(void); -Export *export_get(Export*); +const Export *export_get(const Export*); void export_start_staging(void); void export_end_staging(int commit); -extern erts_mtx_t export_staging_lock; -#define export_staging_lock() erts_mtx_lock(&export_staging_lock) -#define export_staging_unlock() erts_mtx_unlock(&export_staging_lock) - #if ERTS_GLB_INLINE_INCL_FUNC_DEF ERTS_GLB_INLINE void erts_activate_export_trampoline(Export *ep, int code_ix) { @@ -158,7 +156,7 @@ ERTS_GLB_INLINE void erts_activate_export_trampoline(Export *ep, int code_ix) { ep->dispatch.addresses[code_ix] = trampoline_address; } -ERTS_GLB_INLINE int erts_is_export_trampoline_active(Export *ep, int code_ix) { +ERTS_GLB_INLINE int erts_is_export_trampoline_active(const Export * const ep, int code_ix) { ErtsCodePtr trampoline_address; #ifdef BEAMASM @@ -171,10 +169,13 @@ ERTS_GLB_INLINE int erts_is_export_trampoline_active(Export *ep, int code_ix) { return ep->dispatch.addresses[code_ix] == trampoline_address; } -ERTS_GLB_INLINE Export* +ERTS_GLB_INLINE const Export * erts_active_export_entry(Eterm m, Eterm f, unsigned int a) { - extern Export* erts_find_export_entry(Eterm m, Eterm f, unsigned a, ErtsCodeIndex); + extern const Export *erts_find_export_entry(Eterm m, + Eterm f, + unsigned a, + ErtsCodeIndex); return erts_find_export_entry(m, f, a, erts_active_code_ix()); } diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c index 3fee55cb1cee..4e99d9e3d076 100644 --- a/erts/emulator/beam/external.c +++ b/erts/emulator/beam/external.c @@ -591,7 +591,7 @@ Sint erts_encode_ext_dist_header_finalize(ErtsDistOutputBuf* ob, a = atom_tab(atom_val(atom)); sz = a->len; ep -= sz; - sys_memcpy((void *) ep, (void *) a->name, sz); + sys_memcpy((void *) ep, (void *) erts_atom_get_name(a), sz); if (long_atoms) { ep -= 2; put_int16(sz, ep); @@ -633,10 +633,13 @@ Sint erts_encode_ext_dist_header_finalize(ErtsDistOutputBuf* ob, switch (flgs_bytes) { case 4: *--ep = (byte) ((flgs >> 24) & 0xff); + ERTS_FALLTHROUGH(); case 3: *--ep = (byte) ((flgs >> 16) & 0xff); + ERTS_FALLTHROUGH(); case 2: *--ep = (byte) ((flgs >> 8) & 0xff); + ERTS_FALLTHROUGH(); case 1: *--ep = (byte) (flgs & 0xff); } @@ -1044,9 +1047,11 @@ erts_prepare_dist_ext(ErtsDistExternal *edep, case 6: case 5: flgs |= (((Uint32) flgsp[2]) << 16); + ERTS_FALLTHROUGH(); case 4: case 3: flgs |= (((Uint32) flgsp[1]) << 8); + ERTS_FALLTHROUGH(); case 2: case 1: flgs |= ((Uint32) flgsp[0]); @@ -2910,16 +2915,16 @@ enc_atom(ErtsAtomCacheMap *acmp, Eterm atom, byte *ep, Uint64 dflags) put_int8(len, ep); ep += 1; } - sys_memcpy((char *) ep, (char *) a->name, len); + sys_memcpy((char *) ep, (char *) erts_atom_get_name(a), len); } else { if (a->latin1_chars <= 255 && (dflags & DFLAG_SMALL_ATOM_TAGS)) { *ep++ = SMALL_ATOM_EXT; if (len == a->latin1_chars) { - sys_memcpy(ep+1, a->name, len); + sys_memcpy(ep+1, erts_atom_get_name(a), len); } else { - len = erts_utf8_to_latin1(ep+1, a->name, len); + len = erts_utf8_to_latin1(ep+1, erts_atom_get_name(a), len); ASSERT(len == a->latin1_chars); } put_int8(len, ep); @@ -2928,10 +2933,10 @@ enc_atom(ErtsAtomCacheMap *acmp, Eterm atom, byte *ep, Uint64 dflags) else { *ep++ = ATOM_EXT; if (len == a->latin1_chars) { - sys_memcpy(ep+2, a->name, len); + sys_memcpy(ep+2, erts_atom_get_name(a), len); } else { - len = erts_utf8_to_latin1(ep+2, a->name, len); + len = erts_utf8_to_latin1(ep+2, erts_atom_get_name(a), len); ASSERT(len == a->latin1_chars); } put_int16(len, ep); @@ -3089,11 +3094,11 @@ dec_atom(ErtsDistExternal *edep, const byte* ep, Eterm* objp, int internal_nc) *objp = make_atom(n); break; case NIL_EXT: - if (internal_nc) { - *objp = INTERNAL_LOCAL_SYSNAME; - break; + if (!internal_nc) { + goto error; } - /* else: fail... */ + *objp = INTERNAL_LOCAL_SYSNAME; + break; default: error: *objp = NIL; /* Don't leave a hole in the heap */ @@ -3950,7 +3955,7 @@ enc_term_int(TTBEncodeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, ErlFunThing* funp = (ErlFunThing *) fun_val(obj); if (is_local_fun(funp)) { - ErlFunEntry* fe = funp->entry.fun; + const ErlFunEntry *fe = funp->entry.fun; int ei; *ep++ = NEW_FUN_EXT; @@ -3974,7 +3979,7 @@ enc_term_int(TTBEncodeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, WSTACK_PUSH2(s, ENC_TERM, (UWord) funp->env[ei]); } } else { - Export *exp = funp->entry.exp; + const Export *exp = funp->entry.exp; *ep++ = EXPORT_EXT; ep = enc_atom(acmp, exp->info.mfa.module, ep, dflags); @@ -5001,7 +5006,6 @@ dec_term(ErtsDistExternal *edep, case NEW_FUN_EXT: { ErlFunThing *funp; - FunRef *refp; Uint arity; Eterm module; const byte* uniq; @@ -5021,19 +5025,11 @@ dec_term(ErtsDistExternal *edep, num_free = get_int32(ep); ep += 4; - refp = (FunRef*)&hp[0]; - funp = (ErlFunThing*)&hp[ERL_FUN_REF_SIZE]; - - refp->thing_word = HEADER_FUN_REF; + funp = (ErlFunThing*)hp; funp->thing_word = MAKE_FUN_HEADER(arity, num_free, 0); *objp = make_fun(funp); - hp += ERL_FUN_REF_SIZE + ERL_FUN_SIZE; - - /* Fun references are stored just past the end of the free - * variables. */ - funp->env[num_free] = make_boxed((Eterm*)refp); - hp += num_free + 1; + hp += ERL_FUN_SIZE + num_free; /* Module */ if ((ep = dec_atom(edep, ep, &module, 0)) == NULL) { @@ -5067,16 +5063,12 @@ dec_term(ErtsDistExternal *edep, goto error; } - /* It is safe to link the fun into the fun list only when no - * more validity tests can fail. */ - refp->next = factory->off_heap->first; - factory->off_heap->first = (struct erl_off_heap_header*)refp; - - funp->entry.fun = erts_put_fun_entry2(module, old_uniq, - old_index, uniq, - index, arity); - refp->entry = funp->entry.fun; - + funp->entry.fun = erts_fun_entry_get_or_make_stub(module, + old_uniq, + old_index, + uniq, + index, + arity); hp = factory->hp; /* Environment */ @@ -5673,7 +5665,7 @@ encode_size_struct_int(TTBSizeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, ErlFunThing *funp = (ErlFunThing *) fun_val(obj); if (is_local_fun(funp)) { - ErlFunEntry *fe = funp->entry.fun; + const ErlFunEntry *fe = funp->entry.fun; result += 1 /* tag */ + 4 /* length field (size of free variables) */ @@ -5696,7 +5688,7 @@ encode_size_struct_int(TTBSizeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, continue; /* big loop */ } } else { - Export* ep = funp->entry.exp; + const Export *ep = funp->entry.exp; result += 1; result += encode_atom_size(acmp, ep->info.mfa.module, dflags); @@ -6147,7 +6139,7 @@ decoded_size(const byte *ep, const byte* endp, int internal_tags, B2TContext* ct goto error; } ADDTERMS(4 + num_free); - heap_size += ERL_FUN_REF_SIZE + ERL_FUN_SIZE + num_free + 1; + heap_size += ERL_FUN_SIZE + num_free; break; } case FUN_EXT: diff --git a/erts/emulator/beam/generators.tab b/erts/emulator/beam/generators.tab index bdae340b68c9..38bf37f844c8 100644 --- a/erts/emulator/beam/generators.tab +++ b/erts/emulator/beam/generators.tab @@ -81,159 +81,6 @@ gen.get_utf16(Fail, Ms, Flags, Dst) { return op; } -gen.put_binary(Fail, Size, Unit, Flags, Src) { - BeamOp* op; - $NewBeamOp(S, op); - - $NativeEndian(Flags); - if (Size.type == TAG_a && Size.val == am_all) { - $BeamOpNameArity(op, i_new_bs_put_binary_all, 3); - op->a[0] = Src; - op->a[1] = Fail; - op->a[2] = Unit; - } else if (Size.type == TAG_i) { - $BeamOpNameArity(op, i_new_bs_put_binary_imm, 3); - op->a[0] = Fail; - op->a[1].type = TAG_u; - if (beam_load_safe_mul(Size.val, Unit.val, &op->a[1].val)) { - op->a[2] = Src; - } else { - error: - /* - * Invalid size. This instruction can't possibly be - * reached, because bs_add or bs_init* would already - * have raised a system_limit exception. - */ - $BeamOpNameArity(op, delete_me, 0); - } - } else if (Size.type == TAG_q) { -#ifdef ARCH_64 - /* - * There is no way that this binary would fit in memory. - */ - goto error; -#else - Eterm big = beamfile_get_literal(&S->beam, Size.val); - Uint bigval; - Uint size; - - if (!term_to_Uint(big, &bigval) || - !beam_load_safe_mul(bigval, Unit.val, &size)) { - goto error; - } - $BeamOpNameArity(op, i_new_bs_put_binary_imm, 3); - op->a[0] = Fail; - op->a[1].type = TAG_u; - op->a[1].val = size; - op->a[2] = Src; -#endif - } else { - $BeamOpNameArity(op, i_new_bs_put_binary, 4); - op->a[0] = Fail; - op->a[1] = Size; - op->a[2].type = TAG_u; - op->a[2].val = (Unit.val << 3) | (Flags.val & 7); - op->a[3] = Src; - } - - return op; -} - -gen.put_integer(Fail, Size, Unit, Flags, Src) { - BeamOp* op; - $NewBeamOp(S, op); - - $NativeEndian(Flags); - /* Negative size must fail */ - if (Size.type == TAG_i) { - Uint size; - if (!beam_load_safe_mul(Size.val, Unit.val, &size)) { - error: - /* - * Invalid size. This instruction can't possibly be - * reached, because bs_add or bs_init* would already - * have raised a system_limit exception. - */ - $BeamOpNameArity(op, delete_me, 0); - return op; - } - $BeamOpNameArity(op, i_new_bs_put_integer_imm, 4); - op->a[0] = Src; - op->a[1] = Fail; - op->a[2].type = TAG_u; - op->a[2].val = size; - op->a[3].type = Flags.type; - op->a[3].val = (Flags.val & 7); - } else if (Size.type == TAG_q) { - Eterm big = beamfile_get_literal(&S->beam, Size.val); - Uint bigval; - Uint size; - - if (!term_to_Uint(big, &bigval) || - !beam_load_safe_mul(bigval, Unit.val, &size)) { - goto error; - } - $BeamOpNameArity(op, i_new_bs_put_integer_imm, 4); - op->a[0] = Src; - op->a[1] = Fail; - op->a[2].type = TAG_u; - op->a[2].val = size; - op->a[3].type = Flags.type; - op->a[3].val = (Flags.val & 7); - } else { - $BeamOpNameArity(op, i_new_bs_put_integer, 4); - op->a[0] = Fail; - op->a[1] = Size; - op->a[2].type = TAG_u; - op->a[2].val = (Unit.val << 3) | (Flags.val & 7); - op->a[3] = Src; - } - return op; -} - -gen.put_float(Fail, Size, Unit, Flags, Src) { - BeamOp* op; - $NewBeamOp(S, op); - - $NativeEndian(Flags); - if (Size.type == TAG_i) { - $BeamOpNameArity(op, i_new_bs_put_float_imm, 4); - op->a[0] = Fail; - op->a[1].type = TAG_u; - if (!beam_load_safe_mul(Size.val, Unit.val, &op->a[1].val)) { - /* - * Size overflow. This instruction can't possibly be reached, because - * bs_add or bs_init* would already have raised a system_limit - * exception. - */ - $BeamOpNameArity(op, delete_me, 0); - } else { - op->a[2] = Flags; - op->a[3] = Src; - } - } else { - $BeamOpNameArity(op, i_new_bs_put_float, 4); - op->a[0] = Fail; - op->a[1] = Size; - op->a[2].type = TAG_u; - op->a[2].val = (Unit.val << 3) | (Flags.val & 7); - op->a[3] = Src; - } - return op; -} - -gen.put_utf16(Fail, Flags, Src) { - BeamOp* op; - $NewBeamOp(S, op); - - $NativeEndian(Flags); - $BeamOpNameArity(op, i_bs_put_utf16, 3); - op->a[0] = Fail; - op->a[1] = Flags; - op->a[2] = Src; - return op; -} - // Generate the fastest instruction for bs_skip_bits. gen.skip_bits2(Fail, Ms, Size, Unit, Flags) { BeamOp* op; @@ -306,25 +153,17 @@ MakeLiteralFun(Op, Index, Arity, Dst) { /* If we haven't already done so, we need to create a placeholder for the * lambda. */ - literal = S->fun_refs[$Index]; + literal = S->lambda_literals[$Index]; if (literal == ERTS_SWORD_MAX) { - Eterm tmp_hp[ERL_FUN_SIZE + ERL_FUN_REF_SIZE + 1]; + Eterm tmp_hp[ERL_FUN_SIZE]; ErlFunThing *funp; - FunRef *refp; - - /* +1 to skip funp->env[0] */ - refp = (FunRef*)&tmp_hp[ERL_FUN_SIZE + 1]; - refp->thing_word = HEADER_FUN_REF; - refp->entry = NULL; - refp->next = NULL; funp = (ErlFunThing*)tmp_hp; funp->thing_word = MAKE_FUN_HEADER($Arity, 0, 0); funp->entry.exp = NULL; - funp->env[0] = make_boxed((Eterm*)refp); literal = beamfile_add_literal(&S->beam, make_fun((Eterm*)funp), 0); - S->fun_refs[$Index] = literal; + S->lambda_literals[$Index] = literal; } $BeamOpNameArity($Op, move, 2); @@ -334,42 +173,20 @@ MakeLiteralFun(Op, Index, Arity, Dst) { } MakeFun(Op, Index, Arity, NumFree, Env, Dst) { - SWord literal; - $BeamOpNameArity(op, i_make_fun3, 4); - $BeamOpArity(op, 5 + $NumFree); + $BeamOpArity(op, 4 + $NumFree); - op->a[0].type = TAG_u; - op->a[0].val = $Index; - op->a[1] = $Dst; - op->a[2].type = TAG_u; - op->a[2].val = $Arity - $NumFree; - op->a[3].type = TAG_u; - op->a[3].val = $NumFree; + ($Op)->a[0].type = TAG_u; + ($Op)->a[0].val = $Index; + ($Op)->a[1] = $Dst; + ($Op)->a[2].type = TAG_u; + ($Op)->a[2].val = $Arity - $NumFree; + ($Op)->a[3].type = TAG_u; + ($Op)->a[3].val = $NumFree; for (int i = 0; i < $NumFree; i++) { - op->a[4 + i] = $Env[i]; + ($Op)->a[4 + i] = $Env[i]; } - - /* Create a FunRef if we haven't already done so (may be shared with other - * make_fun3 instructions). */ - literal = S->fun_refs[$Index]; - if (literal == ERTS_SWORD_MAX) { - Eterm tmp_hp[ERL_FUN_REF_SIZE]; - FunRef *refp = (FunRef*)tmp_hp; - - refp->thing_word = HEADER_FUN_REF; - refp->entry = NULL; - refp->next = NULL; - - literal = beamfile_add_literal(&S->beam, make_boxed((Eterm*)refp), 0); - S->fun_refs[$Index] = literal; - } - - /* Add the FunRef as part of the environment, just past the free - * variables. */ - op->a[4 + $NumFree].type = TAG_q; - op->a[4 + $NumFree].val = literal; } gen.make_fun3(Idx, Dst, NumFree, Env) { diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index c172ac0df50a..d7bb35378d1c 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -1319,7 +1319,7 @@ void erts_cleanup_offheap(ErlOffHeap *offheap); Uint64 erts_timestamp_millis(void); -Export* erts_find_function(Eterm, Eterm, unsigned int, ErtsCodeIndex); +const Export *erts_find_function(Eterm, Eterm, unsigned int, ErtsCodeIndex); /* ERTS_NOINLINE prevents link-time optimization across modules */ const void *erts_get_stacklimit(void); @@ -1491,7 +1491,7 @@ char *erts_convert_filename_to_wchar(const byte* bytes, Uint size, ErtsAlcType_t alloc_type, Sint* used, Uint extra_wchars); Eterm erts_convert_native_to_filename(Process *p, size_t size, byte *bytes); -Eterm erts_utf8_to_list(Process *p, Uint num, byte *bytes, Uint sz, Uint left, +Eterm erts_utf8_to_list(Process *p, Uint num, const byte *bytes, Uint sz, Uint left, Uint *num_built, Uint *num_eaten, Eterm tail); Eterm erts_make_list_from_utf8_buf(Eterm **hpp, Uint num, diff --git a/erts/emulator/beam/hash.c b/erts/emulator/beam/hash.c index 5c8b43e6e26d..67febabe8fce 100644 --- a/erts/emulator/beam/hash.c +++ b/erts/emulator/beam/hash.c @@ -98,10 +98,8 @@ void hash_info(fmtfn_t to, void *arg, Hash* h) int hash_table_sz(Hash *h) { - int i; - for(i=0;h->name[i];i++); - i++; - return sizeof(Hash) + hash_get_slots(h)*sizeof(HashBucket*) + i; + const int name_len = strlen(h->name) + 1; + return sizeof(Hash) + hash_get_slots(h)*sizeof(HashBucket*) + name_len; } diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c index 78efccc3767c..41c1b94ccbe9 100644 --- a/erts/emulator/beam/io.c +++ b/erts/emulator/beam/io.c @@ -3198,6 +3198,7 @@ static int flush_linebuf(LineBufContext *bp) resize_linebuf(bp->b); LINEBUF_DATA(*bp)[((*bp->b)->ovlen)++] = '\r'; ++bp->retlen; /* fall through instead of switching state... */ + ERTS_FALLTHROUGH(); case LINEBUF_MAIN: case LINEBUF_FULL: (*bp->b)->ovlen = 0; @@ -4277,7 +4278,9 @@ erts_port_control(Process* c_p, return ERTS_PORT_OP_BADARG; try_call = !(sched_flags & ERTS_PTS_FLGS_FORCE_SCHEDULE_OP); + binp = NULL; + ERTS_UNDEF(br, NULL); /* Suppress warning. */ if (is_bitstring(data)) { ERTS_DECLARE_DUMMY(Eterm br_flags); @@ -5430,10 +5433,13 @@ erts_stale_drv_select(Eterm port, switch (mode) { case ERL_DRV_READ | ERL_DRV_WRITE: type = "Input/Output"; + break; case ERL_DRV_WRITE: type = "Output"; + break; case ERL_DRV_READ: type = "Input"; + break; default: type = ""; } diff --git a/erts/emulator/beam/jit/arm/beam_asm_global.cpp b/erts/emulator/beam/jit/arm/beam_asm_global.cpp index 7e294602e4e2..990f826e03ae 100644 --- a/erts/emulator/beam/jit/arm/beam_asm_global.cpp +++ b/erts/emulator/beam/jit/arm/beam_asm_global.cpp @@ -74,9 +74,10 @@ BeamGlobalAssembler::BeamGlobalAssembler(JitAllocator *allocator) stop = (ErtsCodePtr)((char *)getBaseAddress() + code.codeSize()); } - ranges.push_back({.start = start, - .stop = stop, - .name = code.labelEntry(labels[val.first])->name()}); + ranges.push_back(AsmRange{start, + stop, + code.labelEntry(labels[val.first])->name(), + {}}); } (void)beamasm_metadata_insert("global", diff --git a/erts/emulator/beam/jit/arm/beam_asm_global.hpp.pl b/erts/emulator/beam/jit/arm/beam_asm_global.hpp.pl index 2bce940a7131..758303c1d312 100644 --- a/erts/emulator/beam/jit/arm/beam_asm_global.hpp.pl +++ b/erts/emulator/beam/jit/arm/beam_asm_global.hpp.pl @@ -34,8 +34,6 @@ bif_is_ne_exact_shared bif_tuple_size_body bif_tuple_size_guard - bs_add_guard_shared - bs_add_body_shared bs_create_bin_error_shared bs_get_tail_shared bs_get_utf8_shared diff --git a/erts/emulator/beam/jit/arm/beam_asm_module.cpp b/erts/emulator/beam/jit/arm/beam_asm_module.cpp index f940783460a1..e8b5a398c196 100644 --- a/erts/emulator/beam/jit/arm/beam_asm_module.cpp +++ b/erts/emulator/beam/jit/arm/beam_asm_module.cpp @@ -536,10 +536,7 @@ const Label &BeamModuleAssembler::resolve_label(const Label &target, anchor = a.newNamedLabel(name.str().c_str()); } - auto it = _veneers.emplace(target.id(), - Veneer{.latestOffset = maxOffset, - .anchor = anchor, - .target = target}); + auto it = _veneers.emplace(target.id(), Veneer{maxOffset, anchor, target}); const Veneer &veneer = it->second; _pending_veneers.emplace(veneer); @@ -585,10 +582,8 @@ arm::Mem BeamModuleAssembler::embed_constant(const ArgVal &value, } } - auto it = _constants.emplace(value, - Constant{.latestOffset = maxOffset, - .anchor = a.newLabel(), - .value = value}); + auto it = + _constants.emplace(value, Constant{maxOffset, a.newLabel(), value}); const Constant &constant = it->second; _pending_constants.emplace(constant); @@ -603,10 +598,9 @@ arm::Mem BeamModuleAssembler::embed_label(const Label &label, ASSERT(disp >= dispMin && disp <= dispMax); - auto it = _embedded_labels.emplace(label.id(), - EmbeddedLabel{.latestOffset = maxOffset, - .anchor = a.newLabel(), - .label = label}); + auto it = _embedded_labels.emplace( + label.id(), + EmbeddedLabel{maxOffset, a.newLabel(), label}); ASSERT(it.second); const EmbeddedLabel &embedded_label = it.first->second; _pending_labels.emplace(embedded_label); diff --git a/erts/emulator/beam/jit/arm/generators.tab b/erts/emulator/beam/jit/arm/generators.tab index 7a4aa84028a3..c020225cdf1a 100644 --- a/erts/emulator/beam/jit/arm/generators.tab +++ b/erts/emulator/beam/jit/arm/generators.tab @@ -262,7 +262,7 @@ gen.new_small_map_lit(Dst, Live, Size, Rest) { tmp = thp = erts_alloc(ERTS_ALC_T_LOADER_TMP, ((size == 0 ? 0 : 1) + size/2) * sizeof(*tmp)); if (size == 0) { - keys = erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); + keys = ERTS_GLOBAL_LIT_EMPTY_TUPLE; } else { keys = make_tuple(thp); *thp++ = make_arityval(size/2); diff --git a/erts/emulator/beam/jit/arm/instr_bif.cpp b/erts/emulator/beam/jit/arm/instr_bif.cpp index e3a71beb57c9..99f00255b3c6 100644 --- a/erts/emulator/beam/jit/arm/instr_bif.cpp +++ b/erts/emulator/beam/jit/arm/instr_bif.cpp @@ -799,13 +799,13 @@ void BeamModuleAssembler::emit_call_bif(const ArgWord &Func) { void BeamModuleAssembler::emit_call_bif_mfa(const ArgAtom &M, const ArgAtom &F, const ArgWord &A) { - BeamInstr func; - Export *e; + const Export *e; + UWord func; e = erts_active_export_entry(M.get(), F.get(), A.get()); ASSERT(e != NULL && e->bif_number != -1); - func = (BeamInstr)bif_table[e->bif_number].f; + func = (UWord)bif_table[e->bif_number].f; a.adr(ARG3, current_label); a.sub(ARG2, ARG3, imm(sizeof(ErtsCodeMFA))); diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp index a1814fc94c14..18aeefa0483c 100644 --- a/erts/emulator/beam/jit/arm/instr_bs.cpp +++ b/erts/emulator/beam/jit/arm/instr_bs.cpp @@ -112,13 +112,6 @@ int BeamModuleAssembler::emit_bs_get_field_size(const ArgSource &Size, } } -void BeamModuleAssembler::emit_i_bs_init_heap(const ArgWord &Size, - const ArgWord &Heap, - const ArgWord &Live, - const ArgRegister &Dst) { - emit_i_bs_init_bits_heap(ArgWord(Size.get() * 8), Heap, Live, Dst); -} - /* Set the error reason when a size check has failed. */ void BeamGlobalAssembler::emit_bs_size_check_shared() { emit_enter_runtime_frame(); @@ -134,349 +127,6 @@ void BeamGlobalAssembler::emit_bs_size_check_shared() { a.b(labels[raise_exception]); } -void BeamModuleAssembler::emit_i_bs_init_fail_heap(const ArgSource &Size, - const ArgWord &Heap, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - Label fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - } - - if (emit_bs_get_field_size(Size, 1, fail, ARG4) >= 0) { - a.lsl(ARG4, ARG4, imm(3)); - mov_arg(ARG5, Heap); - mov_arg(ARG6, Live); - fragment_call(ga->get_bs_init_bits_shared()); - mov_arg(Dst, ARG1); - } - - if (Fail.get() == 0) { - Label next = a.newLabel(); - - a.b(next); - - a.bind(fail); - { - mov_arg(ARG2, Size); - fragment_call(ga->get_bs_size_check_shared()); - } - - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_bs_init(const ArgWord &Size, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - emit_i_bs_init_heap(Size, Heap, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_fail(const ArgRegister &Size, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - emit_i_bs_init_fail_heap(Size, Heap, Fail, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits(const ArgWord &NumBits, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal heap(ArgVal::Word, 0); - emit_i_bs_init_bits_heap(NumBits, heap, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_heap(const ArgWord &NumBits, - const ArgWord &Alloc, - const ArgWord &Live, - const ArgRegister &Dst) { - mov_arg(ARG4, NumBits); - mov_arg(ARG5, Alloc); - mov_arg(ARG6, Live); - fragment_call(ga->get_bs_init_bits_shared()); - mov_arg(Dst, ARG1); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_fail(const ArgRegister &NumBits, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - - emit_i_bs_init_bits_fail_heap(NumBits, Heap, Fail, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_fail_heap( - const ArgSource &NumBits, - const ArgWord &Alloc, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - Label fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - } - - if (emit_bs_get_field_size(NumBits, 1, fail, ARG4) >= 0) { - mov_arg(ARG5, Alloc); - mov_arg(ARG6, Live); - fragment_call(ga->get_bs_init_bits_shared()); - mov_arg(Dst, ARG1); - } - - if (Fail.get() == 0) { - Label next = a.newLabel(); - - a.b(next); - a.bind(fail); - { - mov_arg(ARG2, NumBits); - fragment_call(ga->get_bs_size_check_shared()); - } - - a.bind(next); - } -} - -void BeamModuleAssembler::emit_bs_put_string(const ArgWord &Size, - const ArgBytePtr &Ptr) { - mov_arg(ARG2, Ptr); - mov_arg(ARG3, Size); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<3>(erts_new_bs_put_string); - - emit_leave_runtime(); -} - -void BeamModuleAssembler::emit_i_new_bs_put_integer_imm(const ArgSource &Src, - const ArgLabel &Fail, - const ArgWord &Sz, - const ArgWord &Flags) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - a.cbz(ARG1, resolve_beam_label(Fail, disp1MB)); - } else { - Label next = a.newLabel(); - - a.cbnz(ARG1, next); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_integer(const ArgLabel &Fail, - const ArgRegister &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - a.cbz(ARG1, fail); - } else { - a.cbnz(ARG1, next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary(const ArgLabel &Fail, - const ArgSource &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - a.cbz(ARG1, fail); - } else { - a.cbnz(ARG1, next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary_all(const ArgSource &Src, - const ArgLabel &Fail, - const ArgWord &Unit) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Unit); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary_all); - - emit_leave_runtime(); - - if (Fail.get() == 0) { - Label next = a.newLabel(); - - a.cbnz(ARG1, next); - emit_error(BADARG); - a.bind(next); - } else { - a.cbz(ARG1, resolve_beam_label(Fail, disp1MB)); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary_imm(const ArgLabel &Fail, - const ArgWord &Sz, - const ArgSource &Src) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); - - emit_leave_runtime(); - - if (Fail.get() == 0) { - Label next = a.newLabel(); - - a.cbnz(ARG1, next); - emit_error(BADARG); - a.bind(next); - } else { - a.cbz(ARG1, resolve_beam_label(Fail, disp1MB)); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_float(const ArgLabel &Fail, - const ArgRegister &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_new_bs_put_float); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - emit_branch_if_value(ARG1, fail); - } else { - emit_branch_if_not_value(ARG1, next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_float_imm(const ArgLabel &Fail, - const ArgWord &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_new_bs_put_float); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - emit_branch_if_value(ARG1, resolve_beam_label(Fail, disp1MB)); - } else { - Label next = a.newLabel(); - - emit_branch_if_not_value(ARG1, next); - emit_error(BADARG); - a.bind(next); - } -} - void BeamModuleAssembler::emit_i_bs_start_match3(const ArgRegister &Src, const ArgWord &Live, const ArgLabel &Fail, @@ -939,56 +589,6 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx, } } -void BeamModuleAssembler::emit_i_bs_utf8_size(const ArgSource &Src, - const ArgXRegister &Dst) { - auto src_reg = load_source(Src, TMP1); - auto dst_reg = init_destination(Dst, TMP2); - - Label next = a.newLabel(); - - /* Note that the source and destination registers could be the - * same register. Therefore, we must copy the source register - * before writing to the destination register. */ - a.lsr(TMP1, src_reg.reg, imm(_TAG_IMMED1_SIZE)); - mov_imm(dst_reg.reg, make_small(1)); - a.cmp(TMP1, imm(0x7F)); - a.b_ls(next); - - mov_imm(dst_reg.reg, make_small(2)); - a.cmp(TMP1, imm(0x7FFUL)); - a.b_ls(next); - - a.cmp(TMP1, imm(0x10000UL)); - mov_imm(TMP2, make_small(3)); - mov_imm(TMP3, make_small(4)); - a.csel(dst_reg.reg, TMP2, TMP3, arm::CondCode::kLO); - - a.bind(next); - flush_var(dst_reg); -} - -void BeamModuleAssembler::emit_i_bs_put_utf8(const ArgLabel &Fail, - const ArgSource &Src) { - mov_arg(ARG2, Src); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<2>(erts_bs_put_utf8); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - a.cbz(ARG1, resolve_beam_label(Fail, disp1MB)); - } else { - Label next = a.newLabel(); - - a.cbnz(ARG1, next); - emit_error(BADARG); - a.bind(next); - } -} - /* * ARG1 = pointer to match state * ARG2 = number of bits left in binary (< 32) @@ -1282,46 +882,6 @@ void BeamModuleAssembler::emit_i_bs_skip_utf8(const ArgRegister &Ctx, emit_bs_get_utf8(Ctx, Fail); } -void BeamModuleAssembler::emit_i_bs_utf16_size(const ArgSource &Src, - const ArgXRegister &Dst) { - auto src_reg = load_source(Src, TMP1); - auto dst_reg = init_destination(Dst, TMP2); - - /* erts_bs_put_utf16 errors out whenever something's fishy, so we can - * return garbage (2 or 4) if our input is not a small. */ - a.asr(TMP1, src_reg.reg, imm(_TAG_IMMED1_SIZE)); - a.cmp(TMP1, imm(0x10000UL)); - mov_imm(TMP1, make_small(2)); - mov_imm(TMP2, make_small(4)); - a.csel(dst_reg.reg, TMP1, TMP2, arm::CondCode::kLO); - - flush_var(dst_reg); -} - -void BeamModuleAssembler::emit_i_bs_put_utf16(const ArgLabel &Fail, - const ArgWord &Flags, - const ArgSource &Src) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Flags); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<3>(erts_bs_put_utf16); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - a.cbz(ARG1, resolve_beam_label(Fail, disp1MB)); - } else { - Label next = a.newLabel(); - - a.cbnz(ARG1, next); - emit_error(BADARG); - a.bind(next); - } -} - void BeamModuleAssembler::emit_bs_get_utf16(const ArgRegister &Ctx, const ArgLabel &Fail, const ArgWord &Flags) { @@ -1377,27 +937,6 @@ void BeamModuleAssembler::emit_validate_unicode(Label next, a.b(next); } -void BeamModuleAssembler::emit_i_bs_validate_unicode(const ArgLabel &Fail, - const ArgSource &Src) { - auto src_reg = load_source(Src, TMP1); - Label fail, next = a.newLabel(); - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail, dispUnknown); - } else { - fail = a.newLabel(); - } - - emit_validate_unicode(next, fail, src_reg.reg); - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - } - - a.bind(next); -} - void BeamModuleAssembler::emit_i_bs_validate_unicode_retract( const ArgLabel &Fail, const ArgSource &Src, @@ -1450,182 +989,6 @@ void BeamModuleAssembler::emit_bs_test_unit(const ArgLabel &Fail, } } -/* ARG2 = current `Size`, - * ARG3 = elements to `Add`, - * ARG4 = element `Unit` - * - * Error is indicated through cond_ne() */ -void BeamGlobalAssembler::emit_bs_add_guard_shared() { - Label error = a.newLabel(); - - /* Since `Unit` is guaranteed to be less than 1024, we can check overflow - * and negative numbers by testing whether any of the highest 12 value bits - * are set on either argument. */ - a.orr(TMP1, ARG2, ARG3); - a.tst(TMP1, imm(0xFFF0000000000000UL)); - - a.and_(TMP1, ARG2, ARG3); - a.and_(TMP1, TMP1, imm(_TAG_IMMED1_MASK)); - a.ccmp(TMP1, - imm(_TAG_IMMED1_SMALL), - imm(NZCV::kNone), - imm(arm::CondCode::kEQ)); - a.b_ne(error); - - /* Return `Size` + `Add` * `Unit` - * - * Note that the result takes the tag bits from `Size` */ - a.and_(TMP2, ARG3, imm(~_TAG_IMMED1_SMALL)); - a.mul(TMP2, TMP2, ARG4); - a.add(ARG1, TMP2, ARG2); - - a.bind(error); - a.ret(a64::x30); -} - -/* ARG2 = current `Size`, - * ARG3 = elements to `Add`, - * ARG4 = element `Unit` */ -void BeamGlobalAssembler::emit_bs_add_body_shared() { - Label error = a.newLabel(); - - /* Since `Unit` is guaranteed to be less than 1024, we can check overflow - * and negative numbers by testing whether any of the highest 12 value bits - * are set on either argument. */ - a.orr(TMP1, ARG2, ARG3); - a.tst(TMP1, imm(0xFFF0000000000000UL)); - - a.and_(TMP1, ARG2, ARG3); - a.and_(TMP1, TMP1, imm(_TAG_IMMED1_MASK)); - a.ccmp(TMP1, - imm(_TAG_IMMED1_SMALL), - imm(NZCV::kNone), - imm(arm::CondCode::kEQ)); - a.b_ne(error); - - /* Return `Size` + `Add` * `Unit` - * - * Note that the result takes the tag bits from `Size` */ - a.and_(TMP2, ARG3, imm(~_TAG_IMMED1_SMALL)); - a.mul(TMP2, TMP2, ARG4); - a.add(ARG1, TMP2, ARG2); - a.ret(a64::x30); - - a.bind(error); - { - emit_enter_runtime_frame(); - emit_enter_runtime(0); - - a.mov(ARG1, c_p); - runtime_call<3>(beam_jit_bs_add_argument_error); - - emit_leave_runtime(0); - emit_leave_runtime_frame(); - - mov_imm(ARG4, 0); - a.b(labels[raise_exception]); - } -} - -void BeamModuleAssembler::emit_bs_add(const ArgLabel &Fail, - const ArgSource &Size, - const ArgSource &Add, - const ArgWord &Unit, - const ArgXRegister &Dst) { - ASSERT(Unit.get() < 1024); - - mov_arg(ARG2, Size); - mov_arg(ARG3, Add); - mov_arg(ARG4, Unit); - - if (Fail.get() == 0) { - fragment_call(ga->get_bs_add_body_shared()); - } else { - fragment_call(ga->get_bs_add_guard_shared()); - a.b_ne(resolve_beam_label(Fail, disp1MB)); - } - - mov_arg(Dst, ARG1); -} - -void BeamModuleAssembler::emit_i_bs_append(const ArgLabel &Fail, - const ArgWord &ExtraHeap, - const ArgWord &Live, - const ArgWord &Unit, - const ArgSource &Size, - const ArgSource &Bin, - const ArgRegister &Dst) { - Label next = a.newLabel(); - - mov_arg(ARG3, Live); - mov_arg(ARG4, Size); - mov_arg(ARG5, ExtraHeap); - mov_arg(ARG6, Unit); - - mov_arg(ArgXRegister(Live.get()), Bin); - - emit_enter_runtime(Live.get() + 1); - - a.mov(ARG1, c_p); - load_x_reg_array(ARG2); - runtime_call<6>(erts_bs_append); - - emit_leave_runtime(Live.get() + 1); - - emit_branch_if_value(ARG1, next); - - if (Fail.get() != 0) { - /* Test whether the max_heap_size limit has been exceeded. */ - a.ldr(TMP1.w(), arm::Mem(c_p, offsetof(Process, state.value))); - a.tst(TMP1, imm(ERTS_PSFLG_EXITING)); - a.b_eq(resolve_beam_label(Fail, disp1MB)); - a.b(resolve_fragment(ga->get_do_schedule(), disp128MB)); - } else { - a.ldr(TMP1.w(), arm::Mem(c_p, offsetof(Process, state.value))); - a.tst(TMP1, imm(ERTS_PSFLG_EXITING)); - a.b_ne(resolve_fragment(ga->get_do_schedule(), disp1MB)); - - /* The error has been prepared in `erts_bs_append` */ - emit_raise_exception(); - } - - a.bind(next); - mov_arg(Dst, ARG1); -} - -void BeamModuleAssembler::emit_i_bs_private_append(const ArgLabel &Fail, - const ArgWord &Unit, - const ArgSource &Size, - const ArgRegister &Src, - const ArgXRegister &Dst) { - mov_arg(ARG2, Src); - mov_arg(ARG3, Size); - mov_arg(ARG4, Unit); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_bs_private_append); - - emit_leave_runtime(); - - if (Fail.get() != 0) { - emit_branch_if_not_value(ARG1, resolve_beam_label(Fail, dispUnknown)); - } else { - Label next = a.newLabel(); - - emit_branch_if_value(ARG1, next); - /* The error has been prepared in `erts_bs_private_append` */ - emit_raise_exception(); - - a.bind(next); - } - - mov_arg(Dst, ARG1); -} - void BeamModuleAssembler::emit_bs_init_writable() { ERTS_CT_ASSERT(ERTS_HIGHEST_CALLEE_SAVE_XREG >= 0); @@ -1836,7 +1199,7 @@ void BeamModuleAssembler::update_bin_state(a64::Gp bin_offset, Sint size, a64::Gp size_reg) { int cur_bin_offset = offsetof(ErtsSchedulerRegisters, - aux_regs.d.erl_bits_state.erts_current_bin_); + aux_regs.d.erl_bits_state.erts_current_bin); arm::Mem mem_bin_base = arm::Mem(scheduler_registers, cur_bin_offset); arm::Mem mem_bin_offset = arm::Mem(scheduler_registers, cur_bin_offset + sizeof(Eterm)); @@ -1844,8 +1207,8 @@ void BeamModuleAssembler::update_bin_state(a64::Gp bin_offset, if (bit_offset % 8 != 0) { /* The bit offset is unknown or not byte-aligned. */ ERTS_CT_ASSERT_FIELD_PAIR(struct erl_bits_state, - erts_current_bin_, - erts_bin_offset_); + erts_current_bin, + erts_bin_offset); a.ldp(TMP2, bin_offset, mem_bin_base); if (size_reg.isValid()) { @@ -2660,14 +2023,14 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, BscSegment seg = segments[0]; comment("private append to binary"); ASSERT(Alloc.get() == 0); - mov_arg(ARG2, seg.src); + load_erl_bits_state(ARG1); + a.mov(ARG2, c_p); + mov_arg(ARG3, seg.src); if (sizeReg.isValid()) { - a.mov(ARG3, sizeReg); + a.mov(ARG4, sizeReg); } else { - mov_imm(ARG3, num_bits); + mov_imm(ARG4, num_bits); } - a.mov(ARG4, seg.unit); - a.mov(ARG1, c_p); emit_enter_runtime(Live.get()); runtime_call<4>(erts_bs_private_append_checked); emit_leave_runtime(Live.get()); @@ -2675,7 +2038,7 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, } else if (estimated_num_bits <= ERL_ONHEAP_BITS_LIMIT) { static constexpr auto cur_bin_offset = offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin_); + offsetof(struct erl_bits_state, erts_current_bin); Uint need; arm::Mem mem_bin_base = arm::Mem(scheduler_registers, cur_bin_offset); @@ -2743,8 +2106,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, /* Initialize the erl_bin_state struct. */ ERTS_CT_ASSERT_FIELD_PAIR(struct erl_bits_state, - erts_current_bin_, - erts_bin_offset_); + erts_current_bin, + erts_bin_offset); a.stp(HTOP, ZERO, mem_bin_base); /* Update HTOP. */ @@ -2797,11 +2160,12 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, comment("construct a binary segment"); if (seg.effectiveSize >= 0) { /* The segment has a literal size. */ - mov_imm(ARG3, seg.effectiveSize); - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); + load_erl_bits_state(ARG1); + a.mov(ARG2, c_p); + mov_arg(ARG3, seg.src); + mov_imm(ARG4, seg.effectiveSize); emit_enter_runtime(Live.get()); - runtime_call<3>(erts_new_bs_put_binary); + runtime_call<4>(erts_bs_put_binary); emit_leave_runtime(Live.get()); error_info = beam_jit_update_bsc_reason_info(seg.error_info, BSC_REASON_BADARG, @@ -2811,12 +2175,13 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, seg.size.as().get() == am_all) { /* Include the entire binary/bitstring in the * resulting binary. */ - a.mov(ARG3, seg.unit); - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); + load_erl_bits_state(ARG1); + a.mov(ARG2, c_p); + mov_arg(ARG3, seg.src); + mov_imm(ARG4, seg.unit); emit_enter_runtime(Live.get()); - runtime_call<3>(erts_new_bs_put_binary_all); + runtime_call<4>(erts_bs_put_binary_all); emit_leave_runtime(Live.get()); error_info = beam_jit_update_bsc_reason_info(seg.error_info, @@ -2834,17 +2199,18 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, * the value is a non-negative small in the * appropriate range. Multiply the size with the * unit. */ - auto r = load_source(seg.size, ARG3); - a.asr(ARG3, r.reg, imm(_TAG_IMMED1_SIZE)); + auto r = load_source(seg.size, ARG4); + a.asr(ARG4, r.reg, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(TMP1, seg.unit); - a.mul(ARG3, ARG3, TMP1); + a.mul(ARG4, ARG4, TMP1); } - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); + load_erl_bits_state(ARG1); + a.mov(ARG2, c_p); + mov_arg(ARG3, seg.src); emit_enter_runtime(Live.get()); - runtime_call<3>(erts_new_bs_put_binary); + runtime_call<4>(erts_bs_put_binary); emit_leave_runtime(Live.get()); error_info = beam_jit_update_bsc_reason_info(seg.error_info, @@ -2864,21 +2230,22 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, case am_float: comment("construct float segment"); if (seg.effectiveSize >= 0) { - mov_imm(ARG3, seg.effectiveSize); + mov_imm(ARG4, seg.effectiveSize); } else { - auto r = load_source(seg.size, ARG3); - a.asr(ARG3, r.reg, imm(_TAG_IMMED1_SIZE)); + auto r = load_source(seg.size, ARG4); + a.asr(ARG4, r.reg, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(TMP1, seg.unit); - a.mul(ARG3, ARG3, TMP1); + a.mul(ARG4, ARG4, TMP1); } } - mov_arg(ARG2, seg.src); - mov_imm(ARG4, seg.flags); - a.mov(ARG1, c_p); + load_erl_bits_state(ARG1); + a.mov(ARG2, c_p); + mov_arg(ARG3, seg.src); + mov_imm(ARG5, seg.flags); emit_enter_runtime(Live.get()); - runtime_call<4>(erts_new_bs_put_float); + runtime_call<5>(erts_bs_put_float); emit_leave_runtime(Live.get()); if (Fail.get() == 0) { @@ -3129,12 +2496,15 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, } else { /* Call the helper function to fetch and store the * integer into the binary. */ - mov_arg(ARG2, seg.src); - mov_imm(ARG4, seg.flags); load_erl_bits_state(ARG1); + mov_arg(ARG2, seg.src); emit_enter_runtime(Live.get()); - runtime_call<4>(erts_new_bs_put_integer); + if (seg.flags & BSF_LITTLE) { + runtime_call<3>(erts_bs_put_integer_le); + } else { + runtime_call<3>(erts_bs_put_integer_be); + } emit_leave_runtime(Live.get()); if (exact_type(seg.src)) { @@ -3161,12 +2531,12 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, comment("insert string"); ASSERT(seg.effectiveSize >= 0); - mov_imm(ARG3, seg.effectiveSize / 8); - mov_arg(ARG2, string_ptr); load_erl_bits_state(ARG1); + mov_arg(ARG2, string_ptr); + mov_imm(ARG3, seg.effectiveSize / 8); emit_enter_runtime(Live.get()); - runtime_call<3>(erts_new_bs_put_string); + runtime_call<3>(erts_bs_put_string); emit_leave_runtime(Live.get()); break; } @@ -3195,13 +2565,16 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, a.cbz(ARG1, resolve_label(error, disp1MB)); break; case am_utf32: + load_erl_bits_state(ARG1); mov_arg(ARG2, seg.src); mov_imm(ARG3, 4 * 8); - a.mov(ARG4, seg.flags); - load_erl_bits_state(ARG1); emit_enter_runtime(Live.get()); - runtime_call<4>(erts_new_bs_put_integer); + if (seg.flags & BSF_LITTLE) { + runtime_call<3>(erts_bs_put_integer_le); + } else { + runtime_call<3>(erts_bs_put_integer_be); + } emit_leave_runtime(Live.get()); if (Fail.get() == 0) { diff --git a/erts/emulator/beam/jit/arm/instr_common.cpp b/erts/emulator/beam/jit/arm/instr_common.cpp index 397d5b88fe2f..0f9299fd59dd 100644 --- a/erts/emulator/beam/jit/arm/instr_common.cpp +++ b/erts/emulator/beam/jit/arm/instr_common.cpp @@ -3109,7 +3109,14 @@ void BeamModuleAssembler::emit_i_perf_counter() { Label next = a.newLabel(), small = a.newLabel(); emit_enter_runtime_frame(); + +#ifdef WIN32 + /* Call the function pointer used by erts_sys_perf_counter */ + runtime_call<0>(erts_sys_time_data__.r.o.sys_hrtime); +#else runtime_call<0>(erts_sys_time_data__.r.o.perf_counter); +#endif + emit_leave_runtime_frame(); a.asr(TMP1, ARG1, imm(SMALL_BITS - 1)); diff --git a/erts/emulator/beam/jit/arm/instr_fun.cpp b/erts/emulator/beam/jit/arm/instr_fun.cpp index 458538f7c65c..0459fd58068e 100644 --- a/erts/emulator/beam/jit/arm/instr_fun.cpp +++ b/erts/emulator/beam/jit/arm/instr_fun.cpp @@ -207,7 +207,7 @@ void BeamModuleAssembler::emit_i_make_fun3(const ArgLambda &Lambda, const Span &env) { Uint i = 0; - ASSERT((NumFree.get() + 1) == env.size() && + ASSERT(NumFree.get() == env.size() && (NumFree.get() + Arity.get()) < MAX_ARG); mov_arg(TMP2, Lambda); diff --git a/erts/emulator/beam/jit/arm/ops.tab b/erts/emulator/beam/jit/arm/ops.tab index 3b0333a83db1..bfd23151c99e 100644 --- a/erts/emulator/beam/jit/arm/ops.tab +++ b/erts/emulator/beam/jit/arm/ops.tab @@ -70,14 +70,14 @@ return # BIF, so we can omit the line instruction for non-BIFs. # -move S X0=x==0 | line Loc | call_ext_last Ar Func=u$is_not_bif D => +move S X0=x==0 | line _Loc | call_ext_last Ar Func=u$is_not_bif D => move S X0 | call_ext_last Ar Func D -move S X0=x==0 | line Loc | call_ext_only Ar Func=u$is_not_bif => +move S X0=x==0 | line _Loc | call_ext_only Ar Func=u$is_not_bif => move S X0 | call_ext_only Ar Func -move S X0=x==0 | line Loc | call_last Ar Func D => +move S X0=x==0 | line _Loc | call_last Ar Func D => move S X0 | call_last Ar Func D -move S X0=x==0 | line Loc | call_only Ar Func => +move S X0=x==0 | line _Loc | call_only Ar Func => move S X0 | call_only Ar Func # The line number in int_func_start/5 can be NIL. @@ -188,8 +188,8 @@ try_end y try_case_end s -try_end Y | deallocate N => try_end_deallocate N -try_end Y | move Src Dst | deallocate N => try_end_move_deallocate Src Dst N +try_end _Y | deallocate N => try_end_deallocate N +try_end _Y | move Src Dst | deallocate N => try_end_move_deallocate Src Dst N try_end_deallocate t try_end_move_deallocate s d t @@ -263,7 +263,7 @@ i_get_tuple_element Tuple Pos Tuple2 | current_tuple Tuple3 | # This is a current_tuple instruction not followed by # get_tuple_element. Invalidate the current tuple pointer. -current_tuple Tuple => _ +current_tuple _Tuple => _ i_get_tuple_element Tuple Pos Dst | current_tuple d | swap R1 R2 => i_get_tuple_element Tuple Pos Dst | swap R1 R2 @@ -283,7 +283,7 @@ i_get_tuple_element Tuple Pos1 Dst1 | # Drop the current_tuple instruction if the tuple is overwritten. current_tuple Tuple Tuple2 | equal(Tuple, Tuple2) => _ -current_tuple Tuple Dst => current_tuple Tuple +current_tuple Tuple _Dst => current_tuple Tuple # The first operand will only be used in the debug-compiled runtime # system to verify that the register holding the tuple pointer agrees @@ -468,7 +468,7 @@ send # Optimized comparisons with one immediate/literal operand. # -is_eq_exact Lbl LHS RHS | equal(LHS, RHS) => _ +is_eq_exact _Lbl LHS RHS | equal(LHS, RHS) => _ is_eq_exact Lbl C=c R=xy => is_eq_exact Lbl R C is_eq_exact Lbl R=xy n => is_nil Lbl R @@ -576,7 +576,7 @@ is_list f s is_atom f s is_float f s -is_nil Fail=f n => _ +is_nil _Fail=f n => _ is_nil Fail=f qia => jump Fail is_nil f S @@ -659,7 +659,7 @@ call_ext_only u==0 u$func:erlang:yield/0 => i_yield | return # The hibernate/3 BIF is an instruction. # call_ext u==3 u$func:erlang:hibernate/3 => i_hibernate -call_ext_last u==3 u$func:erlang:hibernate/3 D => i_hibernate +call_ext_last u==3 u$func:erlang:hibernate/3 _D => i_hibernate call_ext_only u==3 u$func:erlang:hibernate/3 => i_hibernate call_ext u==0 u$func:os:perf_counter/0 => @@ -710,9 +710,9 @@ call_ext_only Ar=u Bif=u$is_bif => # with call instructions. # -call_ext Ar Func => i_call_ext Func -call_ext_last Ar Func D => i_call_ext_last Func D -call_ext_only Ar Func => i_call_ext_only Func +call_ext _Ar Func => i_call_ext Func +call_ext_last _Ar Func D => i_call_ext_last Func D +call_ext_only _Ar Func => i_call_ext_only Func i_validate t @@ -741,50 +741,50 @@ i_perf_counter bif0 u$bif:erlang:self/0 Dst=d => self Dst bif0 u$bif:erlang:node/0 Dst=d => node Dst -bif1 Fail=f Bif=u$bif:erlang:hd/1 Src=xy Dst => +bif1 Fail=f _Bif=u$bif:erlang:hd/1 Src=xy Dst => is_nonempty_list Fail Src | get_hd Src Dst -bif1 Fail=p Bif=u$bif:erlang:hd/1 Src Dst => +bif1 _Fail=p _Bif=u$bif:erlang:hd/1 Src Dst => bif_hd Src Dst bif_hd s d -bif1 Fail=f Bif=u$bif:erlang:tl/1 Src=xy Dst => +bif1 Fail=f _Bif=u$bif:erlang:tl/1 Src=xy Dst => is_nonempty_list Fail Src | get_tl Src Dst -bif1 Fail=p Bif=u$bif:erlang:tl/1 Src Dst => +bif1 _Fail=p _Bif=u$bif:erlang:tl/1 Src Dst => bif_tl Src Dst bif_tl s d -bif1 Fail Bif=u$bif:erlang:get/1 Src=s Dst=d => get(Src, Dst) +bif1 _Fail _Bif=u$bif:erlang:get/1 Src=s Dst=d => get(Src, Dst) bif2 Fail u$bif:erlang:element/2 S1 S2 Dst => bif_element Fail S1 S2 Dst bif_element j s s d -bif2 Fail Bif=u$bif:erlang:and/2 Src1 Src2 Dst=d => bif_and Fail Src1 Src2 Dst +bif2 Fail _Bif=u$bif:erlang:and/2 Src1 Src2 Dst=d => bif_and Fail Src1 Src2 Dst bif_and j s s d -bif2 Fail Bif=u$bif:erlang:or/2 Src1 Src2 Dst=d => bif_or Fail Src1 Src2 Dst +bif2 Fail _Bif=u$bif:erlang:or/2 Src1 Src2 Dst=d => bif_or Fail Src1 Src2 Dst bif_or j s s d -bif1 Fail Bif=u$bif:erlang:not/1 Src=d Dst=d => bif_not Fail Src Dst +bif1 Fail _Bif=u$bif:erlang:not/1 Src=d Dst=d => bif_not Fail Src Dst bif_not j S d -bif1 Fail Bif=u$bif:erlang:node/1 Src=d Dst=d => bif_node Fail Src Dst +bif1 Fail _Bif=u$bif:erlang:node/1 Src=d Dst=d => bif_node Fail Src Dst bif_node j S d -gc_bif1 Fail Live Bif=u$bif:erlang:bit_size/1 Src Dst=d => +gc_bif1 Fail _Live _Bif=u$bif:erlang:bit_size/1 Src Dst=d => bif_bit_size Fail Src Dst bif_bit_size j s d -gc_bif1 Fail Live Bif=u$bif:erlang:byte_size/1 Src Dst=d => +gc_bif1 Fail _Live _Bif=u$bif:erlang:byte_size/1 Src Dst=d => bif_byte_size Fail Src Dst bif_byte_size j s d -bif1 Fail Bif=u$bif:erlang:tuple_size/1 Src=d Dst=d => +bif1 Fail _Bif=u$bif:erlang:tuple_size/1 Src=d Dst=d => bif_tuple_size Fail Src Dst bif_tuple_size j S d -bif2 Fail Bif=u$bif:erlang:map_get/2 Src1 Src2=xy Dst=d => +bif2 Fail _Bif=u$bif:erlang:map_get/2 Src1 Src2=xy Dst=d => bif_map_get Fail Src1 Src2 Dst bif_map_get j s s d @@ -792,15 +792,15 @@ bif2 Fail Bif=u$bif:erlang:is_map_key/2 Key Map=xy Dst=d => bif_is_map_key Bif Fail Key Map Dst bif_is_map_key b j s s d -bif2 Fail Bif=u$bif:erlang:max/2 Src1 Src2 Dst => +bif2 _Fail _Bif=u$bif:erlang:max/2 Src1 Src2 Dst => bif_max Src1 Src2 Dst -bif2 Fail Bif=u$bif:erlang:min/2 Src1 Src2 Dst => +bif2 _Fail _Bif=u$bif:erlang:min/2 Src1 Src2 Dst => bif_min Src1 Src2 Dst bif_max s s d bif_min s s d -bif1 Fail Bif S1 Dst | never_fails(Bif) => nofail_bif1 S1 Bif Dst -bif2 Fail Bif S1 S2 Dst | never_fails(Bif) => nofail_bif2 S1 S2 Bif Dst +bif1 _Fail Bif S1 Dst | never_fails(Bif) => nofail_bif1 S1 Bif Dst +bif2 _Fail Bif S1 S2 Dst | never_fails(Bif) => nofail_bif2 S1 S2 Bif Dst bif1 Fail Bif S1 Dst => i_bif1 S1 Fail Bif Dst bif2 Fail Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst @@ -833,15 +833,16 @@ bif_is_lt s s d # Internal calls. # -i_move S=y Dst | call_last Ar P D => move_call_last S Dst P D -i_move S=y Dst | call_ext_last Ar P=u$is_not_bif D => move_call_ext_last S Dst P D +i_move S=y Dst | call_last _Ar P D => move_call_last S Dst P D +i_move S=y Dst | call_ext_last _Ar P=u$is_not_bif D => + move_call_ext_last S Dst P D move_call_last y d f t move_call_ext_last y d e t -call Ar Func => i_call Func -call_last Ar Func D => i_call_last Func D -call_only Ar Func => i_call_only Func +call _Ar Func => i_call Func +call_last _Ar Func D => i_call_last Func D +call_only _Ar Func => i_call_only Func i_call f i_call_last f t @@ -959,7 +960,7 @@ i_bs_match_test_heap f S I t * # is encountered. # bad_bs_match/1 -bad_bs_match A | never() => _ +bad_bs_match _A | never() => _ # ================================================================ # Bit syntax matching (from R11B). @@ -986,7 +987,7 @@ i_bs_get_binary_all2 S f t t d bs_get_float2 Fail=f Ms=xy Live=u Sz=s Unit=u Flags=u Dst=d => get_float2(Fail, Ms, Live, Sz, Unit, Flags, Dst) -bs_get_float2 Fail=f Ms=x Live=u Sz=q Unit=u Flags=u Dst=d => jump Fail +bs_get_float2 Fail=f _Ms=x _Live=u _Sz=q _Unit=u _Flags=u _Dst=d => jump Fail i_bs_get_float2 S f t s t d @@ -998,7 +999,7 @@ bs_skip_bits2 Fail=f Ms=xy Sz=sq Unit=u Flags=u => i_bs_skip_bits_imm2 f S W i_bs_skip_bits2 S S f t -bs_test_tail2 Fail=f Ms=xy o => jump Fail +bs_test_tail2 Fail=f _Ms=xy o => jump Fail bs_test_tail2 f S W @@ -1021,8 +1022,8 @@ bs_start_match4 Fail=f Live=u Src=xy Ctx=d => %if ARCH_64 # This instruction nops on 64-bit platforms -bs_start_match4 a==am_resume Live Ctx Dst | equal(Ctx, Dst) => _ -bs_start_match4 a==am_resume Live Ctx Dst => move Ctx Dst +bs_start_match4 a==am_resume _Live Ctx Dst | equal(Ctx, Dst) => _ +bs_start_match4 a==am_resume _Live Ctx Dst => move Ctx Dst %else @@ -1031,7 +1032,7 @@ bs_start_match4 a==am_resume Live Ctx Dst => %endif -bs_start_match3 Fail=j ica Live Dst => jump Fail +bs_start_match3 Fail=j ica _Live _Dst => jump Fail bs_start_match3 Fail Bin Live Dst => i_bs_start_match3 Bin Live Fail Dst i_bs_start_match3 S t j d @@ -1040,7 +1041,7 @@ i_bs_start_match3 S t j d # fit into an unsigned small. %if ARCH_64 - bs_get_position Src Dst Live => i_bs_get_position Src Dst + bs_get_position Src Dst _Live => i_bs_get_position Src Dst i_bs_get_position S S bs_set_position S S %else @@ -1086,138 +1087,15 @@ bs_create_bin Fail=j Alloc=u Live=u Unit=u Dst=xy N=u Segments=* => i_bs_create_bin j I t d * -# ================================================================ -# Old instruction for constructing binaries (up to OTP 24). -# ================================================================ - -%warm - -bs_init2 Fail Sz Words Regs Flags Dst | binary_too_big(Sz) => system_limit Fail - -bs_init2 Fail Sz=u Words=u==0 Regs Flags Dst => i_bs_init Sz Regs Dst - -bs_init2 Fail Sz=u Words Regs Flags Dst => - i_bs_init_heap Sz Words Regs Dst - -bs_init2 Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_fail Sz Fail Regs Dst -bs_init2 Fail Sz Words Regs Flags Dst => - i_bs_init_fail_heap Sz Words Fail Regs Dst - -i_bs_init_fail S j t S - -i_bs_init_fail_heap s I j t S - -i_bs_init W t S - -i_bs_init_heap W I t S - - -bs_init_bits Fail Sz=o Words Regs Flags Dst => system_limit Fail - -bs_init_bits Fail Sz=u Words=u==0 Regs Flags Dst => - i_bs_init_bits Sz Regs Dst -bs_init_bits Fail Sz=u Words Regs Flags Dst => - i_bs_init_bits_heap Sz Words Regs Dst - -bs_init_bits Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_bits_fail Sz Fail Regs Dst -bs_init_bits Fail Sz Words Regs Flags Dst => - i_bs_init_bits_fail_heap Sz Words Fail Regs Dst - -i_bs_init_bits_fail S j t S - -i_bs_init_bits_fail_heap s I j t S - -i_bs_init_bits W t S -i_bs_init_bits_heap W I t S - -bs_add Fail S1=i==0 S2 Unit=u==1 D => move S2 D - -bs_add j s s t x - -bs_append Fail Size Extra Live Unit Bin Flags Dst => - i_bs_append Fail Extra Live Unit Size Bin Dst - -bs_private_append Fail Size Unit Bin Flags Dst => - i_bs_private_append Fail Unit Size Bin Dst - -i_bs_private_append Fail Unit Size Bin Dst=y => - i_bs_private_append Fail Unit Size Bin x | move x Dst - bs_init_writable -i_bs_append j I t t s s S -i_bs_private_append j t s S x - -# -# Storing integers into binaries. -# - -bs_put_integer Fail=j Sz=sq Unit=u Flags=u Src=s => - put_integer(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_integer j S t s -i_new_bs_put_integer_imm s j W t - -# -# Utf8/utf16/utf32 support. (R12B-5) -# - -bs_utf8_size j Src Dst=d => i_bs_utf8_size Src Dst -bs_utf16_size j Src Dst=d => i_bs_utf16_size Src Dst - -bs_put_utf8 Fail u Src => i_bs_put_utf8 Fail Src -bs_put_utf16 Fail Flags Src => put_utf16(Fail, Flags, Src) - -bs_put_utf32 Fail=j Flags=u Src=s => - i_bs_validate_unicode Fail Src | bs_put_integer Fail i=32 u=1 Flags Src - -i_bs_utf8_size s x -i_bs_utf16_size s x - -i_bs_put_utf8 j s -i_bs_put_utf16 j t s - -i_bs_validate_unicode j s - -# -# Storing floats into binaries. -# - -# Will fail. No need to keep the instruction, because bs_add or -# bs_init* would already have raised an exception. -bs_put_float Fail Sz=q Unit Flags Val => _ - -bs_put_float Fail=j Sz=s Unit=u Flags=u Src=s => - put_float(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_float j S t s -i_new_bs_put_float_imm j W t s - -# -# Storing binaries into binaries. -# - -bs_put_binary Fail=j Sz=s Unit=u Flags=u Src=s => - put_binary(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_binary j s t s -i_new_bs_put_binary_imm j W s -i_new_bs_put_binary_all s j t - -# -# Warning: The i_bs_put_string and i_new_bs_put_string instructions -# are specially treated in the loader. -# Don't change the instruction format unless you change the loader too. -# - -bs_put_string W M # # New floating point instructions (R8). # +%warm + fadd p FR1 FR2 FR3 => i_fadd FR1 FR2 FR3 fsub p FR1 FR2 FR3 => i_fsub FR1 FR2 FR3 fmul p FR1 FR2 FR3 => i_fmul FR1 FR2 FR3 @@ -1255,7 +1133,7 @@ apply_last t t # always preceded by an is_map test. That means that put_map_assoc can # never fail and does not need any failure label. -put_map_assoc Fail Map Dst Live Size Rest=* => +put_map_assoc _Fail Map Dst Live Size Rest=* => i_put_map_assoc Map Dst Live Size Rest i_put_map_assoc/4 @@ -1311,21 +1189,21 @@ i_get_map_element f S S S # Arithmetic instructions. # -gc_bif2 Fail1 Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | - gc_bif2 Fail2 Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | +gc_bif2 Fail1 _Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | + gc_bif2 Fail2 _Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | equal(Dst1, S3) | equal(Dst1, Dst2) | equal(Fail1, Fail2) => i_mul_add Fail1 S1 S2 S3 S4 Dst1 -gc_bif2 Fail1 Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | - gc_bif2 Fail2 Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | +gc_bif2 Fail1 _Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | + gc_bif2 Fail2 _Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | equal(Dst1, S4) | equal(Dst1, Dst2) | equal(Fail1, Fail2) => i_mul_add Fail1 S1 S2 S4 S3 Dst1 -gc_bif2 Fail Live u$bif:erlang:stimes/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:stimes/2 S1 S2 Dst => i_mul_add Fail S1 S2 Dst i Dst gc_bif2 Fail Live u$bif:erlang:splus/2 Src1 Src2 Dst => @@ -1342,7 +1220,7 @@ gc_bif2 Fail Live u$bif:erlang:div/2 S1 S2 Dst => # Fused 'rem'/'div' pair. gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | - gc_bif2 A B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | + gc_bif2 _A _B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Remainder) | @@ -1351,8 +1229,8 @@ gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | # As above but with a `line` in between gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | - line Loc | - gc_bif2 A B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | + line _Loc | + gc_bif2 _A _B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Remainder) | @@ -1361,7 +1239,7 @@ gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | # Fused 'div'/'rem' pair gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | - gc_bif2 A B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | + gc_bif2 _A _B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Quotient) | @@ -1370,8 +1248,8 @@ gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | # As above but with a `line` in between gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | - line Loc | - gc_bif2 A B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | + line _Loc | + gc_bif2 _A _B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Quotient) | @@ -1437,15 +1315,16 @@ i_length j t d # Specialized guard BIFs. # -gc_bif1 Fail Live Bif=u$bif:erlang:map_size/1 Src Dst=d => bif_map_size Fail Src Dst +gc_bif1 Fail _Live _Bif=u$bif:erlang:map_size/1 Src Dst=d => + bif_map_size Fail Src Dst bif_map_size j s d # # Guard BIFs. # -gc_bif1 Fail Live Bif Src Dst => i_bif1 Src Fail Bif Dst -gc_bif2 Fail Live Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst -gc_bif3 Fail Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst +gc_bif1 Fail _Live Bif Src Dst => i_bif1 Src Fail Bif Dst +gc_bif2 Fail _Live Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst +gc_bif3 Fail _Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst # # The following instruction is specially handled in beam_load.c @@ -1453,7 +1332,7 @@ gc_bif3 Fail Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst # encountered. # unsupported_guard_bif/3 -unsupported_guard_bif A B C | never() => _ +unsupported_guard_bif _A _B _C | never() => _ # # R13B03 diff --git a/erts/emulator/beam/jit/arm/predicates.tab b/erts/emulator/beam/jit/arm/predicates.tab index cb3f5be7ca7c..b98a7e331760 100644 --- a/erts/emulator/beam/jit/arm/predicates.tab +++ b/erts/emulator/beam/jit/arm/predicates.tab @@ -20,7 +20,7 @@ // pred.is_mfa_bif(M, F, A) { - Export *e; + const Export *e; ASSERT(M.type == TAG_a && F.type == TAG_a && A.type == TAG_u); e = erts_active_export_entry(M.val, F.val, A.val); diff --git a/erts/emulator/beam/jit/asm_load.c b/erts/emulator/beam/jit/asm_load.c index 91ce7285c24f..827d03c33fad 100644 --- a/erts/emulator/beam/jit/asm_load.c +++ b/erts/emulator/beam/jit/asm_load.c @@ -139,15 +139,15 @@ int beam_load_prepare_emit(LoaderState *stp) { init_label(&stp->labels[i]); } - stp->fun_refs = erts_alloc(ERTS_ALC_T_PREPARED_CODE, - stp->beam.lambdas.count * sizeof(SWord)); + stp->lambda_literals = erts_alloc(ERTS_ALC_T_PREPARED_CODE, + stp->beam.lambdas.count * sizeof(SWord)); for (i = 0; i < stp->beam.lambdas.count; i++) { BeamFile_LambdaEntry *lambda = &stp->beam.lambdas.entries[i]; if (stp->labels[lambda->label].lambda_index == INVALID_LAMBDA_INDEX) { stp->labels[lambda->label].lambda_index = i; - stp->fun_refs[i] = ERTS_SWORD_MAX; + stp->lambda_literals[i] = ERTS_SWORD_MAX; } else { beam_load_report_error(__LINE__, stp, @@ -166,7 +166,7 @@ int beam_load_prepare_emit(LoaderState *stp) { for (i = 0; i < stp->beam.imports.count; i++) { BeamFile_ImportEntry *import; - Export *export; + const Export *export; int bif_number; import = &stp->beam.imports.entries[i]; @@ -256,9 +256,9 @@ int beam_load_prepared_dtor(Binary *magic) { stp->labels = NULL; } - if (stp->fun_refs) { - erts_free(ERTS_ALC_T_PREPARED_CODE, (void *)stp->fun_refs); - stp->fun_refs = NULL; + if (stp->lambda_literals) { + erts_free(ERTS_ALC_T_PREPARED_CODE, (void *)stp->lambda_literals); + stp->lambda_literals = NULL; } if (stp->bif_imports) { @@ -1100,10 +1100,9 @@ void beam_load_finalize_code(LoaderState *stp, * the module may remote-call itself*/ for (int i = 0; i < stp->beam.imports.count; i++) { BeamFile_ImportEntry *entry = &stp->beam.imports.entries[i]; - Export *import; + const Export *import; import = erts_export_put(entry->module, entry->function, entry->arity); - beamasm_patch_import(stp->ba, stp->writable_region, i, import); } @@ -1114,43 +1113,27 @@ void beam_load_finalize_code(LoaderState *stp, for (int i = 0; i < lambda_table->count; i++) { BeamFile_LambdaEntry *lambda; ErlFunEntry *fun_entry; - FunRef *fun_refp; - Eterm fun_ref; lambda = &lambda_table->entries[i]; - fun_entry = erts_put_fun_entry2(stp->module, - lambda->old_uniq, - i, - stp->beam.checksum, - lambda->index, - lambda->arity - lambda->num_free); - - ASSERT(stp->fun_refs[i] != ERTS_SWORD_MAX); - fun_ref = beamfile_get_literal(&stp->beam, stp->fun_refs[i]); + fun_entry = erts_fun_entry_put(stp->module, + lambda->old_uniq, + i, + stp->beam.checksum, + lambda->index, + lambda->arity - lambda->num_free); - /* If there are no free variables, the literal refers to an - * ErlFunThing that needs to be fixed up before we process the - * FunRef. */ + /* If there are no free variables, the loader has created a literal + * for this lambda and we need to set its fun entry. */ if (lambda->num_free == 0) { - ErlFunThing *funp = (ErlFunThing *)boxed_val(fun_ref); - ASSERT(fun_env_size(funp) == 1 && funp->entry.fun == NULL); - funp->entry.fun = fun_entry; - fun_ref = funp->env[0]; - } + ErlFunThing *funp; + Eterm fun; - fun_refp = (FunRef *)boxed_val(fun_ref); - fun_refp->entry = fun_entry; - - /* Bump the reference count: this could not be done when copying - * the literal as we had no idea which entry it belonged to. - * - * We also need to parry an annoying wrinkle: when reloading a - * module over itself, we inherit the old instance's fun entries, - * and thus have to cancel the reference bump in - * `erts_put_fun_entry2` to make fun purging work. */ - if (!erts_is_fun_loaded(fun_entry, staging_ix)) { - erts_refc_inctest(&fun_entry->refc, 1); + ASSERT(stp->lambda_literals[i] != ERTS_SWORD_MAX); + fun = beamfile_get_literal(&stp->beam, stp->lambda_literals[i]); + funp = (ErlFunThing *)boxed_val(fun); + ASSERT(funp->entry.fun == NULL); + funp->entry.fun = fun_entry; } erts_set_fun_code(fun_entry, diff --git a/erts/emulator/beam/jit/beam_jit_common.cpp b/erts/emulator/beam/jit/beam_jit_common.cpp index aac423948518..dfeb0028fb6c 100644 --- a/erts/emulator/beam/jit/beam_jit_common.cpp +++ b/erts/emulator/beam/jit/beam_jit_common.cpp @@ -39,7 +39,7 @@ extern "C" static std::string getAtom(Eterm atom) { Atom *ap = atom_tab(atom_val(atom)); - return std::string((char *)ap->name, ap->len); + return std::string((char *)erts_atom_get_name(ap), ap->len); } BeamAssemblerCommon::BeamAssemblerCommon(BaseAssembler &assembler_) @@ -808,7 +808,7 @@ void beam_jit_bs_add_argument_error(Process *c_p, Eterm A, Eterm B) { Eterm beam_jit_bs_init_bits(Process *c_p, Eterm *reg, - ERL_BITS_DECLARE_STATEP, + ErlBitsState *EBS, Uint num_bits, Uint alloc, unsigned Live) { @@ -818,7 +818,7 @@ Eterm beam_jit_bs_init_bits(Process *c_p, alloc += ERL_REFC_BITS_SIZE; } - erts_bin_offset = 0; + EBS->erts_bin_offset = 0; if (num_bits <= ERL_ONHEAP_BITS_LIMIT) { ErlHeapBits *hb; @@ -830,7 +830,7 @@ Eterm beam_jit_bs_init_bits(Process *c_p, hb->thing_word = header_heap_bits(num_bits); hb->size = num_bits; - erts_current_bin = (byte *)hb->data; + EBS->erts_current_bin = (byte *)hb->data; return make_bitstring(hb); } else { const Uint num_bytes = NBYTES(num_bits); @@ -839,13 +839,13 @@ Eterm beam_jit_bs_init_bits(Process *c_p, test_bin_vheap(c_p, reg, num_bytes / sizeof(Eterm), alloc, Live); new_binary = erts_bin_nrml_alloc(num_bytes); - erts_current_bin = (byte *)new_binary->orig_bytes; + EBS->erts_current_bin = (byte *)new_binary->orig_bytes; return erts_wrap_refc_bitstring(&MSO(c_p).first, &MSO(c_p).overhead, &HEAP_TOP(c_p), new_binary, - erts_current_bin, + EBS->erts_current_bin, 0, num_bits); } @@ -1281,16 +1281,16 @@ Eterm beam_jit_build_argument_list(Process *c_p, const Eterm *regs, int arity) { return res; } -Export *beam_jit_handle_unloaded_fun(Process *c_p, - Eterm *reg, - int arity, - Eterm fun_thing) { - ErtsCodeIndex code_ix = erts_active_code_ix(); +const Export *beam_jit_handle_unloaded_fun(Process *c_p, + Eterm *reg, + int arity, + Eterm fun_thing) { + const ErtsCodeIndex code_ix = erts_active_code_ix(); + const ErlFunEntry *fe; + const Export *ep; Eterm module, args; ErlFunThing *funp; - ErlFunEntry *fe; Module *modp; - Export *ep; funp = (ErlFunThing *)fun_val(fun_thing); ASSERT(is_local_fun(funp)); diff --git a/erts/emulator/beam/jit/beam_jit_common.hpp b/erts/emulator/beam/jit/beam_jit_common.hpp index 71fe634e8f37..76f64e472f1f 100644 --- a/erts/emulator/beam/jit/beam_jit_common.hpp +++ b/erts/emulator/beam/jit/beam_jit_common.hpp @@ -598,15 +598,9 @@ Uint beam_jit_get_map_elements(Eterm map, void beam_jit_bs_field_size_argument_error(Process *c_p, Eterm size); void beam_jit_bs_add_argument_error(Process *c_p, Eterm A, Eterm B); -Eterm beam_jit_bs_init(Process *c_p, - Eterm *reg, - ERL_BITS_DECLARE_STATEP, - Eterm num_bytes, - Uint alloc, - unsigned Live); Eterm beam_jit_bs_init_bits(Process *c_p, Eterm *reg, - ERL_BITS_DECLARE_STATEP, + ErlBitsState *EBS, Uint num_bits, Uint alloc, unsigned Live); @@ -651,10 +645,10 @@ void beam_jit_return_to_trace(Process *c_p, Eterm beam_jit_build_argument_list(Process *c_p, const Eterm *regs, int arity); -Export *beam_jit_handle_unloaded_fun(Process *c_p, - Eterm *reg, - int arity, - Eterm fun_thing); +const Export *beam_jit_handle_unloaded_fun(Process *c_p, + Eterm *reg, + int arity, + Eterm fun_thing); bool beam_jit_is_list_of_immediates(Eterm term); bool beam_jit_is_shallow_boxed(Eterm term); diff --git a/erts/emulator/beam/jit/load.h b/erts/emulator/beam/jit/load.h index 68045c609c85..c635cd4eb8d0 100644 --- a/erts/emulator/beam/jit/load.h +++ b/erts/emulator/beam/jit/load.h @@ -90,13 +90,10 @@ struct LoaderState_ { unsigned int current_index; unsigned int *loc_index_to_cover_id; - /* Translates lambda indexes to the literal holding their FunRef. - * - * Lambdas that lack an environment are represented by an ErlFunThing that - * is immediately followed by an FunRef. */ - SWord *fun_refs; + /* Translates lambda indexes to their canonical literal, if any. */ + SWord *lambda_literals; - void *ba; /* Assembler used to create x86 assembly */ + void *ba; /* Assembler used to create x86/AArch64 assembly */ const void *executable_region; /* Native module after codegen */ void *writable_region; /* Native module after codegen, writable mapping */ diff --git a/erts/emulator/beam/jit/x86/beam_asm_global.hpp.pl b/erts/emulator/beam/jit/x86/beam_asm_global.hpp.pl index 86d46dd8ab52..26b8f8791b18 100755 --- a/erts/emulator/beam/jit/x86/beam_asm_global.hpp.pl +++ b/erts/emulator/beam/jit/x86/beam_asm_global.hpp.pl @@ -28,14 +28,12 @@ bif_nif_epilogue bif_element_shared bif_export_trap - bs_add_shared bs_create_bin_error_shared bs_size_check_shared bs_get_tail_shared bs_get_utf8_shared bs_get_utf8_short_shared bs_init_bits_shared - bs_init_bits_legacy_shared call_bif_shared call_light_bif_shared call_nif_early diff --git a/erts/emulator/beam/jit/x86/generators.tab b/erts/emulator/beam/jit/x86/generators.tab index 84ac8da3fced..9695118e7955 100644 --- a/erts/emulator/beam/jit/x86/generators.tab +++ b/erts/emulator/beam/jit/x86/generators.tab @@ -332,7 +332,7 @@ gen.new_small_map_lit(Dst, Live, Size, Rest) { tmp = thp = erts_alloc(ERTS_ALC_T_LOADER_TMP, ((size == 0 ? 0 : 1) + size/2) * sizeof(*tmp)); if (size == 0) { - keys = erts_get_global_literal(ERTS_LIT_EMPTY_TUPLE); + keys = ERTS_GLOBAL_LIT_EMPTY_TUPLE; } else { keys = make_tuple(thp); *thp++ = make_arityval(size/2); diff --git a/erts/emulator/beam/jit/x86/instr_bif.cpp b/erts/emulator/beam/jit/x86/instr_bif.cpp index db2d27b603c2..5b0efa534344 100644 --- a/erts/emulator/beam/jit/x86/instr_bif.cpp +++ b/erts/emulator/beam/jit/x86/instr_bif.cpp @@ -860,8 +860,8 @@ void BeamModuleAssembler::emit_call_bif(const ArgWord &Func) { void BeamModuleAssembler::emit_call_bif_mfa(const ArgAtom &M, const ArgAtom &F, const ArgWord &A) { - BeamInstr func; - Export *e; + const Export *e; + UWord func; e = erts_active_export_entry(M.get(), F.get(), A.get()); ASSERT(e != NULL && e->bif_number != -1); @@ -870,7 +870,7 @@ void BeamModuleAssembler::emit_call_bif_mfa(const ArgAtom &M, e->info.mfa.module, e->info.mfa.function, A.get()); - func = (BeamInstr)bif_table[e->bif_number].f; + func = (UWord)bif_table[e->bif_number].f; emit_call_bif(ArgWord(func)); } diff --git a/erts/emulator/beam/jit/x86/instr_bs.cpp b/erts/emulator/beam/jit/x86/instr_bs.cpp index 568dcf7e82f2..4a7f54771750 100644 --- a/erts/emulator/beam/jit/x86/instr_bs.cpp +++ b/erts/emulator/beam/jit/x86/instr_bs.cpp @@ -122,19 +122,6 @@ int BeamModuleAssembler::emit_bs_get_field_size(const ArgSource &Size, } } -void BeamModuleAssembler::emit_i_bs_init_heap(const ArgWord &Size, - const ArgWord &Heap, - const ArgWord &Live, - const ArgRegister &Dst) { - mov_arg(ARG4, ArgWord(Size.get() * 8)); - mov_arg(ARG5, Heap); - mov_arg(ARG6, Live); - - fragment_call(ga->get_bs_init_bits_legacy_shared()); - - mov_arg(Dst, RET); -} - /* Set the error reason when a size check has failed. */ void BeamGlobalAssembler::emit_bs_size_check_shared() { emit_enter_runtime(); @@ -144,390 +131,6 @@ void BeamGlobalAssembler::emit_bs_size_check_shared() { a.ret(); } -void BeamModuleAssembler::emit_i_bs_init_fail_heap(const ArgSource &Size, - const ArgWord &Heap, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - Label fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(Size, 1, fail, ARG4) >= 0) { - a.shl(ARG4, imm(3)); - mov_arg(ARG5, Heap); - mov_arg(ARG6, Live); - fragment_call(ga->get_bs_init_bits_legacy_shared()); - mov_arg(Dst, RET); - } - - if (Fail.get() == 0) { - Label next = a.newLabel(); - a.short_().jmp(next); - - a.bind(fail); - { - mov_arg(ARG2, Size); - safe_fragment_call(ga->get_bs_size_check_shared()); - emit_raise_exception(); - } - - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_bs_init(const ArgWord &Size, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - - emit_i_bs_init_bits_heap(ArgWord(Size.get() * 8), Heap, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_fail(const ArgRegister &Size, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - - emit_i_bs_init_fail_heap(Size, Heap, Fail, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits(const ArgWord &NumBits, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal heap(ArgVal::Word, 0); - emit_i_bs_init_bits_heap(NumBits, heap, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_heap(const ArgWord &NumBits, - const ArgWord &Alloc, - const ArgWord &Live, - const ArgRegister &Dst) { - mov_arg(ARG4, NumBits); - mov_arg(ARG5, Alloc); - mov_arg(ARG6, Live); - - fragment_call(ga->get_bs_init_bits_legacy_shared()); - - mov_arg(Dst, RET); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_fail(const ArgRegister &NumBits, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - const ArgVal Heap(ArgVal::Word, 0); - - emit_i_bs_init_bits_fail_heap(NumBits, Heap, Fail, Live, Dst); -} - -void BeamModuleAssembler::emit_i_bs_init_bits_fail_heap( - const ArgSource &NumBits, - const ArgWord &Alloc, - const ArgLabel &Fail, - const ArgWord &Live, - const ArgRegister &Dst) { - Label fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(NumBits, 1, fail, ARG4) >= 0) { - mov_arg(ARG5, Alloc); - mov_arg(ARG6, Live); - - fragment_call(ga->get_bs_init_bits_legacy_shared()); - - mov_arg(Dst, RET); - } - - if (Fail.get() == 0) { - Label next = a.newLabel(); - a.short_().jmp(next); - - a.bind(fail); - { - mov_arg(ARG2, NumBits); - safe_fragment_call(ga->get_bs_size_check_shared()); - emit_raise_exception(); - } - - a.bind(next); - } -} - -void BeamModuleAssembler::emit_bs_put_string(const ArgWord &Size, - const ArgBytePtr &Ptr) { - mov_arg(ARG3, Size); - - emit_enter_runtime(); - - mov_arg(ARG2, Ptr); - load_erl_bits_state(ARG1); - runtime_call<3>(erts_new_bs_put_string); - - emit_leave_runtime(); -} - -void BeamModuleAssembler::emit_i_new_bs_put_integer_imm(const ArgSource &Src, - const ArgLabel &Fail, - const ArgWord &Sz, - const ArgWord &Flags) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() != 0) { - a.je(resolve_beam_label(Fail)); - } else { - a.short_().jne(next); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_integer(const ArgLabel &Fail, - const ArgRegister &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() != 0) { - a.je(fail); - } else { - a.short_().jne(next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary(const ArgLabel &Fail, - const ArgSource &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() != 0) { - a.je(fail); - } else { - a.short_().jne(next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary_all(const ArgSource &Src, - const ArgLabel &Fail, - const ArgWord &Unit) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - mov_arg(ARG3, Unit); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary_all); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() == 0) { - a.jne(next); - emit_error(BADARG); - a.bind(next); - } else { - a.je(resolve_beam_label(Fail)); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_binary_imm(const ArgLabel &Fail, - const ArgWord &Sz, - const ArgSource &Src) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() == 0) { - a.short_().jne(next); - emit_error(BADARG); - a.bind(next); - } else { - a.je(resolve_beam_label(Fail)); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_float(const ArgLabel &Fail, - const ArgRegister &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - int unit = Flags.get() >> 3; - Label next, fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - next = a.newLabel(); - } - - /* Clobbers RET + ARG3 */ - if (emit_bs_get_field_size(Sz, unit, fail, ARG3) >= 0) { - mov_arg(ARG2, Src); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_new_bs_put_float); - - emit_leave_runtime(); - - emit_test_the_non_value(RET); - - if (Fail.get() != 0) { - a.jne(fail); - } else { - a.short_().je(next); - } - } - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - a.bind(next); - } -} - -void BeamModuleAssembler::emit_i_new_bs_put_float_imm(const ArgLabel &Fail, - const ArgWord &Sz, - const ArgWord &Flags, - const ArgSource &Src) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - mov_arg(ARG3, Sz); - mov_arg(ARG4, Flags); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_new_bs_put_float); - - emit_leave_runtime(); - - emit_test_the_non_value(RET); - - if (Fail.get() != 0) { - a.jne(resolve_beam_label(Fail)); - } else { - a.short_().je(next); - emit_error(BADARG); - a.bind(next); - } -} - void BeamModuleAssembler::emit_i_bs_start_match3(const ArgRegister &Src, const ArgWord &Live, const ArgLabel &Fail, @@ -960,55 +563,6 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx, } } -void BeamModuleAssembler::emit_i_bs_utf8_size(const ArgSource &Src, - const ArgXRegister &Dst) { - Label next = a.newLabel(); - - mov_arg(ARG1, Src); - - mov_imm(RET, make_small(1)); - a.cmp(ARG1, imm(make_small(0x80UL))); - a.short_().jl(next); - mov_imm(RET, make_small(2)); - a.cmp(ARG1, imm(make_small(0x800UL))); - a.short_().jl(next); - mov_imm(RET, make_small(3)); - a.cmp(ARG1, imm(make_small(0x10000UL))); - a.short_().jl(next); - mov_imm(RET, make_small(4)); - - a.bind(next); - mov_arg(Dst, RET); -} - -void BeamModuleAssembler::emit_i_bs_put_utf8(const ArgLabel &Fail, - const ArgSource &Src) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<2>(erts_bs_put_utf8); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() != 0) { - a.je(resolve_beam_label(Fail)); - } else { - a.short_().jne(next); - emit_error(BADARG); - a.bind(next); - } -} - /* * ARG1 = pointer to match state * ARG2 = position in binary in bits @@ -1403,49 +957,6 @@ void BeamModuleAssembler::emit_i_bs_skip_utf8(const ArgRegister &Ctx, emit_bs_get_utf8(Ctx, Fail); } -void BeamModuleAssembler::emit_i_bs_utf16_size(const ArgSource &Src, - const ArgXRegister &Dst) { - mov_arg(ARG1, Src); - - mov_imm(RET, make_small(2)); - mov_imm(ARG2, make_small(4)); - a.cmp(ARG1, imm(make_small(0x10000UL))); - a.cmovae(RET, ARG2); - - mov_arg(Dst, RET); -} - -void BeamModuleAssembler::emit_i_bs_put_utf16(const ArgLabel &Fail, - const ArgWord &Flags, - const ArgSource &Src) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - /* mov_arg may clobber ARG1 */ - mov_arg(ARG3, Flags); - mov_arg(ARG2, Src); - - emit_enter_runtime(); - - load_erl_bits_state(ARG1); - runtime_call<3>(erts_bs_put_utf16); - - emit_leave_runtime(); - - a.test(RET, RET); - - if (Fail.get() != 0) { - a.je(resolve_beam_label(Fail)); - } else { - a.short_().jne(next); - emit_error(BADARG); - a.bind(next); - } -} - void BeamModuleAssembler::emit_bs_get_utf16(const ArgRegister &Ctx, const ArgLabel &Fail, const ArgWord &Flags) { @@ -1495,27 +1006,6 @@ void BeamModuleAssembler::emit_validate_unicode(Label next, a.jmp(next); } -void BeamModuleAssembler::emit_i_bs_validate_unicode(const ArgLabel &Fail, - const ArgSource &Src) { - Label fail, next = a.newLabel(); - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - } - - mov_arg(ARG1, Src); - emit_validate_unicode(next, fail, ARG1); - - if (Fail.get() == 0) { - a.bind(fail); - emit_error(BADARG); - } - - a.bind(next); -} - void BeamModuleAssembler::emit_i_bs_validate_unicode_retract( const ArgLabel &Fail, const ArgSource &Src, @@ -1565,185 +1055,6 @@ void BeamModuleAssembler::emit_bs_test_unit(const ArgLabel &Fail, a.jnz(resolve_beam_label(Fail)); } -/* Set the error reason when bs_add has failed. */ -void BeamGlobalAssembler::emit_bs_add_shared() { - emit_enter_runtime(); - a.mov(ARG1, c_p); - runtime_call<3>(beam_jit_bs_add_argument_error); - emit_leave_runtime(); - a.ret(); -} - -void BeamModuleAssembler::emit_bs_add(const ArgLabel &Fail, - const ArgSource &Src1, - const ArgSource &Src2, - const ArgWord &Unit, - const ArgXRegister &Dst) { - Label fail; - - if (Fail.get() != 0) { - fail = resolve_beam_label(Fail); - } else { - fail = a.newLabel(); - } - - /* Both arguments must be immediates on x64. */ - mov_arg(ARG1, Src1); - - if (Src2.isImmed()) { - a.mov(RETd, ARG1d); - } else { - mov_arg(ARG2, Src2); - a.mov(RETd, ARG2d); - if (Src1.isImmed()) { - a.and_(RETd, ARG1d); - } - } - - a.and_(RETb, imm(_TAG_IMMED1_MASK)); - a.cmp(RETb, imm(_TAG_IMMED1_SMALL)); - a.jne(fail); - - /* Verify that ARG2 >= 0 and multiply ARG2 by the unit. The - * result will be untagged but not shifted and stored in RET. */ - if (Src2.isSmall()) { - Uint val = Src2.as().getUnsigned(); - - if ((val >> (sizeof(Eterm) - 1) * 8) != 0) { - /* Protect against negative or huge literal size. */ - a.jmp(fail); - return; - } else { - val = (Unit.get() * val) << _TAG_IMMED1_SIZE; - mov_imm(RET, val); - } - } else { - a.and_(ARG2, imm(~_TAG_IMMED1_MASK)); - a.js(fail); - /* Multiply ARG2 by unit. */ - if (Unit.get() == 1) { - a.mov(RET, ARG2); - } else { - mov_imm(RET, Unit.get()); - a.mul(ARG2); /* CLOBBERS RDX = ARG3! */ - a.jo(fail); - } - } - - /* Verify that ARG1 >= 0. */ - a.test(ARG1, ARG1); - a.js(fail); - - /* RET is untagged but shifted, so adding ARG1 tags it and sets the overflow - * flag when the result won't fit an immediate. */ - a.add(RET, ARG1); - - if (Fail.get() != 0) { - a.jo(fail); - } else { - Label next = a.newLabel(); - - a.short_().jno(next); - - a.bind(fail); - { - mov_arg(ARG2, Src1); - mov_arg(ARG3, Src2); - safe_fragment_call(ga->get_bs_add_shared()); - emit_raise_exception(); - } - - a.bind(next); - } - - mov_arg(Dst, RET); -} - -void BeamModuleAssembler::emit_i_bs_append(const ArgLabel &Fail, - const ArgWord &ExtraHeap, - const ArgWord &Live, - const ArgWord &Unit, - const ArgSource &Size, - const ArgSource &Bin, - const ArgRegister &Dst) { - Label next = a.newLabel(); - - mov_arg(ARG3, Live); - mov_arg(ARG4, Size); - mov_arg(ARG5, ExtraHeap); - mov_arg(ARG6, Unit); - - mov_arg(ArgXRegister(Live.get()), Bin); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - load_x_reg_array(ARG2); - runtime_call<6>(erts_bs_append); - - emit_leave_runtime(); - - emit_test_the_non_value(RET); - a.short_().jne(next); - -#ifdef WIN32 - a.mov(ARG1d, x86::dword_ptr(c_p, offsetof(Process, state.value))); -#else - a.mov(ARG1d, x86::dword_ptr(c_p, offsetof(Process, state.counter))); -#endif - a.test(ARG1d, imm(ERTS_PSFLG_EXITING)); - - if (Fail.get() != 0) { - a.je(resolve_beam_label(Fail)); - - a.jmp(resolve_fragment(ga->get_do_schedule())); - } else { - a.jne(resolve_fragment(ga->get_do_schedule())); - - /* The error has been prepared in `erts_bs_append` */ - emit_raise_exception(); - } - - a.bind(next); - mov_arg(Dst, RET); -} - -void BeamModuleAssembler::emit_i_bs_private_append(const ArgLabel &Fail, - const ArgWord &Unit, - const ArgSource &Size, - const ArgRegister &Src, - const ArgXRegister &Dst) { - Label next; - - if (Fail.get() == 0) { - next = a.newLabel(); - } - - mov_arg(ARG2, Src); - mov_arg(ARG3, Size); - mov_arg(ARG4, Unit); - - emit_enter_runtime(); - - a.mov(ARG1, c_p); - runtime_call<4>(erts_bs_private_append); - - emit_leave_runtime(); - - emit_test_the_non_value(RET); - - if (Fail.get() != 0) { - a.je(resolve_beam_label(Fail)); - } else { - a.short_().jne(next); - /* The error has been prepared in `erts_bs_private_append` */ - emit_raise_exception(); - a.bind(next); - } - - mov_arg(Dst, RET); -} - void BeamModuleAssembler::emit_bs_init_writable() { emit_enter_runtime(); @@ -1951,10 +1262,10 @@ void BeamModuleAssembler::update_bin_state(x86::Gp bin_offset, const int x_reg_offset = offsetof(ErtsSchedulerRegisters, x_reg_array.d); const int cur_bin_base = offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin_); + offsetof(struct erl_bits_state, erts_current_bin); const int cur_bin_offset = offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_bin_offset_); + offsetof(struct erl_bits_state, erts_bin_offset); x86::Mem mem_bin_base = x86::Mem(registers, cur_bin_base - x_reg_offset, sizeof(UWord)); @@ -2320,45 +1631,6 @@ void BeamModuleAssembler::bs_maybe_leave_runtime(bool entered) { } } -/* - * In: - * ARG4 = Size of binary in bits. - * ARG5 = Extra words to allocate. - * ARG6 = Number of live X registers. - * - * Out: - * RET = Allocated binary object. - */ - -void BeamGlobalAssembler::emit_bs_init_bits_legacy_shared() { - Label exiting = a.newLabel(); - - emit_enter_frame(); - emit_enter_runtime(); - - load_erl_bits_state(ARG3); - load_x_reg_array(ARG2); - a.mov(ARG1, c_p); - - runtime_call<6>(beam_jit_bs_init_bits); - - emit_leave_runtime(); - emit_leave_frame(); - -#ifdef WIN32 - a.mov(ARG1d, x86::dword_ptr(c_p, offsetof(Process, state.value))); -#else - a.mov(ARG1d, x86::dword_ptr(c_p, offsetof(Process, state.counter))); -#endif - a.test(ARG1d, imm(ERTS_PSFLG_EXITING)); - a.short_().jne(exiting); - - a.ret(); - - a.bind(exiting); - a.jmp(labels[do_schedule]); -} - /* * In: * ARG4 = Size of binary in bits. @@ -2550,10 +1822,10 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, offsetof(ErtsSchedulerRegisters, x_reg_array.d); const int cur_bin_base = offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_current_bin_); + offsetof(struct erl_bits_state, erts_current_bin); const int cur_bin_offset = offsetof(ErtsSchedulerRegisters, aux_regs.d.erl_bits_state) + - offsetof(struct erl_bits_state, erts_bin_offset_); + offsetof(struct erl_bits_state, erts_bin_offset); x86::Mem mem_bin_base = x86::qword_ptr(registers, cur_bin_base - x_reg_offset); x86::Mem mem_bin_offset = @@ -2923,14 +2195,14 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, runtime_entered = bs_maybe_enter_runtime(runtime_entered); comment("private append to binary"); ASSERT(Alloc.get() == 0); - mov_arg(ARG2, seg.src); + mov_arg(ARG3, seg.src); if (sizeReg.isValid()) { - a.mov(ARG3, sizeReg); + a.mov(ARG4, sizeReg); } else { - mov_imm(ARG3, num_bits); + mov_imm(ARG4, num_bits); } - a.mov(ARG4, seg.unit); - a.mov(ARG1, c_p); + a.mov(ARG2, c_p); + load_erl_bits_state(ARG1); runtime_call<4>(erts_bs_private_append_checked); /* There is no way the call can fail on a 64-bit architecture. */ a.mov(TMP_MEM1q, RET); @@ -2979,10 +2251,11 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, comment("construct a binary segment"); if (seg.effectiveSize >= 0) { /* The segment has a literal size. */ - mov_imm(ARG3, seg.effectiveSize); - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); + mov_imm(ARG4, seg.effectiveSize); + mov_arg(ARG3, seg.src); + a.mov(ARG2, c_p); + load_erl_bits_state(ARG1); + runtime_call<4>(erts_bs_put_binary); error_info = beam_jit_update_bsc_reason_info(seg.error_info, BSC_REASON_BADARG, BSC_INFO_DEPENDS, @@ -2991,10 +2264,11 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, seg.size.as().get() == am_all) { /* Include the entire binary/bitstring in the * resulting binary. */ - a.mov(ARG3, seg.unit); - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary_all); + mov_imm(ARG4, seg.unit); + mov_arg(ARG3, seg.src); + a.mov(ARG2, c_p); + load_erl_bits_state(ARG1); + runtime_call<4>(erts_bs_put_binary_all); error_info = beam_jit_update_bsc_reason_info(seg.error_info, BSC_REASON_BADARG, BSC_INFO_UNIT, @@ -3010,16 +2284,17 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, * the value is a non-negative small in the * appropriate range. Multiply the size with the * unit. */ - mov_arg(ARG3, seg.size); - a.sar(ARG3, imm(_TAG_IMMED1_SIZE)); + mov_arg(ARG4, seg.size); + a.sar(ARG4, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(RET, seg.unit); - a.mul(ARG3); /* CLOBBERS RDX = ARG3! */ - a.mov(ARG3, RET); + a.mul(ARG4); /* CLOBBERS RDX = ARG3! */ + a.mov(ARG4, RET); } - mov_arg(ARG2, seg.src); - a.mov(ARG1, c_p); - runtime_call<3>(erts_new_bs_put_binary); + mov_arg(ARG3, seg.src); + a.mov(ARG2, c_p); + load_erl_bits_state(ARG1); + runtime_call<4>(erts_bs_put_binary); error_info = beam_jit_update_bsc_reason_info(seg.error_info, BSC_REASON_BADARG, BSC_INFO_DEPENDS, @@ -3039,20 +2314,21 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, runtime_entered = bs_maybe_enter_runtime(runtime_entered); comment("construct float segment"); if (seg.effectiveSize >= 0) { - mov_imm(ARG3, seg.effectiveSize); + mov_imm(ARG4, seg.effectiveSize); } else { - mov_arg(ARG3, seg.size); - a.sar(ARG3, imm(_TAG_IMMED1_SIZE)); + mov_arg(ARG4, seg.size); + a.sar(ARG4, imm(_TAG_IMMED1_SIZE)); if (seg.unit != 1) { mov_imm(RET, seg.unit); - a.mul(ARG3); /* CLOBBERS RDX = ARG3! */ - a.mov(ARG3, RET); + a.mul(ARG4); /* CLOBBERS RDX = ARG3! */ + a.mov(ARG4, RET); } } - mov_arg(ARG2, seg.src); - mov_imm(ARG4, seg.flags); - a.mov(ARG1, c_p); - runtime_call<4>(erts_new_bs_put_float); + mov_arg(ARG3, seg.src); + mov_imm(ARG5, seg.flags); + a.mov(ARG2, c_p); + load_erl_bits_state(ARG1); + runtime_call<5>(erts_bs_put_float); if (Fail.get() == 0) { mov_imm(ARG4, beam_jit_update_bsc_reason_info(seg.error_info, @@ -3323,9 +2599,12 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, * integer into the binary. */ runtime_entered = bs_maybe_enter_runtime(runtime_entered); mov_arg(ARG2, seg.src); - mov_imm(ARG4, seg.flags); load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); + if (seg.flags & BSF_LITTLE) { + runtime_call<3>(erts_bs_put_integer_le); + } else { + runtime_call<3>(erts_bs_put_integer_be); + } if (exact_type(seg.src)) { comment("skipped test for success because construction " "can't fail"); @@ -3356,7 +2635,7 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, mov_imm(ARG3, seg.effectiveSize / 8); mov_arg(ARG2, string_ptr); load_erl_bits_state(ARG1); - runtime_call<3>(erts_new_bs_put_string); + runtime_call<3>(erts_bs_put_string); } break; case am_utf8: { runtime_entered = bs_maybe_enter_runtime(runtime_entered); @@ -3384,9 +2663,12 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail, runtime_entered = bs_maybe_enter_runtime(runtime_entered); mov_arg(ARG2, seg.src); mov_imm(ARG3, 4 * 8); - a.mov(ARG4, seg.flags); load_erl_bits_state(ARG1); - runtime_call<4>(erts_new_bs_put_integer); + if (seg.flags & BSF_LITTLE) { + runtime_call<3>(erts_bs_put_integer_le); + } else { + runtime_call<3>(erts_bs_put_integer_be); + } if (Fail.get() == 0) { mov_arg(ARG1, seg.src); mov_imm(ARG4, diff --git a/erts/emulator/beam/jit/x86/instr_fun.cpp b/erts/emulator/beam/jit/x86/instr_fun.cpp index 29afe3d31828..e8b6d254b857 100644 --- a/erts/emulator/beam/jit/x86/instr_fun.cpp +++ b/erts/emulator/beam/jit/x86/instr_fun.cpp @@ -189,7 +189,7 @@ void BeamModuleAssembler::emit_i_make_fun3(const ArgLambda &Lambda, const ArgWord &Arity, const ArgWord &NumFree, const Span &env) { - ASSERT((NumFree.get() + 1) == env.size() && + ASSERT((NumFree.get()) == env.size() && (NumFree.get() + Arity.get()) < MAX_ARG); mov_arg(RET, Lambda); diff --git a/erts/emulator/beam/jit/x86/ops.tab b/erts/emulator/beam/jit/x86/ops.tab index 5d1c3ff42c6b..1d6e0b726de0 100644 --- a/erts/emulator/beam/jit/x86/ops.tab +++ b/erts/emulator/beam/jit/x86/ops.tab @@ -70,14 +70,14 @@ return # BIF, so we can omit the line instruction for non-BIFs. # -move S X0=x==0 | line Loc | call_ext_last Ar Func=u$is_not_bif D => +move S X0=x==0 | line _Loc | call_ext_last Ar Func=u$is_not_bif D => move S X0 | call_ext_last Ar Func D -move S X0=x==0 | line Loc | call_ext_only Ar Func=u$is_not_bif => +move S X0=x==0 | line _Loc | call_ext_only Ar Func=u$is_not_bif => move S X0 | call_ext_only Ar Func -move S X0=x==0 | line Loc | call_last Ar Func D => +move S X0=x==0 | line _Loc | call_last Ar Func D => move S X0 | call_last Ar Func D -move S X0=x==0 | line Loc | call_only Ar Func => +move S X0=x==0 | line _Loc | call_only Ar Func => move S X0 | call_only Ar Func # The line number in int_func_start/5 can be NIL. @@ -96,7 +96,7 @@ allocate_heap t I t deallocate t -trim N Remaining => i_trim N +trim N _Remaining => i_trim N i_trim t @@ -199,7 +199,7 @@ try_end y try_case_end s -try_end Y | deallocate N => try_end_deallocate N +try_end _Y | deallocate N => try_end_deallocate N try_end_deallocate t @@ -266,7 +266,7 @@ i_get_tuple_element Tuple Pos Tuple2 | current_tuple Tuple3 | # This is a current_tuple instruction not followed by # get_tuple_element. Invalidate the current tuple pointer. -current_tuple Tuple => _ +current_tuple _Tuple => _ load_tuple_ptr s @@ -287,7 +287,7 @@ i_get_tuple_element Tuple Pos1 Dst1 | current_tuple Tuple2 | # Drop the current_tuple instruction if the tuple is overwritten. current_tuple Tuple Tuple2 | equal(Tuple, Tuple2) => _ -current_tuple Tuple Dst => current_tuple Tuple +current_tuple Tuple _Dst => current_tuple Tuple # The first operand will only be used in the debug-compiled runtime # system to verify that the register holding the tuple pointer agrees @@ -412,7 +412,7 @@ send # Optimized comparisons with one immediate/literal operand. # -is_eq_exact Lbl LHS RHS | equal(LHS, RHS) => _ +is_eq_exact _Lbl LHS RHS | equal(LHS, RHS) => _ is_eq_exact Lbl C=c R=xy => is_eq_exact Lbl R C is_eq_exact Lbl R=xy n => is_nil Lbl R @@ -522,7 +522,7 @@ is_list f s is_atom f s is_float f s -is_nil Fail=f n => _ +is_nil _Fail=f n => _ is_nil Fail=f qia => jump Fail is_nil f S @@ -605,7 +605,7 @@ call_ext_only u==0 u$func:erlang:yield/0 => i_yield | return # The hibernate/3 BIF is an instruction. # call_ext u==3 u$func:erlang:hibernate/3 => i_hibernate -call_ext_last u==3 u$func:erlang:hibernate/3 D => i_hibernate +call_ext_last u==3 u$func:erlang:hibernate/3 _D => i_hibernate call_ext_only u==3 u$func:erlang:hibernate/3 => i_hibernate call_ext u==0 u$func:os:perf_counter/0 => @@ -654,9 +654,9 @@ call_ext_only Ar=u Bif=u$is_bif => # with call instructions. # -call_ext Ar Func => i_call_ext Func -call_ext_last Ar Func D => i_call_ext_last Func D -call_ext_only Ar Func => i_call_ext_only Func +call_ext _Ar Func => i_call_ext Func +call_ext_last _Ar Func D => i_call_ext_last Func D +call_ext_only _Ar Func => i_call_ext_only Func i_validate t @@ -685,29 +685,29 @@ i_perf_counter bif0 u$bif:erlang:self/0 Dst=d => self Dst bif0 u$bif:erlang:node/0 Dst=d => node Dst -bif1 Fail=f Bif=u$bif:erlang:hd/1 Src=xy Dst => +bif1 Fail=f _Bif=u$bif:erlang:hd/1 Src=xy Dst => is_nonempty_list Fail Src | get_hd Src Dst -bif1 Fail=p Bif=u$bif:erlang:hd/1 Src Dst => +bif1 _Fail=p _Bif=u$bif:erlang:hd/1 Src Dst => bif_hd Src Dst bif_hd s d -bif1 Fail=f Bif=u$bif:erlang:tl/1 Src=xy Dst => +bif1 Fail=f _Bif=u$bif:erlang:tl/1 Src=xy Dst => is_nonempty_list Fail Src | get_tl Src Dst -bif1 Fail Bif=u$bif:erlang:get/1 Src=s Dst=d => get(Src, Dst) +bif1 _Fail _Bif=u$bif:erlang:get/1 Src=s Dst=d => get(Src, Dst) bif2 Fail u$bif:erlang:element/2 S1=ixy S2 Dst => bif_element Fail S1 S2 Dst bif_element j s s d -bif1 Fail Bif=u$bif:erlang:node/1 Src=d Dst=d => bif_node Fail Src Dst +bif1 Fail _Bif=u$bif:erlang:node/1 Src=d Dst=d => bif_node Fail Src Dst bif_node j S d -gc_bif1 Fail Live Bif=u$bif:erlang:bit_size/1 Src Dst=d => +gc_bif1 Fail _Live Bif=u$bif:erlang:bit_size/1 Src Dst=d => bif_bit_size Bif Fail Src Dst bif_bit_size b j s d -gc_bif1 Fail Live Bif=u$bif:erlang:byte_size/1 Src Dst=d => +gc_bif1 Fail _Live Bif=u$bif:erlang:byte_size/1 Src Dst=d => bif_byte_size Bif Fail Src Dst bif_byte_size b j s d @@ -715,7 +715,7 @@ bif1 Fail Bif=u$bif:erlang:tuple_size/1 Src=d Dst=d => bif_tuple_size Bif Fail Src Dst bif_tuple_size b j S d -bif2 Fail Bif=u$bif:erlang:map_get/2 Src1 Src2=xy Dst=d => +bif2 Fail _Bif=u$bif:erlang:map_get/2 Src1 Src2=xy Dst=d => bif_map_get Fail Src1 Src2 Dst bif_map_get j s s d @@ -723,15 +723,15 @@ bif2 Fail Bif=u$bif:erlang:is_map_key/2 Key Map=xy Dst=d => bif_is_map_key Bif Fail Key Map Dst bif_is_map_key b j s s d -bif2 Fail Bif=u$bif:erlang:max/2 Src1 Src2 Dst => +bif2 _Fail _Bif=u$bif:erlang:max/2 Src1 Src2 Dst => bif_max Src1 Src2 Dst -bif2 Fail Bif=u$bif:erlang:min/2 Src1 Src2 Dst => +bif2 _Fail _Bif=u$bif:erlang:min/2 Src1 Src2 Dst => bif_min Src1 Src2 Dst bif_max s s d bif_min s s d -bif1 Fail Bif S1 Dst | never_fails(Bif) => nofail_bif1 S1 Bif Dst -bif2 Fail Bif S1 S2 Dst | never_fails(Bif) => nofail_bif2 S1 S2 Bif Dst +bif1 _Fail Bif S1 Dst | never_fails(Bif) => nofail_bif1 S1 Bif Dst +bif2 _Fail Bif S1 S2 Dst | never_fails(Bif) => nofail_bif2 S1 S2 Bif Dst bif1 Fail Bif S1 Dst => i_bif1 S1 Fail Bif Dst bif2 Fail Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst @@ -764,9 +764,9 @@ bif_is_lt s s d # Internal calls. # -call Ar Func => i_call Func -call_last Ar Func D => i_call_last Func D -call_only Ar Func => i_call_only Func +call _Ar Func => i_call Func +call_last _Ar Func D => i_call_last Func D +call_only _Ar Func => i_call_only Func i_call f i_call_last f t @@ -881,7 +881,7 @@ i_bs_match_test_heap f S I t * # is encountered. # bad_bs_match/1 -bad_bs_match A | never() => _ +bad_bs_match _A | never() => _ # ================================================================ # Bit syntax matching (from R11B). @@ -908,7 +908,7 @@ i_bs_get_binary_all2 S f t t d bs_get_float2 Fail=f Ms=xy Live=u Sz=s Unit=u Flags=u Dst=d => get_float2(Fail, Ms, Live, Sz, Unit, Flags, Dst) -bs_get_float2 Fail=f Ms=x Live=u Sz=q Unit=u Flags=u Dst=d => jump Fail +bs_get_float2 Fail=f _Ms=x _Live=u _Sz=q _Unit=u _Flags=u _Dst=d => jump Fail i_bs_get_float2 S f t s t d @@ -920,7 +920,7 @@ bs_skip_bits2 Fail=f Ms=xy Sz=sq Unit=u Flags=u => i_bs_skip_bits_imm2 f S W i_bs_skip_bits2 S S f t -bs_test_tail2 Fail=f Ms=xy o => jump Fail +bs_test_tail2 Fail=f _Ms=xy o => jump Fail bs_test_tail2 f S W @@ -943,8 +943,8 @@ bs_start_match4 Fail=f Live=u Src=xy Ctx=d => %if ARCH_64 # This instruction nops on 64-bit platforms -bs_start_match4 a==am_resume Live Ctx Dst | equal(Ctx, Dst) => _ -bs_start_match4 a==am_resume Live Ctx Dst => move Ctx Dst +bs_start_match4 a==am_resume _Live Ctx Dst | equal(Ctx, Dst) => _ +bs_start_match4 a==am_resume _Live Ctx Dst => move Ctx Dst %else @@ -953,7 +953,7 @@ bs_start_match4 a==am_resume Live Ctx Dst => %endif -bs_start_match3 Fail=j ica Live Dst => jump Fail +bs_start_match3 Fail=j ica _Live _Dst => jump Fail bs_start_match3 Fail Bin Live Dst => i_bs_start_match3 Bin Live Fail Dst i_bs_start_match3 S t j d @@ -962,7 +962,7 @@ i_bs_start_match3 S t j d # fit into an unsigned small. %if ARCH_64 - bs_get_position Src Dst Live => i_bs_get_position Src Dst + bs_get_position Src Dst _Live => i_bs_get_position Src Dst i_bs_get_position S S bs_set_position S S %else @@ -1010,134 +1010,8 @@ bs_create_bin Fail=j Alloc=u Live=u Unit=u Dst=xy N=u Segments=* => i_bs_create_bin j I t d * -# ================================================================ -# Old instruction for constructing binaries (up to OTP 24). -# ================================================================ - -%warm - -bs_init2 Fail Sz Words Regs Flags Dst | binary_too_big(Sz) => system_limit Fail - -bs_init2 Fail Sz=u Words=u==0 Regs Flags Dst => i_bs_init Sz Regs Dst - -bs_init2 Fail Sz=u Words Regs Flags Dst => - i_bs_init_heap Sz Words Regs Dst - -bs_init2 Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_fail Sz Fail Regs Dst -bs_init2 Fail Sz Words Regs Flags Dst => - i_bs_init_fail_heap Sz Words Fail Regs Dst - -i_bs_init_fail S j t S - -i_bs_init_fail_heap s I j t S - -i_bs_init W t S - -i_bs_init_heap W I t S - - -bs_init_bits Fail Sz=o Words Regs Flags Dst => system_limit Fail - -bs_init_bits Fail Sz=u Words=u==0 Regs Flags Dst => - i_bs_init_bits Sz Regs Dst -bs_init_bits Fail Sz=u Words Regs Flags Dst => - i_bs_init_bits_heap Sz Words Regs Dst - -bs_init_bits Fail Sz Words=u==0 Regs Flags Dst => - i_bs_init_bits_fail Sz Fail Regs Dst -bs_init_bits Fail Sz Words Regs Flags Dst => - i_bs_init_bits_fail_heap Sz Words Fail Regs Dst - -i_bs_init_bits_fail S j t S - -i_bs_init_bits_fail_heap s I j t S - -i_bs_init_bits W t S -i_bs_init_bits_heap W I t S - -bs_add Fail S1=i==0 S2 Unit=u==1 D => move S2 D - -bs_add j s s t x - -bs_append Fail Size Extra Live Unit Bin Flags Dst => - i_bs_append Fail Extra Live Unit Size Bin Dst - -bs_private_append Fail Size Unit Bin Flags Dst => - i_bs_private_append Fail Unit Size Bin Dst - -i_bs_private_append Fail Unit Size Bin Dst=y => - i_bs_private_append Fail Unit Size Bin x | move x Dst - bs_init_writable -i_bs_append j I t t s s S -i_bs_private_append j t s S x - -# -# Storing integers into binaries. -# - -bs_put_integer Fail=j Sz=sq Unit=u Flags=u Src=s => - put_integer(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_integer j S t s -i_new_bs_put_integer_imm s j W t - -# -# Utf8/utf16/utf32 support. (R12B-5) -# - -bs_utf8_size j Src Dst=d => i_bs_utf8_size Src Dst -bs_utf16_size j Src Dst=d => i_bs_utf16_size Src Dst - -bs_put_utf8 Fail u Src => i_bs_put_utf8 Fail Src -bs_put_utf16 Fail Flags Src => put_utf16(Fail, Flags, Src) - -bs_put_utf32 Fail=j Flags=u Src=s => - i_bs_validate_unicode Fail Src | bs_put_integer Fail i=32 u=1 Flags Src - -i_bs_utf8_size s x -i_bs_utf16_size s x - -i_bs_put_utf8 j s -i_bs_put_utf16 j t s - -i_bs_validate_unicode j s - -# -# Storing floats into binaries. -# - -# Will fail. No need to keep the instruction, because bs_add or -# bs_init* would already have raised an exception. -bs_put_float Fail Sz=q Unit Flags Val => _ - -bs_put_float Fail=j Sz=s Unit=u Flags=u Src=s => - put_float(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_float j S t s -i_new_bs_put_float_imm j W t s - -# -# Storing binaries into binaries. -# - -bs_put_binary Fail=j Sz=s Unit=u Flags=u Src=s => - put_binary(Fail, Sz, Unit, Flags, Src) - -i_new_bs_put_binary j s t s -i_new_bs_put_binary_imm j W s -i_new_bs_put_binary_all s j t - -# -# Warning: The i_bs_put_string and i_new_bs_put_string instructions -# are specially treated in the loader. -# Don't change the instruction format unless you change the loader too. -# - -bs_put_string W M - # # New floating point instructions (R8). # @@ -1162,8 +1036,6 @@ i_fmul l l l i_fdiv l l l i_fnegate l l -%hot - # # New apply instructions in R10B. # @@ -1179,7 +1051,7 @@ apply_last t t # always preceded by an is_map test. That means that put_map_assoc can # never fail and does not need any failure label. -put_map_assoc Fail Map Dst Live Size Rest=* => +put_map_assoc _Fail Map Dst Live Size Rest=* => i_put_map_assoc Map Dst Live Size Rest i_put_map_assoc/4 @@ -1243,7 +1115,7 @@ gc_bif1 Fail Live u$bif:erlang:splus/1 Src Dst => gc_bif2 Fail Live u$bif:erlang:splus/2 S1 S2 Dst => gen_plus Fail Live S1 S2 Dst -gc_bif1 Fail Live u$bif:erlang:sminus/1 Src Dst => +gc_bif1 Fail _Live u$bif:erlang:sminus/1 Src Dst => i_unary_minus Src Fail Dst gc_bif2 Fail Live u$bif:erlang:sminus/2 S1 S2 Dst => gen_minus Fail Live S1 S2 Dst @@ -1252,33 +1124,33 @@ gc_bif2 Fail Live u$bif:erlang:sminus/2 S1 S2 Dst => # Arithmetic instructions. # -gc_bif2 Fail1 Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | - gc_bif2 Fail2 Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | +gc_bif2 Fail1 _Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | + gc_bif2 Fail2 _Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | equal(Dst1, S3) | equal(Dst1, Dst2) | equal(Fail1, Fail2) => i_mul_add Fail1 S1 S2 S3 S4 Dst1 -gc_bif2 Fail1 Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | - gc_bif2 Fail2 Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | +gc_bif2 Fail1 _Live1 u$bif:erlang:stimes/2 S1 S2 Dst1 | + gc_bif2 Fail2 _Live2 u$bif:erlang:splus/2 S3 S4 Dst2 | equal(Dst1, S4) | equal(Dst1, Dst2) | equal(Fail1, Fail2) => i_mul_add Fail1 S1 S2 S4 S3 Dst1 -gc_bif2 Fail Live u$bif:erlang:stimes/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:stimes/2 S1 S2 Dst => i_mul_add Fail S1 S2 Dst i Dst -gen_plus Fail Live S1 S2 Dst => i_plus S1 S2 Fail Dst +gen_plus Fail _Live S1 S2 Dst => i_plus S1 S2 Fail Dst -gen_minus Fail Live S1 S2 Dst => i_minus S1 S2 Fail Dst +gen_minus Fail _Live S1 S2 Dst => i_minus S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:div/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:div/2 S1 S2 Dst => i_m_div Fail S1 S2 Dst # Fused 'rem'/'div' pair. -gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | - gc_bif2 A B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | +gc_bif2 Fail _Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | + gc_bif2 _A _B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Remainder) | @@ -1286,9 +1158,9 @@ gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | i_rem_div LHS1 RHS1 Fail Remainder Quotient # As above but with a `line` in between -gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | - line Loc | - gc_bif2 A B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | +gc_bif2 Fail _Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | + line _Loc | + gc_bif2 _A _B u$bif:erlang:intdiv/2 LHS2 RHS2 Quotient | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Remainder) | @@ -1296,8 +1168,8 @@ gc_bif2 Fail Live u$bif:erlang:rem/2 LHS1 RHS1 Remainder | i_rem_div LHS1 RHS1 Fail Remainder Quotient # Fused 'div'/'rem' pair -gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | - gc_bif2 A B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | +gc_bif2 Fail _Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | + gc_bif2 _A _B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Quotient) | @@ -1305,35 +1177,35 @@ gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | i_div_rem LHS1 RHS1 Fail Quotient Remainder # As above but with a `line` in between -gc_bif2 Fail Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | - line Loc | - gc_bif2 A B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | +gc_bif2 Fail _Live u$bif:erlang:intdiv/2 LHS1 RHS1 Quotient | + line _Loc | + gc_bif2 _A _B u$bif:erlang:rem/2 LHS2 RHS2 Remainder | equal(LHS1, LHS2) | equal(RHS1, RHS2) | distinct(LHS1, Quotient) | distinct(RHS1, Quotient) => i_div_rem LHS1 RHS1 Fail Quotient Remainder -gc_bif2 Fail Live u$bif:erlang:intdiv/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:intdiv/2 S1 S2 Dst => i_int_div Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:rem/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:rem/2 S1 S2 Dst => i_rem S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bsl/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bsl/2 S1 S2 Dst => i_bsl S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bsr/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bsr/2 S1 S2 Dst => i_bsr S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:band/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:band/2 S1 S2 Dst => i_band S1 S2 Fail Dst -gc_bif2 Fail Live u$bif:erlang:bor/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bor/2 S1 S2 Dst => i_bor Fail S1 S2 Dst -gc_bif2 Fail Live u$bif:erlang:bxor/2 S1 S2 Dst => +gc_bif2 Fail _Live u$bif:erlang:bxor/2 S1 S2 Dst => i_bxor Fail S1 S2 Dst -gc_bif1 Fail Live u$bif:erlang:bnot/1 Src Dst => +gc_bif1 Fail _Live u$bif:erlang:bnot/1 Src Dst => i_bnot Fail Src Dst i_plus s s j d @@ -1373,15 +1245,16 @@ i_length j t d # Specialized guard BIFs. # -gc_bif1 Fail Live Bif=u$bif:erlang:map_size/1 Src Dst=d => bif_map_size Fail Src Dst +gc_bif1 Fail _Live _Bif=u$bif:erlang:map_size/1 Src Dst=d => + bif_map_size Fail Src Dst bif_map_size j s d # # Guard BIFs. # -gc_bif1 Fail Live Bif Src Dst => i_bif1 Src Fail Bif Dst -gc_bif2 Fail Live Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst -gc_bif3 Fail Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst +gc_bif1 Fail _Live Bif Src Dst => i_bif1 Src Fail Bif Dst +gc_bif2 Fail _Live Bif S1 S2 Dst => i_bif2 S1 S2 Fail Bif Dst +gc_bif3 Fail _Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst # # The following instruction is specially handled in beam_load.c @@ -1389,7 +1262,7 @@ gc_bif3 Fail Live Bif S1 S2 S3 Dst => i_bif3 S1 S2 S3 Fail Bif Dst # encountered. # unsupported_guard_bif/3 -unsupported_guard_bif A B C | never() => _ +unsupported_guard_bif _A _B _C | never() => _ # # R13B03 diff --git a/erts/emulator/beam/jit/x86/predicates.tab b/erts/emulator/beam/jit/x86/predicates.tab index 58bdbc2290ee..eabad907bd78 100644 --- a/erts/emulator/beam/jit/x86/predicates.tab +++ b/erts/emulator/beam/jit/x86/predicates.tab @@ -20,7 +20,7 @@ // pred.is_mfa_bif(M, F, A) { - Export *e; + const Export *e; ASSERT(M.type == TAG_a && F.type == TAG_a && A.type == TAG_u); e = erts_active_export_entry(M.val, F.val, A.val); diff --git a/erts/emulator/beam/packet_parser.c b/erts/emulator/beam/packet_parser.c index a349c3ff8446..c4adee9f341b 100644 --- a/erts/emulator/beam/packet_parser.c +++ b/erts/emulator/beam/packet_parser.c @@ -388,6 +388,7 @@ int packet_get_length(enum PacketParseType htype, case TCP_PB_HTTPH: case TCP_PB_HTTPH_BIN: *statep = !0; + ERTS_FALLTHROUGH(); case TCP_PB_HTTP: case TCP_PB_HTTP_BIN: /* TCP_PB_HTTP: data \r\n(SP data\r\n)* */ diff --git a/erts/emulator/beam/predicates.tab b/erts/emulator/beam/predicates.tab index 4bccce577ffb..0c93fe45b09d 100644 --- a/erts/emulator/beam/predicates.tab +++ b/erts/emulator/beam/predicates.tab @@ -122,7 +122,7 @@ pred.mixed_types(Size, Rest) { // Test whether Bif is "heavy" and should always go through its export entry. pred.is_heavy_bif(Bif) { BeamFile_ImportEntry *import; - Export *export; + const Export *export; if (Bif.type != TAG_u || Bif.val >= S->beam.imports.count) { return 0; @@ -178,12 +178,6 @@ pred.is_empty_map(Lit) { return is_flatmap(term) && flatmap_get_size(flatmap_val(term)) == 0; } -// Test whether a binary construction is too big. -pred.binary_too_big(Size) { - return Size.type == TAG_o || - (Size.type == TAG_u && ((Size.val >> (8*sizeof(Uint)-3)) != 0)); -} - // Mark this label. Always succeeds. pred.smp_mark_target_label(L) { ASSERT(L.type == TAG_f); diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h index da81abfe1aab..90085e92e11a 100644 --- a/erts/emulator/beam/sys.h +++ b/erts/emulator/beam/sys.h @@ -309,6 +309,19 @@ __decl_noreturn void __noreturn erl_assert_error(const char* expr, const char *f } while (0) #endif +/* Taken from https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html#warn-about-implicit-fallthrough-in-switch-statements */ +#ifdef __has_attribute +# if __has_attribute(__fallthrough__) +# define ERTS_FALLTHROUGH() __attribute__((__fallthrough__)) +# endif +#endif +#ifndef ERTS_FALLTHROUGH +# define ERTS_FALLTHROUGH() do {} while (0) /* fallthrough */ +#endif + +/* C99: bool, true and false */ +#include + /* * Microsoft C/C++: We certainly want to use stdarg.h and prototypes. * But MSC doesn't define __STDC__, unless we compile with the -Za @@ -701,12 +714,13 @@ typedef struct preload { } Preload; /* - * ErtsTracer is either NIL, 'true' or [Mod | State] + * ErtsTracer is either NIL, 'true', LocalPid or [Mod | State] * * If set to NIL, it means no tracer. * If set to 'true' it means the current process' tracer. * If set to [Mod | State], there is a tracer. - * See erts_tracer_update for more details + * LocalPid is the optimized form of the common case [erl_tracer | LocalPid]. + * See erts_tracer_update_impl for more details */ typedef Eterm ErtsTracer; diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c index 364a8dc509b5..57f809f29bb2 100644 --- a/erts/emulator/beam/utils.c +++ b/erts/emulator/beam/utils.c @@ -1207,10 +1207,10 @@ int eq(Eterm a, Eterm b) * a module literal area), we'll add a conservative implementation * to cover direct equality checks of non-term heap objects. * - * Note that we only need this to handle `eq(FunRef, FunRef)` and - * the like: we do not visit the FunRef or BinRef of any term we - * see while testing equality, so we should never land here under - * under normal circumstances. */ + * Note that we only need this to handle `eq(BinRef, BinRef)` and + * the like: we do not visit the BinRef of any term we see while + * testing equality, so we should never land here under normal + * normal circumstances. */ case BIN_REF_SUBTAG: if (is_bin_ref(b)) { BinRef *r1 = (BinRef*)boxed_val(a); @@ -1221,16 +1221,6 @@ int eq(Eterm a, Eterm b) } } break; /* not equal */ - case FUN_REF_SUBTAG: - if (is_fun_ref(b)) { - FunRef *r1 = (FunRef*)boxed_val(a); - FunRef *r2 = (FunRef*)boxed_val(b); - - if (r1->entry == r2->entry) { - goto pop_next; - } - } - break; /* not equal */ #endif case FUN_SUBTAG: { @@ -1460,6 +1450,7 @@ int eq(Eterm a, Eterm b) if (aa[0] != bb[0]) goto not_equal; aa++; bb++; + ERTS_FALLTHROUGH(); case HAMT_SUBTAG_NODE_BITMAP: sz = hashmap_bitcount(MAP_HEADER_VAL(hdr)); ASSERT(sz > 0 && sz < 17); @@ -1813,7 +1804,8 @@ Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only) goto mixed_types; } } - } + } + ERTS_ASSERT(0 && "unreachable"); case TAG_PRIMARY_LIST: if (is_not_list(b)) { a_tag = LIST_DEF; @@ -2068,8 +2060,8 @@ Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only) ErlFunThing* f2 = (ErlFunThing *) fun_val(b); if (is_local_fun(f1) && is_local_fun(f2)) { - ErlFunEntry* fe1 = f1->entry.fun; - ErlFunEntry* fe2 = f2->entry.fun; + const ErlFunEntry *fe1 = f1->entry.fun; + const ErlFunEntry *fe2 = f2->entry.fun; Sint diff; @@ -2103,8 +2095,8 @@ Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only) bb = f2->env; goto term_array; } else if (is_external_fun(f1) && is_external_fun(f2)) { - Export* a_exp = f1->entry.exp; - Export* b_exp = f2->entry.exp; + const Export *a_exp = f1->entry.exp; + const Export *b_exp = f2->entry.exp; if ((j = erts_cmp_atoms(a_exp->info.mfa.module, b_exp->info.mfa.module)) != 0) { diff --git a/erts/emulator/internal_doc/SuperCarrier.md b/erts/emulator/internal_doc/SuperCarrier.md index 55ac5a67afc8..ef8f38053082 100644 --- a/erts/emulator/internal_doc/SuperCarrier.md +++ b/erts/emulator/internal_doc/SuperCarrier.md @@ -5,7 +5,7 @@ A super carrier is large memory area, allocated at VM start, which can be used during runtime to allocate normal carriers from. The super carrier feature was introduced in OTP R16B03. It is -enabled with command line option +MMscs <size in Mb> +enabled with command line option `+MMscs ` and can be configured with other options. Problem diff --git a/erts/emulator/internal_doc/beam_makeops.md b/erts/emulator/internal_doc/beam_makeops.md index f873bc29476c..37b73ef69cca 100644 --- a/erts/emulator/internal_doc/beam_makeops.md +++ b/erts/emulator/internal_doc/beam_makeops.md @@ -891,11 +891,17 @@ a variable must begin with an uppercase letter. In constrast to Erlang, variables must **not** be repeated. Variables that have been bound on the left-hand side can be used on -the right-hand side. For example, this rule will rewrite all `move` -instructions to `assign` instructions with the operands swapped: +the right-hand side or in predicates. For example, this rule will rewrite all +`move` instructions to `assign` instructions with the operands swapped: move Src Dst => assign Dst Src +To help catch issues caused by unused variables (such as GH-8875), they are +considered errors. If you wish to give an operand a name for documentation +purposes, prefix it with an underscore (`_Foobar`) to mark the variable as +intentionally unused. Conversely, using a variable marked in this manner is +also an error. + If we only want to match operands of a certain type, we can use a type constraint. A type constraint consists of one or more lowercase letters, each specifying a type. For example: diff --git a/erts/emulator/nifs/common/prim_tty_nif.c b/erts/emulator/nifs/common/prim_tty_nif.c index ee6924186246..b3a3b8b0fb27 100644 --- a/erts/emulator/nifs/common/prim_tty_nif.c +++ b/erts/emulator/nifs/common/prim_tty_nif.c @@ -60,6 +60,9 @@ #ifdef HAVE_SYS_UIO_H #include #endif +#ifdef HAVE_POLL_H +#include +#endif #if defined IOV_MAX #define MAXIOV IOV_MAX @@ -82,29 +85,28 @@ #define DEF_HEIGHT 24 #define DEF_WIDTH 80 +enum TTYState { + unavailable, + disabled, + enabled +}; + typedef struct { #ifdef __WIN32__ HANDLE ofd; HANDLE ifd; - HANDLE ifdOverlapped; DWORD dwOriginalOutMode; DWORD dwOriginalInMode; DWORD dwOutMode; DWORD dwInMode; - /* Fields to handle the threaded reader */ - OVERLAPPED overlapped; - ErlNifBinary overlappedBuffer; #else int ofd; /* stdout */ int ifd; /* stdin */ #endif ErlNifPid self; ErlNifPid reader; - int tty; /* if the tty is initialized */ -#ifndef __WIN32__ - int signal[2]; /* Pipe used for signal (winch + cont) notifications */ -#endif + enum TTYState tty; /* if the tty is initialized */ #ifdef HAVE_TERMCAP struct termios tty_smode; struct termios tty_rmode; @@ -126,7 +128,7 @@ static ErlNifResourceType *tty_rt; static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM tty_set_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); +static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM setlocale_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_write_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); @@ -142,20 +144,18 @@ static ERL_NIF_TERM tty_tgetnum_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM static ERL_NIF_TERM tty_tgetflag_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_tgetstr_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM tty_tgoto_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); -static ERL_NIF_TERM tty_read_signal_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]); static ErlNifFunc nif_funcs[] = { {"isatty", 1, isatty_nif}, {"tty_create", 0, tty_create_nif}, - {"tty_init", 3, tty_init_nif}, - {"tty_set", 1, tty_set_nif}, - {"tty_read_signal", 2, tty_read_signal_nif}, + {"tty_init", 2, tty_init_nif}, {"setlocale", 1, setlocale_nif}, - {"tty_select", 3, tty_select_nif}, + {"tty_is_open", 2, tty_is_open}, + {"tty_select", 2, tty_select_nif}, {"tty_window_size", 1, tty_window_size_nif}, {"write_nif", 2, tty_write_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, {"tty_encoding", 1, tty_encoding_nif}, - {"read_nif", 2, tty_read_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, + {"read_nif", 3, tty_read_nif, ERL_NIF_DIRTY_JOB_IO_BOUND}, {"isprint", 1, isprint_nif}, {"wcwidth", 1, wcwidth_nif}, {"wcswidth", 1, wcswidth_nif}, @@ -191,6 +191,7 @@ ERL_NIF_INIT(prim_tty, nif_funcs, load, NULL, upgrade, unload) ATOM_DECL(stdout); \ ATOM_DECL(stderr); \ ATOM_DECL(select); \ + ATOM_DECL(raw); \ ATOM_DECL(sig); @@ -233,18 +234,48 @@ static int tty_get_fd(ErlNifEnv *env, ERL_NIF_TERM atom, int *fd) { return 1; } -static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { +#ifdef __WIN32__ +static HANDLE tty_get_handle(ErlNifEnv *env, ERL_NIF_TERM atom) { + HANDLE handle = INVALID_HANDLE_VALUE; int fd; + if (tty_get_fd(env, atom, &fd)) { + + switch (fd) { + case 0: handle = GetStdHandle(STD_INPUT_HANDLE); break; + case 1: handle = GetStdHandle(STD_OUTPUT_HANDLE); break; + case 2: handle = GetStdHandle(STD_ERROR_HANDLE); break; + } + } + return handle; +} +#endif +static ERL_NIF_TERM isatty_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { +#ifdef __WIN32__ + HANDLE handle = tty_get_handle(env, argv[0]); + + if (handle == INVALID_HANDLE_VALUE) + return atom_ebadf; + + switch (GetFileType(handle)) { + case FILE_TYPE_CHAR: return atom_true; + case FILE_TYPE_PIPE: + case FILE_TYPE_DISK: return atom_false; + default: return atom_ebadf; + } +#else + int fd; if (tty_get_fd(env, argv[0], &fd)) { if (isatty(fd)) { return atom_true; } else if (errno == EINVAL || errno == ENOTTY) { return atom_false; - } else { + } + else { return atom_ebadf; } } +#endif return enif_make_badarg(env); } @@ -254,7 +285,7 @@ static ERL_NIF_TERM tty_encoding_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER TTYResource *tty; if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (tty->tty) + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) return enif_make_tuple2(env, enif_make_atom(env, "utf16"), enif_make_atom(env, "little")); #endif @@ -395,6 +426,7 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar TTYResource *tty; ErlNifBinary bin; ERL_NIF_TERM res_term; + Uint64 n; ssize_t res = 0; #ifdef __WIN32__ HANDLE select_event; @@ -402,37 +434,38 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar int select_event; #endif + ASSERT(argc == 3); + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); + if (!enif_get_uint64(env, argv[2], &n)) + return enif_make_badarg(env); + + n = n > 1024 ? 1024 : n; + select_event = tty->ifd; -#ifdef __WIN32__ debug("tty_read_nif(%T, %T, %T)\r\n",argv[0],argv[1],argv[2]); + +#ifdef __WIN32__ /** * We have three different read scenarios we need to deal with * using different approaches. * - * ### New Shell + * ### New Shell / Raw NoShell * * Here characters need to be delivered as they are typed and we * also need to handle terminal resize events. So we use ReadConsoleInputW * to read. * - * ### Input is a terminal, but there is no shell, or old shell + * ### Input is a terminal, but there is noshell, or old shell * * Here we should operate in "line mode", that is characters should only - * be delivered when the user hits enter. Therefore we cannot use - * ReadConsoleInputW, and we also cannot use ReadFile in synchronous mode - * as it will block until a complete line is done. So we use the - * OVERLAPPED support of ReadFile to read data. - * - * From this mode it is important to be able to upgrade to a "New Shell" - * terminal. - * - * Unfortunately it does not seem like unicode works at all when in this - * mode. At least when I try it, all unicode characters are translated to - * "?". Maybe it could be solved by using ReadConsoleW? + * be delivered when the user hits enter. Here we used to use OVERLAPPED ReadFile, + * but that caused unicode to not work, so instead we use ReadFile. + * + * This call will block a single dirty io schedulers until the user hits Enter. * * ### Input is an anonymous pipe * @@ -441,174 +474,157 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar * call will not block until a full line is complete, so this is safe to do. * **/ - if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) { - if (tty->ifdOverlapped == INVALID_HANDLE_VALUE) { - /* Input is a terminal and we are in "new shell" mode */ + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR && tty->tty == enabled) { + /* Input is a terminal and we are in "new shell"/"raw" mode */ - ssize_t inputs_read, num_characters = 0; - wchar_t *characters = NULL; - INPUT_RECORD inputs[128]; + ssize_t inputs_read, num_characters = 0; + wchar_t *characters = NULL; + INPUT_RECORD inputs[128]; - ASSERT(tty->tty); + n = MIN(n, sizeof(inputs) / sizeof(inputs[0])); - if (!ReadConsoleInputW(tty->ifd, inputs, sizeof(inputs)/sizeof(*inputs), - &inputs_read)) { - return make_errno_error(env, "ReadConsoleInput"); - } + ASSERT(tty->tty == enabled); - /** - * Reading keyevents using ReadConsoleInput is a bit fragile as - * different consoles and different input modes cause events to - * be triggered in different ways. I've so far identified four - * different input methods that work slightly differently and - * two classes of consoles that also work slightly differently. - * - * The input methods are: - * - Normal key presses - * - Microsoft IME - * - Pasting into console - * - Using ALT+ modifiers - * - * ### Normal key presses - * - * When typing normally both key down and up events are sent with - * the typed character. If typing a Unicode character (for instance if - * you are using a keyboard with Cyrillic layout), that character also - * is sent as both key up and key down. This behavior is the same on all - * consoles. - * - * ### Microsoft IME - * - * When typing Japanese, Chinese and many other languages it is common to - * use a "Input Method Editor". Basically what it does is that if you type - * "sushi" using the Japanese IME it convert that to "すし". All characters - * typed using IME end up as only keydown events on cmd.exe and powershell, - * while in Windows Terminal and Alacritty both keydown and keyup events - * are sent. - * - * ### Pasting into console - * - * When text pasting into the console, any ascii text pasted ends up as both - * keydown and keyup events. Any non-ascii text pasted seem to be sent using - * a keydown event with UnicodeChar set to 0 and then immediately followed by a - * keyup event with the non-ascii text. - * - * ### Using ALT+ modifiers - * - * A very old way of inputting Unicode characters on Windows is to press - * the left alt key and then some numbers on the number pad. For instance - * you can type ALT+1 to write a ☺. When doing this first a keydown - * with 0 is sent and then some events later a keyup with the character - * is sent. This behavior seems to only work on cmd.exe and powershell. - * - * - * So to summarize: - * - Normal presses -- Always keydown and keyup events - * - IME -- Always keydown, sometimes keyup - * - Pasting -- Always keydown=0 directly followed by keyup=value - * - ALT+ -- Sometimes keydown=0 followed eventually by keyup=value - * - * So in order to read characters we should always read the keydown event, - * except when it is 0, then we should read the adjacent keyup event. - * This covers all modes and consoles except ALT+. If we want ALT+ to work - * we probably have to use PeekConsoleInput to make sure the correct events - * are available and inspect the state of the key event somehow. - **/ - - for (int i = 0; i < inputs_read; i++) { - if (inputs[i].EventType == KEY_EVENT) { - if (inputs[i].Event.KeyEvent.bKeyDown) { - if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { - num_characters++; - } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { - num_characters++; - } + if (!ReadConsoleInputW(tty->ifd, inputs, n, &inputs_read)) { + return make_errno_error(env, "ReadConsoleInput"); + } + + /** + * Reading keyevents using ReadConsoleInput is a bit fragile as + * different consoles and different input modes cause events to + * be triggered in different ways. I've so far identified four + * different input methods that work slightly differently and + * two classes of consoles that also work slightly differently. + * + * The input methods are: + * - Normal key presses + * - Microsoft IME + * - Pasting into console + * - Using Alt+ modifiers + * + * ### Normal key presses + * + * When typing normally both key down and up events are sent with + * the typed character. If typing a Unicode character (for instance if + * you are using a keyboard with Cyrillic layout), that character also + * is sent as both key up and key down. This behavior is the same on all + * consoles. + * + * ### Microsoft IME + * + * When typing Japanese, Chinese and many other languages it is common to + * use a "Input Method Editor". Basically what it does is that if you type + * "sushi" using the Japanese IME it convert that to "すし". All characters + * typed using IME end up as only keydown events on cmd.exe and powershell, + * while in Windows Terminal and Alacritty both keydown and keyup events + * are sent. + * + * ### Pasting into console + * + * When text pasting into the console, any ascii text pasted ends up as both + * keydown and keyup events. Any non-ascii text pasted seem to be sent using + * a keydown event with UnicodeChar set to 0 and then immediately followed by a + * keyup event with the non-ascii text. + * + * ### Using Alt+ modifiers + * + * A very old way of inputting Unicode characters on Windows is to press + * the left alt key and then some numbers on the number pad. For instance + * you can type Alt+1 to write a ☺. When doing this first a keydown + * with 0 is sent and then some events later a keyup with the character + * is sent. This behavior seems to only work on cmd.exe and powershell. + * + * + * So to summarize: + * - Normal presses -- Always keydown and keyup events + * - IME -- Always keydown, sometimes keyup + * - Pasting -- Always keydown=0 directly followed by keyup=value + * - Alt+ -- Sometimes keydown=0 followed eventually by keyup=value + * + * So in order to read characters we should always read the keydown event, + * except when it is 0, then we should read the adjacent keyup event. + * This covers all modes and consoles except Alt+. If we want Alt+ to work + * we probably have to use PeekConsoleInput to make sure the correct events + * are available and inspect the state of the key event somehow. + **/ + + for (int i = 0; i < inputs_read; i++) { + if (inputs[i].EventType == KEY_EVENT) { + if (inputs[i].Event.KeyEvent.bKeyDown) { + if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { + num_characters++; + } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { + num_characters++; } } } - enif_alloc_binary(num_characters * sizeof(wchar_t), &bin); - characters = (wchar_t*)bin.data; - for (int i = 0; i < inputs_read; i++) { - switch (inputs[i].EventType) - { - case KEY_EVENT: - if (inputs[i].Event.KeyEvent.bKeyDown) { - if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { - debug("Read %u\r\n",inputs[i].Event.KeyEvent.uChar.UnicodeChar); - characters[res++] = inputs[i].Event.KeyEvent.uChar.UnicodeChar; - } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { - debug("Read %u\r\n",inputs[i+1].Event.KeyEvent.uChar.UnicodeChar); - characters[res++] = inputs[i+1].Event.KeyEvent.uChar.UnicodeChar; - } + } + enif_alloc_binary(num_characters * sizeof(wchar_t), &bin); + characters = (wchar_t*)bin.data; + for (int i = 0; i < inputs_read; i++) { + switch (inputs[i].EventType) + { + case KEY_EVENT: + if (inputs[i].Event.KeyEvent.bKeyDown) { + if (inputs[i].Event.KeyEvent.uChar.UnicodeChar != 0) { + debug("Read %u\r\n",inputs[i].Event.KeyEvent.uChar.UnicodeChar); + characters[res++] = inputs[i].Event.KeyEvent.uChar.UnicodeChar; + } else if (i + 1 < inputs_read && !inputs[i+1].Event.KeyEvent.bKeyDown) { + debug("Read %u\r\n",inputs[i+1].Event.KeyEvent.uChar.UnicodeChar); + characters[res++] = inputs[i+1].Event.KeyEvent.uChar.UnicodeChar; } - break; - case WINDOW_BUFFER_SIZE_EVENT: - enif_send(env, &tty->self, NULL, - enif_make_tuple2( - env, enif_make_atom(env, "resize"), - enif_make_tuple2( - env, - enif_make_int(env, inputs[i].Event.WindowBufferSizeEvent.dwSize.Y), - enif_make_int(env, inputs[i].Event.WindowBufferSizeEvent.dwSize.X)))); - break; - case MOUSE_EVENT: - /* We don't do anything with the mouse event */ - break; - case MENU_EVENT: - case FOCUS_EVENT: - /* Should be ignored according to - https://docs.microsoft.com/en-us/windows/console/input-record-str */ - break; - default: - fprintf(stderr,"Unknown event: %d\r\n", inputs[i].EventType); - break; } + break; + case WINDOW_BUFFER_SIZE_EVENT: + enif_send(env, &tty->self, NULL, + enif_make_tuple2(env, argv[1], + enif_make_tuple2(env, + enif_make_atom(env, "signal"), + enif_make_atom(env, "resize")))); + break; + case MOUSE_EVENT: + /* We don't do anything with the mouse event */ + break; + case MENU_EVENT: + case FOCUS_EVENT: + /* Should be ignored according to + https://docs.microsoft.com/en-us/windows/console/input-record-str */ + break; + default: + fprintf(stderr,"Unknown event: %d\r\n", inputs[i].EventType); + break; } - res *= sizeof(wchar_t); - } else { - /* Input is a terminal and we are in "noshell" or "oldshell" mode */ - DWORD bytesRead = 0; - debug("GetOverlapped on %d\r\n", tty->ifdOverlapped); - if (!GetOverlappedResult(tty->ifdOverlapped, &tty->overlapped, &bytesRead, TRUE)) { - if (GetLastError() == ERROR_OPERATION_ABORTED && tty->tty) { - /* The overlapped operation was cancels by CancelIo because - we are upgrading to "newshell". So we close the handles - involved with the overlapped io and select on the stdin - handle. From now on we use ReadConsoleInputW to get - input. */ - CloseHandle(tty->ifdOverlapped); - CloseHandle(tty->overlapped.hEvent); - tty->ifdOverlapped = INVALID_HANDLE_VALUE; - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - /* Return {error,aborted} to signal that the encoding has changed . */ - return make_error(env, enif_make_atom(env, "aborted")); - } - return make_errno_error(env, "GetOverlappedResult"); - } - if (bytesRead == 0) { - return make_error(env, enif_make_atom(env, "closed")); - } - debug("Read %d bytes\r\n", bytesRead); -#ifdef HARD_DEBUG - for (int i = 0; i < bytesRead; i++) - debug("Read %u\r\n", tty->overlappedBuffer.data[i]); -#endif - bin = tty->overlappedBuffer; - res = bytesRead; - enif_alloc_binary(1024, &tty->overlappedBuffer); - if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, - tty->overlappedBuffer.size, NULL, &tty->overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) - return make_errno_error(env, "ReadFile"); - } - select_event = tty->overlapped.hEvent; } + res *= sizeof(wchar_t); } else { - /* Input is not a terminal */ + /* Input is not a terminal or we are in "cooked" mode */ DWORD bytesTransferred; - enif_alloc_binary(1024, &bin); - if (ReadFile(tty->ifd, bin.data, bin.size, - &bytesTransferred, NULL)) { + BOOL readRes; + const char *errorFunction; + if (GetFileType(tty->ifd) == FILE_TYPE_CHAR) { + /* This ReadConsoleW call may hang until Enter is pressed. + * This will block one dirty io schedulers, but that should be ok as it will + * only happen if the application wants to read data, i.e. it is reasonable to + * expect and enter to be hit "soon". + * + * NOTE: I've tried various things to try to figure out if ReadFile/ReadConsole + * will block or not, but one of the crazy thing with ReadFile/ReadConsole is + * that you need to call it before the characters on the terminal are echoed, + * so we need this call to be blocking. What we could do is move the read to another + * thread so that we don't consume a dirty io scheduler, but I've opted to keep + * it simple and not do that. + */ + enif_alloc_binary(n * sizeof(wchar_t), &bin); + readRes = ReadConsoleW(tty->ifd, bin.data, n, &bytesTransferred, NULL); + bytesTransferred *= sizeof(wchar_t); + errorFunction = "ReadConsoleW"; + } + else { + enif_alloc_binary(n, &bin); + readRes = ReadFile(tty->ifd, bin.data, bin.size, &bytesTransferred, NULL); + errorFunction = "ReadFile"; + } + if (readRes) { res = bytesTransferred; if (res == 0) { enif_release_binary(&bin); @@ -619,11 +635,11 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar enif_release_binary(&bin); if (error == ERROR_BROKEN_PIPE) return make_error(env, enif_make_atom(env, "closed")); - return make_errno_error(env, "ReadFile"); + return make_errno_error(env, errorFunction); } } #else - enif_alloc_binary(1024, &bin); + enif_alloc_binary(n, &bin); res = read(tty->ifd, bin.data, bin.size); if (res < 0) { if (errno != EAGAIN && errno != EINTR) { @@ -654,6 +670,76 @@ static ERL_NIF_TERM tty_read_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar return enif_make_tuple2(env, atom_ok, res_term); } +/* Poll if stdin/stdout/stderr are still open. */ +static ERL_NIF_TERM tty_is_open(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { + TTYResource *tty; +#ifdef __WIN32__ + HANDLE handle; +#else + int fd; +#endif + + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) + return enif_make_badarg(env); + +#ifdef __WIN32__ + + handle = tty_get_handle(env, argv[1]); + + if (handle != INVALID_HANDLE_VALUE) { + DWORD bytesAvailable = 0; + + switch (GetFileType(handle)) { + case FILE_TYPE_CHAR: { + DWORD eventsAvailable; + if (!GetNumberOfConsoleInputEvents(handle, &eventsAvailable)) { + return atom_false; + } + return atom_true; + } + case FILE_TYPE_DISK: { + return atom_true; + } + default: { + DWORD bytesAvailable = 0; + // Check the state of the pipe + if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL)) { + DWORD err = GetLastError(); + + // If the error is ERROR_BROKEN_PIPE, it means stdin has been closed + if (err == ERROR_BROKEN_PIPE) { + return atom_false; + } + else { + return make_errno_error(env, "PeekNamedPipe"); + } + } + return atom_true; + } + } + } +#else + if (tty_get_fd(env, argv[1], &fd)) { + struct pollfd fds[1]; + int ret; + + fds[0].fd = fd; + fds[0].events = POLLHUP; + fds[0].revents = 0; + ret = poll(fds, 1, 0); + + if (ret < 0) { + return make_errno_error(env, __FUNCTION__); + } else if (ret == 0) { + return atom_true; + } else if (ret == 1 && fds[0].revents & POLLHUP) { + return atom_false; + } + } +#endif + return enif_make_badarg(env); +} + static ERL_NIF_TERM setlocale_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { #ifdef __WIN32__ TTYResource *tty; @@ -789,13 +875,25 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM TTYResource *tty = enif_alloc_resource(tty_rt, sizeof(TTYResource)); ERL_NIF_TERM tty_term; memset(tty, 0, sizeof(*tty)); + +#ifdef HARD_DEBUG + logFile = fopen("tty.log","w+"); +#endif + + tty->tty = unavailable; + #ifndef __WIN32__ tty->ifd = 0; tty->ofd = 1; -#else -#ifdef HARD_DEBUG - logFile = fopen("tty.log","w+"); + +#ifdef HAVE_TERMCAP + if (tcgetattr(tty->ofd, &tty->tty_rmode) >= 0) { + tty->tty = disabled; + } #endif + +#else + tty->ifd = GetStdHandle(STD_INPUT_HANDLE); if (tty->ifd == INVALID_HANDLE_VALUE || tty->ifd == NULL) { tty->ifd = CreateFile("nul", GENERIC_READ, 0, @@ -813,6 +911,7 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM /* Failed to set any VT mode, can't do anything here. */ return make_errno_error(env, "SetConsoleMode"); } + tty->tty = disabled; } if (GetConsoleMode(tty->ifd, &tty->dwOriginalInMode)) { @@ -822,7 +921,7 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM return make_errno_error(env, "SetConsoleMode"); } } - tty->ifdOverlapped = INVALID_HANDLE_VALUE; + #endif tty_term = enif_make_resource(env, tty); @@ -837,50 +936,41 @@ static ERL_NIF_TERM tty_create_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { #if defined(HAVE_TERMCAP) || defined(__WIN32__) - ERL_NIF_TERM canon, echo, sig; + ERL_NIF_TERM input; TTYResource *tty; - int fd; - debug("tty_init_nif(%T,%T,%T)\r\n", argv[0], argv[1], argv[2]); + debug("tty_init_nif(%T,%T)\r\n", argv[0], argv[1]); - if (argc != 3 || - !tty_get_fd(env, argv[1], &fd) || - !enif_is_map(env, argv[2])) { + if (argc != 2 || !enif_is_map(env, argv[1])) { return enif_make_badarg(env); } if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"canon"), &canon)) - canon = enif_make_atom(env, "undefined"); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"echo"), &echo)) - echo = enif_make_atom(env, "undefined"); - if (!enif_get_map_value(env, argv[2], enif_make_atom(env,"sig"), &sig)) - sig = enif_make_atom(env, "undefined"); + if (!enif_get_map_value(env, argv[1], enif_make_atom(env, "input"), &input)) + return enif_make_badarg(env); -#ifndef __WIN32__ - if (tcgetattr(fd, &tty->tty_rmode) < 0) { - return make_errno_error(env, "tcgetattr"); + if (tty->tty == unavailable) { + if (enif_is_identical(input, atom_raw)) + return make_enotsup(env); + return atom_ok; } + tty->tty = enif_is_identical(input, atom_raw) ? enabled : disabled; + +#ifndef __WIN32__ + + /* Restore the original mode, that is canonical echo mode */ tty->tty_smode = tty->tty_rmode; - /* Default characteristics for all usage including termcap output. */ - tty->tty_smode.c_iflag &= ~ISTRIP; + if (tty->tty == enabled) { - /* erts_fprintf(stderr,"canon %T\r\n", canon); */ - /* Turn canonical (line mode) on off. */ - if (enif_is_identical(canon, atom_true)) { - tty->tty_smode.c_iflag |= ICRNL; - tty->tty_smode.c_lflag |= ICANON; - tty->tty_smode.c_oflag |= OPOST; - tty->tty_smode.c_cc[VEOF] = tty->tty_rmode.c_cc[VEOF]; -#ifdef VDSUSP - tty->tty_smode.c_cc[VDSUSP] = tty->tty_rmode.c_cc[VDSUSP]; -#endif - } - if (enif_is_identical(canon, atom_false)) { + /* Default characteristics for all usage including termcap output. */ + tty->tty_smode.c_iflag &= ~ISTRIP; + + /* erts_fprintf(stderr,"canon %T\r\n", canon); */ + /* Turn canonical (line mode) off. */ tty->tty_smode.c_iflag &= ~ICRNL; tty->tty_smode.c_lflag &= ~ICANON; tty->tty_smode.c_oflag &= ~OPOST; @@ -890,83 +980,46 @@ static ERL_NIF_TERM tty_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar #ifdef VDSUSP tty->tty_smode.c_cc[VDSUSP] = 0; #endif - } - /* Turn echo on or off. */ - /* erts_fprintf(stderr,"echo %T\r\n", echo); */ - if (enif_is_identical(echo, atom_true)) - tty->tty_smode.c_lflag |= ECHO; - if (enif_is_identical(echo, atom_false)) + /* Turn echo off. */ + /* erts_fprintf(stderr,"echo %T\r\n", echo); */ tty->tty_smode.c_lflag &= ~ECHO; - /* erts_fprintf(stderr,"sig %T\r\n", sig); */ - /* Set extra characteristics for "RAW" mode, no signals. */ - if (enif_is_identical(sig, atom_true)) { - /* Ignore IMAXBEL as not POSIX. */ -#ifndef QNX - tty->tty_smode.c_iflag |= (BRKINT|IGNPAR|ICRNL|IXON|IXANY); -#else - tty->tty_smode.c_iflag |= (BRKINT|IGNPAR|ICRNL|IXON); -#endif - tty->tty_smode.c_lflag |= (ISIG|IEXTEN); } - if (enif_is_identical(sig, atom_false)) { - /* Ignore IMAXBEL as not POSIX. */ -#ifndef QNX - tty->tty_smode.c_iflag &= ~(BRKINT|IGNPAR|ICRNL|IXON|IXANY); -#else - tty->tty_smode.c_iflag &= ~(BRKINT|IGNPAR|ICRNL|IXON); -#endif - tty->tty_smode.c_lflag &= ~(ISIG|IEXTEN); + + if (tcsetattr(tty->ofd, TCSANOW, &tty->tty_smode) < 0) { + return make_errno_error(env, "tcsetattr"); } #else + DWORD dwOutMode = tty->dwOutMode; + DWORD dwInMode = tty->dwInMode; + debug("origOutMode: %x origInMode: %x\r\n", tty->dwOriginalOutMode, tty->dwOriginalInMode); - /* If we cannot disable NEWLINE_AUTO_RETURN we continue anyway as things work */ - if (SetConsoleMode(tty->ofd, tty->dwOutMode | DISABLE_NEWLINE_AUTO_RETURN)) { - tty->dwOutMode |= DISABLE_NEWLINE_AUTO_RETURN; + if (tty->tty == enabled) { + dwOutMode |= DISABLE_NEWLINE_AUTO_RETURN; + dwInMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); } - tty->dwInMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); - if (!SetConsoleMode(tty->ifd, tty->dwInMode)) + if (!SetConsoleMode(tty->ifd, dwInMode)) { /* Failed to set disable echo or line input mode */ return make_errno_error(env, "SetConsoleMode"); } - /* If we are changing from "-noshell" to a shell we - need to cancel any outstanding async io. This - will cause the enif_select to trigger which allows - us to do more cleanup in tty_read_nif. */ - if (tty->ifdOverlapped != INVALID_HANDLE_VALUE) { - debug("CancelIo on %d\r\n", tty->ifdOverlapped); - CancelIoEx(tty->ifdOverlapped, &tty->overlapped); + + if (!SetConsoleMode(tty->ofd, dwOutMode)) { + /* If we cannot disable NEWLINE_AUTO_RETURN we continue anyway as things work */ + ; } #endif /* __WIN32__ */ - tty->tty = 1; - - return atom_ok; -#else - return make_enotsup(env); -#endif -} - -static ERL_NIF_TERM tty_set_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { -#if defined(HAVE_TERMCAP) || defined(__WIN32__) - TTYResource *tty; - if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) - return enif_make_badarg(env); -#ifdef HAVE_TERMCAP - if (tty->tty && tcsetattr(tty->ifd, TCSANOW, &tty->tty_smode) < 0) { - return make_errno_error(env, "tcsetattr"); - } -#endif enif_self(env, &tty->self); enif_monitor_process(env, tty, &tty->self, NULL); + return atom_ok; #else return make_enotsup(env); @@ -1015,103 +1068,21 @@ static ERL_NIF_TERM tty_window_size_nif(ErlNifEnv* env, int argc, const ERL_NIF_ )); } -#ifndef __WIN32__ - -static int tty_signal_fd = -1; - -static RETSIGTYPE tty_cont(int sig) -{ - if (tty_signal_fd != 1) { - while (write(tty_signal_fd, "c", 1) < 0 && errno == EINTR) { }; - } -} - - -static RETSIGTYPE tty_winch(int sig) -{ - if (tty_signal_fd != 1) { - while (write(tty_signal_fd, "w", 1) < 0 && errno == EINTR) { }; - } -} - -#endif - -static ERL_NIF_TERM tty_read_signal_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { - TTYResource *tty; - char buff[1]; - ssize_t ret; - ERL_NIF_TERM res; - if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) - return enif_make_badarg(env); -#ifndef __WIN32__ - do { - ret = read(tty->signal[0], buff, 1); - } while (ret < 0 && errno == EAGAIN); - - if (ret < 0) { - return make_errno_error(env, "read"); - } else if (ret == 0) { - return make_error(env, enif_make_atom(env,"empty")); - } - - enif_select(env, tty->signal[0], ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - - if (buff[0] == 'w') { - res = enif_make_atom(env, "winch"); - } else if (buff[0] == 'c') { - res = enif_make_atom(env, "cont"); - } else { - res = enif_make_string_len(env, buff, 1, ERL_NIF_LATIN1); - } - return enif_make_tuple2(env, atom_ok, res); -#else - return make_enotsup(env); -#endif -} - static ERL_NIF_TERM tty_select_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { TTYResource *tty; + #ifndef __WIN32__ extern int using_oldshell; /* set this to let the rest of erts know */ -#else - struct tty_reader *tty_reader; #endif + if (!enif_get_resource(env, argv[0], tty_rt, (void **)&tty)) return enif_make_badarg(env); #ifndef __WIN32__ - if (pipe(tty->signal) == -1) { - return make_errno_error(env, "pipe"); - } - SET_NONBLOCKING(tty->signal[0]); - enif_select(env, tty->signal[0], ERL_NIF_SELECT_READ, tty, NULL, argv[1]); - tty_signal_fd = tty->signal[1]; - - sys_signal(SIGCONT, tty_cont); - sys_signal(SIGWINCH, tty_winch); - using_oldshell = 0; - - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[2]); -#else - if (tty->tty || GetFileType(tty->ifd) != FILE_TYPE_CHAR) { - debug("Select on %d\r\n", tty->ifd); - enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[2]); - } else { - tty->ifdOverlapped = CreateFile("CONIN$", GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); - enif_alloc_binary(1024, &tty->overlappedBuffer); - tty->overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - debug("Calling ReadFile on %d\r\n", tty->ifdOverlapped); - if (!ReadFile(tty->ifdOverlapped, tty->overlappedBuffer.data, tty->overlappedBuffer.size, NULL, &tty->overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - return make_errno_error(env, "ReadFile"); - } - } - debug("Select on %d\r\n", tty->overlapped.hEvent); - enif_select(env, tty->overlapped.hEvent, ERL_NIF_SELECT_READ, tty, NULL, argv[2]); - } #endif + debug("Select on %d\r\n", tty->ifd); + enif_select(env, tty->ifd, ERL_NIF_SELECT_READ, tty, NULL, argv[1]); enif_self(env, &tty->reader); enif_monitor_process(env, tty, &tty->reader, NULL); @@ -1128,12 +1099,6 @@ static void tty_monitor_down(ErlNifEnv* caller_env, void* obj, ErlNifPid* pid, E #endif if (enif_compare_pids(pid, &tty->reader) == 0) { enif_select(caller_env, tty->ifd, ERL_NIF_SELECT_STOP, tty, NULL, atom_undefined); -#ifndef __WIN32__ - enif_select(caller_env, tty->signal[0], ERL_NIF_SELECT_STOP, tty, NULL, atom_undefined); - close(tty->signal[1]); - sys_signal(SIGCONT, SIG_DFL); - sys_signal(SIGWINCH, SIG_DFL); -#endif } } diff --git a/erts/emulator/pcre/pcre.mk b/erts/emulator/pcre/pcre.mk index 38b91237a23e..2f536b072dfa 100644 --- a/erts/emulator/pcre/pcre.mk +++ b/erts/emulator/pcre/pcre.mk @@ -49,7 +49,7 @@ PCRE_OBJDIR = $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE) PCRE_DIR = $(ERL_TOP)/erts/emulator/pcre -PCRE_CFLAGS = $(filter-out -DDEBUG,$(CFLAGS)) -DERLANG_INTEGRATION +PCRE_CFLAGS = $(filter-out -DDEBUG -Wimplicit-fallthrough,$(CFLAGS)) -DERLANG_INTEGRATION ifeq ($(TARGET), win32) $(EPCRE_LIB): $(PCRE_OBJS) diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c index f821cca9c854..70986d7a0b86 100644 --- a/erts/emulator/sys/common/erl_check_io.c +++ b/erts/emulator/sys/common/erl_check_io.c @@ -589,8 +589,8 @@ abort_tasks(ErtsDrvEventState *state, int mode) return; default: ASSERT(state->type == ERTS_EV_TYPE_DRV_SEL); - /* Fall through */ } + ERTS_FALLTHROUGH(); case ERL_DRV_READ|ERL_DRV_WRITE: case ERL_DRV_WRITE: ASSERT(state->type == ERTS_EV_TYPE_DRV_SEL); @@ -599,6 +599,7 @@ abort_tasks(ErtsDrvEventState *state, int mode) state->type); if (mode == ERL_DRV_WRITE) break; + ERTS_FALLTHROUGH(); case ERL_DRV_READ: ASSERT(state->type == ERTS_EV_TYPE_DRV_SEL); abort_task(state->driver.select->inport, diff --git a/erts/emulator/sys/common/erl_mmap.c b/erts/emulator/sys/common/erl_mmap.c index 4dfa1ba3c00d..ef29b075d90e 100644 --- a/erts/emulator/sys/common/erl_mmap.c +++ b/erts/emulator/sys/common/erl_mmap.c @@ -32,19 +32,39 @@ #include #endif -int erts_mem_guard(void *p, UWord size) { +int erts_mem_guard(void *p, UWord size, int readable, int writable) { + #if defined(WIN32) DWORD oldProtect; + DWORD newProtect = PAGE_NOACCESS; BOOL success; + if (readable && writable) { + newProtect = PAGE_READWRITE; + } else if (readable) { + newProtect = PAGE_READONLY; + } else { + ERTS_INTERNAL_ERROR(!"mem_guard invalid page permissions"); + } success = VirtualProtect((LPVOID*)p, size, - PAGE_NOACCESS, + newProtect, &oldProtect); return success ? 0 : -1; #elif defined(HAVE_SYS_MMAN_H) - return mprotect(p, size, PROT_NONE); + int flags = 0; + + /* Check that the ptr is aligned at page boundary */ + ASSERT((Uint)p % sys_page_size == 0); + + if (writable) { + flags |= PROT_WRITE; + } + if (readable) { + flags |= PROT_READ; + } + return mprotect(p, size, flags); #else errno = ENOTSUP; return -1; diff --git a/erts/emulator/sys/common/erl_mmap.h b/erts/emulator/sys/common/erl_mmap.h index 648cd6f0ce6f..1a0b3713f52a 100644 --- a/erts/emulator/sys/common/erl_mmap.h +++ b/erts/emulator/sys/common/erl_mmap.h @@ -182,10 +182,10 @@ void hard_dbg_remove_mseg(void* seg, UWord sz); #endif /* HAVE_ERTS_MMAP */ -/* Marks the given memory region as permanently inaccessible. - * +/* Changes the permissions of the given memory region. + * Assumes proper page alignment. * Returns 0 on success, and -1 on error. */ -int erts_mem_guard(void *p, UWord size); +int erts_mem_guard(void *p, UWord size, int readable, int writable); /* Marks the given memory region as unused without freeing it, letting the OS * reclaim its physical memory with the promise that we'll get it back (without diff --git a/erts/emulator/sys/unix/erl_child_setup.c b/erts/emulator/sys/unix/erl_child_setup.c index 317bf8cfe977..01c0a74f53a1 100644 --- a/erts/emulator/sys/unix/erl_child_setup.c +++ b/erts/emulator/sys/unix/erl_child_setup.c @@ -434,7 +434,7 @@ static int system_properties_fd(void) #endif /* __ANDROID__ */ /* - If beam is terminated using kill -9 or Ctrl-C when +B is set it may not + If beam is terminated using kill -9 or Ctrl+C when +B is set it may not cleanup the terminal properly. So to clean it up we save the initial state in erl_child_setup and then reset the terminal if we detect that beam terminated. diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c index a512f1d9977a..cd9800d19ca6 100644 --- a/erts/emulator/sys/unix/sys.c +++ b/erts/emulator/sys/unix/sys.c @@ -682,11 +682,13 @@ static RETSIGTYPE suspend_signal(int signum) SIGUSR1 Term User-defined signal 1 SIGUSR2 Term User-defined signal 2 !SIGCHLD Ign Child stopped or terminated - !SIGCONT Cont Continue if stopped + SIGCONT Cont Continue if stopped SIGSTOP Stop Stop process SIGTSTP Stop Stop typed at terminal !SIGTTIN Stop Terminal input for background process !SIGTTOU Stop Terminal output for background process + SIGWINCH Ign Window size change + SIGINFO Ign Status request from keyboard */ @@ -707,6 +709,11 @@ signalterm_to_signum(Eterm signal) case am_sigchld: return SIGCHLD; case am_sigstop: return SIGSTOP; case am_sigtstp: return SIGTSTP; + case am_sigcont: return SIGCONT; + case am_sigwinch: return SIGWINCH; +#ifdef SIGINFO + case am_siginfo: return SIGINFO; +#endif /* defined(SIGINFO) */ default: return 0; } } @@ -728,6 +735,11 @@ signum_to_signalterm(int signum) case SIGCHLD: return am_sigchld; case SIGSTOP: return am_sigstop; case SIGTSTP: return am_sigtstp; /* ^z */ + case SIGCONT: return am_sigcont; + case SIGWINCH: return am_sigwinch; +#ifdef SIGINFO + case SIGINFO: return am_siginfo; /* ^t */ +#endif /* defined(SIGINFO) */ default: return am_error; } } @@ -759,12 +771,12 @@ void erts_set_ignore_break(void) { * typing certain key combinations at the * controlling terminal... */ - sys_signal(SIGINT, SIG_IGN); /* Ctrl-C */ - sys_signal(SIGQUIT, SIG_IGN); /* Ctrl-\ */ - sys_signal(SIGTSTP, SIG_IGN); /* Ctrl-Z */ + sys_signal(SIGINT, SIG_IGN); /* Ctrl+C */ + sys_signal(SIGQUIT, SIG_IGN); /* Ctrl+\ */ + sys_signal(SIGTSTP, SIG_IGN); /* Ctrl+Z */ } -/* Don't use ctrl-c for break handler but let it be +/* Don't use Ctrl+C for break handler but let it be used by the shell instead (see user_drv.erl) */ void erts_replace_intr(void) { struct termios mode; @@ -772,11 +784,11 @@ void erts_replace_intr(void) { if (isatty(0)) { tcgetattr(0, &mode); - /* here's an example of how to replace ctrl-c with ctrl-u */ + /* here's an example of how to replace Ctrl+C with Ctrl+U */ /* mode.c_cc[VKILL] = 0; mode.c_cc[VINTR] = CKILL; */ - mode.c_cc[VINTR] = 0; /* disable ctrl-c */ + mode.c_cc[VINTR] = 0; /* disable Ctrl+C */ tcsetattr(0, TCSANOW, &mode); replace_intr = 1; } diff --git a/erts/emulator/sys/win32/sys_interrupt.c b/erts/emulator/sys/win32/sys_interrupt.c index fc4f63d4bf05..c039da63c596 100644 --- a/erts/emulator/sys/win32/sys_interrupt.c +++ b/erts/emulator/sys/win32/sys_interrupt.c @@ -111,7 +111,7 @@ BOOL WINAPI ctrl_handler_replace_intr(DWORD dwCtrlType) } -/* Don't use ctrl-c for break handler but let it be +/* Don't use Ctrl+C for break handler but let it be used by the shell instead (see user_drv.erl) */ void erts_replace_intr(void) { HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); diff --git a/erts/emulator/test/Makefile b/erts/emulator/test/Makefile index 0530b597651b..302d06dde697 100644 --- a/erts/emulator/test/Makefile +++ b/erts/emulator/test/Makefile @@ -154,10 +154,6 @@ NO_OPT= bs_bincomp \ guard \ map -R24= \ - bs_construct \ - process_max_heap_size - R25= \ bs_bincomp \ bs_construct \ @@ -179,9 +175,6 @@ STRIPPED_TYPES= \ NO_OPT_MODULES= $(NO_OPT:%=%_no_opt_SUITE) NO_OPT_ERL_FILES= $(NO_OPT_MODULES:%=%.erl) -R24_MODULES= $(R24:%=%_r24_SUITE) -R24_ERL_FILES= $(R24_MODULES:%=%.erl) - R25_MODULES= $(R25:%=%_r25_SUITE) R25_ERL_FILES= $(R25_MODULES:%=%.erl) @@ -225,13 +218,11 @@ ERL_COMPILE_FLAGS := $(filter-out +deterministic,$($(ERL_COMPILE_FLAGS))) # ---------------------------------------------------- make_emakefile: $(NO_OPT_ERL_FILES) \ - $(KERNEL_ERL_FILES) $(R24_ERL_FILES) $(R25_ERL_FILES) $(STRIPPED_TYPES_ERL_FILES) + $(KERNEL_ERL_FILES) $(R25_ERL_FILES) $(STRIPPED_TYPES_ERL_FILES) $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) +compressed -o$(EBIN) \ $(MODULES) $(STDLIB_MODULES) $(KERNEL_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +no_copt +no_postopt +no_ssa_opt +no_bsm_opt \ $(ERL_COMPILE_FLAGS) -o$(EBIN) $(NO_OPT_MODULES) >> $(EMAKEFILE) - $(ERL_TOP)/make/make_emakefile +r24 \ - $(ERL_COMPILE_FLAGS) -o$(EBIN) $(R24_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +r25 \ $(ERL_COMPILE_FLAGS) -o$(EBIN) $(R25_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +strip_types \ @@ -257,9 +248,6 @@ targets: $(TARGET_FILES) %_no_opt_SUITE.erl: %_SUITE.erl sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ -%_r24_SUITE.erl: %_SUITE.erl - sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ - %_r25_SUITE.erl: %_SUITE.erl sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ @@ -279,7 +267,6 @@ release_tests_spec: make_emakefile $(ERL_FILES) "$(RELSYSDIR)" $(INSTALL_DATA) $(NO_OPT_ERL_FILES) "$(RELSYSDIR)" $(INSTALL_DATA) $(KERNEL_ERL_FILES) "$(RELSYSDIR)" - $(INSTALL_DATA) $(R24_ERL_FILES) "$(RELSYSDIR)" $(INSTALL_DATA) $(R25_ERL_FILES) "$(RELSYSDIR)" $(INSTALL_DATA) $(STRIPPED_TYPES_ERL_FILES) "$(RELSYSDIR)" chmod -R u+w "$(RELSYSDIR)" diff --git a/erts/emulator/test/bif_SUITE.erl b/erts/emulator/test/bif_SUITE.erl index fd50e9e2bb53..ee951d95583d 100644 --- a/erts/emulator/test/bif_SUITE.erl +++ b/erts/emulator/test/bif_SUITE.erl @@ -199,18 +199,17 @@ shadow_comments(_Config) -> List1 = [MFA || {M,_,_}=MFA <- List0, M =/= erlang], List = List1 ++ ErlangList, HasTypes = [MFA || {M,F,A}=MFA <- List, - erl_bif_types:is_known(M, F, A)], - Path = get_code_path(), - BifRel = sofs:relation(HasTypes, [{m,f,a}]), - BifModules = sofs:to_external(sofs:projection(1, BifRel)), - AbstrByModule = [extract_abstract(Mod, Path) || Mod <- BifModules], + erl_bif_types:is_known(M, F, A)], + BifModules = bif_modules(HasTypes), + AbstrByModule = [extract_abstract(Mod) || Mod <- BifModules], Specs0 = [extract_specs(Mod, Abstr) || {Mod,Abstr} <- AbstrByModule], Specs = lists:append(Specs0), SpecFuns0 = [F || {F,_} <- Specs], SpecFuns = sofs:relation(SpecFuns0, [{m,f,a}]), + BifRel = sofs:relation(HasTypes, [{m,f,a}]), HasTypesAndSpecs = sofs:intersection(BifRel, SpecFuns), - Commented0 = lists:append([extract_comments(Mod, Path) || + Commented0 = lists:append([extract_comments(Mod) || Mod <- BifModules]), Commented = sofs:relation(Commented0, [{m,f,a}]), {NoComments0,_,NoBifSpecs0} = @@ -246,9 +245,18 @@ shadow_comments(_Config) -> ct:fail(erl_bif_types) end. -extract_comments(Mod, Path) -> - Beam = which(Mod, Path), - SrcDir = filename:join(filename:dirname(filename:dirname(Beam)), "src"), +extract_comments(Mod) -> + Beam = which(Mod), + AppDir = filename:dirname(filename:dirname(Beam)), + SrcDir = case code:root_dir() =:= filename:dirname(AppDir) of + true -> + %% Running in an uninstalled system. + filename:join(AppDir, "preloaded/src"); + false -> + %% Running in an installed system. + filename:join(AppDir, "src") + end, + io:format("~p\n", [SrcDir]), Src = filename:join(SrcDir, atom_to_list(Mod) ++ ".erl"), {ok,Bin} = file:read_file(Src), Lines0 = binary:split(Bin, <<"\n">>, [global]), @@ -267,13 +275,12 @@ specs(_) -> List0 = erlang:system_info(snifs), %% Ignore all operators. - List = [MFA || MFA <- List0, not is_operator(MFA)], + List1 = [MFA || MFA <- List0, not is_operator(MFA)], %% Extract specs from the abstract code for all BIFs. - Path = get_code_path(), - BifRel = sofs:relation(List, [{m,f,a}]), - BifModules = sofs:to_external(sofs:projection(1, BifRel)), - AbstrByModule = [extract_abstract(Mod, Path) || Mod <- BifModules], + BifModules = bif_modules(List1), + List = [MFA || {M,_,_}=MFA <- List1, lists:member(M, BifModules)], + AbstrByModule = [extract_abstract(Mod) || Mod <- BifModules], Specs0 = [extract_specs(Mod, Abstr) || {Mod,Abstr} <- AbstrByModule], Specs = lists:append(Specs0), @@ -312,10 +319,8 @@ make_mfa(M, {M,_,_}=MFA) -> MFA. improper_bif_stubs(_) -> Bifs = erlang:system_info(snifs), - Path = get_code_path(), - BifRel = sofs:relation(Bifs, [{m,f,a}]), - BifModules = sofs:to_external(sofs:projection(1, BifRel)), - AbstrByModule = [extract_abstract(Mod, Path) || Mod <- BifModules], + BifModules = bif_modules(Bifs), + AbstrByModule = [extract_abstract(Mod) || Mod <- BifModules], Funcs0 = [extract_functions(Mod, Abstr) || {Mod,Abstr} <- AbstrByModule], Funcs = lists:append(Funcs0), @@ -657,6 +662,12 @@ t_atom_to_binary(Config) when is_list(Config) -> <<>> = atom_to_binary('', unicode), <<127>> = atom_to_binary('\177', utf8), <<"abcdef">> = atom_to_binary(abcdef, utf8), + <<"qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwe">> = + atom_to_binary(qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwe, utf8), + <<"qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwer">> = + atom_to_binary(qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwer, utf8), + <<"qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerq">> = + atom_to_binary(qwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerqwerq, utf8), HalfLongBin = atom_to_binary(HalfLongAtom, utf8), HalfLongBin = atom_to_binary(HalfLongAtom), LongAtomBin = atom_to_binary(LongAtom, utf8), @@ -1786,35 +1797,27 @@ busy_wait_go() -> id(I) -> I. -%% Get code path, including the path for the erts application. -get_code_path() -> - Erts = filename:join([code:root_dir(),"erts","preloaded","ebin"]), - case filelib:is_dir(Erts) of - true-> - [Erts|code:get_path()]; - _ -> - code:get_path() - end. - -which(Mod, Path) -> - which_1(atom_to_list(Mod) ++ ".beam", Path). +bif_modules(MFAs) -> + BifRel = sofs:relation(MFAs, [{m,f,a}]), + sofs:to_external(sofs:projection(1, BifRel)). -which_1(Base, [D|Ds]) -> - Path = filename:join(D, Base), - case filelib:is_regular(Path) of - true -> Path; - false -> which_1(Base, Ds) - end. print_mfa({M,F,A}) -> io:format("~p:~p/~p", [M,F,A]). -extract_abstract(Mod, Path) -> - Beam = which(Mod, Path), +which(Mod) -> + case code:which(Mod) of + preloaded -> + filename:join([code:lib_dir(erts), "ebin", atom_to_list(Mod) ++ ".beam"]); + Beam when is_list(Beam) -> + Beam + end. + +extract_abstract(Mod) -> + Beam = which(Mod), {ok,{Mod,[{abstract_code,{raw_abstract_v1,Abstr}}]}} = beam_lib:chunks(Beam, [abstract_code]), {Mod,Abstr}. - tok_loop() -> tok_loop(hej). diff --git a/erts/emulator/test/bs_construct_SUITE.erl b/erts/emulator/test/bs_construct_SUITE.erl index 9c110b9dd007..943d0726498f 100644 --- a/erts/emulator/test/bs_construct_SUITE.erl +++ b/erts/emulator/test/bs_construct_SUITE.erl @@ -26,12 +26,11 @@ not_used/1, in_guard/1, mem_leak/1, coerce_to_float/1, bjorn/1, append_empty_is_same/1, huge_float_field/1, system_limit/1, badarg/1, - copy_writable_binary/1, kostis/1, dynamic/1, bs_add/1, + copy_writable_binary/1, kostis/1, dynamic/1, otp_7422/1, zero_width/1, bad_append/1, bs_append_overflow/1, bs_append_offheap/1, reductions/1, fp16/1, zero_init/1, error_info/1, little/1, - heap_binary_unit/1, - otp_24_code_gh_8238/1, + heap_binary_unit/1, floats/1, many_segments/1]). -include_lib("common_test/include/ct.hrl"). @@ -44,11 +43,10 @@ all() -> [test1, test2, test3, test4, test5, testf, not_used, in_guard, mem_leak, coerce_to_float, bjorn, append_empty_is_same, huge_float_field, system_limit, badarg, - copy_writable_binary, kostis, dynamic, bs_add, otp_7422, zero_width, + copy_writable_binary, kostis, dynamic, otp_7422, zero_width, bad_append, bs_append_overflow, bs_append_offheap, reductions, fp16, zero_init, - error_info, little, heap_binary_unit, - otp_24_code_gh_8238, + error_info, little, heap_binary_unit, floats, many_segments]. init_per_suite(Config) -> @@ -857,75 +855,6 @@ dynamic_little(Bef, N, Int, Lpad, Rpad) -> <> = id(Bin), ok. -%% Test that the bs_add/5 instruction handles big numbers correctly. -bs_add(Config) when is_list(Config) -> - Mod = list_to_atom(atom_to_list(?MODULE) ++ "_" ++ - atom_to_list(?FUNCTION_NAME)), - N = 2000, - Code = [{module, Mod}, - {exports, [{bs_add,2}]}, - {labels, 2}, - - %% bs_add(Number, -SmallestBig) -> Number + N - {function, bs_add, 2, 2}, - {label,1}, - {func_info,{atom,Mod},{atom,bs_add},2}, - - {label,2}, - {move,{x,0},{x,2}}] ++ - lists:duplicate(N-1, {bs_add,{f,0},[{x,2},{integer,1},1],{x,2}}) ++ - [{gc_bif,abs,{f,0},3,[{x,1}],{x,4}}, %Force GC, ignore result. - {gc_bif,'+',{f,0},3,[{x,2},{integer,1}],{x,0}}, %Safe result in {x,0} - return], - - %% Write assembly file and assemble it. - PrivDir = proplists:get_value(priv_dir, Config), - RootName = filename:join(PrivDir, atom_to_list(Mod)), - AsmFile = RootName ++ ".S", - {ok,Fd} = file:open(AsmFile, [write]), - [io:format(Fd, "~p. \n", [T]) || T <- Code], - ok = file:close(Fd), - {ok,Mod} = compile:file(AsmFile, [from_asm,report,{outdir,PrivDir}]), - LoadRc = code:load_abs(RootName), - {module,_Module} = LoadRc, - - %% Find smallest positive bignum. - SmallestBig = smallest_big(), - io:format("~p\n", [SmallestBig]), - DoTest = fun() -> - exit(Mod:bs_add(SmallestBig, -SmallestBig)) - end, - {Pid,Mref} = spawn_monitor(DoTest), - receive - {'DOWN',Mref,process,Pid,Res} -> ok - end, - - case erlang:system_info(wordsize) of - 8 -> - %% bignum-sized binaries must system_limit on 64-bit platforms - {system_limit, _} = Res; - 4 -> - Res = SmallestBig + N - end, - - %% Clean up. - ok = file:delete(AsmFile), - ok = file:delete(code:which(Mod)), - _ = code:delete(Mod), - _ = code:purge(Mod), - - ok. - - -smallest_big() -> - smallest_big_1(1 bsl 24). - -smallest_big_1(N) -> - case erts_debug:flat_size(N) of - 0 -> smallest_big_1(N+N); - _ -> N - end. - otp_7422(Config) when is_list(Config) -> otp_7422_int(0), otp_7422_bin(0). @@ -1399,16 +1328,6 @@ do_zero_init_1(Size, LPad, RPad) -> end()). error_info(_Config) -> - case ?MODULE of - bs_construct_r24_SUITE -> - %% Error information is not implemented for old bit syntax - %% instructions. - ok; - _ -> - error_info() - end. - -error_info() -> Atom = id(some_atom), NegSize = id(-1), HugeNegSize = id(-1 bsl 64), @@ -1716,20 +1635,253 @@ heap_binary_unit_2(Variant, Rest) -> {error2, Bin2} end. -otp_24_code_gh_8238(Config) -> - case ?MODULE of - bs_construct_SUITE -> - %% GH-8238. Code compiled with Erlang/OTP 24 would crash - %% when run on OTP-26.2.3. - DataDir = proplists:get_value(data_dir, Config), - Asm = filename:join(DataDir, atom_to_list(?FUNCTION_NAME) ++ ".S"), - {ok,Mod,Beam} = compile:file(Asm, [binary,from_asm,report]), - {module,Mod} = code:load_binary(Mod, "", Beam), - Mod:Mod(), - ok; - _ -> - {skip,"Enough to run once"} - end. +floats(_Config) -> + _ = rand:uniform(), %Seed generator + io:format("Seed: ~p", [rand:export_seed()]), + + %% Random floats. + _ = [do_float(rand:uniform() * math:pow(10.0, rand:uniform(20))) || + _ <- lists:seq(1, 20)], + + %% Random floats with powers of 10 near the upper limit representable + %% as a 64-bit float. + _ = [do_float(rand:uniform() * math:pow(10.0, 300 + rand:uniform(7))) || + _ <- lists:seq(1, 10)], + + %% Random small integers. + _ = [do_float(rand:uniform(1_000_000)) || _ <- lists:seq(1, 10)], + + %% Random big integers. + _ = [do_float(rand:uniform(1_000_000) bsl 64) || _ <- lists:seq(1, 10)], + + do_float(-0.0), + do_float(+0.0), + + ok. + +do_float(F) -> + do_float(F, 0). + +do_float(_F, 32) -> + ok; +do_float(F, N) -> + Pad = rand:uniform(1 bsl N) - 1, + true = is_integer(Pad), + + do_float_be_16(F, N, Pad), + do_float_be_32(F, N, Pad), + do_float_be_64(F, N, Pad), + + do_float_le_16(F, N, Pad), + do_float_le_32(F, N, Pad), + do_float_le_64(F, N, Pad), + + do_float(F, N + 1). + +do_float_be_16(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 15 -> <>; + 21 -> <>; + _ -> <> + end; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 1 -> <>; + 19 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + +do_float_be_32(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 1 -> <>; + 6 -> <>; + _ -> <> + end; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 8 -> <>; + 12 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + +do_float_be_64(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 7 -> <>; + 13 -> <>; + _ -> <> + end, + + %% Match out the original float. + <> = Bin; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 7 -> <>; + 13 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + +do_float_le_16(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 11 -> <>; + 27 -> <>; + _ -> <> + end; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 7 -> <>; + 13 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + +do_float_le_32(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 9 -> <>; + 29 -> <>; + _ -> <> + end; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 7 -> <>; + 13 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + +do_float_le_64(F, N, Pad) -> + FloatBin = id(<>), + Bin = id(<>), + Bin = id(<>), + Bin = <>, + Bin = <>, + <> = Bin, + + if + is_float(F) -> + %% Construct float segment of a known float. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 9 -> <>; + 29 -> <>; + _ -> <> + end, + + %% Match out the original float. + <> = Bin; + is_integer(F) -> + %% Construct float segment of a known integer. + FloatBin = id(<>), + Bin = <>, + Bin = case N of + 7 -> <>; + 13 -> <>; + _ -> <> + end; + true -> + ok + end, + + ok. + %% GH-8815: Binary construction with "too many" segments failed to JIT on ARM. many_segments(_Config) -> diff --git a/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.S b/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.S deleted file mode 100644 index 7944fa818a69..000000000000 --- a/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.S +++ /dev/null @@ -1,50 +0,0 @@ -{module, otp_24_code_gh_8238}. %% version = 0 - -{exports, [{module_info,0},{module_info,1},{otp_24_code_gh_8238,0}]}. - -{attributes, []}. - -{labels, 7}. - - -{function, otp_24_code_gh_8238, 0, 2}. - {label,1}. - {line,[{location,"otp_24_code_gh_8238.erl",4}]}. - {func_info,{atom,otp_24_code_gh_8238},{atom,otp_24_code_gh_8238},0}. - {label,2}. - {allocate,0,0}. - {move,{integer,1000},{x,0}}. - {line,[{location,"otp_24_code_gh_8238.erl",5}]}. - {call_ext,1,{extfunc,erlang,integer_to_binary,1}}. - {line,[{location,"otp_24_code_gh_8238.erl",6}]}. - {gc_bif,byte_size,{f,0},1,[{x,0}],{x,1}}. - {bs_add,{f,0},[{x,1},{integer,9},1],{x,1}}. - {bs_init2,{f,0},{x,1},2,2,{field_flags,[]},{x,1}}. - {bs_put_integer,{f,0}, - {integer,72}, - 1, - {field_flags,[unsigned,big]}, - {integer,1281499675772873685536}}. - {bs_put_binary,{f,0},{atom,all},8,{field_flags,[unsigned,big]},{x,0}}. - {put_list,{x,1},nil,{x,1}}. - {move,{literal,"~p\n"},{x,0}}. - {call_ext_last,2,{extfunc,io,format,2},0}. - - -{function, module_info, 0, 4}. - {label,3}. - {line,[]}. - {func_info,{atom,otp_24_code_gh_8238},{atom,module_info},0}. - {label,4}. - {move,{atom,otp_24_code_gh_8238},{x,0}}. - {call_ext_only,1,{extfunc,erlang,get_module_info,1}}. - - -{function, module_info, 1, 6}. - {label,5}. - {line,[]}. - {func_info,{atom,otp_24_code_gh_8238},{atom,module_info},1}. - {label,6}. - {move,{x,0},{x,1}}. - {move,{atom,otp_24_code_gh_8238},{x,0}}. - {call_ext_only,2,{extfunc,erlang,get_module_info,2}}. diff --git a/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.erl b/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.erl deleted file mode 100644 index d18a7c096d0a..000000000000 --- a/erts/emulator/test/bs_construct_SUITE_data/otp_24_code_gh_8238.erl +++ /dev/null @@ -1,10 +0,0 @@ --module(otp_24_code_gh_8238). --export([?MODULE/0]). - -%% Produce otp_24_code_gh_8238.S using Erlang/OTP 24 like this: -%% erlc -S +no_copt +no_ssa_opt otp_24_code_gh_8238.erl - -?MODULE() -> - Bin = integer_to_binary(1000), - io:format("~p\n", [<<"Example: ", Bin/binary>>]). - diff --git a/erts/emulator/test/erts_debug_SUITE.erl b/erts/emulator/test/erts_debug_SUITE.erl index c94b6036d7f5..1dd29a079c02 100644 --- a/erts/emulator/test/erts_debug_SUITE.erl +++ b/erts/emulator/test/erts_debug_SUITE.erl @@ -83,9 +83,9 @@ test_size(Config) when is_list(Config) -> %% Fun environment size = 0 (the smallest fun possible) SimplestFun = fun() -> ok end, - %% 2 words for the fun, 1 word to point at the off-heap reference, and - %% 3 words for the off-heap reference itself. The actual on-heap size is 3. - FunSz0 = 6, + %% Funs without environment occupy 2 words, and are stored off-heap as long + %% as their defining module is loaded. + FunSz0 = 2, FunSz0 = do_test_size(SimplestFun), %% Fun environment size = 1 @@ -98,8 +98,8 @@ test_size(Config) when is_list(Config) -> FunSz1 = do_test_size(fun() -> ConsCell1 end) - do_test_size(ConsCell1), - %% External funs are always 2 words (they're also always stored off-heap, - %% so the effective size is zero). + %% External funs, which always lack environment, occupy 2 words and are + %% always stored off-heap. 2 = do_test_size(fun lists:sort/1), Arch = 8 * erlang:system_info({wordsize, external}), diff --git a/erts/emulator/test/erts_test_utils.erl b/erts/emulator/test/erts_test_utils.erl index bcdb79039239..1c2325cf1883 100644 --- a/erts/emulator/test/erts_test_utils.erl +++ b/erts/emulator/test/erts_test_utils.erl @@ -25,7 +25,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). %% %% THIS MODULE IS ALSO USED BY *OTHER* APPLICATIONS TEST CODE diff --git a/erts/emulator/test/float_SUITE_data/fp_drv.c b/erts/emulator/test/float_SUITE_data/fp_drv.c index a91d622040db..f10d39412a24 100644 --- a/erts/emulator/test/float_SUITE_data/fp_drv.c +++ b/erts/emulator/test/float_SUITE_data/fp_drv.c @@ -123,7 +123,7 @@ static ErlDrvSSizeT control(ErlDrvData drv_data, res_str = "skip: no thread support"; else if (0 != erl_drv_thread_create("test", &tid, do_test, NULL, NULL)) res_str = "failed to create thread"; - else if (0 != erl_drv_thread_join(tid, &res_str)) + else if (0 != erl_drv_thread_join(tid, (void**)&res_str)) res_str = "failed to join thread"; break; } diff --git a/erts/emulator/test/fun_SUITE.erl b/erts/emulator/test/fun_SUITE.erl index 8f8a282feb38..fe13e02322d2 100644 --- a/erts/emulator/test/fun_SUITE.erl +++ b/erts/emulator/test/fun_SUITE.erl @@ -26,7 +26,6 @@ bad_arglist/1, equality/1,ordering/1, fun_to_port/1,t_phash/1,t_phash2/1,md5/1, - refc/1,refc_ets/1,refc_dist/1, const_propagation/1,t_arity/1,t_is_function2/1, t_fun_info/1,t_fun_info_mfa/1,t_fun_to_list/1]). @@ -43,7 +42,7 @@ all() -> [bad_apply, bad_fun_call, badarity, ext_badarity, bad_arglist, equality, ordering, fun_to_port, t_phash, - t_phash2, md5, refc, refc_ets, refc_dist, + t_phash2, md5, const_propagation, t_arity, t_is_function2, t_fun_info, t_fun_info_mfa,t_fun_to_list]. @@ -508,178 +507,18 @@ md5(Config) when is_list(Config) -> bad_md5(Bad) -> {'EXIT',{badarg,_}} = (catch erlang:md5(Bad)). -refc(Config) when is_list(Config) -> - %% As the fun entry is owned by the fun's shared reference holder and not - %% the fun itself, its reference count should be generally be unchanged - %% regardless of how many copies we create, and on which process we do so. - %% - %% Only certain operations that break the sharing of the literal reference - %% holder should have an impact. - F1 = fun_factory(2), - {refc,2} = erlang:fun_info(F1, refc), - F2 = fun_factory(42), - {refc,2} = erlang:fun_info(F1, refc), - - process_flag(trap_exit, true), - Pid = spawn_link(fun() -> {refc,2} = erlang:fun_info(F1, refc) end), - receive - {'EXIT',Pid,normal} -> ok; - Other -> ct:fail({unexpected,Other}) - end, - process_flag(trap_exit, false), - %% Wait to make sure that the process has terminated completely. - receive after 1 -> ok end, - {refc,2} = erlang:fun_info(F1, refc), - - %% Force a copy of the underlying reference holder by passing through the - %% external term format. - F3 = binary_to_term(term_to_binary(F1)), - 3 = fun_refc(F1), - 3 = fun_refc(F3), - - %% Garbage collect. Only the F2 fun will be left. - 7 = F1(5), - true = erlang:garbage_collect(), - 40 = F2(-2), - {refc,2} = erlang:fun_info(F2, refc), - - ok. - -fun_factory(Const) -> - fun(X) -> X + Const end. - -refc_ets(Config) when is_list(Config) -> - F = fun(X) -> X + 33 end, - {refc,2} = erlang:fun_info(F, refc), - - refc_ets_set(F, [set]), - refc_ets_set(F, [ordered_set]), - refc_ets_bag(F, [bag]), - refc_ets_bag(F, [duplicate_bag]), - ok. - -refc_ets_set(F1, Options) -> - io:format("~p", [Options]), - Tab = ets:new(kalle, Options), - true = ets:insert(Tab, {a_key,F1}), - 3 = fun_refc(F1), - [{a_key,F3}] = ets:lookup(Tab, a_key), - 4 = fun_refc(F1), - true = ets:insert(Tab, {a_key,not_a_fun}), - 3 = fun_refc(F1), - true = ets:insert(Tab, {another_key,F1}), - 4 = fun_refc(F1), - true = ets:delete(Tab), - 3 = fun_refc(F1), - 10 = F3(-23), - true = erlang:garbage_collect(), - 2 = fun_refc(F1), - ok. - -refc_ets_bag(F1, Options) -> - io:format("~p", [Options]), - Tab = ets:new(kalle, Options), - true = ets:insert(Tab, {a_key,F1}), - 3 = fun_refc(F1), - [{a_key,F3}] = ets:lookup(Tab, a_key), - 4 = fun_refc(F1), - true = ets:insert(Tab, {a_key,not_a_fun}), - 4 = fun_refc(F1), - true = ets:insert(Tab, {another_key,F1}), - 5 = fun_refc(F1), - true = ets:delete(Tab), - 3 = fun_refc(F1), - 10 = F3(-23), - true = erlang:garbage_collect(), - 2 = fun_refc(F1), - ok. - -refc_dist(Config) when is_list(Config) -> - {ok, Peer, Node} = ?CT_PEER(), - process_flag(trap_exit, true), - Pid = spawn_link(Node, fun() -> receive - Fun when is_function(Fun) -> - 3 = fun_refc(Fun), - exit({normal,Fun}) end - end), - F = fun() -> 42 end, - 2 = fun_refc(F), - Pid ! F, - F2 = receive - {'EXIT',Pid,{normal,Fun}} -> Fun; - Other -> ct:fail({unexpected,Other}) - end, - %% dist.c:net_mess2 have a reference to Fun for a while since - %% Fun is passed in an exit signal. Wait until it is gone. - wait_until(fun () -> 4 =/= fun_refc(F2) end), - 3 = fun_refc(F2), - true = erlang:garbage_collect(), - 2 = fun_refc(F), - refc_dist_send(Node, F), - peer:stop(Peer). - -refc_dist_send(Node, F) -> - Pid = spawn_link(Node, fun() -> receive - {To,Fun} when is_function(Fun) -> - wait_until(fun () -> - 3 =:= fun_refc(Fun) - end), - To ! Fun - end - end), - 2 = fun_refc(F), - Pid ! {self(),F}, - F2 = receive - Fun when is_function(Fun) -> Fun; - Other -> ct:fail({unexpected,Other}) - end, - receive {'EXIT',Pid,normal} -> ok end, - %% No reference from dist.c:net_mess2 since Fun is passed - %% in an ordinary message. - 3 = fun_refc(F), - 3 = fun_refc(F2), - refc_dist_reg_send(Node, F). - -refc_dist_reg_send(Node, F) -> - true = erlang:garbage_collect(), - 2 = fun_refc(F), - Ref = make_ref(), - Me = self(), - Pid = spawn_link(Node, fun() -> - true = register(my_fun_tester, self()), - Me ! Ref, - receive - {Me,Fun} when is_function(Fun) -> - 3 = fun_refc(Fun), - Me ! Fun - end - end), - erlang:yield(), - 2 = fun_refc(F), - receive Ref -> ok end, - {my_fun_tester,Node} ! {self(),F}, - F2 = receive - Fun when is_function(Fun) -> Fun; - Other -> ct:fail({unexpected,Other}) - end, - receive {'EXIT',Pid,normal} -> ok end, - - 3 = fun_refc(F), - 3 = fun_refc(F2), - ok. - fun_refc(F) -> {refc,Count} = erlang:fun_info(F, refc), Count. const_propagation(Config) when is_list(Config) -> Fun1 = fun wait_until/1, - 2 = fun_refc(Fun1), + 1 = fun_refc(Fun1), Fun2 = Fun1, my_cmp({Fun1,Fun2}), Fun3 = fun() -> ok end, - 2 = fun_refc(Fun3), + 1 = fun_refc(Fun3), Fun4 = Fun3, my_cmp({Fun3,Fun4}), ok. diff --git a/erts/emulator/test/os_signal_SUITE.erl b/erts/emulator/test/os_signal_SUITE.erl index 21e3bebb6bbf..072e10b8166e 100644 --- a/erts/emulator/test/os_signal_SUITE.erl +++ b/erts/emulator/test/os_signal_SUITE.erl @@ -41,7 +41,10 @@ t_sigterm/1, t_sigalrm/1, t_sigchld/1, - t_sigchld_fork/1]). + t_sigchld_fork/1, + t_sigcont/1, + t_sigwinch/1, + t_siginfo/1]). -define(signal_server, erl_signal_server). @@ -59,6 +62,8 @@ all() -> t_sigalrm, t_sigchld, t_sigchld_fork, + t_sigwinch, + t_siginfo, set_unset] end. @@ -91,7 +96,7 @@ set_unset(_Config) -> sigalrm, sigterm, sigusr1, sigusr2, sigchld, - sigstop, sigtstp], + sigstop, sigtstp, sigcont], F1 = fun(Sig) -> ok = os:set_signal(Sig,handle) end, F2 = fun(Sig) -> ok = os:set_signal(Sig,default) end, F3 = fun(Sig) -> ok = os:set_signal(Sig,ignore) end, @@ -298,6 +303,105 @@ sigchld_fork() -> os:set_signal(sigchld, ignore), ok. +t_sigcont(_Config) -> + Pid1 = setup_service(), + OsPid = os:getpid(), + os:set_signal(sigcont, handle), + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + Msgs1 = fetch_msgs(Pid1), + io:format("Msgs1: ~p~n", [Msgs1]), + [{notify,sigcont}, + {notify,sigcont}, + {notify,sigcont}] = Msgs1, + %% no proc + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + %% ignore + Pid2 = setup_service(), + os:set_signal(sigcont, ignore), + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + ok = kill("CONT", OsPid), + Msgs2 = fetch_msgs(Pid2), + io:format("Msgs2: ~p~n", [Msgs2]), + [] = Msgs2, + %% reset to ignore (it's the default) + os:set_signal(sigcont, ignore), + ok. + +t_sigwinch(_Config) -> + Pid1 = setup_service(), + OsPid = os:getpid(), + os:set_signal(sigwinch, handle), + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + Msgs1 = fetch_msgs(Pid1), + io:format("Msgs1: ~p~n", [Msgs1]), + [{notify,sigwinch}, + {notify,sigwinch}, + {notify,sigwinch}] = Msgs1, + %% no proc + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + %% ignore + Pid2 = setup_service(), + os:set_signal(sigwinch, ignore), + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + ok = kill("WINCH", OsPid), + Msgs2 = fetch_msgs(Pid2), + io:format("Msgs2: ~p~n", [Msgs2]), + [] = Msgs2, + %% reset to ignore (it's the default) + os:set_signal(sigwinch, ignore), + ok. + +t_siginfo(_Config) -> + SiginfoSupported = try + os:set_signal(siginfo, default), + true + catch + error:badarg -> + false + end, + case SiginfoSupported of + true -> + Pid1 = setup_service(), + OsPid = os:getpid(), + os:set_signal(siginfo, handle), + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + Msgs1 = fetch_msgs(Pid1), + io:format("Msgs1: ~p~n", [Msgs1]), + [{notify,siginfo}, + {notify,siginfo}, + {notify,siginfo}] = Msgs1, + %% no proc + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + %% ignore + Pid2 = setup_service(), + os:set_signal(siginfo, ignore), + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + ok = kill("INFO", OsPid), + Msgs2 = fetch_msgs(Pid2), + io:format("Msgs2: ~p~n", [Msgs2]), + [] = Msgs2, + %% reset to ignore (it's the default) + os:set_signal(siginfo, ignore); + false -> + ok + end, + ok. + %% nif stubs diff --git a/erts/emulator/test/port_SUITE_data/dead_port.c b/erts/emulator/test/port_SUITE_data/dead_port.c index 26f09f33c731..723f0bc67da0 100644 --- a/erts/emulator/test/port_SUITE_data/dead_port.c +++ b/erts/emulator/test/port_SUITE_data/dead_port.c @@ -40,7 +40,7 @@ #include "winbase.h" #endif -#define MAIN(argc, argv) main(argc, argv) +#define MAIN(argc, argv) int main(argc, argv) extern int errno; diff --git a/erts/emulator/test/signal_SUITE_data/unlink_signal_drv.c b/erts/emulator/test/signal_SUITE_data/unlink_signal_drv.c index f441e311827f..ba80c8f5adf3 100644 --- a/erts/emulator/test/signal_SUITE_data/unlink_signal_drv.c +++ b/erts/emulator/test/signal_SUITE_data/unlink_signal_drv.c @@ -61,7 +61,7 @@ DRIVER_INIT(unlink_signal_entry) } typedef struct { - ErlDrvData port; + ErlDrvPort port; int timeout_count; } us_drv_state; diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl index 247ac947876d..2a7ab7d5bed5 100644 --- a/erts/emulator/test/trace_SUITE.erl +++ b/erts/emulator/test/trace_SUITE.erl @@ -38,6 +38,7 @@ set_on_spawn/1, set_on_first_spawn/1, cpu_timestamp/1, set_on_link/1, set_on_first_link/1, system_monitor_args/1, more_system_monitor_args/1, + system_monitor_badargs/1, system_monitor_long_gc_1/1, system_monitor_long_gc_2/1, system_monitor_large_heap_1/1, system_monitor_large_heap_2/1, system_monitor_long_schedule/1, system_monitor_long_message_queue/1, @@ -74,6 +75,7 @@ testcases() -> new_clear, existing_clear, tracer_die, set_on_spawn, set_on_first_spawn, set_on_link, set_on_first_link, system_monitor_args, + system_monitor_badargs, more_system_monitor_args, system_monitor_long_gc_1, system_monitor_long_gc_2, system_monitor_large_heap_1, system_monitor_long_schedule, @@ -118,6 +120,13 @@ erlang_trace_pattern(A,B,C) -> erlang_trace_info(A,B) -> trace_sessions:erlang_trace_info(A,B). +erlang_system_monitor() -> + trace_sessions:erlang_system_monitor(). +erlang_system_monitor(A) -> + trace_sessions:erlang_system_monitor(A). +erlang_system_monitor(A,B) -> + trace_sessions:erlang_system_monitor(A,B). + %% No longer testing anything, just reporting whether cpu_timestamp %% is enabled or not. cpu_timestamp(Config) when is_list(Config) -> @@ -876,46 +885,50 @@ set_on_first_link(_Config) -> system_monitor_args(Config) when is_list(Config) -> Self = self(), %% - OldMonitor = erlang:system_monitor(undefined), - undefined = erlang:system_monitor(Self, [{long_gc,0}]), - MinT = case erlang:system_monitor() of + OldMonitor = erlang_system_monitor(undefined), + undefined = erlang_system_monitor(Self, [{long_gc,0}]), + MinT = case erlang_system_monitor() of {Self,[{long_gc,T}]} when is_integer(T), T > 0 -> T; - Other1 -> test_server:fault(Other1) + Other1 -> ct:fail(Other1) end, - {Self,[{long_gc,MinT}]} = erlang:system_monitor(), + {Self,[{long_gc,MinT}]} = erlang_system_monitor(), {Self,[{long_gc,MinT}]} = - erlang:system_monitor({Self,[{large_heap,0}]}), - MinN = case erlang:system_monitor() of + erlang_system_monitor({Self,[{large_heap,0}]}), + MinN = case erlang_system_monitor() of {Self,[{large_heap,N}]} when is_integer(N), N > 0 -> N; - Other2 -> test_server:fault(Other2) + Other2 -> ct:fail(Other2) end, - {Self,[{large_heap,MinN}]} = erlang:system_monitor(), + {Self,[{large_heap,MinN}]} = erlang_system_monitor(), {Self,[{large_heap,MinN}]} = - erlang:system_monitor(Self,[{long_message_queue, {100,101}}]), - {Self,[{long_message_queue,{100,101}}]} = erlang:system_monitor(), + erlang_system_monitor(Self,[{long_message_queue, {100,101}}]), + {Self,[{long_message_queue,{100,101}}]} = erlang_system_monitor(), {Self,[{long_message_queue,{100,101}}]} = - erlang:system_monitor(Self, [busy_port]), - {Self,[busy_port]} = erlang:system_monitor(), + erlang_system_monitor(Self, [busy_port]), + {Self,[busy_port]} = erlang_system_monitor(), {Self,[busy_port]} = - erlang:system_monitor({Self,[busy_dist_port]}), - {Self,[busy_dist_port]} = erlang:system_monitor(), + erlang_system_monitor({Self,[busy_dist_port]}), + {Self,[busy_dist_port]} = erlang_system_monitor(), All = lists:sort([busy_port,busy_dist_port, {long_gc,1},{large_heap,65535},{long_message_queue,{99,100}}]), - {Self,[busy_dist_port]} = erlang:system_monitor(Self, All), - {Self,A1} = erlang:system_monitor(), + {Self,[busy_dist_port]} = erlang_system_monitor(Self, All), + {Self,A1} = erlang_system_monitor(), All = lists:sort(A1), - {Self,A1} = erlang:system_monitor(Self, []), + {Self,A1} = erlang_system_monitor(Self, []), Pid = spawn(fun () -> receive {Self,die} -> exit(die) end end), Mref = erlang:monitor(process, Pid), - undefined = erlang:system_monitor(Pid, All), - {Pid,A2} = erlang:system_monitor(), + undefined = erlang_system_monitor(Pid, All), + {Pid,A2} = erlang_system_monitor(), All = lists:sort(A2), Pid ! {Self,die}, receive {'DOWN',Mref,_,_,_} -> ok end, - undefined = erlang:system_monitor(OldMonitor), + undefined = erlang_system_monitor(OldMonitor), erlang:yield(), - OldMonitor = erlang:system_monitor(), - %% + OldMonitor = erlang_system_monitor(), + ok. + + +system_monitor_badargs(Config) when is_list(Config) -> + Self = self(), {'EXIT',{badarg,_}} = (catch erlang:system_monitor(atom)), {'EXIT',{badarg,_}} = (catch erlang:system_monitor({})), {'EXIT',{badarg,_}} = (catch erlang:system_monitor({1})), @@ -959,14 +972,14 @@ try_l(Val) -> Arbitrary1 = 77777, Arbitrary2 = 88888, - erlang:system_monitor(undefined), + erlang_system_monitor(undefined), - undefined = erlang:system_monitor(Self, [{long_gc,Val},{large_heap,Arbitrary1}]), + undefined = erlang_system_monitor(Self, [{long_gc,Val},{large_heap,Arbitrary1}]), - {Self,Comb0} = erlang:system_monitor(Self, [{long_gc,Arbitrary2},{large_heap,Val}]), + {Self,Comb0} = erlang_system_monitor(Self, [{long_gc,Arbitrary2},{large_heap,Val}]), [{large_heap,Arbitrary1},{long_gc,Val}] = lists:sort(Comb0), - {Self,Comb1} = erlang:system_monitor(undefined), + {Self,Comb1} = erlang_system_monitor(undefined), [{large_heap,Val},{long_gc,Arbitrary2}] = lists:sort(Comb1). monitor_sys(Parent) -> @@ -987,7 +1000,7 @@ monitor_sys(Parent) -> start_monitor() -> Parent = self(), Mpid = spawn_link(fun() -> monitor_sys(Parent) end), - erlang:system_monitor(Mpid,[{long_schedule,100}]), + erlang_system_monitor(Mpid,[{long_schedule,100}]), erlang:yield(), % Need to be rescheduled for the trace to take ok. @@ -1030,7 +1043,7 @@ do_system_monitor_long_schedule() -> ct:fail(no_trace_of_port) end, port_close(Port), - erlang:system_monitor(undefined), + erlang_system_monitor(undefined), ok. @@ -1093,11 +1106,11 @@ system_monitor_long_gc_2(Config) when is_list(Config) -> long_gc(LoadFun, ExpectMonMsg) -> Self = self(), Time = 1, - OldMonitor = erlang:system_monitor(Self, [{long_gc,Time}]), + OldMonitor = erlang_system_monitor(Self, [{long_gc,Time}]), Pid = LoadFun(), Ref = erlang:trace_delivered(Pid), receive {trace_delivered, Pid, Ref} -> ok end, - {Self,[{long_gc,Time}]} = erlang:system_monitor(OldMonitor), + {Self,[{long_gc,Time}]} = erlang_system_monitor(OldMonitor), case {long_gc_check(Pid, Time, undefined), ExpectMonMsg} of {ok, true} when Pid =/= Self -> ok; @@ -1181,11 +1194,11 @@ large_heap(LoadFun, ExpectMonMsg) -> Size = 65535, Self = self(), NewMonitor = {Self,[{large_heap,Size}]}, - OldMonitor = erlang:system_monitor(NewMonitor), + OldMonitor = erlang_system_monitor(NewMonitor), Pid = LoadFun(Size), Ref = erlang:trace_delivered(Pid), receive {trace_delivered, Pid, Ref} -> ok end, - {Self,[{large_heap,Size}]} = erlang:system_monitor(OldMonitor), + {Self,[{large_heap,Size}]} = erlang_system_monitor(OldMonitor), case {large_heap_check(Pid, Size, undefined), ExpectMonMsg} of {ok, true} when Pid =/= Self -> ok; @@ -1236,7 +1249,7 @@ large_heap_check(Pid, Size, Result) -> system_monitor_long_message_queue(Config) when is_list(Config) -> Self = self(), SMonPrxy = spawn_link(fun () -> smon_lmq_proxy(Self) end), - erlang:system_monitor(SMonPrxy,[{long_message_queue, {50,100}}]), + erlang_system_monitor(SMonPrxy,[{long_message_queue, {50,100}}]), erlang:yield(), lists:foreach(fun (_) -> self() ! hello end, lists:seq(1, 100)), receive {monitor,Self,long_message_queue,true} -> ok @@ -1280,7 +1293,7 @@ system_monitor_long_message_queue(Config) when is_list(Config) -> exit(SMonPrxy, kill), false = is_process_alive(SMonPrxy), - erlang:system_monitor(undefined), + erlang_system_monitor(undefined), ok. smon_lmq_proxy(To) -> @@ -1292,7 +1305,7 @@ system_monitor_long_message_queue_ignore(Config) when is_list(Config) -> %% Ensure that messages are delivered and monitored even if a %% process ignores the message queue while continuesly executing. %% - erlang:system_monitor(self(),[{long_message_queue, {50,100}}]), + erlang_system_monitor(self(),[{long_message_queue, {50,100}}]), Pid = spawn_opt(fun ignore_messages_working/0, [{priority,low}, link]), lists:foreach(fun (_) -> Pid ! hello end, lists:seq(1, 50)), receive {monitor,Pid,long_message_queue,_} = Msg0 -> ct:fail({unexpected_message, Msg0}) @@ -1308,7 +1321,7 @@ system_monitor_long_message_queue_ignore(Config) when is_list(Config) -> exit(Pid, kill), false = is_process_alive(Pid), - erlang:system_monitor(undefined), + erlang_system_monitor(undefined), ok. diff --git a/erts/emulator/test/trace_call_memory_SUITE.erl b/erts/emulator/test/trace_call_memory_SUITE.erl index ef60cb527924..a261717f164b 100644 --- a/erts/emulator/test/trace_call_memory_SUITE.erl +++ b/erts/emulator/test/trace_call_memory_SUITE.erl @@ -396,7 +396,7 @@ spawn_memory_lambda(Config) when is_list(Config) -> receive {'DOWN', MRef, process, Pid, _} -> ok end, 1 = erlang_trace(self(), false, [all]), %% 16-elements list translates into 34-words for spawn, and 4 more words for apply itself - {call_memory, [{Pid, 1, 38}]} = erlang_trace_info({erlang, apply, 2}, call_memory). + {call_memory, [{Pid, 1, 37}]} = erlang_trace_info({erlang, apply, 2}, call_memory). spawn_memory_internal(Array) -> Array. diff --git a/erts/emulator/test/trace_session_SUITE.erl b/erts/emulator/test/trace_session_SUITE.erl index f80bc4fa559a..efcf3092fd22 100644 --- a/erts/emulator/test/trace_session_SUITE.erl +++ b/erts/emulator/test/trace_session_SUITE.erl @@ -34,6 +34,8 @@ meta/1, ms_enable_flags/1, return_to/1, + system_monitor_info/1, + system_monitor_long_msgq/1, destroy/1, negative/1, error_info/1, @@ -69,6 +71,8 @@ all() -> test_set_on_link, test_set_on_first_link, return_to, + system_monitor_info, + system_monitor_long_msgq, destroy, negative, error_info, @@ -1419,6 +1423,208 @@ io_format(Frmt, List) -> ok end. + +system_monitor_info(_Config) -> + undefined = erlang:system_monitor(), + + S = trace:session_create(system_monitor, self(), []), + + ok = trace:system(S, large_heap, 1_234_567), + {system, [{large_heap,1_234_567}]} = trace:info(S, system, all), + + ok = trace:system(S, long_gc, 2_345), + {system, L1} = trace:info(S, system, all), + [{large_heap,1_234_567}, {long_gc,2_345}] = lists:sort(L1), + + ok = trace:system(S, long_message_queue, {22,33}), + {system, L2} = trace:info(S, system, all), + [{large_heap,1_234_567}, {long_gc,2_345}, {long_message_queue,{22,33}}] = lists:sort(L2), + + ok = trace:system(S, long_schedule, 3_456), + {system, L3} = trace:info(S, system, all), + [{large_heap,1_234_567}, {long_gc,2_345}, + {long_message_queue,{22,33}}, + {long_schedule,3_456}] = lists:sort(L3), + + ok = trace:system(S, busy_port, true), + {system, L4} = trace:info(S, system, all), + [busy_port, + {large_heap,1_234_567}, {long_gc,2_345}, + {long_message_queue,{22,33}}, + {long_schedule,3_456}] = lists:sort(L4), + + ok = trace:system(S, busy_dist_port, true), + {system, L5} = trace:info(S, system, all), + L5s = lists:sort(L5), + [busy_dist_port, + busy_port, + {large_heap,1_234_567}, + {long_gc,2_345}, + {long_message_queue,{22,33}}, + {long_schedule,3_456}] = L5s, + + undefined = erlang:system_monitor(), + + ok = trace:system(S, large_heap, false), + {system, L6} = trace:info(S, system, all), + L6exp = lists:keydelete(large_heap, 1, L5s), + L6exp = lists:sort(L6), + + ok = trace:system(S, long_message_queue, false), + {system, L7} = trace:info(S, system, all), + L7exp = lists:keydelete(long_message_queue, 1, L6exp), + L7exp = lists:sort(L7), + + ok = trace:system(S, busy_port, false), + {system, L8} = trace:info(S, system, all), + L8exp = lists:delete(busy_port, L7exp), + L8exp = lists:sort(L8), + + ok = trace:system(S, long_schedule, false), + {system, L9} = trace:info(S, system, all), + L9exp = lists:keydelete(long_schedule, 1, L8exp), + L9exp = lists:sort(L9), + + ok = trace:system(S, busy_dist_port, false), + {system, L10} = trace:info(S, system, all), + L10exp = lists:delete(busy_dist_port, L9exp), + L10exp = lists:sort(L10), + + ok = trace:system(S, long_gc, false), + {system, []} = trace:info(S, system, all), + + undefined = erlang:system_monitor(), + ok. + + +system_monitor_long_msgq(_Config) -> + Tester = self(), + Receiver = spawn_link(fun () -> message_receiver() end), + + Tracer1 = spawn_link(fun() -> tracer("Tracer1", Tester) end), + Tracer2 = spawn_link(fun() -> tracer("Tracer2", Tester) end), + S1 = trace:session_create(system_monitor_long_msgq, Tracer1, []), + S2 = trace:session_create(system_monitor_long_msgq, Tracer2, []), + + sysmon_long_msgq(S1, Tracer1, S2, Tracer2, Receiver), + sysmon_long_msgq(S2, Tracer2, S1, Tracer1, Receiver), + + trace:session_destroy(S1), + trace:session_destroy(S2), + + unlink(Receiver), + exit(Receiver, die), + unlink(Tracer1), + exit(Tracer1, die), + unlink(Tracer2), + exit(Tracer2, die), + ok. + +sysmon_long_msgq(S1, Tracer1, S2, Tracer2, Receiver) -> + trace:system(S1, long_message_queue, {50,70}), + trace:system(S2, long_message_queue, {60,80}), + + [Receiver ! message || _ <- lists:seq(1,50)], % 50 + receive_nothing(), + + [begin + [begin + [Receiver ! message || _ <- lists:seq(1,10)], % 60 + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,10)], % 70 + {Tracer1, {monitor,Receiver,long_message_queue,true}} = receive_any(), + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,10)], % 80 + {Tracer2, {monitor,Receiver,long_message_queue,true}} = receive_any(), + receive_nothing(), + + message_receive_order(Receiver, 10), % 70 + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,10)], % 80 + receive_nothing(), + + message_receive_order(Receiver, 20), % 60 + {Tracer2, {monitor,Receiver,long_message_queue,false}} = receive_any(), + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,10)], % 70 + receive_nothing(), + + message_receive_order(Receiver, 20), % 50 + {Tracer1, {monitor,Receiver,long_message_queue,false}} = receive_any(), + receive_nothing() + end + || _ <- [1,2] + ], + + trace:system(S1, long_message_queue, false), + + [Receiver ! message || _ <- lists:seq(1,20)], % 70 + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,10)], % 80 + {Tracer2, {monitor,Receiver,long_message_queue,true}} = receive_any(), + receive_nothing(), + + message_receive_order(Receiver, 10), % 70 + receive_nothing(), + + message_receive_order(Receiver, 10), % 60 + {Tracer2, {monitor,Receiver,long_message_queue,false}} = receive_any(), + receive_nothing(), + + message_receive_order(Receiver, 10), % 50 + receive_nothing(), + + trace:system(S1, long_message_queue, {50,70}) + end + || _ <- [1,2]], + + %% Set same limits as S2 + %% and test that we can produce more than one message at a time + trace:system(S1, long_message_queue, {60,80}), + + [Receiver ! message || _ <- lists:seq(1,29)], % 79 + receive_nothing(), + + [Receiver ! message || _ <- lists:seq(1,1)], % 80 + receive_parallel( + {[{Tracer1, {monitor,Receiver,long_message_queue,true}}], + [{Tracer2, {monitor,Receiver,long_message_queue,true}}]}), + receive_nothing(), + + message_receive_order(Receiver, 19), % 61 + receive_nothing(), + + message_receive_order(Receiver, 1), % 60 + receive_parallel( + {[{Tracer1, {monitor,Receiver,long_message_queue,false}}], + [{Tracer2, {monitor,Receiver,long_message_queue,false}}]}), + receive_nothing(), + + message_receive_order(Receiver, 60), % 0 + receive_nothing(), + + ok. + +message_receiver() -> + receive + {'receive', N, From} -> + [receive_any() || _ <- lists:seq(1,N)], + From ! {done, N, self()} + end, + message_receiver(). + +message_receive_order(Receiver, N) -> + Receiver ! {'receive', N, self()}, + receive + {done, N, Receiver} -> ok + end. + + destroy(_Config) -> Name = ?MODULE, {_,SName1}=S1 = trace:session_create(Name, self(), []), @@ -1643,7 +1849,7 @@ receive_any(Timeout) -> end. receive_nothing() -> - receive_any(10). + timeout = receive_any(10). %% Argument is a tuple of lists with expected messages to receive. %% Each list is internally ordered according to expected reception. diff --git a/erts/emulator/test/trace_sessions.erl b/erts/emulator/test/trace_sessions.erl index 5a7b3cb37f5f..790aad3c9ac6 100644 --- a/erts/emulator/test/trace_sessions.erl +++ b/erts/emulator/test/trace_sessions.erl @@ -34,7 +34,10 @@ erlang_trace/3, erlang_trace_info/2, erlang_trace_pattern/2, - erlang_trace_pattern/3 + erlang_trace_pattern/3, + erlang_system_monitor/0, + erlang_system_monitor/1, + erlang_system_monitor/2 ]). group_map() -> @@ -42,7 +45,7 @@ group_map() -> %%legacy_pre_session => [pre_session], %%legacy_post_session => [post_session], legacy_pre_post => [pre_session, post_session], - %%dynamic_sesssion => [dynamic_session] + %%dynamic_session => [dynamic_session] dynamic_pre_post => [pre_session, post_session, dynamic_session] }. @@ -210,6 +213,27 @@ erlang_trace_info(PidPortFuncEvent, Item) -> trace:info(S, PidPortFuncEvent, Item) end. +erlang_system_monitor() -> + case ets:lookup(?MODULE, dynamic_session) of + [] -> + erlang:system_monitor(); + [{dynamic_session, S}] -> + erts_internal:system_monitor(S) + end. + +erlang_system_monitor(undefined) -> + erlang_system_monitor(undefined, []); +erlang_system_monitor({Pid, Opts}) -> + erlang_system_monitor(Pid, Opts). + +erlang_system_monitor(Pid, Opts) -> + case ets:lookup(?MODULE, dynamic_session) of + [] -> + erlang:system_monitor(Pid, Opts); + [{dynamic_session, S}] -> + erts_internal:system_monitor(S, Pid, Opts) + end. + init_per_group(Group, Config) -> init_group(group_tricks(Group), Config). diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops index 2471df724cc9..9585ea569962 100755 --- a/erts/emulator/utils/beam_makeops +++ b/erts/emulator/utils/beam_makeops @@ -2555,7 +2555,7 @@ sub tr_parse_op { # Get the variable name if any. - if (/^([A-Z]\w*)(.*)/) { + if (/^(_?[A-Z]\w*)(.*)/) { $var = $1; $_ = $2; error("garbage after variable") @@ -3039,6 +3039,7 @@ END sub tr_gen_from { my($line,@tr) = @_; my(%var) = (); + my(%unused) = (); my(%var_type); my($var_num) = 0; my(@code); @@ -3076,6 +3077,7 @@ sub tr_gen_from { } error($where, "'$var' unbound") unless defined $var{$var}; + delete $unused{$var}; push @vars, $var; if ($var_type{$var} eq 'scalar') { push(@args, "v$var{$var}"); @@ -3167,6 +3169,8 @@ sub tr_gen_from { $var_num++; push(@code, make_op($var, 'set_var', $var{$var})); } + + $unused{$var} = 1; } push(@code, make_op('', 'next_arg')); } @@ -3184,13 +3188,14 @@ sub tr_gen_from { $te_max_vars = $var_num if $te_max_vars < $var_num; - [\%var, \%var_type, \@instrs, \@code]; + [\%var, \%unused, \%var_type, \@instrs, \@code]; } sub tr_gen_to { my($line, $orig_transform, $so_far, @tr) = @_; - my($var_ref, $var_type_ref, $instrs_ref, $code_ref) = @$so_far; + my($var_ref, $unused_ref, $var_type_ref, $instrs_ref, $code_ref) = @$so_far; my(%var) = %$var_ref; + my(%unused) = %$unused_ref; my(%var_type) = %$var_type_ref; my(@code) = @$code_ref; my($op, $ref); # Loop variables. @@ -3216,6 +3221,8 @@ sub tr_gen_to { foreach $var (@ops) { error($where, "variable '$var' unbound") unless defined $var{$var}; + delete $unused{$var}; + if ($var_type{$var} eq 'scalar') { push @args, "v$var{$var}"; push @param_types, 'BeamOpArg'; @@ -3255,6 +3262,9 @@ sub tr_gen_to { if ($type eq '*') { push(@code, make_op($var, 'store_rest_args')); } elsif ($var ne '') { + error($where, "using explicitly unused variable '$var'. " . + "Remove the '_' prefix if this is intentional.") + unless !($var =~ /^_/); error($where, "variable '$var' unbound") unless defined $var{$var}; my $op = make_op($var, 'store_var', $var{$var}); @@ -3268,10 +3278,20 @@ sub tr_gen_to { my $next_arg = make_op('', 'next_arg'); push @code, $store_val, $next_arg; } + + delete $unused{$var}; } + pop(@code) if is_instr($code[$#code], 'next_arg'); } + foreach my $unused (keys %unused) { + error($where, + "variable '$unused' is unused. Prefix with '_' if this is " . + "intentional") + unless $unused =~ /^_/; + } + push(@code, make_op('', 'end')); tr_maybe_keep(\@code); diff --git a/erts/emulator/zlib/adler32.c b/erts/emulator/zlib/adler32.c index d0be4380a39c..04b81d29bad1 100644 --- a/erts/emulator/zlib/adler32.c +++ b/erts/emulator/zlib/adler32.c @@ -7,8 +7,6 @@ #include "zutil.h" -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - #define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -60,11 +58,7 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #endif /* ========================================================================= */ -uLong ZEXPORT adler32_z(adler, buf, len) - uLong adler; - const Bytef *buf; - z_size_t len; -{ +uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { unsigned long sum2; unsigned n; @@ -131,20 +125,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ +uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { return adler32_z(adler, buf, len); } /* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) { unsigned long sum1; unsigned long sum2; unsigned rem; @@ -169,18 +155,10 @@ local uLong adler32_combine_(adler1, adler2, len2) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ +uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { return adler32_combine_(adler1, adler2, len2); } -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) { return adler32_combine_(adler1, adler2, len2); } diff --git a/erts/emulator/zlib/compress.c b/erts/emulator/zlib/compress.c index 2ad5326c14ec..f43bacf7ab97 100644 --- a/erts/emulator/zlib/compress.c +++ b/erts/emulator/zlib/compress.c @@ -19,13 +19,8 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT compress2(dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ +int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int level) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -65,12 +60,8 @@ int ZEXPORT compress2(dest, destLen, source, sourceLen, level) /* =========================================================================== */ -int ZEXPORT compress(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } @@ -78,9 +69,7 @@ int ZEXPORT compress(dest, destLen, source, sourceLen) If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -uLong ZEXPORT compressBound(sourceLen) - uLong sourceLen; -{ +uLong ZEXPORT compressBound(uLong sourceLen) { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } diff --git a/erts/emulator/zlib/crc32.c b/erts/emulator/zlib/crc32.c index f8357b083f76..6c38f5c04c6a 100644 --- a/erts/emulator/zlib/crc32.c +++ b/erts/emulator/zlib/crc32.c @@ -103,19 +103,6 @@ # define ARMCRC32 #endif -/* Local functions. */ -local z_crc_t multmodp OF((z_crc_t a, z_crc_t b)); -local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); - -#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) - local z_word_t byte_swap OF((z_word_t word)); -#endif - -#if defined(W) && !defined(ARMCRC32) - local z_crc_t crc_word OF((z_word_t data)); - local z_word_t crc_word_big OF((z_word_t data)); -#endif - #if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) /* Swap the bytes in a z_word_t to convert between little and big endian. Any @@ -123,9 +110,7 @@ local z_crc_t x2nmodp OF((z_off64_t n, unsigned k)); instruction, if one is available. This assumes that word_t is either 32 bits or 64 bits. */ -local z_word_t byte_swap(word) - z_word_t word; -{ +local z_word_t byte_swap(z_word_t word) { # if W == 8 return (word & 0xff00000000000000) >> 56 | @@ -146,24 +131,77 @@ local z_word_t byte_swap(word) } #endif +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Table of powers of x for combining CRC-32s, filled in by make_crc_table() + * below. + */ + local z_crc_t FAR x2n_table[32]; +#else +/* ========================================================================= + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +# include "crc32.h" +#endif + /* CRC polynomial. */ #define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ -#ifdef DYNAMIC_CRC_TABLE +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(z_crc_t a, z_crc_t b) { + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(z_off64_t n, unsigned k) { + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Build the tables for byte-wise and braided CRC-32 calculations, and a table + * of powers of x for combining CRC-32s. + */ local z_crc_t FAR crc_table[256]; -local z_crc_t FAR x2n_table[32]; -local void make_crc_table OF((void)); #ifdef W local z_word_t FAR crc_big_table[256]; local z_crc_t FAR crc_braid_table[W][256]; local z_word_t FAR crc_braid_big_table[W][256]; - local void braid OF((z_crc_t [][256], z_word_t [][256], int, int)); + local void braid(z_crc_t [][256], z_word_t [][256], int, int); #endif #ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *, int)); - local void write_table32hi OF((FILE *, const z_word_t FAR *, int)); - local void write_table64 OF((FILE *, const z_word_t FAR *, int)); + local void write_table(FILE *, const z_crc_t FAR *, int); + local void write_table32hi(FILE *, const z_word_t FAR *, int); + local void write_table64(FILE *, const z_word_t FAR *, int); #endif /* MAKECRCH */ /* @@ -176,7 +214,6 @@ local void make_crc_table OF((void)); /* Definition of once functionality. */ typedef struct once_s once_t; -local void once OF((once_t *, void (*)(void))); /* Check for the availability of atomics. */ #if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ @@ -196,10 +233,7 @@ struct once_s { invoke once() at the same time. The state must be a once_t initialized with ONCE_INIT. */ -local void once(state, init) - once_t *state; - void (*init)(void); -{ +local void once(once_t *state, void (*init)(void)) { if (!atomic_load(&state->done)) { if (atomic_flag_test_and_set(&state->begun)) while (!atomic_load(&state->done)) @@ -222,10 +256,7 @@ struct once_s { /* Test and set. Alas, not atomic, but tries to minimize the period of vulnerability. */ -local int test_and_set OF((int volatile *)); -local int test_and_set(flag) - int volatile *flag; -{ +local int test_and_set(int volatile *flag) { int was; was = *flag; @@ -234,10 +265,7 @@ local int test_and_set(flag) } /* Run the provided init() function once. This is not thread-safe. */ -local void once(state, init) - once_t *state; - void (*init)(void); -{ +local void once(once_t *state, void (*init)(void)) { if (!state->done) { if (test_and_set(&state->begun)) while (!state->done) @@ -279,8 +307,7 @@ local once_t made = ONCE_INIT; combinations of CRC register values and incoming bytes. */ -local void make_crc_table() -{ +local void make_crc_table(void) { unsigned i, j, n; z_crc_t p; @@ -447,11 +474,7 @@ local void make_crc_table() Write the 32-bit values in table[0..k-1] to out, five per line in hexadecimal separated by commas. */ -local void write_table(out, table, k) - FILE *out; - const z_crc_t FAR *table; - int k; -{ +local void write_table(FILE *out, const z_crc_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -464,11 +487,7 @@ local void write_table(out, table, k) Write the high 32-bits of each value in table[0..k-1] to out, five per line in hexadecimal separated by commas. */ -local void write_table32hi(out, table, k) -FILE *out; -const z_word_t FAR *table; -int k; -{ +local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -484,11 +503,7 @@ int k; bits. If not, then the type cast and format string can be adjusted accordingly. */ -local void write_table64(out, table, k) - FILE *out; - const z_word_t FAR *table; - int k; -{ +local void write_table64(FILE *out, const z_word_t FAR *table, int k) { int n; for (n = 0; n < k; n++) @@ -498,8 +513,7 @@ local void write_table64(out, table, k) } /* Actually do the deed. */ -int main() -{ +int main(void) { make_crc_table(); return 0; } @@ -511,12 +525,7 @@ int main() Generate the little and big-endian braid tables for the given n and z_word_t size w. Each array must have room for w blocks of 256 elements. */ -local void braid(ltl, big, n, w) - z_crc_t ltl[][256]; - z_word_t big[][256]; - int n; - int w; -{ +local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) { int k; z_crc_t i, p, q; for (k = 0; k < w; k++) { @@ -531,69 +540,13 @@ local void braid(ltl, big, n, w) } #endif -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables for byte-wise and braided CRC-32 calculations, and a table of powers - * of x for combining CRC-32s, all made by make_crc_table(). - */ -#include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Routines used for CRC calculation. Some are also required for the table - * generation above. - */ - -/* - Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, - reflected. For speed, this requires that a not be zero. - */ -local z_crc_t multmodp(a, b) - z_crc_t a; - z_crc_t b; -{ - z_crc_t m, p; - - m = (z_crc_t)1 << 31; - p = 0; - for (;;) { - if (a & m) { - p ^= b; - if ((a & (m - 1)) == 0) - break; - } - m >>= 1; - b = b & 1 ? (b >> 1) ^ POLY : b >> 1; - } - return p; -} - -/* - Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been - initialized. - */ -local z_crc_t x2nmodp(n, k) - z_off64_t n; - unsigned k; -{ - z_crc_t p; - - p = (z_crc_t)1 << 31; /* x^0 == 1 */ - while (n) { - if (n & 1) - p = multmodp(x2n_table[k & 31], p); - n >>= 1; - k++; - } - return p; -} - /* ========================================================================= * This function can be used by asm versions of crc32(), and to force the * generation of the CRC tables in a threaded application. */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ +const z_crc_t FAR * ZEXPORT get_crc_table(void) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -619,11 +572,8 @@ const z_crc_t FAR * ZEXPORT get_crc_table() #define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ #define Z_BATCH_MIN 800 /* fewest words in a final batch */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { z_crc_t val; z_word_t crc1, crc2; const z_word_t *word; @@ -723,18 +673,14 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) least-significant byte of the word as the first byte of data, without any pre or post conditioning. This is used to combine the CRCs of each braid. */ -local z_crc_t crc_word(data) - z_word_t data; -{ +local z_crc_t crc_word(z_word_t data) { int k; for (k = 0; k < W; k++) data = (data >> 8) ^ crc_table[data & 0xff]; return (z_crc_t)data; } -local z_word_t crc_word_big(data) - z_word_t data; -{ +local z_word_t crc_word_big(z_word_t data) { int k; for (k = 0; k < W; k++) data = (data << 8) ^ @@ -745,11 +691,8 @@ local z_word_t crc_word_big(data) #endif /* ========================================================================= */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { /* Return initial CRC, if requested. */ if (buf == Z_NULL) return 0; @@ -781,8 +724,8 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) words = (z_word_t const *)buf; /* Do endian check at execution time instead of compile time, since ARM - processors can change the endianess at execution time. If the - compiler knows what the endianess will be, it can optimize out the + processors can change the endianness at execution time. If the + compiler knows what the endianness will be, it can optimize out the check and the unused branch. */ endian = 1; if (*(unsigned char *)&endian) { @@ -1069,20 +1012,13 @@ unsigned long ZEXPORT crc32_z(crc, buf, len) #endif /* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ +unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, + uInt len) { return crc32_z(crc, buf, len); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ +uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -1090,18 +1026,12 @@ uLong ZEXPORT crc32_combine64(crc1, crc2, len2) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ +uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) { return crc32_combine64(crc1, crc2, (z_off64_t)len2); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_gen64(len2) - z_off64_t len2; -{ +uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) { #ifdef DYNAMIC_CRC_TABLE once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ @@ -1109,17 +1039,11 @@ uLong ZEXPORT crc32_combine_gen64(len2) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_gen(len2) - z_off_t len2; -{ +uLong ZEXPORT crc32_combine_gen(z_off_t len2) { return crc32_combine_gen64((z_off64_t)len2); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine_op(crc1, crc2, op) - uLong crc1; - uLong crc2; - uLong op; -{ +uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) { return multmodp(op, crc1) ^ (crc2 & 0xffffffff); } diff --git a/erts/emulator/zlib/deflate.c b/erts/emulator/zlib/deflate.c index 4a689db35989..012ea8148e8d 100644 --- a/erts/emulator/zlib/deflate.c +++ b/erts/emulator/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.13 Copyright 1995-2022 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -60,9 +60,6 @@ const char deflate_copyright[] = copyright string in the executable of your product. */ -/* =========================================================================== - * Function prototypes. - */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ @@ -70,29 +67,16 @@ typedef enum { finish_done /* finish done, accept no more input or output */ } block_state; -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +typedef block_state (*compress_func)(deflate_state *s, int flush); /* Compression function. Returns the block state after the call. */ -local int deflateStateCheck OF((z_streamp strm)); -local void slide_hash OF((deflate_state *s)); -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); +local block_state deflate_stored(deflate_state *s, int flush); +local block_state deflate_fast(deflate_state *s, int flush); #ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -local uInt longest_match OF((deflate_state *s, IPos cur_match)); - -#ifdef ZLIB_DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); +local block_state deflate_slow(deflate_state *s, int flush); #endif +local block_state deflate_rle(deflate_state *s, int flush); +local block_state deflate_huff(deflate_state *s, int flush); /* =========================================================================== * Local data @@ -195,9 +179,12 @@ local const config configuration_table[10] = { * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ -local void slide_hash(s) - deflate_state *s; -{ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) + __attribute__((no_sanitize("memory"))) +# endif +#endif +local void slide_hash(deflate_state *s) { unsigned n, m; Posf *p; uInt wsize = s->w_size; @@ -221,30 +208,177 @@ local void slide_hash(s) #endif } +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) { + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(deflate_state *s) { + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize + MAX_DIST(s)) { + + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + /* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, + int stream_size) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, int strategy, + const char *version, int stream_size) { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; @@ -359,7 +493,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, * symbols from which it is being constructed. */ - s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || @@ -369,8 +503,14 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else s->sym_buf = s->pending_buf + s->lit_bufsize; s->sym_end = (s->lit_bufsize - 1) * 3; +#endif /* We avoid equality with lit_bufsize*3 because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -386,9 +526,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ -local int deflateStateCheck(strm) - z_streamp strm; -{ +local int deflateStateCheck(z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -409,11 +547,8 @@ local int deflateStateCheck(strm) } /* ========================================================================= */ -int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ +int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { deflate_state *s; uInt str, n; int wrap; @@ -478,11 +613,8 @@ int ZEXPORT deflateSetDictionary(strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) - z_streamp strm; - Bytef *dictionary; - uInt *dictLength; -{ +int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { deflate_state *s; uInt len; @@ -500,9 +632,7 @@ int ZEXPORT deflateGetDictionary(strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateResetKeep(strm) - z_streamp strm; -{ +int ZEXPORT deflateResetKeep(z_streamp strm) { deflate_state *s; if (deflateStateCheck(strm)) { @@ -537,10 +667,32 @@ int ZEXPORT deflateResetKeep(strm) return Z_OK; } +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init(deflate_state *s) { + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +} + /* ========================================================================= */ -int ZEXPORT deflateReset(strm) - z_streamp strm; -{ +int ZEXPORT deflateReset(z_streamp strm) { int ret; ret = deflateResetKeep(strm); @@ -550,10 +702,7 @@ int ZEXPORT deflateReset(strm) } /* ========================================================================= */ -int ZEXPORT deflateSetHeader(strm, head) - z_streamp strm; - gz_headerp head; -{ +int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; @@ -561,11 +710,7 @@ int ZEXPORT deflateSetHeader(strm, head) } /* ========================================================================= */ -int ZEXPORT deflatePending(strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ +int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; @@ -575,19 +720,21 @@ int ZEXPORT deflatePending(strm, pending, bits) } /* ========================================================================= */ -int ZEXPORT deflatePrime(strm, bits, value) - z_streamp strm; - int bits; - int value; -{ +int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; int put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else if (bits < 0 || bits > 16 || s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -602,11 +749,7 @@ int ZEXPORT deflatePrime(strm, bits, value) } /* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ +int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) { deflate_state *s; compress_func func; @@ -651,13 +794,8 @@ int ZEXPORT deflateParams(strm, level, strategy) } /* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ +int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy, + int nice_length, int max_chain) { deflate_state *s; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -693,10 +831,7 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) * * Shifts are used to approximate divisions, for speed. */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ +uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) { deflate_state *s; uLong fixedlen, storelen, wraplen; @@ -752,7 +887,8 @@ uLong ZEXPORT deflateBound(strm, sourceLen) /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return (s->w_bits <= s->hash_bits ? fixedlen : storelen) + wraplen; + return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + + wraplen; /* default settings: return tight bound for that case -- ~0.03% overhead plus a small constant */ @@ -765,10 +901,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ -local void putShortMSB(s, b) - deflate_state *s; - uInt b; -{ +local void putShortMSB(deflate_state *s, uInt b) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } @@ -779,9 +912,7 @@ local void putShortMSB(s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ -local void flush_pending(strm) - z_streamp strm; -{ +local void flush_pending(z_streamp strm) { unsigned len; deflate_state *s = strm->state; @@ -812,10 +943,7 @@ local void flush_pending(strm) } while (0) /* ========================================================================= */ -int ZEXPORT deflate(strm, flush) - z_streamp strm; - int flush; -{ +int ZEXPORT deflate(z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; @@ -1127,9 +1255,7 @@ int ZEXPORT deflate(strm, flush) } /* ========================================================================= */ -int ZEXPORT deflateEnd(strm) - z_streamp strm; -{ +int ZEXPORT deflateEnd(z_streamp strm) { int status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1153,11 +1279,10 @@ int ZEXPORT deflateEnd(strm) * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ -int ZEXPORT deflateCopy(dest, source) - z_streamp dest; - z_streamp source; -{ +int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { #ifdef MAXSEG_64K + (void)dest; + (void)source; return Z_STREAM_ERROR; #else deflate_state *ds; @@ -1181,7 +1306,7 @@ int ZEXPORT deflateCopy(dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1192,10 +1317,15 @@ int ZEXPORT deflateCopy(dest, source) zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1205,66 +1335,6 @@ int ZEXPORT deflateCopy(dest, source) #endif /* MAXSEG_64K */ } -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local unsigned read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init(s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -} - #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and @@ -1275,10 +1345,7 @@ local void lm_init(s) * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ @@ -1426,10 +1493,7 @@ local uInt longest_match(s, cur_match) /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ @@ -1490,19 +1554,23 @@ local uInt longest_match(s, cur_match) /* =========================================================================== * Check that the match at match_start is indeed a match. */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ +local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); + Bytef *back = s->window + (int)match, *here = s->window + start; + IPos len = length; + if (match == (IPos)-1) { + /* match starts one byte before the current window -- just compare the + subsequent length-1 bytes */ + back++; + here++; + len--; + } + if (zmemcmp(back, here, len) != EQUAL) { + fprintf(stderr, " start %u, match %d, length %d\n", + start, (int)match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); + fprintf(stderr, "(%02x %02x)", *back++, *here++); + } while (--len != 0); z_error("invalid match"); } if (z_verbose > 1) { @@ -1514,137 +1582,6 @@ local void check_match(s, start, match, length) # define check_match(s, start, match, length) #endif /* ZLIB_DEBUG */ -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize + MAX_DIST(s)) { - - zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - if (s->insert > s->strstart) - s->insert = s->strstart; - slide_hash(s); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. @@ -1687,10 +1624,7 @@ local void fill_window(s) * copied. It is most efficient with large input and output buffers, which * maximizes the opportunities to have a single copy from next_in to next_out. */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_stored(deflate_state *s, int flush) { /* Smallest worthy block size when not flushing or finishing. By default * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. @@ -1874,10 +1808,7 @@ local block_state deflate_stored(s, flush) * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_fast(deflate_state *s, int flush) { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ @@ -1976,10 +1907,7 @@ local block_state deflate_fast(s, flush) * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_slow(deflate_state *s, int flush) { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ @@ -2107,10 +2035,7 @@ local block_state deflate_slow(s, flush) * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_rle(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ @@ -2181,10 +2106,7 @@ local block_state deflate_rle(s, flush) * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_huff(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ for (;;) { diff --git a/erts/emulator/zlib/deflate.h b/erts/emulator/zlib/deflate.h index 1a06cd5f25d1..300c6ada62b8 100644 --- a/erts/emulator/zlib/deflate.h +++ b/erts/emulator/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2018 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +/* #define LIT_MEM */ + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,14 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ +#ifdef LIT_MEM +# define LIT_BUFS 5 + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else +# define LIT_BUFS 4 uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,7 +250,7 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt sym_next; /* running index in sym_buf */ + uInt sym_next; /* running index in symbol buffer */ uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ @@ -291,14 +302,14 @@ typedef struct internal_state { memory checker errors from longest match routines */ /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_init(deflate_state *s); +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc); +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last); +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s); +void ZLIB_INTERNAL _tr_align(deflate_state *s); +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -318,6 +329,25 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->sym_buf[s->sym_next++] = 0; \ @@ -337,6 +367,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff --git a/erts/emulator/zlib/gzguts.h b/erts/emulator/zlib/gzguts.h index 57faf37165a3..eba72085bb75 100644 --- a/erts/emulator/zlib/gzguts.h +++ b/erts/emulator/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -7,9 +7,8 @@ # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif +# undef _FILE_OFFSET_BITS +# undef _TIME_BITS #endif #ifdef HAVE_HIDDEN @@ -119,8 +118,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc(uInt size); + extern void free(voidpf ptr); #endif /* get errno and strerror definition */ @@ -138,10 +137,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); #endif /* default memLevel */ @@ -203,17 +202,13 @@ typedef struct { typedef gz_state FAR *gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error(gz_statep, int, const char *); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror(DWORD error); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif +unsigned ZLIB_INTERNAL gz_intmax(void); +#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) diff --git a/erts/emulator/zlib/inffast.c b/erts/emulator/zlib/inffast.c index 1fec7f363fa6..9354676e786e 100644 --- a/erts/emulator/zlib/inffast.c +++ b/erts/emulator/zlib/inffast.c @@ -47,10 +47,7 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ diff --git a/erts/emulator/zlib/inffast.h b/erts/emulator/zlib/inffast.h index e5c1aa4ca8cd..49c6d156c5c6 100644 --- a/erts/emulator/zlib/inffast.h +++ b/erts/emulator/zlib/inffast.h @@ -8,4 +8,4 @@ subject to change. Applications should only use zlib.h. */ -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start); diff --git a/erts/emulator/zlib/inflate.c b/erts/emulator/zlib/inflate.c index 8acbef44e993..94ecff015a9b 100644 --- a/erts/emulator/zlib/inflate.c +++ b/erts/emulator/zlib/inflate.c @@ -91,20 +91,7 @@ # endif #endif -/* function prototypes */ -local int inflateStateCheck OF((z_streamp strm)); -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -local int inflateStateCheck(strm) -z_streamp strm; -{ +local int inflateStateCheck(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -116,9 +103,7 @@ z_streamp strm; return 0; } -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ +int ZEXPORT inflateResetKeep(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -142,9 +127,7 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ +int ZEXPORT inflateReset(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -155,10 +138,7 @@ z_streamp strm; return inflateResetKeep(strm); } -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ +int ZEXPORT inflateReset2(z_streamp strm, int windowBits) { int wrap; struct inflate_state FAR *state; @@ -195,12 +175,8 @@ int windowBits; return inflateReset(strm); } -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size) { int ret; struct inflate_state FAR *state; @@ -239,22 +215,17 @@ int stream_size; return ret; } -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit_(z_streamp strm, const char *version, + int stream_size) { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ +int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; @@ -278,9 +249,7 @@ int value; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -342,7 +311,7 @@ struct inflate_state FAR *state; a.out > inffixed.h */ -void makefixed() +void makefixed(void) { unsigned low, size; struct inflate_state state; @@ -396,11 +365,7 @@ void makefixed() output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ +local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) { struct inflate_state FAR *state; unsigned dist; @@ -622,10 +587,7 @@ unsigned copy; will return Z_BUF_ERROR if it has not reached the end of the stream. */ -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ +int ZEXPORT inflate(z_streamp strm, int flush) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -1301,9 +1263,7 @@ int flush; return ret; } -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateEnd(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1315,11 +1275,8 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ +int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { struct inflate_state FAR *state; /* check state */ @@ -1338,11 +1295,8 @@ uInt *dictLength; return Z_OK; } -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ +int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { struct inflate_state FAR *state; unsigned long dictid; int ret; @@ -1373,10 +1327,7 @@ uInt dictLength; return Z_OK; } -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ +int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) { struct inflate_state FAR *state; /* check state */ @@ -1401,11 +1352,8 @@ gz_headerp head; called again with more data and the *have state. *have is initialized to zero for the first call. */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ +local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, + unsigned len) { unsigned got; unsigned next; @@ -1424,9 +1372,7 @@ unsigned len; return next; } -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ +int ZEXPORT inflateSync(z_streamp strm) { unsigned len; /* number of bytes to look at or looked at */ int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ @@ -1441,7 +1387,7 @@ z_streamp strm; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { @@ -1482,9 +1428,7 @@ z_streamp strm; block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ +int ZEXPORT inflateSyncPoint(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1492,10 +1436,7 @@ z_streamp strm; return state->mode == STORED && state->bits == 0; } -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ +int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; @@ -1539,10 +1480,7 @@ z_streamp source; return Z_OK; } -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ +int ZEXPORT inflateUndermine(z_streamp strm, int subvert) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1557,10 +1495,7 @@ int subvert; #endif } -int ZEXPORT inflateValidate(strm, check) -z_streamp strm; -int check; -{ +int ZEXPORT inflateValidate(z_streamp strm, int check) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1572,9 +1507,7 @@ int check; return Z_OK; } -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ +long ZEXPORT inflateMark(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) @@ -1585,9 +1518,7 @@ z_streamp strm; (state->mode == MATCH ? state->was - state->length : 0)); } -unsigned long ZEXPORT inflateCodesUsed(strm) -z_streamp strm; -{ +unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return (unsigned long)-1; state = (struct inflate_state FAR *)strm->state; diff --git a/erts/emulator/zlib/inftrees.c b/erts/emulator/zlib/inftrees.c index 57d2793bec93..98cfe164458c 100644 --- a/erts/emulator/zlib/inftrees.c +++ b/erts/emulator/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2022 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.13 Copyright 1995-2022 Mark Adler "; + " inflate 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,14 +29,9 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ @@ -62,7 +57,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 194, 65}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/erts/emulator/zlib/inftrees.h b/erts/emulator/zlib/inftrees.h index f53665311c16..396f74b5da79 100644 --- a/erts/emulator/zlib/inftrees.h +++ b/erts/emulator/zlib/inftrees.h @@ -41,8 +41,8 @@ typedef struct { examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 30 6 15" for distance codes returns 592. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ @@ -57,6 +57,6 @@ typedef enum { DISTS } codetype; -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work); diff --git a/erts/emulator/zlib/trees.c b/erts/emulator/zlib/trees.c index 5f305c47221e..6a523ef34e3c 100644 --- a/erts/emulator/zlib/trees.c +++ b/erts/emulator/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2021 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -122,39 +122,116 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local const static_tree_desc static_l_desc = +#ifdef NO_INIT_GLOBAL_POINTERS +# define TCONST +#else +# define TCONST const +#endif + +local TCONST static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local const static_tree_desc static_d_desc = +local TCONST static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local const static_tree_desc static_bl_desc = +local TCONST static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== - * Local (static) routines in this file. + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 */ +local unsigned bi_reverse(unsigned code, int len) { + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned code, int len)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(deflate_state *s) { + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(deflate_state *s) { + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent + 7) & ~7; +#endif +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) { + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, + "inconsistent bit counts"); + Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); + + for (n = 0; n <= max_code; n++) { + int len = tree[n].Len; + if (len == 0) continue; + /* Now reverse the bits */ + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); + + Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); + } +} #ifdef GEN_TREES_H -local void gen_trees_header OF((void)); +local void gen_trees_header(void); #endif #ifndef ZLIB_DEBUG @@ -167,27 +244,12 @@ local void gen_trees_header OF((void)); send_bits(s, tree[c].Code, tree[c].Len); } #endif -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef ZLIB_DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ +local void send_bits(deflate_state *s, int value, int length) { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; @@ -229,8 +291,7 @@ local void send_bits(s, value, length) /* =========================================================================== * Initialize the various 'constant' tables. */ -local void tr_static_init() -{ +local void tr_static_init(void) { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ @@ -323,8 +384,7 @@ local void tr_static_init() ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width) - 1 ? ",\n" : ", ")) -void gen_trees_header() -{ +void gen_trees_header(void) { FILE *header = fopen("trees.h", "w"); int i; @@ -373,12 +433,26 @@ void gen_trees_header() } #endif /* GEN_TREES_H */ +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(deflate_state *s) { + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->sym_next = s->matches = 0; +} + /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_init(deflate_state *s) { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; @@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s) init_block(s); } -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->sym_next = s->matches = 0; -} - #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ @@ -448,11 +504,7 @@ local void init_block(s) * when the heap property is re-established (each father smaller than its * two sons). */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ +local void pqdownheap(deflate_state *s, ct_data *tree, int k) { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { @@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k) * The length opt_len is updated; static_len is also updated if stree is * not null. */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void gen_bitlen(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; @@ -561,48 +610,9 @@ local void gen_bitlen(s, desc) } } -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes(tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - unsigned code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits - 1]) << 1; - next_code[bits] = (ush)code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, - "inconsistent bit counts"); - Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); - - for (n = 0; n <= max_code; n++) { - int len = tree[n].Len; - if (len == 0) continue; - /* Now reverse the bits */ - tree[n].Code = (ush)bi_reverse(next_code[len]++, len); - - Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", - n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); - } -} +#ifdef DUMP_BL_TREE +# include +#endif /* =========================================================================== * Construct one Huffman tree and assigns the code bit strings and lengths. @@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_count) * and corresponding code. The length opt_len is updated; static_len is * also updated if stree is not null. The field max_code is set. */ -local void build_tree(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void build_tree(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; @@ -700,11 +707,7 @@ local void build_tree(s, desc) * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ -local void scan_tree(s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void scan_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code) * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -local void send_tree(s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void send_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code) * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ -local int build_bl_tree(s) - deflate_state *s; -{ +local int build_bl_tree(deflate_state *s) { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ @@ -831,10 +828,8 @@ local int build_bl_tree(s) * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ +local void send_all_trees(deflate_state *s, int lcodes, int dcodes, + int blcodes) { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); @@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) /* =========================================================================== * Send a stored block */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); @@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { bi_flush(s); } @@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s) * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_align(deflate_state *s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef ZLIB_DEBUG @@ -905,16 +892,108 @@ void ZLIB_INTERNAL _tr_align(s) bi_flush(s); } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(deflate_state *s, const ct_data *ltree, + const ct_data *dtree) { + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned sx = 0; /* running index in symbol buffers */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; +#endif + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow"); +#else + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif + + } while (sx < s->sym_next); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(deflate_state *s) { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long block_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("allow-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -1011,14 +1090,15 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int ZLIB_INTERNAL _tr_tally(s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */ -{ +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else s->sym_buf[s->sym_next++] = (uch)dist; s->sym_buf[s->sym_next++] = (uch)(dist >> 8); s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1035,147 +1115,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc) } return (s->sym_next == s->sym_end); } - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - const ct_data *ltree; /* literal tree */ - const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned sx = 0; /* running index in sym_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->sym_next != 0) do { - dist = s->sym_buf[sx++] & 0xff; - dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; - lc = s->sym_buf[sx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and sym_buf is ok: */ - Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - - } while (sx < s->sym_next); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "block list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* block_mask is the bit mask of block-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long block_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("block-listed") bytes. */ - for (n = 0; n <= 31; n++, block_mask >>= 1) - if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("allow-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "block-listed" or "allow-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent + 7) & ~7; -#endif -} diff --git a/erts/emulator/zlib/uncompr.c b/erts/emulator/zlib/uncompr.c index f9532f46c1a6..5e256663b451 100644 --- a/erts/emulator/zlib/uncompr.c +++ b/erts/emulator/zlib/uncompr.c @@ -24,12 +24,8 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT uncompress2(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong *sourceLen; -{ +int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -83,11 +79,7 @@ int ZEXPORT uncompress2(dest, destLen, source, sourceLen) err; } -int ZEXPORT uncompress(dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/erts/emulator/zlib/zconf.h b/erts/emulator/zlib/zconf.h index bf977d3e70ad..62adc8d8431f 100644 --- a/erts/emulator/zlib/zconf.h +++ b/erts/emulator/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -241,7 +241,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -296,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -520,7 +516,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/erts/emulator/zlib/zlib.h b/erts/emulator/zlib/zlib.h index 953cb5012dc2..8d4b932eaf6a 100644 --- a/erts/emulator/zlib/zlib.h +++ b/erts/emulator/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.13, October 13th, 2022 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.13" -#define ZLIB_VERNUM 0x12d0 +#define ZLIB_VERSION "1.3.1" +#define ZLIB_VERNUM 0x1310 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 13 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 1 #define ZLIB_VER_SUBREVISION 0 /* @@ -78,8 +78,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +217,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,12 +225,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -247,7 +247,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -320,8 +320,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -360,7 +360,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +375,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -383,7 +383,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -397,7 +398,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -517,7 +518,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,12 +536,12 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The fields zalloc, zfree and opaque must be initialized before by the caller. @@ -607,9 +608,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -651,9 +652,9 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -673,8 +674,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -691,20 +692,20 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be @@ -729,7 +730,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +741,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +758,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, + uLong sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -772,9 +773,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -787,9 +788,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +805,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -821,16 +822,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -883,9 +885,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -906,9 +908,9 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied @@ -921,7 +923,7 @@ ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -934,14 +936,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -956,18 +958,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -980,9 +983,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -1001,7 +1004,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1029,8 +1032,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1070,8 +1073,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1091,13 +1094,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1165,7 +1168,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1173,7 +1176,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1226,8 +1229,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); you need special options. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1241,9 +1244,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1257,15 +1260,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1282,8 +1285,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1302,7 +1305,7 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); Open the gzip (.gz) file at path for reading and decompressing, or compressing and writing. The mode parameter is as in fopen ("rb" or "wb") @@ -1339,7 +1342,7 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); file could not be opened. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* Associate a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (if the file has @@ -1362,7 +1365,7 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* Set the internal buffer size used by this library's functions for file to size. The default buffer size is 8192 bytes. This function must be called @@ -1378,7 +1381,7 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* Dynamically update the compression level and strategy for file. See the description of deflateInit2 for the meaning of these parameters. Previously @@ -1389,7 +1392,7 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of @@ -1419,8 +1422,8 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); Z_STREAM_ERROR. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* Read and decompress up to nitems items of size size from file into buf, otherwise operating as gzread() does. This duplicates the interface of @@ -1445,14 +1448,14 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, file, resetting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* Compress and write the len uncompressed bytes at buf to file. gzwrite returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If @@ -1465,7 +1468,7 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); /* Convert, format, compress, and write the arguments (...) to file under control of the string format, as in fprintf. gzprintf returns the number of @@ -1480,7 +1483,7 @@ ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* Compress and write the given null-terminated string s to file, excluding the terminating null character. @@ -1488,7 +1491,7 @@ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* Read and decompress bytes from file into buf, until len-1 characters are read, or until a newline character is read and transferred to buf, or an @@ -1502,13 +1505,13 @@ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. @@ -1517,7 +1520,7 @@ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* Push c back onto the stream for file to be read as the first character on the next read. At least one character of push-back is always allowed. @@ -1529,7 +1532,7 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* Flush all pending output to file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function @@ -1545,8 +1548,8 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); Set the starting position to offset relative to whence for the next gzread or gzwrite on file. The offset represents a number of bytes in the @@ -1564,7 +1567,7 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* Rewind file. This function is supported only for reading. @@ -1572,7 +1575,7 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); Return the starting position for the next gzread or gzwrite on file. This position represents a number of bytes in the uncompressed data stream, @@ -1583,7 +1586,7 @@ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); Return the current compressed (actual) read or write offset of file. This offset includes the count of bytes that precede the gzip stream, for example @@ -1592,7 +1595,7 @@ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* Return true (1) if the end-of-file indicator for file has been set while reading, false (0) otherwise. Note that the end-of-file indicator is set @@ -1607,7 +1610,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. @@ -1628,7 +1631,7 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* Flush all pending output for file, if necessary, close file and deallocate the (de)compression state. Note that once file is closed, you @@ -1641,8 +1644,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1653,7 +1656,7 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* Return the error message for the last error which occurred on file. errnum is set to zlib error number. If an error occurred in the file system @@ -1669,7 +1672,7 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip @@ -1686,7 +1689,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. An Adler-32 value is in the range of a 32-bit @@ -1706,15 +1709,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* Same as adler32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1724,7 +1727,7 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. @@ -1742,30 +1745,30 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* Same as crc32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative. */ /* -ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); Return the operator corresponding to length len2, to be used with - crc32_combine_op(). + crc32_combine_op(). len2 must be non-negative. */ -ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); /* Give the same result as crc32_combine(), using op in place of len2. op is is generated from len2 by crc32_combine_gen(). This will be faster than @@ -1778,20 +1781,20 @@ ZEXTERN uLong ZEXPORT crc32_combine_op OF((uLong crc1, uLong crc2, uLong op)); /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1836,7 +1839,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1853,13 +1856,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1881,50 +1884,50 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen OF((z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); #if defined(_WIN32) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/erts/emulator/zlib/zutil.c b/erts/emulator/zlib/zutil.c index 9543ae825e32..b1c5d2d3c6da 100644 --- a/erts/emulator/zlib/zutil.c +++ b/erts/emulator/zlib/zutil.c @@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = { }; -const char * ZEXPORT zlibVersion() -{ +const char * ZEXPORT zlibVersion(void) { return ZLIB_VERSION; } -uLong ZEXPORT zlibCompileFlags() -{ +uLong ZEXPORT zlibCompileFlags(void) { uLong flags; flags = 0; @@ -121,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags() # endif int ZLIB_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error(m) - char *m; -{ +void ZLIB_INTERNAL z_error(char *m) { fprintf(stderr, "%s\n", m); exit(1); } @@ -132,9 +128,7 @@ void ZLIB_INTERNAL z_error(m) /* exported to allow conversion of error code to string for compress() and * uncompress() */ -const char * ZEXPORT zError(err) - int err; -{ +const char * ZEXPORT zError(int err) { return ERR_MSG(err); } @@ -148,22 +142,14 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ +void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ +int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) { uInt j; for (j = 0; j < len; j++) { @@ -172,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len) return 0; } -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ +void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ @@ -216,8 +199,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -242,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) return buf; } -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; (void)opaque; @@ -279,14 +260,12 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); } @@ -299,25 +278,18 @@ void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); +extern voidp malloc(uInt size); +extern voidp calloc(uInt items, uInt size); +extern void free(voidpf ptr); #endif -voidpf ZLIB_INTERNAL zcalloc(opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } -void ZLIB_INTERNAL zcfree(opaque, ptr) - voidpf opaque; - voidpf ptr; -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; free(ptr); } diff --git a/erts/emulator/zlib/zutil.h b/erts/emulator/zlib/zutil.h index 0bc7f4ecd1c0..48dd7febae65 100644 --- a/erts/emulator/zlib/zutil.h +++ b/erts/emulator/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -56,7 +56,7 @@ typedef unsigned long ulg; extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) @@ -137,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#if defined(MACOS) || defined(TARGET_OS_MAC) +#if defined(MACOS) # define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif #endif #ifdef __acorn @@ -170,18 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 19 #endif -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 @@ -191,9 +170,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine_gen64 OF((z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); #endif /* common defaults */ @@ -232,16 +211,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len); + int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len); + void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len); #endif /* Diagnostic functions */ #ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); + extern void ZLIB_INTERNAL z_error(char *m); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -258,9 +237,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); + voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, + unsigned size); + void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr); #endif #define ZALLOC(strm, items, size) \ diff --git a/erts/epmd/src/epmd.c b/erts/epmd/src/epmd.c index e71a0528dd44..a0d5e9ab2296 100644 --- a/erts/epmd/src/epmd.c +++ b/erts/epmd/src/epmd.c @@ -523,7 +523,9 @@ static void free_all_nodes(EpmdVars *g) free(tmp); } } -void epmd_cleanup_exit(EpmdVars *g, int exitval) + +__decl_noreturn void __noreturn +epmd_cleanup_exit(EpmdVars *g, int exitval) { int i; diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index ed2ca330741a..523a55f3d17f 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -97,6 +97,21 @@ #define ASSERT(Cnd) #endif +#if __GNUC__ +# define __decl_noreturn +# ifndef __noreturn +# define __noreturn __attribute__((noreturn)) +# endif +#else +# if defined(__WIN32__) && defined(_MSC_VER) +# define __noreturn +# define __decl_noreturn __declspec(noreturn) +# else +# define __noreturn +# define __decl_noreturn +# endif +#endif + #if defined(HAVE_IN6) && defined(AF_INET6) && defined(HAVE_INET_PTON) # define EPMD6 #endif @@ -343,7 +358,7 @@ void dbg_perror(EpmdVars*,const char*,...); void kill_epmd(EpmdVars*); void epmd_call(EpmdVars*,int); void run(EpmdVars*); -void epmd_cleanup_exit(EpmdVars*, int); +__decl_noreturn void __noreturn epmd_cleanup_exit(EpmdVars*, int); int epmd_conn_close(EpmdVars*,Connection*); void stop_cli(EpmdVars *g, char *name); diff --git a/erts/etc/common/dialyzer.c b/erts/etc/common/dialyzer.c index 846542268407..7f0acc50f810 100644 --- a/erts/etc/common/dialyzer.c +++ b/erts/etc/common/dialyzer.c @@ -60,7 +60,6 @@ static void* emalloc(size_t size); static void efree(void *p); #endif static char* strsave(char* string); -static void push_words(char* src); static int run_erlang(char* name, char** argv); static char* get_default_emulator(char* progname); #ifdef __WIN32__ @@ -213,7 +212,7 @@ int main(int argc, char** argv) eargv_base = (char **) emalloc(eargv_size*sizeof(char*)); eargv = eargv_base; eargc = 0; - push_words(emulator); + PUSH(strsave(emulator)); if (emulator != env) { free(emulator); } @@ -289,27 +288,6 @@ int main(int argc, char** argv) return run_erlang(eargv[0], eargv); } -static void -push_words(char* src) -{ - char sbuf[MAXPATHLEN]; - char* dst; - - dst = sbuf; - while ((*dst++ = *src++) != '\0') { - if (isspace((int)*src)) { - *dst = '\0'; - PUSH(strsave(sbuf)); - dst = sbuf; - do { - src++; - } while (isspace((int)*src)); - } - } - if (sbuf[0]) - PUSH(strsave(sbuf)); -} - #ifdef __WIN32__ wchar_t *make_commandline(char **argv) { diff --git a/erts/etc/common/erlc.c b/erts/etc/common/erlc.c index 1493c6f6ffa9..d376cd89755d 100644 --- a/erts/etc/common/erlc.c +++ b/erts/etc/common/erlc.c @@ -83,7 +83,6 @@ static void* emalloc(size_t size); static void efree(void *p); #endif static char* strsave(char* string); -static void push_words(char* src); static int run_erlang(char* name, char** argv); static void call_compile_server(char** argv); static void encode_env(ei_x_buff* buf); @@ -259,6 +258,9 @@ int main(int argc, char** argv) { char* full_path_emulator = find_executable(emulator); set_env("ERLC_CONFIGURATION", full_path_emulator); + if (full_path_emulator != emulator) { + free(full_path_emulator); + } } #endif @@ -276,7 +278,10 @@ int main(int argc, char** argv) eargv_base = (char **) emalloc(eargv_size*sizeof(char*)); eargv = eargv_base; eargc = 0; - push_words(emulator); + PUSH(strsave(emulator)); + if (emulator != env) { + free(emulator); + } eargc_base = eargc; eargv = eargv + eargv_size/2; eargc = 0; @@ -471,27 +476,6 @@ get_env_compile_server(void) "for environment value ERLC_USE_SERVER\n", us); } -static void -push_words(char* src) -{ - char sbuf[MAXPATHLEN]; - char* dst; - - dst = sbuf; - while ((*dst++ = *src++) != '\0') { - if (isspace((int)*src)) { - *dst = '\0'; - PUSH(strsave(sbuf)); - dst = sbuf; - do { - src++; - } while (isspace((int)*src)); - } - } - if (sbuf[0]) - PUSH(strsave(sbuf)); -} - #ifdef __WIN32__ wchar_t *make_commandline(char **argv) { @@ -1075,7 +1059,7 @@ get_default_emulator(char* progname) char* s; if (strlen(progname) >= sizeof(sbuf)) - return ERL_NAME; + return strsave(ERL_NAME); strcpy(sbuf, progname); for (s = sbuf+strlen(sbuf); s >= sbuf; s--) { @@ -1086,7 +1070,7 @@ get_default_emulator(char* progname) break; } } - return ERL_NAME; + return strsave(ERL_NAME); } diff --git a/erts/etc/common/typer.c b/erts/etc/common/typer.c index a5d4b1c231b2..93bc644e8669 100644 --- a/erts/etc/common/typer.c +++ b/erts/etc/common/typer.c @@ -60,7 +60,6 @@ static void* emalloc(size_t size); static void efree(void *p); #endif static char* strsave(char* string); -static void push_words(char* src); static int run_erlang(char* name, char** argv); static char* get_default_emulator(char* progname); #ifdef __WIN32__ @@ -162,7 +161,7 @@ main(int argc, char** argv) eargv_base = (char **) emalloc(eargv_size*sizeof(char*)); eargv = eargv_base; eargc = 0; - push_words(emulator); + PUSH(strsave(emulator)); free(emulator); eargc_base = eargc; eargv = eargv + eargv_size/2; @@ -216,26 +215,6 @@ main(int argc, char** argv) return run_erlang(eargv[0], eargv); } -static void -push_words(char* src) -{ - char sbuf[MAXPATHLEN]; - char* dst; - - dst = sbuf; - while ((*dst++ = *src++) != '\0') { - if (isspace((int)*src)) { - *dst = '\0'; - PUSH(strsave(sbuf)); - dst = sbuf; - do { - src++; - } while (isspace((int)*src)); - } - } - if (sbuf[0]) - PUSH(strsave(sbuf)); -} #ifdef __WIN32__ wchar_t *make_commandline(char **argv) { diff --git a/erts/etc/unix/etp-commands.in b/erts/etc/unix/etp-commands.in index 559b45262cd5..9ceda74d1669 100644 --- a/erts/etc/unix/etp-commands.in +++ b/erts/etc/unix/etp-commands.in @@ -425,23 +425,19 @@ define etp-boxed-immediate-1 if ($etp_boxed_immediate_h == etp_fun_subtag) printf "#Fun<" else - if ($etp_boxed_immediate_h == etp_fun_ref_subtag) - printf "#FunRef<" + if ($etp_boxed_immediate_h == etp_bin_ref_subtag) + printf "#BinRef<" else - if ($etp_boxed_immediate_h == etp_bin_ref_subtag) - printf "#BinRef<" - else if ($etp_boxed_immediate_h == etp_heap_bits_subtag) printf "#HeapBits<" else - if ($etp_boxed_immediate_h == etp_sub_bits_subtag) - printf "#SubBits<" - else - printf "#Header%X<", $etp_boxed_immediate_h + if ($etp_boxed_immediate_h == etp_sub_bits_subtag) + printf "#SubBits<" + else + printf "#Header%X<", $etp_boxed_immediate_h + end end end - end - end end set $etp_boxed_immediate_arity = \ ($etp_boxed_immediate_p[0] >> etp_header_arity_offs) @@ -612,7 +608,8 @@ define etp-atom-1 else set $etp_atom_1_ap = (Atom*)erts_atom_table.seg_table[(Eterm)($arg0)>>16][((Eterm)($arg0)>>6)&0x3FF] set $etp_atom_1_i = ($etp_atom_1_ap)->len - set $etp_atom_1_p = ($etp_atom_1_ap)->name + etp-bitstring-data-1 ($etp_atom_1_ap)->u.bin + set $etp_atom_1_p = ($etp_bitstring_data) set $etp_atom_1_quote = 1 # Check if atom has to be quoted if ($etp_atom_1_i > 0) @@ -642,7 +639,7 @@ define etp-atom-1 printf "'" end set $etp_atom_1_i = ($etp_atom_1_ap)->len - set $etp_atom_1_p = ($etp_atom_1_ap)->name + set $etp_atom_1_p = ($etp_bitstring_data) while $etp_atom_1_i > 0 etp-char-1 (*$etp_atom_1_p) '\'' set $etp_atom_1_p++ @@ -654,6 +651,25 @@ define etp-atom-1 end end +define etp-bitstring-data-1 +# Args: Eterm bitstring +# +# Non-reentrant +# +# Unbox and retrieve the binary data pointer from any bitstring + set $etp_bitstring_unboxed = ((Eterm*)(($arg0) & etp_ptr_mask)) + set $etp_bitstring_subtag = ($etp_bitstring_unboxed[0] & etp_header_subtag_mask) + if ($etp_bitstring_subtag == etp_sub_bits_subtag) + set $etp_bitstring_ptr = (ErlSubBits *) $etp_bitstring_unboxed + set $etp_bitstring_size = ($etp_bitstring_ptr)->end - ($etp_bitstring_ptr)->start + set $etp_bitstring_data = (byte *)(($etp_bitstring_ptr)->base_flags & ~(UWord)3) + else + set $etp_bitstring_ptr = (ErlHeapBits *) $etp_bitstring_unboxed + set $etp_bitstring_size = ($etp_bitstring_ptr)->size + set $etp_bitstring_data = (byte *)&($etp_bitstring_ptr)->data + end +end + define etp-string-to-atom # Args: (char*) null-terminated @@ -691,8 +707,10 @@ define etp-string-to-atom # search hash bucket list while $etp_p set $etp_i = 0 + etp-bitstring-data-1 ($etp_p)->u.bin + set $etp_atom_1_p = ($etp_bitstring_data) while $etp_i < $etp_p->len && ($arg0)[$etp_i] - if $etp_p->name[$etp_i] != ($arg0)[$etp_i] + if $etp_atom_1_p[$etp_i] != ($arg0)[$etp_i] loop_break end set $etp_i++ @@ -2094,7 +2112,8 @@ define etp-term-dump-atom # Args: atom term set $etp_atom_1_ap = (Atom*)erts_atom_table.seg_table[(Eterm)($arg0)>>16][((Eterm)($arg0)>>6)&0x3FF] set $etp_atom_1_i = ($etp_atom_1_ap)->len - set $etp_atom_1_p = ($etp_atom_1_ap)->name + etp-bitstring-data-1 ($etp_atom_1_ap)->u.bin + set $etp_atom_1_p = ($etp_bitstring_data) set $etp_atom_1_quote = 1 set $etp_atom_indent = 13 @@ -2142,7 +2161,7 @@ define etp-term-dump-atom printf "'" end set $etp_atom_1_i = ($etp_atom_1_ap)->len - set $etp_atom_1_p = ($etp_atom_1_ap)->name + set $etp_atom_1_p = ($etp_bitstring_data) while $etp_atom_1_i > 0 etp-char-1 (*$etp_atom_1_p) '\'' set $etp_atom_1_p++ diff --git a/erts/etc/unix/etp.py b/erts/etc/unix/etp.py index 6d9339fe57da..5fbc275a1799 100644 --- a/erts/etc/unix/etp.py +++ b/erts/etc/unix/etp.py @@ -415,8 +415,6 @@ def boxed(valobj, depth = float('inf')): return '#Ref' if masked_hdr == c('FUN_SUBTAG'): return '#Fun' - if masked_hdr == c('FUN_REF_SUBTAG'): - return '#FunRef' if masked_hdr == c('HEAP_BITS_SUBTAG'): return '#HeapBits' if masked_hdr == c('SUB_BITS_SUBTAG'): diff --git a/erts/etc/unix/run_erl.c b/erts/etc/unix/run_erl.c index 615764663058..9e369176cc99 100644 --- a/erts/etc/unix/run_erl.c +++ b/erts/etc/unix/run_erl.c @@ -488,6 +488,21 @@ int main(int argc, char **argv) return 0; } /* main() */ +/* Broken out in order to do GCC diagnostic ignore here */ +#ifdef HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL +_Pragma("GCC diagnostic push"); +_Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\""); +#endif +static int dynamic_strftime( + char *__restrict__ log_alive_buffer, + const char *__restrict__ log_alive_format, + const struct tm *__restrict__ tmptr) { + return strftime(log_alive_buffer, ALIVE_BUFFSIZ, log_alive_format, tmptr); +} +#ifdef HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL +_Pragma("GCC diagnostic pop"); +#endif + /* pass_on() * Is the work loop of the logger. Selects on the pipe to the to_erl * program erlang. If input arrives from to_erl it is passed on to @@ -584,8 +599,7 @@ static void pass_on(pid_t childpid) } else { tmptr = localtime(&now); } - if (!strftime(log_alive_buffer, ALIVE_BUFFSIZ, log_alive_format, - tmptr)) { + if (!dynamic_strftime(log_alive_buffer, log_alive_format, tmptr)) { strn_cpy(log_alive_buffer, sizeof(log_alive_buffer), "(could not format time in 256 positions " "with current format string.)"); @@ -711,8 +725,8 @@ static void pass_on(pid_t childpid) #endif } } - - if (!got_some && wfd && buf[0] == '\014') { + if (!got_some && wfd && buf[0] == '\033' && + buf[1] == 'l') { char wbuf[30]; int wlen = sn_printf(wbuf,sizeof(wbuf),"[run_erl v%u-%u]\n", RUN_ERL_HI_VER, RUN_ERL_LO_VER); @@ -858,8 +872,7 @@ static int open_log(int log_num, int flags) } else { tmptr = localtime(&now); } - if (!strftime(log_buffer, ALIVE_BUFFSIZ, log_alive_format, - tmptr)) { + if (!dynamic_strftime(log_buffer, log_alive_format, tmptr)) { strn_cpy(log_buffer, sizeof(log_buffer), "(could not format time in 256 positions " "with current format string.)"); diff --git a/erts/etc/unix/to_erl.c b/erts/etc/unix/to_erl.c index 4de4ac4d64ae..e34c14102534 100644 --- a/erts/etc/unix/to_erl.c +++ b/erts/etc/unix/to_erl.c @@ -351,16 +351,12 @@ int main(int argc, char **argv) show_terminal_settings(&tty_smode); #endif /* - * "Write a ^L to the FIFO which causes the other end to redisplay - * the input line." - * This does not seem to work as was intended in old comment above. - * However, this control character is now (R12B-3) used by run_erl - * to trigger the version handshaking between to_erl and run_erl - * at the start of every new to_erl-session. + * Write ^[l to the FIFO. This trigger the version handshaking + * between to_erl and run_erl and a redraw in erl, at the start + * of every new to_erl-session. */ - - if (write(wfd, "\014", 1) < 0) { - fprintf(stderr, "Error in writing ^L to FIFO.\n"); + if (write(wfd, "\033l", 2) < 0) { + fprintf(stderr, "Error in writing ^[l to FIFO.\n"); } /* diff --git a/erts/etc/win32/INSTALL.txt b/erts/etc/win32/INSTALL.txt new file mode 100644 index 000000000000..2ad9c539294b --- /dev/null +++ b/erts/etc/win32/INSTALL.txt @@ -0,0 +1,10 @@ +Welcome to Erlang/OTP! + +This Erlang installation requires "Microsoft Visual C++ Redistributable". Unless it is already +present on your system, you can install vc_redist.exe that is included with this installation. +For scripts, CIs, etc you may want to install it in "passive" mode: + + .\vc_redist.exe /install /quiet /norestart + +For an installation that is more integrated with Windows (Adds Erlang to Start menu, Add/Remove +Programs, etc), download a "Windows installer" from https://www.erlang.org/downloads. diff --git a/erts/etc/win32/nsis/Makefile b/erts/etc/win32/nsis/Makefile index dd4bbd4de670..e007e3deafed 100644 --- a/erts/etc/win32/nsis/Makefile +++ b/erts/etc/win32/nsis/Makefile @@ -54,6 +54,9 @@ WTARGET_DIR=$(shell (w32_path.sh -d "$(TARGET_DIR)")) ifeq ($(CONFIG_SUBTYPE),win64) WINTYPE=win64 REDIST_TARGET=vcredist_x64.exe +else ifeq ($(CONFIG_SUBTYPE),arm64) + WINTYPE=arm64 + REDIST_TARGET=vcredist_arm64.exe else WINTYPE=win32 REDIST_TARGET=vcredist_x86.exe diff --git a/erts/etc/win32/nsis/erlang20.nsi b/erts/etc/win32/nsis/erlang20.nsi index 7d63671f89ca..2785a103d46c 100644 --- a/erts/etc/win32/nsis/erlang20.nsi +++ b/erts/etc/win32/nsis/erlang20.nsi @@ -68,7 +68,11 @@ Var STARTMENU_FOLDER !if ${WINTYPE} == "win64" !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_RELEASE} (x64)" !else - !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_RELEASE} (i386)" + !if ${WINTYPE} == "arm64" + !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_RELEASE} (arm64)" + !else + !define MUI_STARTMENUPAGE_DEFAULTFOLDER "${OTP_PRODUCT} ${OTP_RELEASE} (i386)" + !endif !endif ;-------------------------------- @@ -104,7 +108,7 @@ Var STARTMENU_FOLDER VIProductVersion "${OTP_VERSION_LONG}" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Ericsson AB" -VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${OTP_VERSION}" +VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${OTP_VERSION}" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Erlang/OTP installer" VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright Ericsson AB 2010-${YEAR}. All Rights Reserved." VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Erlang/OTP" @@ -385,6 +389,10 @@ Function .onInit StrCmpS ${WINTYPE} "win64" +1 +4 StrCpy $archprefix "amd64" StrCpy $sysnativedir "$WINDIR\sysnative" + Goto +4 + StrCmpS ${WINTYPE} "arm64" +1 +6 + StrCpy $archprefix "arm64" + StrCpy $sysnativedir "$WINDIR\sysnative" Goto +3 StrCpy $archprefix "x86" StrCpy $sysnativedir $SYSDIR diff --git a/erts/etc/win32/nsis/find_redist.sh b/erts/etc/win32/nsis/find_redist.sh index f551bc752749..6a43571ff822 100755 --- a/erts/etc/win32/nsis/find_redist.sh +++ b/erts/etc/win32/nsis/find_redist.sh @@ -85,13 +85,19 @@ add_path_element() if [ "$1" = "win64" ]; then AMD64DIR=true VCREDIST=vcredist_x64 + VCREDIST2=vcredist.x64 COMPONENTS="cl amd64 bin vc" elif [ "$1" = "win32" ]; then AMD64DIR=false VCREDIST=vcredist_x86 + VCREDIST2=vcredist.x86 COMPONENTS="cl bin vc" +elif [ "$1" = "arm64" ]; then + AMD64DIR=false + VCREDIST=vcredist_arm64 + VCREDIST2=vcredist.arm64 else - echo "TARGET argument should win32 or win64" + echo "TARGET argument should win32, win64 or arm64" exit 2 fi @@ -101,11 +107,16 @@ if [ x"$VCToolsRedistDir" != x"" ]; then echo "$File" exit 0 fi + File="$VCToolsRedistDir/$VCREDIST2.exe" + if [ -r "$File" ]; then + echo "$File" + exit 0 + fi fi CLPATH=`lookup_prog_in_path cl` if [ -z "$CLPATH" ]; then - echo "Can not locate cl.exe and vcredist_x86/x64.exe - OK if using mingw" >&2 + echo "Can not locate cl.exe and vcredist_x86/x64/arm64.exe - OK if using mingw" >&2 exit 1 fi diff --git a/erts/etc/win32/wsl_tools/SetupWSLcross.bat b/erts/etc/win32/wsl_tools/SetupWSLcross.bat index 0e8d9348c188..af33cfccf3a8 100644 --- a/erts/etc/win32/wsl_tools/SetupWSLcross.bat +++ b/erts/etc/win32/wsl_tools/SetupWSLcross.bat @@ -4,6 +4,9 @@ rem Usage: eval `cmd.exe /c SetupWSLcross.bat x64` IF "%~1"=="x86" GOTO search IF "%~1"=="x64" GOTO search +IF "%~1"=="arm64" GOTO search +IF "%~1"=="amd64_arm64" GOTO search +IF "%~1"=="x64_arm64" GOTO search GOTO badarg @@ -67,7 +70,12 @@ GOTO no_vcvars :continue -FOR /F "delims==" %%F IN ('where cl.exe') DO SET _cl_exec_=%%F +FOR /F "delims==" %%F IN ('where cl.exe') DO ( + SET _cl_exec_=%%F + goto set_cl_path +) + +:set_cl_path FOR %%F IN ("%_cl_exec_%") DO SET CL_PATH=%%~dpF FOR /F "delims==" %%F IN ('where rc.exe') DO SET _rc_exec_=%%F @@ -87,7 +95,7 @@ wsl.exe echo "# Eval this file eval \`cmd.exe /c SetupWSLcross.bat\`" exit :badarg -echo "Bad TARGET or not specified: %~1 expected x86 or x64" +echo "Bad TARGET or not specified: %~1 expected x86, x64, arm64 or amd64_arm64(x64_arm64)" exit :no_vcvars diff --git a/erts/etc/win32/wsl_tools/reg_query.sh b/erts/etc/win32/wsl_tools/reg_query.sh index c05f00dfa191..1cb5e711e71c 100755 --- a/erts/etc/win32/wsl_tools/reg_query.sh +++ b/erts/etc/win32/wsl_tools/reg_query.sh @@ -10,6 +10,8 @@ BACKED=`echo "$1" | sed 's,/,\\\\,g'` if [ $CONFIG_SUBTYPE = "win64" ]; then REG_OPT=" /reg:64" +elif [ X"$CONFIG_SUBTYPE" = X"arm64" -o X"$CONFIG_SUBTYPE" = X"x64_arm64" ]; then + REG_OPT=" /reg:64" else REG_OPT=" /reg:32" fi diff --git a/erts/etc/win32/wsl_tools/vc/cc.sh b/erts/etc/win32/wsl_tools/vc/cc.sh index 50abaf077798..5128bd35e112 100755 --- a/erts/etc/win32/wsl_tools/vc/cc.sh +++ b/erts/etc/win32/wsl_tools/vc/cc.sh @@ -29,6 +29,15 @@ SAVE="$@" # Constants COMMON_CFLAGS="-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -D_CRT_SECURE_NO_DEPRECATE" +if [ "$CONFIG_SUBTYPE" = "arm64" -o "$CONFIG_SUBTYPE" = "x64_arm64" ]; then + MACHINE="ARM64" + COMMON_CFLAGS="${COMMON_CFLAGS} -D__aarch64__" +elif [ "$CONFIG_SUBTYPE" = "win64" ]; then + MACHINE="x64" +else + MACHINE="x86" +fi + # Variables # The stdout and stderr for the compiler MSG_FILE=/tmp/cl.exe.$$.1 @@ -64,7 +73,7 @@ CMD="" # All the c source files, in unix style SOURCES="" # All the options to pass to the linker, kept in Unix style -LINKCMD="" +LINKCMD="-MACHINE:${MACHINE}" # Loop through the parameters and set the above variables accordingly diff --git a/erts/etc/win32/wsl_tools/vc/emu_cc.sh b/erts/etc/win32/wsl_tools/vc/emu_cc.sh index fd931c826023..485c75aa3b80 100755 --- a/erts/etc/win32/wsl_tools/vc/emu_cc.sh +++ b/erts/etc/win32/wsl_tools/vc/emu_cc.sh @@ -23,6 +23,8 @@ if [ X"$CONFIG_SUBTYPE" = X"win64" ]; then GCC="x86_64-w64-mingw32-gcc -m64" +elif [ X"$CONFIG_SUBTYPE" = X"arm64" || X"$CONFIG_SUBTYPE" = X"x64_arm64" ]; then + GCC="aarch64-w64-mingw32-gcc -m64" else GCC="x86_64-w64-mingw32-gcc -m32" fi diff --git a/erts/include/internal/ethread.h b/erts/include/internal/ethread.h index e1aa6d412699..d0227a481fad 100644 --- a/erts/include/internal/ethread.h +++ b/erts/include/internal/ethread.h @@ -105,6 +105,15 @@ ethr_assert_failed(const char *file, int line, const char *func, const char *a); #define ETHR_ASSERT(A) ((void) 1) #endif +/* Taken from https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html#warn-about-implicit-fallthrough-in-switch-statements */ +#ifdef __has_attribute +# if __has_attribute(__fallthrough__) +# define ETHR_FALLTHROUGH() __attribute__((__fallthrough__)) +# endif +#endif +#ifndef ETHR_FALLTHROUGH +# define ETHR_FALLTHROUGH() do {} while (0) /* fallthrough */ +#endif #if defined(ETHR_PTHREADS) /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ diff --git a/erts/lib_src/common/erl_misc_utils.c b/erts/lib_src/common/erl_misc_utils.c index 01f8b35ffe30..74941ce570d0 100644 --- a/erts/lib_src/common/erl_misc_utils.c +++ b/erts/lib_src/common/erl_misc_utils.c @@ -1124,7 +1124,6 @@ get_cgroup_path(const char *controller, const char **out) { enum cgroup_version_t version; char mount_line[10 << 10]; - const char *mount_format; const char *child_path; FILE *mount_file; @@ -1134,27 +1133,10 @@ get_cgroup_path(const char *controller, } version = get_cgroup_child_path(controller, &child_path); - switch (version) { - case ERTS_CGROUP_NONE: + + if (version == ERTS_CGROUP_NONE) { fclose(mount_file); return ERTS_CGROUP_NONE; - case ERTS_CGROUP_V1: - /* Format: - * [Mount id] [Parent id] [Major] [Minor] [Root] [Mounted at] \ - * [Mount flags] ... (options terminated by a single hyphen) ... \ - * [FS type] [Mount source] [Flags] - * - * (See proc(5) for a more complete description.) - * - * This fails if any of the fs options contain a hyphen, but this is - * not likely to happen on a cgroup, so we just skip such lines. */ - mount_format = "%*d %*d %*d:%*d %4095s %4095s %*s%*[^-]- " - "cgroup %*s %511[^\n]\n"; - break; - case ERTS_CGROUP_V2: - mount_format = "%*d %*d %*d:%*d %4095s %4095s %*s%*[^-]- " - "cgroup2 %*s %511[^\n]\n"; - break; } /* As a controller can only belong to one hierarchy, regardless of @@ -1166,12 +1148,39 @@ get_cgroup_path(const char *controller, char root_path[4 << 10]; char fs_flags[512]; - if (sscanf(mount_line, - mount_format, - root_path, - mount_path, - fs_flags) != 3) { - continue; + switch (version) { + + case ERTS_CGROUP_V1: + /* Format: + * [Mount id] [Parent id] [Major] [Minor] [Root] [Mounted at] \ + * [Mount flags] ... (options terminated by a single hyphen) ... \ + * [FS type] [Mount source] [Flags] + * + * (See proc(5) for a more complete description.) + * + * This fails if any of the fs options contain a hyphen, but this is + * not likely to happen on a cgroup, so we just skip such lines. */ + if (sscanf(mount_line, + "%*d %*d %*d:%*d %4095s %4095s %*s%*[^-]- " + "cgroup %*s %511[^\n]\n", + root_path, + mount_path, + fs_flags) != 3) { + continue; + } + break; + case ERTS_CGROUP_V2: + if (sscanf(mount_line, + "%*d %*d %*d:%*d %4095s %4095s %*s%*[^-]- " + "cgroup2 %*s %511[^\n]\n", + root_path, + mount_path, + fs_flags) != 3) { + continue; + } + break; + default: + ASSERT(0 && "Only V1 and V2 should come here"); } if (version == ERTS_CGROUP_V2) { diff --git a/erts/lib_src/common/erl_printf_format.c b/erts/lib_src/common/erl_printf_format.c index d59a5df2e506..e854825a2a69 100644 --- a/erts/lib_src/common/erl_printf_format.c +++ b/erts/lib_src/common/erl_printf_format.c @@ -45,6 +45,17 @@ #include "erl_printf.h" #include "erl_printf_format.h" + +/* Taken from https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html#warn-about-implicit-fallthrough-in-switch-statements */ +#ifdef __has_attribute +# if __has_attribute(__fallthrough__) +# define FALLTHROUGH() __attribute__((__fallthrough__)) +# endif +#endif +#ifndef FALLTHROUGH +# define FALLTHROUGH() do {} while (0) /* fallthrough */ +#endif + #ifdef DEBUG #include #define ASSERT(X) assert(X) @@ -234,6 +245,7 @@ static int fmt_uword(fmtfn_t fn,void* arg,int sign,ErlPfUWord uval, break; case FMTC_X: dc = heX; + FALLTHROUGH(); case FMTC_x: base = 16; break; @@ -286,6 +298,7 @@ static int fmt_long_long(fmtfn_t fn,void* arg,int sign, break; case FMTC_X: dc = heX; + FALLTHROUGH(); case FMTC_x: base = 16; break; @@ -413,7 +426,14 @@ static int fmt_double(fmtfn_t fn,void*arg,double val, } } +#ifdef HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL +_Pragma("GCC diagnostic push"); +_Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\""); +#endif size = sprintf(bufp, format_str, precision, val); +#ifdef HAVE_GCC_DIAG_IGNORE_WFORMAT_NONLITERAL +_Pragma("GCC diagnostic pop"); +#endif if (size < 0) { if (errno > 0) res = -errno; @@ -562,6 +582,7 @@ int erts_printf_format(fmtfn_t fn, void* arg, char* fmt, va_list ap) #else #error No 16-bit integer datatype found #endif + break; case 8: #if SIZEOF_CHAR == 1 fmt |= FMTL_hh; diff --git a/erts/lib_src/common/ethr_mutex.c b/erts/lib_src/common/ethr_mutex.c index 636adfe397ca..abfa65964910 100644 --- a/erts/lib_src/common/ethr_mutex.c +++ b/erts/lib_src/common/ethr_mutex.c @@ -2657,6 +2657,7 @@ ethr_rwmutex_init_opt(ethr_rwmutex *rwmtx, ethr_rwmutex_opt *opt) rwmtx->type = ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ; } /* Fall through */ + ETHR_FALLTHROUGH(); case ETHR_RWMUTEX_TYPE_EXTREMELY_FREQUENT_READ: { int length; @@ -2688,6 +2689,7 @@ ethr_rwmutex_init_opt(ethr_rwmutex *rwmtx, ethr_rwmutex_opt *opt) break; } } + ETHR_FALLTHROUGH(); case ETHR_RWMUTEX_TYPE_NORMAL: rwmtx->tdata.rs = 0; break; diff --git a/erts/preloaded/ebin/atomics.beam b/erts/preloaded/ebin/atomics.beam index 0f9cda23ea59..ef42c0fcd06b 100644 Binary files a/erts/preloaded/ebin/atomics.beam and b/erts/preloaded/ebin/atomics.beam differ diff --git a/erts/preloaded/ebin/counters.beam b/erts/preloaded/ebin/counters.beam index 0cc148fa9e39..fe9ea02686bd 100644 Binary files a/erts/preloaded/ebin/counters.beam and b/erts/preloaded/ebin/counters.beam differ diff --git a/erts/preloaded/ebin/erl_init.beam b/erts/preloaded/ebin/erl_init.beam index df6cde31e070..f24c0d8490c0 100644 Binary files a/erts/preloaded/ebin/erl_init.beam and b/erts/preloaded/ebin/erl_init.beam differ diff --git a/erts/preloaded/ebin/erl_prim_loader.beam b/erts/preloaded/ebin/erl_prim_loader.beam index 0a5e4e06c955..276dc1e3f1ce 100644 Binary files a/erts/preloaded/ebin/erl_prim_loader.beam and b/erts/preloaded/ebin/erl_prim_loader.beam differ diff --git a/erts/preloaded/ebin/erl_tracer.beam b/erts/preloaded/ebin/erl_tracer.beam index e9e5673144c9..762dfb351f7a 100644 Binary files a/erts/preloaded/ebin/erl_tracer.beam and b/erts/preloaded/ebin/erl_tracer.beam differ diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam index 6e90e635bea4..db3161848848 100644 Binary files a/erts/preloaded/ebin/erlang.beam and b/erts/preloaded/ebin/erlang.beam differ diff --git a/erts/preloaded/ebin/erts_code_purger.beam b/erts/preloaded/ebin/erts_code_purger.beam index 058bf4c91b4a..4ce0d155b78b 100644 Binary files a/erts/preloaded/ebin/erts_code_purger.beam and b/erts/preloaded/ebin/erts_code_purger.beam differ diff --git a/erts/preloaded/ebin/erts_dirty_process_signal_handler.beam b/erts/preloaded/ebin/erts_dirty_process_signal_handler.beam index 364fb5366c13..2f65f2f946f4 100644 Binary files a/erts/preloaded/ebin/erts_dirty_process_signal_handler.beam and b/erts/preloaded/ebin/erts_dirty_process_signal_handler.beam differ diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam index 9c98f1edf12a..928de46229df 100644 Binary files a/erts/preloaded/ebin/erts_internal.beam and b/erts/preloaded/ebin/erts_internal.beam differ diff --git a/erts/preloaded/ebin/erts_literal_area_collector.beam b/erts/preloaded/ebin/erts_literal_area_collector.beam index d0fa0119d04d..1792384c6a72 100644 Binary files a/erts/preloaded/ebin/erts_literal_area_collector.beam and b/erts/preloaded/ebin/erts_literal_area_collector.beam differ diff --git a/erts/preloaded/ebin/erts_trace_cleaner.beam b/erts/preloaded/ebin/erts_trace_cleaner.beam index 0a7a27afe822..b956ae46b497 100644 Binary files a/erts/preloaded/ebin/erts_trace_cleaner.beam and b/erts/preloaded/ebin/erts_trace_cleaner.beam differ diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam index f09e16798c4a..569d61e11197 100644 Binary files a/erts/preloaded/ebin/init.beam and b/erts/preloaded/ebin/init.beam differ diff --git a/erts/preloaded/ebin/persistent_term.beam b/erts/preloaded/ebin/persistent_term.beam index 111c2733b3e3..995046de0c4d 100644 Binary files a/erts/preloaded/ebin/persistent_term.beam and b/erts/preloaded/ebin/persistent_term.beam differ diff --git a/erts/preloaded/ebin/prim_buffer.beam b/erts/preloaded/ebin/prim_buffer.beam index 9dc95d5c940b..87d827668ff7 100644 Binary files a/erts/preloaded/ebin/prim_buffer.beam and b/erts/preloaded/ebin/prim_buffer.beam differ diff --git a/erts/preloaded/ebin/prim_eval.beam b/erts/preloaded/ebin/prim_eval.beam index 0b5b51de66be..dafcf2797fa7 100644 Binary files a/erts/preloaded/ebin/prim_eval.beam and b/erts/preloaded/ebin/prim_eval.beam differ diff --git a/erts/preloaded/ebin/prim_file.beam b/erts/preloaded/ebin/prim_file.beam index e10851dec2fa..66eefb868ab7 100644 Binary files a/erts/preloaded/ebin/prim_file.beam and b/erts/preloaded/ebin/prim_file.beam differ diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam index 1d4e2e5ae0f7..6a2d7b83807b 100644 Binary files a/erts/preloaded/ebin/prim_inet.beam and b/erts/preloaded/ebin/prim_inet.beam differ diff --git a/erts/preloaded/ebin/prim_net.beam b/erts/preloaded/ebin/prim_net.beam index 7e59c25f2e6e..62ce59d5fe07 100644 Binary files a/erts/preloaded/ebin/prim_net.beam and b/erts/preloaded/ebin/prim_net.beam differ diff --git a/erts/preloaded/ebin/prim_socket.beam b/erts/preloaded/ebin/prim_socket.beam index bab5105c851c..bb396bef140b 100644 Binary files a/erts/preloaded/ebin/prim_socket.beam and b/erts/preloaded/ebin/prim_socket.beam differ diff --git a/erts/preloaded/ebin/prim_zip.beam b/erts/preloaded/ebin/prim_zip.beam index 44ad467c9295..4dbd507c1dc7 100644 Binary files a/erts/preloaded/ebin/prim_zip.beam and b/erts/preloaded/ebin/prim_zip.beam differ diff --git a/erts/preloaded/ebin/socket_registry.beam b/erts/preloaded/ebin/socket_registry.beam index 6f35628847fc..6e244d4f7d1d 100644 Binary files a/erts/preloaded/ebin/socket_registry.beam and b/erts/preloaded/ebin/socket_registry.beam differ diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam index 3fb28be1a077..1e9419072ef1 100644 Binary files a/erts/preloaded/ebin/zlib.beam and b/erts/preloaded/ebin/zlib.beam differ diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl index 061f55cd4337..6357cbeea608 100644 --- a/erts/preloaded/src/erlang.erl +++ b/erts/preloaded/src/erlang.erl @@ -3308,7 +3308,7 @@ Puts the calling process into a wait state where its memory allocation has been reduced as much as possible. This is useful if the process does not expect to receive any messages soon. -The process is awaken when a message is sent to it, and control resumes in +The process is awakened when a message is sent to it, and control resumes in `Module:Function` with the arguments specified by `Args` with the call stack emptied, meaning that the process terminates when that function returns. Thus `erlang:hibernate/3` never returns to its caller. The resume function @@ -4262,7 +4262,7 @@ earlier, and: > Now, such a call to `monitor` will instead succeed and a monitor is created. > But the monitor will only supervise the connection. That is, a > `{'DOWN', _, process, _, noconnection}` is the only message that may be - > received, as the primitive node have no way of reporting the status of the + > received, as the primitive node has no way of reporting the status of the > monitored process. - **Monitoring a `port`{: #monitor_port }** - Creates monitor between the @@ -5946,7 +5946,7 @@ The order of the options can be different from the one that was set. MonitorPid :: pid(), Options :: [ system_monitor_option() ]. system_monitor() -> - erlang:nif_error(undefined). + erts_internal:system_monitor(legacy). %% system_monitor/1 -doc """ @@ -5965,115 +5965,46 @@ Returns the previous system monitor settings just like MonSettings :: undefined | { MonitorPid, Options }, MonitorPid :: pid(), Options :: [ system_monitor_option() ]. -system_monitor(_Arg) -> - erlang:nif_error(undefined). +system_monitor(undefined) -> + erts_internal:system_monitor(legacy, undefined, []); +system_monitor({MonitorPid, Options}=Arg) -> + try + erts_internal:system_monitor(legacy, MonitorPid, Options) + catch + error:Reason -> + error_with_info(Reason, [Arg]) + end; +system_monitor(Arg) -> + badarg_with_info([Arg]). + %% system_monitor/2 -doc """ -Sets the system performance monitoring options. `MonitorPid` is a local process +Sets the system event monitoring options. `MonitorPid` is a local process identifier (pid) receiving system monitor messages. -The second argument is a list of monitoring options: - -- **`{long_gc, Time}`** - If a garbage collection in the system takes at least - `Time` wall clock milliseconds, a message `{monitor, GcPid, long_gc, Info}` is - sent to `MonitorPid`. `GcPid` is the pid that was garbage collected. `Info` is - a list of two-element tuples describing the result of the garbage collection. - - One of the tuples is `{timeout, GcTime}`, where `GcTime` is the time for the - garbage collection in milliseconds. The other tuples are tagged with - `heap_size`, `heap_block_size`, `stack_size`, `mbuf_size`, `old_heap_size`, - and `old_heap_block_size`. These tuples are explained in the description of - trace message [`gc_minor_start`](`m:trace#gc_minor_start`) (see - `trace:process/4`). New tuples can be added, and the order of the - tuples in the `Info` list can be changed at any time without prior notice. - -- **`{long_message_queue, {Disable, Enable}}`** - If the message queue length of - a process in the system reach `Enable` length, a `long_message_queue` monitor - message is sent to the process identified by `MonitorPid`. The monitor message - will be on the form `{monitor, Pid, long_message_queue, Long}`, where `Pid` is - the process identifier of the process that got a long message queue and `Long` - will equal `true` indicating that it is in a _long message queue_ state. No - more `long_message_queue` monitor messages will be sent due to the process - identified by `Pid` until its message queue length falls down to a length of - `Disable` length. When this happens, a `long_message_queue` monitor message - with `Long` equal to `false` will be sent to the process identified by - `MonitorPid` indicating that the process is no longer in a _long message - queue_ state. As of this, if the message queue length should again reach - `Enable` length, a new `long_message_queue` monitor message with `Long` set to - `true` will again be sent. That is, a `long_message_queue` monitor message is - sent when a process enters or leaves a _long message queue_ state where these - state changes are defined by the `Enable` and `Disable` parameters. - - `Enable` length must be an integer larger than zero and `Disable` length must - be an integer larger than or equal to zero. `Disable` length must also be - smaller than `Enable` length. If the above is not satisfied the operation will - fail with a `badarg` error exception. You are recommended to use a much - smaller value for `Disable` length than `Enable` length in order not to be - flooded with `long_message_queue` monitor messages. - -- **`{long_schedule, Time}`** - If a process or port in the system runs - uninterrupted for at least `Time` wall clock milliseconds, a message - `{monitor, PidOrPort, long_schedule, Info}` is sent to `MonitorPid`. - `PidOrPort` is the process or port that was running. `Info` is a list of - two-element tuples describing the event. - - If a `t:pid/0`, the tuples `{timeout, Millis}`, `{in, Location}`, and - `{out, Location}` are present, where `Location` is either an MFA - (`{Module, Function, Arity}`) describing the function where the process was - scheduled in/out, or the atom `undefined`. - - If a `t:port/0`, the tuples `{timeout, Millis}` and `{port_op,Op}` are - present. `Op` is one of `proc_sig`, `timeout`, `input`, `output`, `event`, or - `dist_cmd`, depending on which driver callback was executing. - - `proc_sig` is an internal operation and is never to appear, while the others - represent the corresponding driver callbacks `timeout`, `ready_input`, - `ready_output`, `event`, and `outputv` (when the port is used by - distribution). Value `Millis` in tuple `timeout` informs about the - uninterrupted execution time of the process or port, which always is equal to - or higher than the `Time` value supplied when starting the trace. New tuples - can be added to the `Info` list in a future release. The order of the tuples - in the list can be changed at any time without prior notice. - - This can be used to detect problems with NIFs or drivers that take too long to - execute. 1 ms is considered a good maximum time for a driver callback or a - NIF. However, a time-sharing system is usually to consider everything < 100 ms - as "possible" and fairly "normal". However, longer schedule times can indicate - swapping or a misbehaving NIF/driver. Misbehaving NIFs and drivers can cause - bad resource utilization and bad overall system performance. - -- **`{large_heap, Size}`** - If a garbage collection in the system results in - the allocated size of a heap being at least `Size` words, a message - `{monitor, GcPid, large_heap, Info}` is sent to `MonitorPid`. `GcPid` and - `Info` are the same as for `long_gc` earlier, except that the tuple tagged - with `timeout` is not present. - - The monitor message is sent if the sum of the sizes of all memory blocks - allocated for all heap generations after a garbage collection is equal to or - higher than `Size`. - - When a process is killed by - [`max_heap_size`](#process_flag_max_heap_size), it is killed before - the garbage collection is complete and thus no large heap message is sent. - -- **`busy_port`** - If a process in the system gets suspended because it sends - to a busy port, a message `{monitor, SusPid, busy_port, Port}` is sent to - `MonitorPid`. `SusPid` is the pid that got suspended when sending to `Port`. - -- **`busy_dist_port`[](){: #busy_dist_port } ** - If a process in the system gets suspended because it sends to a process on a remote - node whose inter-node communication was handled by a busy port, a message `{monitor, SusPid, busy_dist_port, Port}` - is sent to `MonitorPid`. `SusPid` is the pid that got suspended when sending through - the inter-node communication port `Port`. - -Returns the previous system monitor settings just like -[`erlang:system_monitor/0`](`system_monitor/0`). - -The arguments to [`system_monitor/2`](`system_monitor/2`) specifies how all -system monitoring on the node should be done, not how it should be changed. This -means only one process at a time (`MonitorPid`) can be the receiver of system -monitor messages. Also, the way to clear a specific monitor option is to not + > #### Change {: .info } + > + > This function is superseded by `trace:system/3` that operate on + > dynamic trace sessions. + +The second argument is a list of monitoring options to enable: + +- **`{long_gc, Time}`** +- **`{long_message_queue, {Disable, Enable}}`** +- **`{long_schedule, Time}`** +- **`{large_heap, Size}`** +- **`busy_port`** +- **`busy_dist_port`** + +For more detailed descriptions about the monitoring options, see +`trace:system/3`. + +Unlink `trace:system/3`, the arguments to +[`system_monitor/2`](`system_monitor/2`) specifies how all system monitoring +should be set, not how it should be changed. This means only one process +at a time (`MonitorPid`) can be the receiver of messages from system monitoring set +with this function. Also, the way to clear a specific monitor option is to not include it in the list `Options`. All system monitoring will, however, be cleared if the process identified by `MonitorPid` terminates. @@ -6082,6 +6013,9 @@ options have a unspecified minimum value. Lower values will be adjusted to the minimum value. For example, it is currently not possible to monitor all garbage collections with `{long_gc, 0}`. +Returns the previous system monitor settings just like +[`erlang:system_monitor/0`](`system_monitor/0`). + > #### Note {: .info } > > If a monitoring process gets so large that it itself starts to cause system @@ -6104,8 +6038,13 @@ Failures: MonSettings :: undefined | { OldMonitorPid, OldOptions }, OldMonitorPid :: pid(), OldOptions :: [ system_monitor_option() ]. -system_monitor(_MonitorPid, _Options) -> - erlang:nif_error(undefined). +system_monitor(MonitorPid, Options) -> + try + erts_internal:system_monitor(legacy, MonitorPid, Options) + catch + error:Reason -> + error_with_info(Reason, [MonitorPid, Options]) + end. %% system_profile/0 -doc """ @@ -7404,8 +7343,8 @@ of the flag. > condition. Blocking due to disabled `async_dist` can be monitored by - [`erlang:system_monitor()`](`system_monitor/2`) using the - [`busy_dist_port`](#busy_dist_port) option. Only data buffered by + [`trace:system()`](`trace:system/3`) using the + [`busy_dist_port`](`m:trace#busy_dist_port`) option. Only data buffered by processes which (at the time of sending a signal) have disabled `async_dist` will be counted when determining whether or not an operation should block the caller. @@ -12540,6 +12479,7 @@ aa_mem_data(#memory{code = Code} = Mem, CodeData == export_table; CodeData == export_list; CodeData == fun_table; + CodeData == fun_list; CodeData == module_refs; CodeData == loaded_code -> aa_mem_data(Mem#memory{code = Code+Sz}, diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl index 8e9ebc6b4d93..e0aaf5ee6af8 100644 --- a/erts/preloaded/src/erts_internal.erl +++ b/erts/preloaded/src/erts_internal.erl @@ -127,6 +127,8 @@ -export([term_to_string/1, term_to_string/2]). +-export([system_monitor/1, system_monitor/3]). + %% %% Await result of send to port %% @@ -1150,3 +1152,17 @@ term_to_string(T) -> term_to_string(_T, _Limit) -> erlang:nif_error(undefined). + +-spec system_monitor(Session) -> Return when + Session :: term(), + Return :: undefined | {pid(), [term()]}. +system_monitor(_Session) -> + erlang:nif_error(undefined). + +-spec system_monitor(Session, MonitorPid, Options) -> Return when + Session :: term(), + MonitorPid :: undefined | session | pid(), + Options :: [term()], + Return :: undefined | ok | {pid(), Options}. +system_monitor(_Session, _MonitorPid, _Options) -> + erlang:nif_error(undefined). diff --git a/erts/test/erlc_SUITE.erl b/erts/test/erlc_SUITE.erl index c9068164e5c9..c6f3a2bf310a 100644 --- a/erts/test/erlc_SUITE.erl +++ b/erts/test/erlc_SUITE.erl @@ -1188,7 +1188,7 @@ run_command(Dir, {win32, _}, Cmd) -> {BatchFile, Run, ["@echo off\r\n", - "set ERLC_EMULATOR=", ct:get_progname(), "\r\n", + "set ERLC_EMULATOR=", os:find_executable("erl"), "\r\n", Cmd, "\r\n", "if errorlevel 1 echo _ERROR_\r\n", "if not errorlevel 1 echo _OK_\r\n"]}; @@ -1197,7 +1197,7 @@ run_command(Dir, {unix, _}, Cmd) -> {Name, "/bin/sh " ++ Name, ["#!/bin/sh\n", - "ERLC_EMULATOR='", ct:get_progname(), "'\n", + "ERLC_EMULATOR='", os:find_executable("erl"), "'\n", "export ERLC_EMULATOR\n", Cmd, "\n", "case $? in\n", diff --git a/erts/test/otp_SUITE.erl b/erts/test/otp_SUITE.erl index d523a434f8e8..244f082ccd4b 100644 --- a/erts/test/otp_SUITE.erl +++ b/erts/test/otp_SUITE.erl @@ -228,7 +228,7 @@ call_to_size_1(Config) when is_list(Config) -> not_recommended_calls(Config, Apps, {erlang,size,1}). call_to_now_0(Config) when is_list(Config) -> - %% Forbid the use of erlang:now/1 in all applications except et. + %% Forbid the use of erlang:now/0 in all applications except et. Apps = all_otp_applications(Config) -- [et], not_recommended_calls(Config, Apps, {erlang,now,0}). diff --git a/erts/test/upgrade_SUITE.erl b/erts/test/upgrade_SUITE.erl index d73c5ce7b75c..f6120abc98b1 100644 --- a/erts/test/upgrade_SUITE.erl +++ b/erts/test/upgrade_SUITE.erl @@ -23,7 +23,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). -compile(export_all). diff --git a/lib/asn1/src/asn1ct_check.erl b/lib/asn1/src/asn1ct_check.erl index 772b417c6386..dd7c4a1a3a92 100644 --- a/lib/asn1/src/asn1ct_check.erl +++ b/lib/asn1/src/asn1ct_check.erl @@ -2294,9 +2294,10 @@ use_maps(#state{options=Opts}) -> lists:member(maps, Opts). create_map_value(Components, ListOfVals) -> - Zipped = lists:zip(Components, ListOfVals), - #{Name => V || {#'ComponentType'{name=Name},V} <- Zipped, - V =/= asn1_NOVALUE}. + #{Name => V || + #'ComponentType'{name=Name} <- Components && + V <- ListOfVals, + V =/= asn1_NOVALUE}. normalize_seq_or_set(SorS, S, [{#seqtag{val=Cname},V}|Vs], diff --git a/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl b/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl index 5c7ffc3556bd..efb29f231f3f 100644 --- a/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl +++ b/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl @@ -171,9 +171,9 @@ enc_match_input(#gen{pack=record}, ValName, CompList) -> enc_match_input(#gen{pack=map}, ValName, CompList) -> Len = length(CompList), Vars = [lists:concat(["Cindex",N]) || N <- lists:seq(1, Len)], - Zipped = lists:zip(CompList, Vars), M = [[{asis,Name},":=",Var] || - {#'ComponentType'{prop=mandatory,name=Name},Var} <- Zipped], + #'ComponentType'{prop=mandatory,name=Name} <- CompList && + Var <- Vars], case M of [] -> ok; @@ -181,7 +181,8 @@ enc_match_input(#gen{pack=map}, ValName, CompList) -> emit(["#{",lists:join(",", M),"} = ",ValName,com,nl]) end, Os0 = [{Name,Var} || - {#'ComponentType'{prop=Prop,name=Name},Var} <- Zipped, + #'ComponentType'{prop=Prop,name=Name} <- CompList && + Var <- Vars, Prop =/= mandatory], F = fun({Name,Var}) -> [Var," = case ",ValName," of\n" @@ -316,8 +317,8 @@ dec_external(#gen{pack=map}, _RecordName) -> Vars = asn1ct_name:all(term), Names = ['direct-reference','indirect-reference', 'data-value-descriptor',encoding], - Zipped = lists:zip(Names, Vars), - MapInit = lists:join(",", [["'",N,"'=>",{var,V}] || {N,V} <- Zipped]), + MapInit = lists:join(",", [["'",N,"'=>",{var,V}] || + N <- Names && V <- Vars]), emit(["OldFormat = #{",MapInit,"}",com,nl, "ASN11994Format =",nl, {call,ext,transform_to_EXTERNAL1994_maps, diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl index b57277b17090..c79e7f6d4c51 100644 --- a/lib/asn1/src/asn1ct_constructed_per.erl +++ b/lib/asn1/src/asn1ct_constructed_per.erl @@ -455,8 +455,8 @@ dec_external(#gen{pack=map}, _Typename) -> Vars = asn1ct_name:all(term), Names = ['direct-reference','indirect-reference', 'data-value-descriptor',encoding], - Zipped = lists:zip(Names, Vars), - MapInit = lists:join(",", [["'",N,"'=>",{var,V}] || {N,V} <- Zipped]), + MapInit = lists:join(",", [["'",N,"'=>",{var,V}] || + N <- Names && V <- Vars]), emit(["OldFormat = #{",MapInit,"}",com,nl, "ASN11994Format =",nl, {call,ext,transform_to_EXTERNAL1994_maps, diff --git a/lib/asn1/src/asn1ct_gen.erl b/lib/asn1/src/asn1ct_gen.erl index 213e4f5b829d..7ee834f37ed8 100644 --- a/lib/asn1/src/asn1ct_gen.erl +++ b/lib/asn1/src/asn1ct_gen.erl @@ -941,7 +941,7 @@ gen_info_functions(Gen) -> "legacy_erlang_types() -> ", {asis,asn1ct:use_legacy_types()},".",nl,nl]). -gen_decode_partial_incomplete(#gen{erule=ber}, NoOkWrapper) -> +gen_decode_partial_incomplete(#gen{erule=ber, options=Options}, NoOkWrapper) -> case {asn1ct:read_config_data(partial_incomplete_decode), asn1ct:get_gen_state_field(inc_type_pattern)} of {undefined,_} -> @@ -949,16 +949,25 @@ gen_decode_partial_incomplete(#gen{erule=ber}, NoOkWrapper) -> {_,undefined} -> ok; _ -> - emit(["decode_partial_incomplete(Type, Data0, Pattern) ->",nl, - " {Data,_RestBin} =",nl, - " ",{call,ber,decode_primitive_incomplete, - ["Pattern","Data0"]},com,nl]), - case NoOkWrapper of - true -> - emit([" decode_partial_inc_disp(Type, Data)",nl]); - false -> - emit([" try {ok,decode_partial_inc_disp(Type, Data)}",nl, - try_catch()]) + emit(["decode_partial_incomplete(Type, Data0, Pattern) ->",nl]), + case {NoOkWrapper, lists:member(undec_rest, Options)} of + {true, _} -> + emit([" {Data,_RestBin} =",nl, + " ",{call,ber,decode_primitive_incomplete, + ["Pattern","Data0"]},com,nl, + " decode_partial_inc_disp(Type, Data)",nl]); + {false, true} -> + emit([" {Data,RestBin} =",nl, + " ",{call,ber,decode_primitive_incomplete, + ["Pattern","Data0"]},com,nl, + " try {ok,decode_partial_inc_disp(Type, Data),RestBin}", + nl,try_catch()]); + {false, false} -> + emit([" {Data,RestBin} =",nl, + " ",{call,ber,decode_primitive_incomplete, + ["Pattern","Data0"]},com,nl, + " try {ok,decode_partial_inc_disp(Type, Data)}", + nl,try_catch()]) end, emit([".",nl,nl]), diff --git a/lib/asn1/test/Makefile b/lib/asn1/test/Makefile index 84f327ce45d2..a7e17a9e0acd 100644 --- a/lib/asn1/test/Makefile +++ b/lib/asn1/test/Makefile @@ -102,6 +102,7 @@ MODULES= \ testDER \ test_selective_decode \ test_special_decode_performance \ + test_exclusive_decode_rest \ testTCAP \ testSSLspecs \ testSelectionTypes \ diff --git a/lib/asn1/test/asn1_SUITE.erl b/lib/asn1/test/asn1_SUITE.erl index 11aa10eff945..c7889129f0ca 100644 --- a/lib/asn1/test/asn1_SUITE.erl +++ b/lib/asn1/test/asn1_SUITE.erl @@ -59,6 +59,7 @@ all() -> test_undecoded_rest, specialized_decodes, special_decode_performance, + exclusive_decode_rest, testMegaco, testConstraints, @@ -967,6 +968,13 @@ special_decode_performance(Config, Rule, Opts) -> asn1_test_lib:compile_all(Files, Config, [Rule, asn1config|Opts]), test_special_decode_performance:go(all). +exclusive_decode_rest(Config) -> + test(Config, fun exclusive_decode_rest/3, [ber]). +exclusive_decode_rest(Config, Rule, Opts) -> + asn1_test_lib:compile("SwCDR.py", Config, + [Rule, undec_rest, asn1config|Opts]), + test_exclusive_decode_rest:test(). + test_ParamTypeInfObj(Config) -> asn1_test_lib:compile("IN-CS-1-Datatypes", Config, [ber]). diff --git a/lib/asn1/test/asn1_SUITE_data/SwCDR.asn1config b/lib/asn1/test/asn1_SUITE_data/SwCDR.asn1config new file mode 100644 index 000000000000..a2c96c43e98c --- /dev/null +++ b/lib/asn1/test/asn1_SUITE_data/SwCDR.asn1config @@ -0,0 +1,6 @@ +{exclusive_decode, + {'SwCDR', + [{decode_cdr, + ['SwCDR', + [{origSvcCallRecord, undecoded}, + {termSvcCallRecord, undecoded}]]}]}}. diff --git a/lib/asn1/test/test_exclusive_decode_rest.erl b/lib/asn1/test/test_exclusive_decode_rest.erl new file mode 100644 index 000000000000..2e17643369ce --- /dev/null +++ b/lib/asn1/test/test_exclusive_decode_rest.erl @@ -0,0 +1,35 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% +-module(test_exclusive_decode_rest). +-export([test/0]). + +test() -> + {ok, CDR} = 'SwCDR':encode('SwCDR', {origSvcCallRecord, orig_cdr()}), + Bin = <>, + {ok, {origSvcCallRecord, _}, CDR} = 'SwCDR':decode_cdr(Bin). + +orig_cdr() -> + {'OrigSvcCallRecord', 1, 2, 3, <<145,65,97,85,21,50,244>>, + <<145,65,97,85,85,118,248>>, <<145,65,97,85,85,118,248>>, + <<2,0,2,4,1,0,0,5>>, <<2,0,3,2,4,5>>, 35000, 0, 0, 0, 3600, + 3600, 3600, 3600, 48, 48, 64, 64, 20, 20, 12, 12, 20, 20, + 4, 4, 1, 1, 3600, 3600, asn1_NOVALUE}. + diff --git a/lib/common_test/configure b/lib/common_test/configure index 4a1e3390e764..6532c0389f5f 100755 --- a/lib/common_test/configure +++ b/lib/common_test/configure @@ -1917,6 +1917,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi @@ -2041,6 +2052,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -2055,6 +2073,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -2069,6 +2094,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -2080,18 +2112,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -2102,6 +2135,11 @@ fi TARGET=$host + +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + ac_config_files="$ac_config_files priv/$host/Makefile:priv/Makefile.in" cat >confcache <<\_ACEOF diff --git a/lib/common_test/configure.ac b/lib/common_test/configure.ac index 490a64328d6f..4f08ae10d3f4 100644 --- a/lib/common_test/configure.ac +++ b/lib/common_test/configure.ac @@ -5,10 +5,14 @@ m4_include([otp.m4]) AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf]) +ERL_PUSH_WERROR + ERL_CANONICAL_SYSTEM_TYPE TARGET=$host AC_SUBST(TARGET) +ERL_POP_WERROR + AC_CONFIG_FILES([priv/$host/Makefile:priv/Makefile.in]) AC_OUTPUT diff --git a/lib/common_test/src/ct_config.erl b/lib/common_test/src/ct_config.erl index 215f0d01c88c..9fb56d5b8b03 100644 --- a/lib/common_test/src/ct_config.erl +++ b/lib/common_test/src/ct_config.erl @@ -594,7 +594,7 @@ encrypt_config_file(SrcFileName, EncryptFileName, {file,KeyFile}) -> end; encrypt_config_file(SrcFileName, EncryptFileName, {key,Key}) -> - _ = crypto:start(), + _ = application:start(crypto), {CryptoKey,IVec} = make_crypto_key(Key), case file:read_file(SrcFileName) of {ok,Bin0} -> @@ -633,7 +633,7 @@ decrypt_config_file(EncryptFileName, TargetFileName, {file,KeyFile}) -> end; decrypt_config_file(EncryptFileName, TargetFileName, {key,Key}) -> - _ = crypto:start(), + _ = application:start(crypto), {CryptoKey,IVec} = make_crypto_key(Key), case file:read_file(EncryptFileName) of {ok,Bin} -> diff --git a/lib/common_test/src/ct_property_test.erl b/lib/common_test/src/ct_property_test.erl index cc4a819e53b0..5b431312e10e 100644 --- a/lib/common_test/src/ct_property_test.erl +++ b/lib/common_test/src/ct_property_test.erl @@ -702,4 +702,3 @@ median(L = [{_Value,_Weight}|_]) -> median( lists:append([lists:duplicate(W,V) || {V,W} <- L]) ); median(_) -> undefined. - diff --git a/lib/common_test/src/ct_ssh.erl b/lib/common_test/src/ct_ssh.erl index 58bef59e4fd0..4ab1a08175c1 100644 --- a/lib/common_test/src/ct_ssh.erl +++ b/lib/common_test/src/ct_ssh.erl @@ -1340,7 +1340,7 @@ init(KeyOrName, {ConnType,Addr,Port}, AllOpts) -> end, [], AllOpts1), FinalOptions = [{silently_accept_hosts,true}, {user_interaction,false} | Options], - _ = crypto:start(), + _ = application:start(crypto), _ = ssh:start(), Result = case ConnType of ssh -> diff --git a/lib/common_test/src/test_server_ctrl.erl b/lib/common_test/src/test_server_ctrl.erl index e54fe32b8c21..193b0e80767f 100644 --- a/lib/common_test/src/test_server_ctrl.erl +++ b/lib/common_test/src/test_server_ctrl.erl @@ -101,6 +101,25 @@ -define(last_link, "last_link"). -define(last_test, "last_test"). -define(html_ext, ".html"). +-define(cover_html_stylesheet, + "\n"). -define(now, os:timestamp()). -define(void_fun, fun() -> ok end). @@ -5607,7 +5626,8 @@ analyse_modules(_Dir, [], _DetailsFun, Acc) -> %% Support functions for writing the cover logs (both cross and normal) write_coverlog_header(CoverLog) -> - case catch io:put_chars(CoverLog,html_header("Coverage results")) of + Style = [?cover_html_stylesheet], + case catch io:put_chars(CoverLog,html_header("Coverage results", Style)) of {'EXIT',Reason} -> io:format("\n\nERROR: Could not write normal heading in coverlog.\n" "CoverLog: ~tw\n" @@ -5657,7 +5677,8 @@ pc(Cov,NotCov) -> write_not_covered(CoverOut,M,Lines) -> - io:put_chars(CoverOut,html_header("Coverage results for "++atom_to_list(M))), + Style = [?cover_html_stylesheet], + io:put_chars(CoverOut,html_header("Coverage results for "++atom_to_list(M), Style)), io:fwrite(CoverOut, "The following lines in module ~w are not covered:\n" "\n" @@ -5734,12 +5755,12 @@ html_header(Title) -> "\n"]. -html_header(Title, Meta) -> +html_header(Title, Extra) -> ["\n" "\n" "\n" "\n" - "", Title, "\n"] ++ Meta ++ ["\n"]. + "", Title, "\n"] ++ Extra ++ ["\n"]. open_html_file(File) -> open_utf8_file(File). diff --git a/lib/common_test/src/test_server_node.erl b/lib/common_test/src/test_server_node.erl index 2f3d4871826e..93f687628ad4 100644 --- a/lib/common_test/src/test_server_node.erl +++ b/lib/common_test/src/test_server_node.erl @@ -25,7 +25,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). %% Test Controller interface -export([is_release_available/1, find_release/1]). diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl index ff0909d725bb..c0cf74f3bebf 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl @@ -137,7 +137,7 @@ init_per_suite(Config) -> end_per_suite(Config) -> ?NS:stop(?config(netconf_server,Config)), ssh:stop(), - crypto:stop(), + application:stop(crypto), Config. hello(Config) -> diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl index c641704b1083..06e3446e3d00 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl @@ -70,7 +70,7 @@ init_per_suite(Config) -> end_per_suite(Config) -> ssh:stop(), - crypto:stop(), + application:stop(crypto), Config. %% This test case is related to seq12645 diff --git a/lib/common_test/test_server/configure b/lib/common_test/test_server/configure index c2cde61897f3..b3a8b2e6986c 100755 --- a/lib/common_test/test_server/configure +++ b/lib/common_test/test_server/configure @@ -4745,7 +4745,7 @@ if test -n "$JAVAC"; then : fi -for ac_prog in make gmake +for ac_prog in gmake make do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 diff --git a/lib/common_test/test_server/configure.ac b/lib/common_test/test_server/configure.ac index 9012987e19c2..af2687f04949 100644 --- a/lib/common_test/test_server/configure.ac +++ b/lib/common_test/test_server/configure.ac @@ -498,7 +498,7 @@ if test -n "$JAVAC"; then : fi -AC_CHECK_PROGS([make_command], [make gmake], [false]) +AC_CHECK_PROGS([make_command], [gmake make], [false]) AC_SUBST(make_command) if test "$GCC" = yes; then diff --git a/lib/compiler/internal_doc/cerl-notes.md b/lib/compiler/internal_doc/cerl-notes.md index 705fe8f42d8c..02186e64af01 100644 --- a/lib/compiler/internal_doc/cerl-notes.md +++ b/lib/compiler/internal_doc/cerl-notes.md @@ -53,7 +53,7 @@ Thus, after inlining the function `t/0` will look like this: V. The problem here is that the inliner assumed that the bindings from -the first and second call to `cer_clauses:match/3` would be the same. +the first and second call to `cerl_clauses:match/3` would be the same. It used the empty bindings from the first call for the body. The correct way would be to add the bindings from the second call: diff --git a/lib/compiler/src/Makefile b/lib/compiler/src/Makefile index 50f4c2dc16a4..9b50016bb559 100644 --- a/lib/compiler/src/Makefile +++ b/lib/compiler/src/Makefile @@ -112,6 +112,7 @@ BEAM_H = $(wildcard ../priv/beam_h/*.h) HRL_FILES= \ beam_asm.hrl \ beam_disasm.hrl \ + beam_ssa_alias_debug.hrl \ beam_ssa_opt.hrl \ beam_ssa.hrl \ beam_types.hrl \ @@ -216,7 +217,8 @@ $(EBIN)/beam_jump.beam: beam_asm.hrl $(EBIN)/beam_listing.beam: core_parse.hrl beam_ssa.hrl \ beam_asm.hrl beam_types.hrl $(EBIN)/beam_ssa.beam: beam_ssa.hrl -$(EBIN)/beam_ssa_alias_opt.beam: beam_ssa_opt.hrl beam_types.hrl +$(EBIN)/beam_ssa_alias.beam: beam_ssa_opt.hrl beam_ssa_alias_debug.hrl \ + beam_types.hrl $(EBIN)/beam_ssa_bsm.beam: beam_ssa.hrl $(EBIN)/beam_ssa_bool.beam: beam_ssa.hrl $(EBIN)/beam_ssa_check.beam: beam_ssa.hrl beam_types.hrl @@ -229,7 +231,7 @@ $(EBIN)/beam_ssa_pp.beam: beam_ssa.hrl beam_types.hrl $(EBIN)/beam_ssa_pre_codegen.beam: beam_ssa.hrl beam_asm.hrl $(EBIN)/beam_ssa_recv.beam: beam_ssa.hrl $(EBIN)/beam_ssa_share.beam: beam_ssa.hrl -$(EBIN)/beam_ssa_ss.beam: beam_ssa.hrl beam_types.hrl +$(EBIN)/beam_ssa_ss.beam: beam_ssa.hrl beam_ssa_alias_debug.hrl beam_types.hrl $(EBIN)/beam_ssa_throw.beam: beam_ssa.hrl beam_types.hrl $(EBIN)/beam_ssa_type.beam: beam_ssa.hrl beam_types.hrl $(EBIN)/beam_trim.beam: beam_asm.hrl diff --git a/lib/compiler/src/beam_a.erl b/lib/compiler/src/beam_a.erl index ff21073db4ed..fc1c307e70a8 100644 --- a/lib/compiler/src/beam_a.erl +++ b/lib/compiler/src/beam_a.erl @@ -106,40 +106,6 @@ rename_instr({bif,Bif,Fail,[A,B],Dst}=I) -> _ -> I end; -rename_instr({bs_put_binary=I,F,Sz,U,Fl,Src}) -> - {bs_put,F,{I,U,Fl},[Sz,Src]}; -rename_instr({bs_put_float=I,F,Sz,U,Fl,Src}) -> - {bs_put,F,{I,U,Fl},[Sz,Src]}; -rename_instr({bs_put_integer=I,F,Sz,U,Fl,Src}) -> - {bs_put,F,{I,U,Fl},[Sz,Src]}; -rename_instr({bs_put_utf8=I,F,Fl,Src}) -> - {bs_put,F,{I,Fl},[Src]}; -rename_instr({bs_put_utf16=I,F,Fl,Src}) -> - {bs_put,F,{I,Fl},[Src]}; -rename_instr({bs_put_utf32=I,F,Fl,Src}) -> - {bs_put,F,{I,Fl},[Src]}; -rename_instr({bs_put_string,_,{string,String}}) -> - %% Only happens when compiling from .S files. In old - %% .S files, String is a list. In .S in OTP 22 and later, - %% String is a binary. - {bs_put,{f,0},{bs_put_binary,8,{field_flags,[unsigned,big]}}, - [{atom,all},{literal,iolist_to_binary([String])}]}; -rename_instr({bs_add=I,F,[Src1,Src2,U],Dst}) when is_integer(U) -> - {bif,I,F,[Src1,Src2,{integer,U}],Dst}; -rename_instr({bs_utf8_size=I,F,Src,Dst}) -> - {bif,I,F,[Src],Dst}; -rename_instr({bs_utf16_size=I,F,Src,Dst}) -> - {bif,I,F,[Src],Dst}; -rename_instr({bs_init2=I,F,Sz,Extra,Live,Flags,Dst}) -> - {bs_init,F,{I,Extra,Flags},Live,[Sz],Dst}; -rename_instr({bs_init_bits=I,F,Sz,Extra,Live,Flags,Dst}) -> - {bs_init,F,{I,Extra,Flags},Live,[Sz],Dst}; -rename_instr({bs_append=I,F,Sz,Extra,Live,U,Src,Flags,Dst}) -> - {bs_init,F,{I,Extra,U,Flags},Live,[Sz,Src],Dst}; -rename_instr({bs_private_append=I,F,Sz,U,Src,Flags,Dst}) -> - {bs_init,F,{I,U,Flags},none,[Sz,Src],Dst}; -rename_instr(bs_init_writable=I) -> - {bs_init,{f,0},I,1,[{x,0}],{x,0}}; rename_instr({put_map_assoc,Fail,S,D,R,L}) -> {put_map,Fail,assoc,S,D,R,L}; rename_instr({put_map_exact,Fail,S,D,R,L}) -> diff --git a/lib/compiler/src/beam_asm.erl b/lib/compiler/src/beam_asm.erl index 23673eace978..9f8c111c9743 100644 --- a/lib/compiler/src/beam_asm.erl +++ b/lib/compiler/src/beam_asm.erl @@ -73,7 +73,7 @@ assemble({Mod,Exp0,Attr0,Asm0,NumLabels}, ExtraChunks, CompileInfo, CompilerOpts Dict3 = reject_unsupported_versions(Dict2), NumFuncs = length(Asm0), {Asm,Attr} = on_load(Asm0, Attr0), - Exp = sets:from_list(Exp0, [{version, 2}]), + Exp = sets:from_list(Exp0), {Code,Dict} = assemble_1(Asm, Exp, Dict3, []), build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks, CompileInfo, CompilerOpts). @@ -81,7 +81,7 @@ assemble({Mod,Exp0,Attr0,Asm0,NumLabels}, ExtraChunks, CompileInfo, CompilerOpts reject_unsupported_versions(Dict) -> %% Emit an instruction that was added in our lowest supported %% version so that it cannot be loaded by earlier releases. - Instr = beam_opcodes:opcode(make_fun3, 3), %OTP 24 + Instr = beam_opcodes:opcode(bs_create_bin, 6), %OTP 25 beam_dict:opcode(Instr, Dict). on_load(Fs0, Attr0) -> @@ -137,8 +137,7 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks0, CompileInfo, Com Code), %% Create the atom table chunk. - {NumAtoms, AtomTab} = beam_dict:atom_table(Dict), - AtomChunk = chunk(<<"AtU8">>, <>, AtomTab), + AtomChunk = build_atom_table(CompilerOpts, Dict), %% Create the import table chunk. @@ -175,14 +174,7 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks0, CompileInfo, Com %% Create the literal table chunk. It is important not to build an empty chunk, %% as that would change the MD5. - LiteralChunk = case beam_dict:literal_table(Dict) of - {0,[]} -> []; - {NumLiterals,LitTab0} -> - LitTab1 = [<>,LitTab0], - LitTab = zlib:compress(LitTab1), - chunk(<<"LitT">>, <<(iolist_size(LitTab1)):32>>, - LitTab) - end, + LiteralChunk = build_literal_chunk(CompilerOpts, Dict), %% Create the line chunk. LineChunk = chunk(<<"Line">>, build_line_table(Dict, CompilerOpts)), @@ -215,7 +207,7 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks0, CompileInfo, Com %% Compile all extra chunks. - CheckedChunks = [chunk(Key, Value) || {Key, Value} <- ExtraChunks], + CheckedChunks = [chunk(Key, Value) || {Key, Value} <:- ExtraChunks], %% Create IFF chunk. @@ -287,6 +279,19 @@ build_attributes(Attr, Compile, MD5) -> CompileBinary = term_to_binary([{version,?COMPILER_VSN}|Compile]), {AttrBinary,CompileBinary}. +build_atom_table(Options, Dict) -> + {NumAtoms, AtomTab0} = beam_dict:atom_table(Dict), + case member(no_long_atoms, Options) of + false -> + %% Build an atom table for Erlang/OTP 28 and later. + AtomTab = [[encode(?tag_u, Len),Text] || [Len,Text] <:- AtomTab0], + chunk(<<"AtU8">>, <<-NumAtoms:32>>, AtomTab); + true -> + %% Build an atom table compatible with Erlang/OTP 27 + %% and earlier. + chunk(<<"AtU8">>, <>, AtomTab0) + end. + build_line_table(Dict, Options) -> {NumLineInstrs,NumFnames0,Fnames0,NumLines,Lines0,ExecLine} = beam_dict:line_table(Dict), @@ -322,6 +327,30 @@ encode_line_items([{F,L}|T], _) -> [encode(?tag_a, F),encode(?tag_i, L)|encode_line_items(T, F)]; encode_line_items([], _) -> []. +build_literal_chunk(Options, Dict) -> + case beam_dict:literal_table(Dict) of + {0,[]} -> + %% No literals. The literal chunk must be omitted. + []; + {NumLiterals,LitTab0} -> + LitTab1 = [<>,LitTab0], + case member(compressed_literals, Options) of + true -> + %% Erlang/OTP 27 and earlier. The word following + %% the chunk header is the size of the data + %% before compression. + LitTab = zlib:compress(LitTab1), + chunk(<<"LitT">>, <<(iolist_size(LitTab1)):32>>, + LitTab); + false -> + %% Erlang/OTP 28 and later. No compression, which + %% is indicated by the zero word following the + %% chunk header. (Zero is not a valid uncompressed + %% size because the literal chunk is only present + %% if there is at least one literal.) + chunk(<<"LitT">>, <<0:32>>, LitTab1) + end + end. %% %% If the attributes contains no 'vsn' attribute, we'll insert one %% with an MD5 "checksum" calculated on the code as its value. @@ -390,8 +419,6 @@ make_op({gc_bif,Bif,Fail,Live,Args,Dest}, Dict) -> 3 -> gc_bif3 end, encode_op(BifOp, [Fail,Live,{extfunc,erlang,Bif,Arity}|Args++[Dest]],Dict); -make_op({bs_add=Op,Fail,[Src1,Src2,Unit],Dest}, Dict) -> - encode_op(Op, [Fail,Src1,Src2,Unit,Dest], Dict); make_op({test,Cond,Fail,Src,{list,_}=Ops}, Dict) -> encode_op(Cond, [Fail,Src,Ops], Dict); make_op({test,Cond,Fail,Ops}, Dict) when is_list(Ops) -> diff --git a/lib/compiler/src/beam_call_types.erl b/lib/compiler/src/beam_call_types.erl index 1abf520acc01..e73f8a17d9a8 100644 --- a/lib/compiler/src/beam_call_types.erl +++ b/lib/compiler/src/beam_call_types.erl @@ -203,7 +203,7 @@ will_succeed(Mod, Func, Args) -> max_tuple_size(#t_union{tuple_set=[_|_]=Set}=Union) -> Union = meet(Union, #t_tuple{}), %Assertion. - Arities = [Arity || {{Arity, _Tag}, _Record} <- Set], + Arities = [Arity || {{Arity, _Tag}, _Record} <:- Set], lists:max(Arities); max_tuple_size(#t_tuple{exact=true,size=Size}) -> Size; diff --git a/lib/compiler/src/beam_clean.erl b/lib/compiler/src/beam_clean.erl index 55f907c1824c..5f8df45a0115 100644 --- a/lib/compiler/src/beam_clean.erl +++ b/lib/compiler/src/beam_clean.erl @@ -31,15 +31,13 @@ module({Mod,Exp,Attr,Fs0,_}, Opts) -> Fs1 = move_out_funs(Fs0), - Order = [Lbl || {function,_,_,Lbl,_} <- Fs1], - All = #{Lbl => Func || {function,_,_,Lbl,_}=Func <- Fs1}, + Order = [Lbl || {function,_,_,Lbl,_} <:- Fs1], + All = #{Lbl => Func || {function,_,_,Lbl,_}=Func <:- Fs1}, WorkList = rootset(Fs1, Exp, Attr), - Used = find_all_used(WorkList, All, sets:from_list(WorkList, [{version, 2}])), + Used = find_all_used(WorkList, All, sets:from_list(WorkList)), Fs2 = remove_unused(Order, Used, All), {Fs3,Lc} = clean_labels(Fs2), - Fs4 = fix_bs_create_bin(Fs3, Opts), - Fs5 = fix_badrecord(Fs4, Opts), - Fs = maybe_remove_lines(Fs5, Opts), + Fs = maybe_remove_lines(Fs3, Opts), {ok,{Mod,Exp,Attr,Fs,Lc}}. %% Determine the rootset, i.e. exported functions and @@ -51,7 +49,7 @@ rootset(Fs, Root0, Attr) -> [OnLoad] -> [OnLoad|Root0] end, Root = sofs:set(Root1, [function]), - Map0 = [{{Name,Arity},Lbl} || {function,Name,Arity,Lbl,_} <- Fs], + Map0 = [{{Name,Arity},Lbl} || {function,Name,Arity,Lbl,_} <:- Fs], Map = sofs:relation(Map0, [{function,label}]), sofs:to_external(sofs:image(Map, Root)). @@ -184,167 +182,6 @@ remove_lines_block([I|Is]) -> [I|remove_lines_block(Is)]; remove_lines_block([]) -> []. -%%% -%%% If compatibility with a previous release (OTP 24 or earlier) has -%%% been requested, eliminate bs_create_bin instructions by translating -%%% them to the old binary syntax instructions. -%%% - -fix_bs_create_bin(Fs, Opts) -> - case proplists:get_bool(no_bs_create_bin, Opts) of - false -> Fs; - true -> fold_functions(fun fix_bs_create_bin/1, Fs) - end. - -fix_bs_create_bin([{bs_create_bin,Fail,Alloc,Live,Unit,Dst,{list,List}}|Is]) -> - Tail = fix_bs_create_bin(Is), - Flags = {field_flags,[]}, - try bs_pre_size_calc(List) of - SizeCalc0 -> - SizeCalc = fold_size_calc(SizeCalc0, 0, []), - TmpDst = SizeReg = {x,Live}, - SizeIs0 = bs_size_calc(SizeCalc, Fail, SizeReg, {x,Live+1}), - SizeIs = [{move,{integer,0},SizeReg}|SizeIs0], - RestIs = bs_puts(List, Fail) ++ [{move,TmpDst,Dst}|Tail], - case List of - [{atom,append},_,_,_,Src|_] -> - SizeIs ++ [{bs_append,Fail,SizeReg,Alloc,Live+1,Unit,Src,Flags,TmpDst}|RestIs]; - [{atom,private_append},_,_,_,Src|_] -> - TestHeap = {test_heap,Alloc,Live+1}, - SizeIs ++ [TestHeap,{bs_private_append,Fail,SizeReg,Unit,Src,Flags,TmpDst}|RestIs]; - _ -> - SizeIs ++ [{bs_init_bits,Fail,SizeReg,Alloc,Live+1,Flags,TmpDst}|RestIs] - end - catch - throw:invalid_size -> - [{move,{atom,badarg},{x,0}}, - {call_ext_only,1,{extfunc,erlang,error,1}}|Tail] - end; -fix_bs_create_bin([I|Is]) -> - [I|fix_bs_create_bin(Is)]; -fix_bs_create_bin([]) -> []. - -bs_pre_size_calc([Type,_Seg,Unit,_Flags,Src,Size|Segs]) -> - case Type of - {atom,T} when T =:= append; T =:= private_append -> - bs_pre_size_calc(Segs); - _ -> - [bs_pre_size_calc_1(Type, Unit, Src, Size)|bs_pre_size_calc(Segs)] - end; -bs_pre_size_calc([]) -> []. - -bs_pre_size_calc_1({atom,Type}, Unit, Src, Size) -> - case {Unit,Size} of - {0,{atom,undefined}} -> - %% No size/unit given. - {8,case Type of - utf8 -> {{instr,bs_utf8_size},Src}; - utf16 -> {{instr,bs_utf16_size},Src}; - utf32 -> {term,{integer,4}} - end}; - {Unit,_} -> - case {Type,Size} of - {binary,{atom,all}} -> - case Unit rem 8 of - 0 -> {8,{{bif,byte_size},Src}}; - _ -> {1,{{bif,bit_size},Src}} - end; - {_,_} -> - ensure_valid_size(Size), - {Unit,{term,Size}} - end - end. - -ensure_valid_size({x,_}) -> ok; -ensure_valid_size({y,_}) -> ok; -ensure_valid_size({integer,Size}) when Size >= 0 -> ok; -ensure_valid_size(_) -> throw(invalid_size). - -fold_size_calc([{Unit,{term,{integer,Size}}}|T], Bits, Acc) -> - fold_size_calc(T, Bits + Unit*Size, Acc); -fold_size_calc([{Unit,{{bif,Bif},{literal,Lit}}}=H|T], Bits, Acc) -> - try erlang:Bif(Lit) of - Result -> - fold_size_calc([{Unit,{term,{integer,Result}}}|T], Bits, Acc) - catch - _:_ -> - fold_size_calc(T, Bits, [H|Acc]) - end; -fold_size_calc([{U,_}=H|T], Bits, Acc) when U =:= 1; U =:= 8 -> - fold_size_calc(T, Bits, [H|Acc]); -fold_size_calc([{U,Var}|T], Bits, Acc) -> - fold_size_calc(T, Bits, [{1,{'*',{term,{integer,U}},Var}}|Acc]); -fold_size_calc([], Bits, Acc) -> - Bytes = Bits div 8, - RemBits = Bits rem 8, - Sizes = [{1,{term,{integer,RemBits}}},{8,{term,{integer,Bytes}}}|Acc], - [Pair || {_,Sz}=Pair <- Sizes, Sz =/= {term,{integer,0}}]. - -bs_size_calc([{Unit,{{bif,Bif},Reg}}|T], Fail, SizeReg, TmpReg) -> - Live = element(2, SizeReg) + 1, - [{gc_bif,Bif,Fail,Live,[Reg],TmpReg}, - {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)]; -bs_size_calc([{Unit,{'*',{term,Term1},{term,Term2}}}|T], Fail, SizeReg, TmpReg) -> - Live = element(2, SizeReg) + 1, - [{gc_bif,'*',Fail,Live,[Term1,Term2],TmpReg}, - {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)]; -bs_size_calc([{Unit,{{instr,Instr},Reg}}|T], Fail, SizeReg, TmpReg) -> - [{Instr,Fail,Reg,TmpReg}, - {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)]; -bs_size_calc([{Unit,{term,Term}}|T], Fail, SizeReg, TmpReg) -> - [{bs_add,Fail,[SizeReg,Term,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)]; -bs_size_calc([], _Fail, _SizeReg, _TmpReg) -> []. - -bs_puts([{atom,string},_Seg,_Unit,_Flags,{string,_}=Str,{integer,Size}|Is], Fail) -> - [{bs_put_string,Size,Str}|bs_puts(Is, Fail)]; -bs_puts([{atom,append},_,_,_,_,_|Is], Fail) -> - bs_puts(Is, Fail); -bs_puts([{atom,private_append},_,_,_,_,_|Is], Fail) -> - bs_puts(Is, Fail); -bs_puts([{atom,Type},_Seg,Unit,Flags0,Src,Size|Is], Fail) -> - Op = case Type of - integer -> bs_put_integer; - float -> bs_put_float; - binary -> bs_put_binary; - utf8 -> bs_put_utf8; - utf16 -> bs_put_utf16; - utf32 -> bs_put_utf32 - end, - Flags = case Flags0 of - nil -> []; - {literal,Fs} -> Fs - end, - I = if - Unit =:= 0 -> - {bs_put,Fail,{Op,{field_flags,Flags}},[Src]}; - true -> - {bs_put,Fail,{Op,Unit,{field_flags,Flags}},[Size,Src]} - end, - [I|bs_puts(Is, Fail)]; -bs_puts([], _Fail) -> []. - -%%% -%%% If compatibility with a previous release (OTP 24 or earlier) has -%%% been requested, eliminate badrecord instructions by translating -%%% them to calls to error({badrecord,Value}). -%%% - -fix_badrecord(Fs, Opts) -> - case proplists:get_bool(no_badrecord, Opts) of - false -> Fs; - true -> fold_functions(fun fix_badrecord/1, Fs) - end. - -fix_badrecord([{badrecord,Value}|Is]) -> - [{move,Value,{x,0}}, - {test_heap,3,1}, - {put_tuple2,{x,0},{list,[{atom,badrecord},{x,0}]}}, - {call_ext_only,1,{extfunc,erlang,error,1}}|fix_badrecord(Is)]; -fix_badrecord([I|Is]) -> - [I|fix_badrecord(Is)]; -fix_badrecord([]) -> []. - - %%% %%% Helpers. %%% diff --git a/lib/compiler/src/beam_core_to_ssa.erl b/lib/compiler/src/beam_core_to_ssa.erl index a5243ededb59..d6beeb7bb440 100644 --- a/lib/compiler/src/beam_core_to_ssa.erl +++ b/lib/compiler/src/beam_core_to_ssa.erl @@ -67,8 +67,7 @@ map/2,mapfoldl/3,member/2, keyfind/3,keysort/2,last/1, partition/2,reverse/1,reverse/2, - sort/1,sort/2,splitwith/2, - zip/2]). + sort/1,sort/2,splitwith/2]). -import(ordsets, [add_element/2,del_element/2,intersection/2, subtract/2,union/2,union/1]). @@ -145,7 +144,7 @@ get_anno(#cg_select{anno=Anno}) -> Anno. fargs=[] :: [#b_var{}], %Arguments for current function vcount=0, %Variable counter fcount=0, %Fun counter - ds=sets:new([{version, 2}]) :: sets:set(), %Defined variables + ds=sets:new() :: sets:set(), %Defined variables funs=[], %Fun functions free=#{}, %Free variables ws=[] :: [warning()], %Warnings. @@ -169,8 +168,8 @@ module(#c_module{name=#c_literal{val=Mod},exports=Es,attrs=As,defs=Fs}, Options) -spec format_error(warning()) -> string() | binary(). format_error({nomatch,{shadow,Line}}) -> - M = io_lib:format(<<"this clause cannot match because a previous clause at line ~p " - "always matches">>, [Line]), + S = ~"this clause cannot match because a previous clause at line ~p matches the same pattern as this clause", + M = io_lib:format(S, [Line]), flatten(M); format_error({nomatch,shadow}) -> <<"this clause cannot match because a previous clause always matches">>; @@ -321,7 +320,7 @@ expr(#c_let{vars=Cvs,arg=Ca,body=Cb}, Sub0, St0) -> %% Break known multiple values into separate sets. Sets = case Ka of #ivalues{args=Kas} -> - [#iset{vars=[V],arg=Val} || {V,Val} <- zip(Kps, Kas)]; + [#iset{vars=[V],arg=Val} || V <- Kps && Val <- Kas]; _Other -> [#iset{vars=Kps,arg=Ka}] end, @@ -1451,7 +1450,7 @@ reorder_bin_ints(Cs0) -> %% * The patterns that follow are also safe to re-order. try Cs = sort([{reorder_bin_int_sort_key(C),C} || C <- Cs0]), - [C || {_,C} <- Cs] + [C || {_,C} <:- Cs] catch throw:not_possible -> Cs0 @@ -1502,12 +1501,46 @@ ensure_fixed_size(#cg_bin_end{}) -> %% At this point all the clauses have the same constructor; we must %% now separate them according to value. +match_value(Us0, cg_map=T, Cs0, Def, St0) -> + {Cs1,St1} = remove_unreachable(Cs0, St0), + {Us1,Cs2,St2} = partition_intersection(Us0, Cs1, St1), + do_match_value(Us1, T, Cs2, Def, St2); match_value(Us0, T, Cs0, Def, St0) -> - {Us1,Cs1,St1} = partition_intersection(T, Us0, Cs0, St0), - UCss = group_value(T, Us1, Cs1), - mapfoldl(fun ({Us,Cs}, St) -> match_clause(Us, Cs, Def, St) end, St1, UCss). + do_match_value(Us0, T, Cs0, Def, St0). + +do_match_value(Us0, T, Cs0, Def, St0) -> + UCss = group_value(T, Us0, Cs0), + mapfoldl(fun ({Us,Cs}, St) -> match_clause(Us, Cs, Def, St) end, St0, UCss). + +%% remove_unreachable([Clause], State) -> {[Clause],State} +%% Remove all clauses after a clause that will always match any +%% map. +remove_unreachable([#iclause{anno=Anno,pats=Pats,guard=G}=C|Cs0], St0) -> + maybe + %% Will the first pattern match any map? + [#cg_map{es=[]}|Ps] ?= Pats, + + %% Are all following pattern variables, which will always match? + true ?= all(fun(#b_var{}) -> true; + (_) -> false + end, Ps), + + %% Will the guard always succeed? + #c_literal{val=true} ?= G, + + %% This clause will always match. Warn and discard all clauses + %% that follow. + St1 = maybe_add_warning(Cs0, Anno, St0), + {[C],St1} + else + _ -> + {Cs,St} = remove_unreachable(Cs0, St0), + {[C|Cs],St} + end; +remove_unreachable([], St0) -> + {[],St0}. -%% partition_intersection(Type, Us, [Clause], State) -> {Us,Cs,State}. +%% partition_intersection(Us, [Clause], State) -> {Us,Cs,State}. %% Partition a map into two maps with the most common keys to the %% first map. %% @@ -1528,7 +1561,7 @@ match_value(Us0, T, Cs0, Def, St0) -> %% The intention is to group as many keys together as possible and %% thus reduce the number of lookups to that key. -partition_intersection(cg_map, [U|_]=Us, [_,_|_]=Cs0, St0) -> +partition_intersection([U|_]=Us, [_,_|_]=Cs0, St0) -> Ps = [clause_val(C) || C <- Cs0], case find_key_intersection(Ps) of none -> @@ -1540,7 +1573,7 @@ partition_intersection(cg_map, [U|_]=Us, [_,_|_]=Cs0, St0) -> end, Cs0), {[U|Us],Cs1,St0} end; -partition_intersection(_, Us, Cs, St) -> +partition_intersection(Us, Cs, St) -> {Us,Cs,St}. partition_keys(#cg_map{es=Pairs}=Map, Ks) -> @@ -1555,7 +1588,7 @@ partition_keys(#ialias{pat=Map}=Alias, Ks) -> {Map1,Alias#ialias{pat=Map2}}. find_key_intersection(Ps) -> - Sets = [sets:from_list(Ks, [{version, 2}]) || Ks <- Ps], + Sets = [sets:from_list(Ks) || Ks <- Ps], Intersection = sets:intersection(Sets), case sets:is_empty(Intersection) of true -> @@ -1658,7 +1691,7 @@ new_clauses(Cs, #b_var{name=U}) -> #cg_bin_int{next=N} -> [N|As]; #cg_map{op=exact,es=Es} -> - Vals = [V || #cg_map_pair{val=V} <- Es], + Vals = [V || #cg_map_pair{val=V} <:- Es], Vals ++ As; _Other -> As @@ -1768,7 +1801,7 @@ do_squeeze_clauses(Cs, Size, Count) when Count >= 16; Size =< 1 -> Cs; do_squeeze_clauses(Cs, Size, _Count) -> [C#iclause{pats=[squeeze_segments(P, Size)|Pats]} || - #iclause{pats=[P|Pats]}=C <- Cs]. + #iclause{pats=[P|Pats]}=C <:- Cs]. squeeze_segments(BinSeg, Size) -> squeeze_segments(BinSeg, 0, 0, Size). @@ -1885,7 +1918,7 @@ arg_val(Arg, C) -> %% Literals will sort before variables %% as intended. erts_internal:cmp_term(A, B) < 0 - end, [Key || #cg_map_pair{key=Key} <- Es]) + end, [Key || #cg_map_pair{key=Key} <:- Es]) end. %%% @@ -2726,6 +2759,10 @@ guard_cg(#cg_seq{arg=Arg,body=Body}, Fail, St0) -> {ArgIs,St1} = guard_cg(Arg, Fail, St0), {BodyIs,St} = guard_cg(Body, Fail, St1), {ArgIs++BodyIs,St}; +guard_cg(#cg_succeeded{set=Set0}, Fail, St0) -> + {[#b_set{dst=Dst}=Set],St1} = cg(Set0, St0), + {Is,St} = make_succeeded(Dst, {guard, Fail}, St1), + {[Set|Is],St}; guard_cg(G, _Fail, St) -> cg(G, St). diff --git a/lib/compiler/src/beam_dict.erl b/lib/compiler/src/beam_dict.erl index b9e1d0d142ef..51f144e40802 100644 --- a/lib/compiler/src/beam_dict.erl +++ b/lib/compiler/src/beam_dict.erl @@ -261,7 +261,7 @@ atom_table(#asm{atoms=Atoms}) -> {NumAtoms,[begin L = atom_to_binary(A, utf8), [byte_size(L),L] - end || {A,_} <- Sorted]}. + end || {A,_} <:- Sorted]}. %% Returns the table of local functions. %% local_table(Dict) -> {NumLocals, [{Function, Arity, Label}...]} @@ -283,7 +283,7 @@ export_table(#asm{exports = Exports}) -> import_table(#asm{imports=Imp,next_import=NumImports}) -> Sorted = lists:keysort(2, gb_trees:to_list(Imp)), - ImpTab = [MFA || {MFA,_} <- Sorted], + ImpTab = [MFA || {MFA,_} <:- Sorted], {NumImports,ImpTab}. -spec string_table(bdict()) -> {non_neg_integer(), binary()}. @@ -295,15 +295,15 @@ string_table(#asm{strings=Strings,string_offset=Size}) -> lambda_table(#asm{locals=Loc0,exports=Ext0,lambdas={NumLambdas,Lambdas0}}) -> Lambdas1 = sofs:relation(Lambdas0), - Loc = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <- Loc0]), - Ext = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <- Ext0]), + Loc = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <:- Loc0]), + Ext = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <:- Ext0]), All = sofs:union(Loc, Ext), Lambdas2 = sofs:relative_product1(Lambdas1, All), %% Initialize OldUniq to 0. It will be set to an unique value %% based on the MD5 checksum of the BEAM code for the module. OldUniq = 0, Lambdas = [<> || - {{Index,Lbl,NumFree},{F,A}} <- sofs:to_external(Lambdas2)], + {{Index,Lbl,NumFree},{F,A}} <:- sofs:to_external(Lambdas2)], {NumLambdas,Lambdas}. %% Returns the literal table. @@ -318,7 +318,7 @@ literal_table(#asm{literals=Tab,next_literal=NumLiterals}) -> [{Num,Lit}|Acc] end, [], Tab), L1 = lists:sort(L0), - L = [[<<(byte_size(Term)):32>>,Term] || {_,Term} <- L1], + L = [[<<(byte_size(Term)):32>>,Term] || {_,Term} <:- L1], {NumLiterals,L}. my_term_to_binary(Term) -> @@ -352,10 +352,10 @@ line_table(#asm{fnames=Fnames0,lines=Lines0, num_lines=NumLineInstrs,exec_line=ExecLine}) -> NumFnames = maps:size(Fnames0), Fnames1 = lists:keysort(2, maps:to_list(Fnames0)), - Fnames = [Name || {Name,_} <- Fnames1], + Fnames = [Name || {Name,_} <:- Fnames1], NumLines = maps:size(Lines0), Lines1 = lists:keysort(2, maps:to_list(Lines0)), - Lines = [L || {L,_} <- Lines1], + Lines = [L || {L,_} <:- Lines1], {NumLineInstrs,NumFnames,Fnames,NumLines,Lines,ExecLine}. %% Search for binary string Str in the binary string pool Pool. diff --git a/lib/compiler/src/beam_digraph.erl b/lib/compiler/src/beam_digraph.erl index 4a72dad4e193..663a6496fe26 100644 --- a/lib/compiler/src/beam_digraph.erl +++ b/lib/compiler/src/beam_digraph.erl @@ -30,13 +30,15 @@ -export([new/0, add_vertex/2, add_vertex/3, add_edge/3, add_edge/4, del_edge/2, del_edges/2, + del_vertex/2, + edges/1, foldv/3, has_vertex/2, is_path/3, in_degree/2, in_edges/2, in_neighbours/2, no_vertices/1, out_degree/2, out_edges/2, out_neighbours/2, - vertex/2, vertices/1, + vertex/2, vertex/3, vertices/1, reverse_postorder/2, roots/1, topsort/1, @@ -76,6 +78,18 @@ add_vertex(Dg, V, Label) -> Vs = Vs0#{V=>Label}, Dg#dg{vs=Vs}. +-spec del_vertex(graph(), vertex()) -> graph(). +del_vertex(Dg, V) -> + #dg{vs=Vs0,in_es=InEsMap0,out_es=OutEsMap0} = Dg, + InEs = maps:get(V, InEsMap0, []), + OutEsMap = foldl(fun({From,_,_}=E, A) -> edge_map_del(From, E, A) end, + maps:remove(V, OutEsMap0), InEs), + OutEs = maps:get(V, OutEsMap0, []), + InEsMap = foldl(fun({_,To,_}=E, A) -> edge_map_del(To, E, A) end, + maps:remove(V, InEsMap0), OutEs), + Vs = maps:remove(V, Vs0), + Dg#dg{vs=Vs,in_es=InEsMap,out_es=OutEsMap}. + -spec add_edge(graph(), vertex(), vertex()) -> graph(). add_edge(Dg, From, To) -> add_edge(Dg, From, To, edge). @@ -128,11 +142,11 @@ in_edges(#dg{in_es=InEsMap}, V) -> -spec in_neighbours(graph(), vertex()) -> [vertex()]. in_neighbours(#dg{in_es=InEsMap}, V) -> - [From || {From,_,_} <- maps:get(V, InEsMap, [])]. + [From || {From,_,_} <:- maps:get(V, InEsMap, [])]. -spec is_path(graph(), vertex(), vertex()) -> boolean(). is_path(G, From, To) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), try _ = is_path_1([From], To, G, Seen), false @@ -166,7 +180,7 @@ out_edges(#dg{out_es=OutEsMap}, V) -> -spec out_neighbours(graph(), vertex()) -> [vertex()]. out_neighbours(#dg{out_es=OutEsMap}, V) -> - [To || {_,To,_} <- maps:get(V, OutEsMap, [])]. + [To || {_,To,_} <:- maps:get(V, OutEsMap, [])]. -spec no_vertices(graph()) -> non_neg_integer(). no_vertices(#dg{vs=Vs}) -> @@ -176,13 +190,19 @@ no_vertices(#dg{vs=Vs}) -> vertex(#dg{vs=Vs}, V) -> map_get(V, Vs). +%% As vertex/2 but if the vertex does not exist a default value is +%% returned. +-spec vertex(graph(), vertex(), label()) -> label(). +vertex(#dg{vs=Vs}, V, Default) -> + maps:get(V, Vs, Default). + -spec vertices(graph()) -> [{vertex(), label()}]. vertices(#dg{vs=Vs}) -> maps:to_list(Vs). -spec reverse_postorder(graph(), [vertex()]) -> [vertex()]. reverse_postorder(G, Vs) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), {RPO, _} = reverse_postorder_1(Vs, G, Seen, []), RPO. @@ -217,6 +237,12 @@ topsort(G) -> Seen = roots(G), reverse_postorder(G, Seen). +-spec edges(graph()) -> [edge()]. +edges(#dg{out_es=OutEsMap}) -> + maps:fold(fun(_, Es, Acc) -> + Es ++ Acc + end, [], OutEsMap). + %% %% Kosaraju's algorithm %% diff --git a/lib/compiler/src/beam_disasm.erl b/lib/compiler/src/beam_disasm.erl index 7195b9416069..dd63a7e058f3 100644 --- a/lib/compiler/src/beam_disasm.erl +++ b/lib/compiler/src/beam_disasm.erl @@ -191,8 +191,11 @@ process_chunks(F) -> Atoms = mk_atoms(AtomsList), LambdaBin = optional_chunk(F, "FunT"), Lambdas = beam_disasm_lambdas(LambdaBin, Atoms), - LiteralBin = optional_chunk(F, "LitT"), - Literals = beam_disasm_literals(LiteralBin), + Literals1 = case optional_chunk(F, literals) of + none -> []; + Literals0 -> Literals0 + end, + Literals = gb_trees:from_orddict(Literals1), TypeBin = optional_chunk(F, "Type"), Types = beam_disasm_types(TypeBin), Code = beam_disasm_code(CodeBin, Atoms, mk_imports(ImportsList), @@ -244,21 +247,6 @@ disasm_lambdas(<>, [{OldIndex,Info}|disasm_lambdas(More, Atoms, OldIndex+1)]; disasm_lambdas(<<>>, _, _) -> []. -%%----------------------------------------------------------------------- -%% Disassembles the literal table (constant pool) of a BEAM file. -%%----------------------------------------------------------------------- - --spec beam_disasm_literals('none' | binary()) -> literals(). - -beam_disasm_literals(none) -> none; -beam_disasm_literals(<<_:32,Compressed/binary>>) -> - <<_:32,Tab/binary>> = zlib:uncompress(Compressed), - gb_trees:from_orddict(disasm_literals(Tab, 0)). - -disasm_literals(<>, Index) -> - [{Index,binary_to_term(Ext)}|disasm_literals(T, Index+1)]; -disasm_literals(<<>>, _) -> []. - %%----------------------------------------------------------------------- %% Disassembles the type table of a BEAM file. %%----------------------------------------------------------------------- @@ -307,7 +295,7 @@ beam_disasm_code(<<_SS:32, % Sub-Size (length of information before code) [function__code_update(Function, resolve_names(Is, Imports, Str, Labels, Lambdas, Literals, M)) - || Function = #function{code=Is} <- Functions] + || Function = #function{code=Is} <:- Functions] catch error:Rsn -> ?NO_DEBUG('code disassembling failed: ~p~n', [Rsn]), @@ -1410,7 +1398,8 @@ decode_field_flags(FieldFlags) when is_integer(FieldFlags) -> %%----------------------------------------------------------------------- mk_imports(ImportList) -> - gb_trees:from_orddict([{I,{extfunc,M,F,A}} || {I,M,F,A} <- ImportList]). + gb_trees:from_orddict([{I,{extfunc,M,F,A}} || + {I,M,F,A} <:- ImportList]). mk_atoms(AtomList) -> gb_trees:from_orddict(AtomList). diff --git a/lib/compiler/src/beam_doc.erl b/lib/compiler/src/beam_doc.erl index a9a9d31abce7..4f2aecf7753e 100644 --- a/lib/compiler/src/beam_doc.erl +++ b/lib/compiler/src/beam_doc.erl @@ -57,12 +57,15 @@ opts :: [opt()], module :: module(), + anno = none :: none | erl_anno:anno(), deprecated = #{} :: map(), docformat = ?DEFAULT_FORMAT :: binary(), moduledoc = {?DEFAULT_MODULE_DOC_LOC, none} :: {integer() | erl_anno:anno(), none | map() | hidden}, moduledoc_meta = none :: none | #{ _ := _ }, + behaviours = [] :: list(module()), + %% If the module has any documentation attributes at all. %% If it does not and no documentation related options are %% passed, then we don't generate a doc chunk. @@ -130,7 +133,7 @@ %% documentation text, etc. %% %% one cannot rely on the fields below to keep track of documentation, - %% as Erlang allows pretty unstructure code. + %% as Erlang allows pretty unstructured code. %% %% e.g., %% @@ -143,7 +146,7 @@ %% -doc foo() -> ok. %% %% thus, after reading a terminal AST node (spec, type, fun declaration, opaque, callback), - %% the intermediate state saveed in the fields below needs to be + %% the intermediate state saved in the fields below needs to be %% saved in the `docs` field. hidden_status = none :: none | hidden, @@ -185,7 +188,7 @@ %% Stateful, need to be fixed as docs. meta = #{exported => false} :: map(), - %% on analysing the AST, and upon finding a spec of a exported + %% on analyzing the AST, and upon finding a spec of a exported %% function, the types from the spec are added to the field %% below. if the function to which the spec belongs to is hidden, %% we purge types from this field. if the function to which the @@ -244,10 +247,15 @@ main(Dirname, Filename, AST, CmdLineOpts) -> if State1#docs.has_docs orelse Opts =/= [] -> Docs = extract_documentation(AST, State1), {ModuleDocAnno, ModuleDoc} = Docs#docs.moduledoc, + Behaviours = lists:sort(Docs#docs.behaviours), + Metadata0 = maps:merge(Docs#docs.moduledoc_meta, #{ + source_anno => Docs#docs.anno, + behaviours => Behaviours}), + Metadata = maybe_add_source_path_meta(Metadata0, Docs, CmdLineOpts), DocV1 = #docs_v1{}, Result = DocV1#docs_v1{ format = Docs#docs.docformat, anno = ModuleDocAnno, - metadata = Docs#docs.moduledoc_meta, + metadata = Metadata, module_doc = ModuleDoc, docs = process_docs(Docs) }, {ok, Result, Docs#docs.warnings }; @@ -255,6 +263,16 @@ main(Dirname, Filename, AST, CmdLineOpts) -> {error, no_docs} end. +maybe_add_source_path_meta(Metadata, Docs, CmdLineOpts) -> + case lists:member(deterministic, CmdLineOpts) of + true -> + Metadata; + false -> + Dir = filename:absname(Docs#docs.cwd), + SourcePath = filename:join(Dir, Docs#docs.filename), + Metadata#{source_path => SourcePath} + end. + extract_opts(AST, CmdLineOpts) -> CompileOpts = lists:flatten([C || {attribute,_,compile,C} <- AST]), NormalizedOpts = normalize_warn_missing_doc(CmdLineOpts ++ CompileOpts), @@ -321,6 +339,7 @@ preprocessing(AST, State) -> fun extract_exported_funs/2, fun extract_file/2, fun extract_record/2, + fun extract_behaviours/2, fun extract_hidden_types0/2, fun extract_type_defs0/2, fun extract_type_dependencies/2], @@ -363,8 +382,8 @@ extract_deprecated(_, State) -> extract_exported_types0({attribute,_ANNO,export_type,ExportedTypes}, State) -> update_export_types(State, ExportedTypes); -extract_exported_types0({attribute,_ANNO,module, Module}, State) -> - State#docs{ module = Module }; +extract_exported_types0({attribute,Anno,module, Module}, State) -> + State#docs{ module = Module, anno = Anno }; extract_exported_types0({attribute,_ANNO,compile, export_all}, State) -> update_export_all(State, true); extract_exported_types0(_AST, State) -> @@ -437,27 +456,27 @@ track_documentation({attribute, Anno, doc, Doc}, State) when is_binary(Doc) -> track_documentation(_, State) -> State. -upsert_documentation_from_terminal_item({function, _Anno, F, Arity, _}, State) -> - upsert_documentation(function, F, Arity, State); -upsert_documentation_from_terminal_item({attribute, _Anno, TypeOrOpaque, {TypeName, _TypeDef, TypeArgs}},State) +upsert_documentation_from_terminal_item({function, Anno, F, Arity, _}, State) -> + upsert_documentation(function, F, Arity, Anno, State); +upsert_documentation_from_terminal_item({attribute, Anno, TypeOrOpaque, {TypeName, _TypeDef, TypeArgs}},State) when TypeOrOpaque =:= type; TypeOrOpaque =:= opaque -> Arity = length(fun_to_varargs(TypeArgs)), - upsert_documentation(type, TypeName, Arity, State); -upsert_documentation_from_terminal_item({attribute, _Anno, callback, {{CB, Arity}, _Form}}, State) -> - upsert_documentation(callback, CB, Arity, State); + upsert_documentation(type, TypeName, Arity, Anno, State); +upsert_documentation_from_terminal_item({attribute, Anno, callback, {{CB, Arity}, _Form}}, State) -> + upsert_documentation(callback, CB, Arity, Anno, State); upsert_documentation_from_terminal_item(_, State) -> State. -upsert_documentation(Tag, Name, Arity, State) when Tag =:= function; - Tag =:= type; - Tag =:= opaque; - Tag =:= callback -> +upsert_documentation(Tag, Name, Arity, Anno, State) when Tag =:= function; + Tag =:= type; + Tag =:= opaque; + Tag =:= callback -> Docs = State#docs.docs, State1 = case maps:get({Tag, Name, Arity}, Docs, none) of none -> Status = State#docs.doc_status, Doc = State#docs.doc, - Meta = State#docs.meta, + Meta = (State#docs.meta)#{source_anno => Anno}, State#docs{docs = Docs#{{Tag, Name, Arity} => {Status, Doc, Meta}}}; {Status, Documentation, Meta} -> Status1 = upsert_state(Status, State#docs.doc_status), @@ -539,6 +558,11 @@ extract_record({attribute, Anno, record, {Name, Fields}}, State) -> extract_record(_, State) -> State. +extract_behaviours({attribute, _Anno, behaviour, Behaviour}, State) -> + State#docs{ behaviours = [Behaviour | State#docs.behaviours] }; +extract_behaviours(_, State) -> + State. + %% %% Extracts types with documentation attribute set to `hidden` or `false`. %% diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl index fbd241a98474..3a213ed440f7 100644 --- a/lib/compiler/src/beam_jump.erl +++ b/lib/compiler/src/beam_jump.erl @@ -408,7 +408,7 @@ share_1([I|Is], Safe, Dict, Lbls, Seq, Acc) -> share_1(Is, Safe, Dict, Lbls, [I], Acc) end. -unambigous_deallocation([{bs_init,_,bs_init_writable,_,_,_}|Is]) -> +unambigous_deallocation([bs_init_writable|Is]) -> %% beam_validator requires that the size of the stack frame is %% unambigously known when certain instructions are used. %% @@ -429,7 +429,7 @@ unambigous_deallocation([]) -> find_deallocation([{block,_}|Is]) -> find_deallocation(Is); -find_deallocation([{bs_init,_,bs_init_writable,_,_,_}|Is]) -> +find_deallocation([bs_init_writable|Is]) -> find_deallocation(Is); find_deallocation([{call,_,_}|Is]) -> find_deallocation(Is); @@ -847,7 +847,7 @@ initial_labels([{line,_}|Is], Acc) -> initial_labels([{label,Lbl}|Is], Acc) -> initial_labels(Is, [Lbl|Acc]); initial_labels([{func_info,_,_,_},{label,Lbl}|_], Acc) -> - sets:from_list([Lbl|Acc], [{version, 2}]). + sets:from_list([Lbl|Acc]). drop_upto_label([{label,_}|_]=Is) -> Is; drop_upto_label([_|Is]) -> drop_upto_label(Is); @@ -937,10 +937,6 @@ instr_labels({gc_bif,_Name,Lbl,_Live,_As,_R}) -> do_instr_labels(Lbl); instr_labels({bs_create_bin,Lbl,_,_,_,_,_}) -> do_instr_labels(Lbl); -instr_labels({bs_init,Lbl,_,_,_,_}) -> - do_instr_labels(Lbl); -instr_labels({bs_put,Lbl,_,_}) -> - do_instr_labels(Lbl); instr_labels({put_map,Lbl,_Op,_Src,_Dst,_Live,_List}) -> do_instr_labels(Lbl); instr_labels({get_map_elements,Lbl,_Src,_List}) -> diff --git a/lib/compiler/src/beam_ssa.erl b/lib/compiler/src/beam_ssa.erl index f9ce67442f74..1773ada4b458 100644 --- a/lib/compiler/src/beam_ssa.erl +++ b/lib/compiler/src/beam_ssa.erl @@ -38,6 +38,7 @@ merge_blocks/2, normalize/1, no_side_effect/1, + can_be_guard_bif/3, predecessors/1, rename_vars/3, rpo/1,rpo/2, @@ -234,6 +235,19 @@ no_side_effect(#b_set{op=Op}) -> _ -> false end. +-spec can_be_guard_bif(atom(), atom(), integer()) -> boolean(). + +can_be_guard_bif(M, F, A) -> + case {M,F,A} of + {erlang, binary_to_atom, 2} -> true; + {erlang, binary_to_existing_atom, 2} -> true; + {erlang, list_to_atom, 1} -> true; + {erlang, list_to_existing_atom, 1} -> true; + {_,_,_} -> false + end. + + + %% insert_on_edges(Insertions, BlockMap, Count) -> {BlockMap, Count}. %% Inserts instructions on the specified normal edges. It will not work on %% exception edges. @@ -293,7 +307,7 @@ insert_on_edges_1([], Blocks, Count) -> insert_on_edges_reroute(#b_switch{fail=Fail0,list=List0}=Sw, Old, New) -> Fail = rename_label(Fail0, Old, New), - List = [{Value, rename_label(Dst, Old, New)} || {Value, Dst} <- List0], + List = [{Value, rename_label(Dst, Old, New)} || {Value, Dst} <:- List0], Sw#b_switch{fail=Fail,list=List}; insert_on_edges_reroute(#b_br{succ=Succ0,fail=Fail0}=Br, Old, New) -> Succ = rename_label(Succ0, Old, New), @@ -358,7 +372,7 @@ successors(#b_blk{last=Terminator}) -> #b_br{succ=Succ,fail=Fail} -> [Fail,Succ]; #b_switch{fail=Fail,list=List} -> - [Fail|[L || {_,L} <- List]]; + [Fail|[L || {_,L} <:- List]]; #b_ret{} -> [] end. @@ -460,7 +474,7 @@ def(Ls, Blocks) when is_map(Blocks) -> def_unused(Ls, Unused, Blocks) when is_map(Blocks) -> Blks = [map_get(L, Blocks) || L <- Ls], - Preds = sets:from_list(Ls, [{version, 2}]), + Preds = sets:from_list(Ls), def_unused_1(Blks, Preds, [], Unused). %% dominators(Labels, BlockMap) -> {Dominators,Numbering}. @@ -625,7 +639,7 @@ fold_blocks(Fun, Labels, Acc0, Blocks) when is_map(Blocks) -> Linear :: [{label(),b_blk()}]. linearize(Blocks) when is_map(Blocks) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), {Linear0,_} = linearize_1([0], Blocks, Seen, []), Linear = fix_phis(Linear0, #{}), Linear. @@ -643,7 +657,7 @@ rpo(Blocks) -> Labels :: [label()]. rpo(From, Blocks) when is_map(Blocks) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), {Ls,_} = rpo_1(From, Blocks, Seen, []), Ls. @@ -667,7 +681,7 @@ between(From, To, Preds, Blocks) when is_map(Preds), is_map(Blocks) -> %% gathering once seen since we're only interested in the blocks in between. %% Uninteresting blocks can still be added if `From` doesn't dominate `To`, %% but that has no effect on the final result. - Filter = between_make_filter([To], Preds, sets:from_list([From], [{version, 2}])), + Filter = between_make_filter([To], Preds, sets:from_list([From])), {Paths, _} = between_rpo([From], Blocks, Filter, []), Paths. @@ -678,7 +692,7 @@ between(From, To, Preds, Blocks) when is_map(Preds), is_map(Blocks) -> rename_vars(Rename, Labels, Blocks) when is_list(Rename) -> rename_vars(maps:from_list(Rename), Labels, Blocks); rename_vars(Rename, Labels, Blocks) when is_map(Rename), is_map(Blocks) -> - Preds = sets:from_list(Labels, [{version, 2}]), + Preds = sets:from_list(Labels), F = fun(#b_set{op=phi,args=Args0}=Set) -> Args = rename_phi_vars(Args0, Preds, Rename), normalize(Set#b_set{args=Args}); @@ -696,8 +710,10 @@ rename_vars(Rename, Labels, Blocks) when is_map(Rename), is_map(Blocks) -> %% split_blocks(Labels, Predicate, Blocks0, Count0) -> {Blocks,Count}. %% Call Predicate(Instruction) for each instruction in the given -%% blocks. If Predicate/1 returns true, split the block -%% before this instruction. +%% blocks. If Predicate/1 returns true, split the block before this +%% instruction. Note that this function won't create a new empty +%% block if the predicate returns true for the first instruction in a +%% block. -spec split_blocks(Labels, Pred, Blocks0, Count0) -> {Blocks,Count} when Labels :: [label()], @@ -724,7 +740,7 @@ trim_unreachable(Blocks) when is_map(Blocks) -> %% Could perhaps be optimized if there is any need. maps:from_list(linearize(Blocks)); trim_unreachable([_|_]=Blocks) -> - trim_unreachable_1(Blocks, sets:from_list([0], [{version, 2}])). + trim_unreachable_1(Blocks, sets:from_list([0])). -spec used(b_blk() | b_set() | terminator()) -> [b_var()]. @@ -941,7 +957,7 @@ fix_phis([{L,Blk0}|Bs], S) -> fix_phis([], _) -> []. fix_phis_1([#b_set{op=phi,args=Args0}=I|Is], L, S) -> - Args = [{Val,Pred} || {Val,Pred} <- Args0, + Args = [{Val,Pred} || {Val,Pred} <:- Args0, is_successor(L, Pred, S)], [I#b_set{args=Args}|fix_phis_1(Is, L, S)]; fix_phis_1(Is, _, _) -> Is. @@ -968,7 +984,7 @@ trim_unreachable_1([{L,Blk0}|Bs], Seen0) -> Seen = sets:add_element(Next, Seen0), [{L,Blk}|trim_unreachable_1(Bs, Seen)]; [_|_]=Successors -> - Seen = sets:union(Seen0, sets:from_list(Successors, [{version, 2}])), + Seen = sets:union(Seen0, sets:from_list(Successors)), [{L,Blk}|trim_unreachable_1(Bs, Seen)] end end; @@ -980,7 +996,7 @@ trim_phis(#b_blk{is=[#b_set{op=phi}|_]=Is0}=Blk, Seen) -> trim_phis(Blk, _Seen) -> Blk. trim_phis_1([#b_set{op=phi,args=Args0}=I|Is], Seen) -> - Args = [P || {_,L}=P <- Args0, sets:is_element(L, Seen)], + Args = [P || {_,L}=P <:- Args0, sets:is_element(L, Seen)], [I#b_set{args=Args}|trim_phis_1(Is, Seen)]; trim_phis_1(Is, _Seen) -> Is. @@ -1093,7 +1109,7 @@ split_blocks_is([I|Is], P, Acc) -> split_blocks_is([], _, _) -> no. update_phi_labels_is([#b_set{op=phi,args=Args0}=I0|Is], Old, New) -> - Args = [{Arg,rename_label(Lbl, Old, New)} || {Arg,Lbl} <- Args0], + Args = [{Arg,rename_label(Lbl, Old, New)} || {Arg,Lbl} <:- Args0], I = I0#b_set{args=Args}, [I|update_phi_labels_is(Is, Old, New)]; update_phi_labels_is(Is, _, _) -> Is. diff --git a/lib/compiler/src/beam_ssa_alias.erl b/lib/compiler/src/beam_ssa_alias.erl index 2a52c32e77bb..e5e79b8e2eb4 100644 --- a/lib/compiler/src/beam_ssa_alias.erl +++ b/lib/compiler/src/beam_ssa_alias.erl @@ -32,15 +32,16 @@ -include("beam_ssa_opt.hrl"). -include("beam_types.hrl"). +-include("beam_ssa_alias_debug.hrl"). -%% Uncomment the following to get trace printouts. - -%% -define(DEBUG, true). - --ifdef(DEBUG). +-ifdef(DEBUG_ALIAS). -define(DP(FMT, ARGS), io:format(FMT, ARGS)). -define(DP(FMT), io:format(FMT)). -define(DBG(STMT), STMT). + +fn(#b_local{name=#b_literal{val=N},arity=A}) -> + io_lib:format("~p/~p", [N, A]). + -else. -define(DP(FMT, ARGS), skip). -define(DP(FMT), skip). @@ -56,25 +57,41 @@ kills :: kills_map(), st_map :: st_map(), orig_st_map :: st_map(), - repeats = sets:new([{version,2}]) :: sets:set(func_id()), + repeats = sets:new() :: sets:set(func_id()), %% The next unused variable name in caller cnt = 0 :: non_neg_integer(), + %% Functions which have been analyzed at least once. + analyzed = sets:new() :: sets:set(func_id()), + run_count = #{} :: #{ func_id() => non_neg_integer() }, + prune_strategy = #{} :: #{ func_id() => + #{beam_ssa:label() => + 'add' | 'del'} }, forced_aliases :: #{ func_id() => var_set() } }). --type var_set() :: sets:set(#b_var{}). - %% A code location refering to either the #b_set{} defining a variable %% or the terminator of a block. -type kill_loc() :: #b_var{} | {terminator, beam_ssa:label()} - | {live_outs, beam_ssa:label()}. + | {live_outs, beam_ssa:label()} + | {killed_in_block, beam_ssa:label()}. + +-type var_set() :: sets:set(#b_var{}). %% Map a code location to the set of variables which die at that %% location. --type kill_set() :: #{ kill_loc() => sets:set(#b_var{}) }. +-type kill_set() :: #{ kill_loc() => var_set() }. + +%% Map a label to the set of variables which are live in to that block. +-type live_in_set() :: #{ beam_ssa:label() => var_set() }. + +%% Map a flow-control edge to the set of variables which are live in +%% to the destination block due to phis. +-type phi_live_set() :: #{ {beam_ssa:label(), beam_ssa:label()} => var_set() }. --type kills_map() :: #{ func_id() => kill_set() }. +-type kills_map() :: #{ func_id() => {live_in_set(), + kill_set(), + phi_live_set()} }. -type alias_map() :: #{ func_id() => lbl2ss() }. @@ -132,7 +149,7 @@ opt(StMap0, FuncDb0) -> killsets(Funs, StMap) -> OptStates = [{F,map_get(F, StMap)} || F <- Funs], - #{ F=>killsets_fun(reverse(SSA)) || {F,#opt_st{ssa=SSA}} <- OptStates }. + #{ F=>killsets_fun(reverse(SSA)) || {F,#opt_st{ssa=SSA}} <:- OptStates }. killsets_fun(Blocks) -> %% Pre-calculate the live-ins due to Phi-instructions. @@ -142,19 +159,19 @@ killsets_fun(Blocks) -> killsets_blks([{Lbl,Blk}|Blocks], LiveIns0, Kills0, PhiLiveIns) -> {LiveIns,Kills} = killsets_blk(Lbl, Blk, LiveIns0, Kills0, PhiLiveIns), killsets_blks(Blocks, LiveIns, Kills, PhiLiveIns); -killsets_blks([], _LiveIns, Kills, _PhiLiveIns) -> - Kills. +killsets_blks([], LiveIns, Kills, PhiLiveIns) -> + {LiveIns,Kills,PhiLiveIns}. killsets_blk(Lbl, #b_blk{is=Is0,last=L}=Blk, LiveIns0, Kills0, PhiLiveIns) -> Successors = beam_ssa:successors(Blk), Live1 = killsets_blk_live_outs(Successors, Lbl, LiveIns0, PhiLiveIns), Kills1 = Kills0#{{live_outs,Lbl}=>Live1}, Is = [L|reverse(Is0)], - {Live,Kills} = killsets_is(Is, Live1, Kills1, Lbl), + {Live,Kills} = killsets_is(Is, Live1, Kills1, Lbl, sets:new()), LiveIns = LiveIns0#{Lbl=>Live}, {LiveIns, Kills}. -killsets_is([#b_set{op=phi,dst=Dst}=I|Is], Live, Kills0, Lbl) -> +killsets_is([#b_set{op=phi,dst=Dst}=I|Is], Live, Kills0, Lbl, KilledInBlock0) -> %% The Phi uses are logically located in the predecessors, so we %% don't want them live in to this block. But to correctly %% calculate the aliasing of the arguments to the Phi in this @@ -163,21 +180,24 @@ killsets_is([#b_set{op=phi,dst=Dst}=I|Is], Live, Kills0, Lbl) -> Uses = beam_ssa:used(I), {_,LastUses} = killsets_update_live_and_last_use(Live, Uses), Kills = killsets_add_kills({phi,Dst}, LastUses, Kills0), - killsets_is(Is, sets:del_element(Dst, Live), Kills, Lbl); -killsets_is([I|Is], Live0, Kills0, Lbl) -> + KilledInBlock = sets:union(LastUses, KilledInBlock0), + killsets_is(Is, sets:del_element(Dst, Live), Kills, Lbl, KilledInBlock); +killsets_is([I|Is], Live0, Kills0, Lbl, KilledInBlock0) -> Uses = beam_ssa:used(I), {Live,LastUses} = killsets_update_live_and_last_use(Live0, Uses), + KilledInBlock = sets:union(LastUses, KilledInBlock0), case I of #b_set{dst=Dst} -> killsets_is(Is, sets:del_element(Dst, Live), - killsets_add_kills(Dst, LastUses, Kills0), Lbl); + killsets_add_kills(Dst, LastUses, Kills0), + Lbl, KilledInBlock); _ -> killsets_is(Is, Live, killsets_add_kills({terminator,Lbl}, LastUses, Kills0), - Lbl) + Lbl, KilledInBlock) end; -killsets_is([], Live, Kills, _) -> - {Live,Kills}. +killsets_is([], Live, Kills, Lbl, KilledInBlock) -> + {Live,killsets_add_kills({killed_in_block,Lbl}, KilledInBlock, Kills)}. killsets_update_live_and_last_use(Live0, Uses) -> foldl(fun(Use, {LiveAcc,LastAcc}=Acc) -> @@ -188,7 +208,7 @@ killsets_update_live_and_last_use(Live0, Uses) -> {sets:add_element(Use, LiveAcc), sets:add_element(Use, LastAcc)} end - end, {Live0,sets:new([{version,2}])}, Uses). + end, {Live0,sets:new()}, Uses). killsets_add_kills(Dst, LastUses, Kills) -> Kills#{Dst=>LastUses}. @@ -212,7 +232,7 @@ killsets_phi_uses_in_block(Lbl, [#b_set{op=phi,args=Args}|Is], PhiLiveIns0) -> Key = {From,Lbl}, Old = case Acc of #{Key:=O} -> O; - #{} -> sets:new([{version,2}]) + #{} -> sets:new() end, Acc#{Key=>sets:add_element(Var, Old)}; ({#b_literal{},_},Acc) -> @@ -226,7 +246,7 @@ killsets_phi_uses_in_block(_Lbl, _, PhiLiveIns) -> %% Create a set of variables which are live out from this block. killsets_blk_live_outs(Successors, ThisBlock, LiveIns, PhiLiveIns) -> killsets_blk_live_outs(Successors, ThisBlock, LiveIns, - PhiLiveIns, sets:new([{version,2}])). + PhiLiveIns, sets:new()). killsets_blk_live_outs([Successor|Successors], ThisBlock, LiveIns, PhiLiveIns, Acc0) -> @@ -295,7 +315,7 @@ killsets_blk_live_outs([], _, _, _, Acc) -> %%% post order traversal of the basic blocks. -spec aa([func_id()], kills_map(), st_map(), func_info_db(), - #{ func_id() => var_set() }) -> + #{func_id() => var_set()}) -> {st_map(), func_info_db()}. aa(Funs, KillsMap, StMap, FuncDb, ForcedAliases) -> @@ -340,94 +360,137 @@ aa(Funs, KillsMap, StMap, FuncDb, ForcedAliases) -> %%% to detect incomplete information in a hypothetical %%% ssa_opt_alias_finish pass. %%% -aa_fixpoint(Funs, AAS=#aas{alias_map=AliasMap,call_args=CallArgs, - func_db=FuncDb}) -> - Order = aa_reverse_post_order(Funs, FuncDb), - aa_fixpoint(Order, Order, AliasMap, CallArgs, AAS, ?MAX_REPETITIONS). - -aa_fixpoint([F|Fs], Order, OldAliasMap, OldCallArgs, AAS0=#aas{st_map=StMap}, - Limit) -> - #b_local{name=#b_literal{val=_N},arity=_A} = F, - AAS1 = AAS0#aas{caller=F}, - ?DP("-= ~p/~p =-~n", [_N, _A]), +aa_fixpoint(Funs, AAS=#aas{func_db=FuncDb}) -> + Order = aa_order(Funs, FuncDb), + ?DP("Traversal order:~n ~s~n", + [string:join([fn(F) || F <- Order], ",\n ")]), + aa_fixpoint(Order, reverse(Order), AAS, 1). + +aa_fixpoint([F|Fs], Order, + AAS0=#aas{func_db=FuncDb,st_map=StMap, + repeats=Repeats,run_count=RC}, NoofIters) -> + + ?DP("-= ~s =-~n", [fn(F)]), + %% If, when analysing another function, this function has been + %% scheduled for revisiting, we can remove it, as we otherwise + %% revisit it again in the next iteration. + AAS1 = AAS0#aas{caller=F,repeats=sets:del_element(F, Repeats)}, + St = #opt_st{ssa=_Is} = map_get(F, StMap), ?DP("code:~n~p.~n", [_Is]), AAS = aa_fun(F, St, AAS1), - ?DP("Done ~p/~p~n", [_N, _A]), - aa_fixpoint(Fs, Order, OldAliasMap, OldCallArgs, AAS, Limit); -aa_fixpoint([], Order, OldAliasMap, OldCallArgs, - #aas{alias_map=OldAliasMap,call_args=OldCallArgs, - func_db=FuncDb}=AAS, _Limit) -> - ?DP("**** End of iteration ~p ****~n", [_Limit]), - {StMap,_} = aa_update_annotations(Order, AAS), - {StMap, FuncDb}; -aa_fixpoint([], _, _, _, #aas{func_db=FuncDb,orig_st_map=StMap}, 0) -> - ?DP("**** End of iteration, too many iterations ****~n"), - {StMap, FuncDb}; -aa_fixpoint([], Order, _OldAliasMap, _OldCallArgs, - #aas{alias_map=AliasMap,call_args=CallArgs,repeats=Repeats}=AAS, - Limit) -> - ?DP("**** Things have changed, starting next iteration ****~n"), + ?DP("Done ~s~n", [fn(F)]), + case maps:get(F, RC, ?MAX_REPETITIONS) of + 0 -> + ?DP("**** End of iteration, too many iterations ****~n"), + {StMap, FuncDb}; + N -> + aa_fixpoint(Fs, Order, + AAS#aas{run_count=RC#{F => N - 1}}, NoofIters) + end; +aa_fixpoint([], Order, #aas{func_db=FuncDb,repeats=Repeats}=AAS, NoofIters) -> %% Following the depth first order, select those in Repeats. - NewOrder = [Id || Id <- Order, sets:is_element(Id, Repeats)], - aa_fixpoint(NewOrder, Order, AliasMap, CallArgs, - AAS#aas{repeats=sets:new([{version,2}])}, Limit - 1). + case [Id || Id <- Order, sets:is_element(Id, Repeats)] of + [] -> + ?DP("**** Fixpoint reached after ~p traversals ****~n", + [NoofIters]), + {StMap,_} = aa_update_annotations(Order, AAS), + {StMap, FuncDb}; + NewOrder -> + ?DP("**** Starting traversal ~p ****~n", [NoofIters + 1]), + aa_fixpoint(NewOrder, reverse(Order), + AAS#aas{repeats=sets:new()}, NoofIters + 1) + end. aa_fun(F, #opt_st{ssa=Linear0,args=Args}, - AAS0=#aas{alias_map=AliasMap0,call_args=CallArgs0, - func_db=FuncDb,kills=KillsMap,repeats=Repeats0, - forced_aliases=ForcedAliases}) -> + AAS0=#aas{alias_map=AliasMap0,analyzed=Analyzed,kills=KillsMap, + prune_strategy=StrategyMap0,forced_aliases=ForcedAliases}) -> %% Initially assume all formal parameters are unique for a %% non-exported function, if we have call argument info in the %% AAS, we use it. For an exported function, all arguments are %% assumed to be aliased. {SS0,Cnt} = aa_init_fun_ss(Args, F, AAS0), - #{F:=Kills} = KillsMap, - {SS,#aas{call_args=CallArgs}=AAS} = - aa_blocks(Linear0, Kills, #{0=>SS0}, AAS0#aas{cnt=Cnt}, + #{F:={LiveIns,Kills,PhiLiveIns}} = KillsMap, + Strategy0 = maps:get(F, StrategyMap0, #{}), + {SS,Strategy,AAS1} = + aa_blocks(Linear0, LiveIns, PhiLiveIns, + Kills, #{0=>SS0}, Strategy0, AAS0#aas{cnt=Cnt}, maps:get(F, ForcedAliases)), + Lbl2SS0 = maps:get(F, AliasMap0, #{}), + Type2Status0 = maps:get(returns, Lbl2SS0, #{}), + Type2Status = maps:get(returns, SS, #{}), + AAS = case Type2Status0 =/= Type2Status of + true -> + aa_schedule_revisit_callers(F, AAS1); + false -> + AAS1 + end, AliasMap = AliasMap0#{ F => SS }, - PrevSS = maps:get(F, AliasMap0, #{}), - Repeats = case PrevSS =/= SS orelse CallArgs0 =/= CallArgs of - true -> - %% Alias status has changed, so schedule both - %% our callers and callees for renewed analysis. - #{ F := #func_info{in=In,out=Out} } = FuncDb, - foldl(fun sets:add_element/2, - foldl(fun sets:add_element/2, Repeats0, Out), In); - false -> - Repeats0 - end, - AAS#aas{alias_map=AliasMap,repeats=Repeats}. + StrategyMap = StrategyMap0#{F => Strategy}, + AAS#aas{alias_map=AliasMap,analyzed=sets:add_element(F, Analyzed), + prune_strategy=StrategyMap}. %% Main entry point for the alias analysis -aa_blocks([{?EXCEPTION_BLOCK,_}|Bs], Kills, Lbl2SS, AAS, ForcedAliases) -> +aa_blocks([{?EXCEPTION_BLOCK,_}|Bs], + LiveIns, PhiLiveIns, Kills, Lbl2SS, Strategy, AAS, ForcedAliases) -> %% Nothing happening in the exception block can propagate to the %% other block. - aa_blocks(Bs, Kills, Lbl2SS, AAS, ForcedAliases); -aa_blocks([{L,#b_blk{is=Is0,last=T}}|Bs0], Kills, Lbl2SS0, - AAS0, ForcedAliases) -> + aa_blocks(Bs, LiveIns, PhiLiveIns, Kills, Lbl2SS, + Strategy, AAS, ForcedAliases); +aa_blocks([{L,#b_blk{is=Is0,last=T}}|Bs0], + LiveIns, PhiLiveIns, Kills, Lbl2SS0, Strategy0, AAS0, + ForcedAliases) -> #{L:=SS0} = Lbl2SS0, - ?DP("Block: ~p~nSS: ~p~n", [L, SS0]), + ?DP("Block: ~p~nSS:~n~s~n", [L, beam_ssa_ss:dump(SS0)]), {FullSS,AAS1} = aa_is(Is0, SS0, AAS0, ForcedAliases), #{{live_outs,L}:=LiveOut} = Kills, {Lbl2SS1,Successors} = aa_terminator(T, FullSS, Lbl2SS0), - PrunedSS = beam_ssa_ss:prune(LiveOut, FullSS), - Lbl2SS2 = aa_add_block_entry_ss(Successors, PrunedSS, Lbl2SS1), + %% In around 80% of the cases when prune is called, more than half + %% of the nodes in the sharing state database survive. Therefore + %% we default to a pruning strategy which removes nodes from the + %% database. But if only a few nodes survive it is faster to + %% recreate the pruned state from scratch. We therefore track the + %% result of a previous prune for the current basic block and + %% select the, hopefully, best pruning strategy. + Before = beam_ssa_ss:size(FullSS), + S = maps:get(L, Strategy0, del), + PrunedSS = + case S of + del -> + #{{killed_in_block,L}:=KilledInBlock} = Kills, + beam_ssa_ss:prune(LiveOut, KilledInBlock, FullSS); + add -> + beam_ssa_ss:prune_by_add(LiveOut, FullSS) + end, + After = beam_ssa_ss:size(PrunedSS), + Strategy = case After < (Before div 2) of + true when S =:= add -> + Strategy0; + false when S =:= del -> + Strategy0; + true -> + Strategy0#{L => add}; + false -> + Strategy0#{L => del} + end, + ?DP("Live out from ~p: ~p~n", [L, sets:to_list(LiveOut)]), + Lbl2SS2 = aa_add_block_entry_ss(Successors, L, PrunedSS, + LiveOut, LiveIns, PhiLiveIns, Lbl2SS1), Lbl2SS = aa_set_block_exit_ss(L, FullSS, Lbl2SS2), - aa_blocks(Bs0, Kills, Lbl2SS, AAS1, ForcedAliases); -aa_blocks([], _Kills, Lbl2SS, AAS, _ForcedAliases) -> - {Lbl2SS,AAS}. + aa_blocks(Bs0, LiveIns, PhiLiveIns, Kills, Lbl2SS, + Strategy, AAS1, ForcedAliases); +aa_blocks([], _LiveIns, _PhiLiveIns, _Kills, Lbl2SS, + Strategy, AAS, _ForcedAliases) -> + {Lbl2SS, Strategy, AAS}. -aa_is([I=#b_set{dst=Dst,op=Op,args=Args,anno=Anno0}|Is], SS0, +aa_is([_I=#b_set{dst=Dst,op=Op,args=Args,anno=Anno0}|Is], SS0, AAS0, ForcedAliases) -> - ?DP("I: ~p~n", [I]), - SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), + ?DP("I: ~p~n", [_I]), {SS3, AAS} = case Op of %% Instructions changing the alias status. {bif,Bif} -> - {aa_bif(Dst, Bif, Args, SS1, AAS0), AAS0}; + {aa_bif(Dst, Bif, Args, SS0, AAS0), AAS0}; bs_create_bin -> case Args of [#b_literal{val=Flag},_,Arg|_] when @@ -435,76 +498,82 @@ aa_is([I=#b_set{dst=Dst,op=Op,args=Args,anno=Anno0}|Is], SS0, case aa_all_dies([Arg], Dst, AAS0) of true -> %% Inherit the status of the argument - {aa_derive_from(Dst, Arg, SS1), AAS0}; + {aa_derive_from(Dst, Arg, SS0), AAS0}; false -> %% We alias with the surviving arg - {aa_set_aliased([Dst|Args], SS1), AAS0} + {aa_set_aliased([Dst|Args], SS0), AAS0} end; _ -> %% TODO: Too conservative? - {aa_set_aliased([Dst|Args], SS1), AAS0} + {aa_set_aliased([Dst|Args], SS0), AAS0} end; bs_extract -> - {aa_set_aliased([Dst|Args], SS1), AAS0}; + {aa_set_aliased([Dst|Args], SS0), AAS0}; bs_get_tail -> - {aa_set_aliased([Dst|Args], SS1), AAS0}; + {aa_set_aliased([Dst|Args], SS0), AAS0}; bs_match -> - {aa_set_aliased([Dst|Args], SS1), AAS0}; + {aa_set_aliased([Dst|Args], SS0), AAS0}; bs_start_match -> [_,Bin] = Args, - {aa_set_aliased([Dst,Bin], SS1), AAS0}; + {aa_set_aliased([Dst,Bin], SS0), AAS0}; build_stacktrace -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), %% build_stacktrace can potentially alias anything %% live at this point in the code. We handle it by %% aliasing everything known to us. Touching %% variables which are dead is harmless. {aa_alias_all(SS1), AAS0}; call -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), aa_call(Dst, Args, Anno0, SS1, AAS0); 'catch_end' -> [_Tag,Arg] = Args, - {aa_derive_from(Dst, Arg, SS1), AAS0}; + {aa_derive_from(Dst, Arg, SS0), AAS0}; extract -> [Arg,_] = Args, - {aa_derive_from(Dst, Arg, SS1), AAS0}; + {aa_derive_from(Dst, Arg, SS0), AAS0}; get_hd -> [Arg] = Args, Type = maps:get(0, maps:get(arg_types, Anno0, #{0=>any}), any), - {aa_pair_extraction(Dst, Arg, hd, Type, SS1), AAS0}; + {aa_pair_extraction(Dst, Arg, hd, Type, SS0), AAS0}; get_map_element -> [Map,_Key] = Args, - {aa_map_extraction(Dst, Map, SS1, AAS0), AAS0}; + {aa_map_extraction(Dst, Map, SS0, AAS0), AAS0}; get_tl -> [Arg] = Args, Type = maps:get(0, maps:get(arg_types, Anno0, #{0=>any}), any), - {aa_pair_extraction(Dst, Arg, tl, Type, SS1), AAS0}; + {aa_pair_extraction(Dst, Arg, tl, Type, SS0), AAS0}; get_tuple_element -> [Arg,Idx] = Args, Types = maps:get(arg_types, Anno0, #{}), - {aa_tuple_extraction(Dst, Arg, Idx, Types, SS1), AAS0}; + {aa_tuple_extraction(Dst, Arg, Idx, Types, SS0), AAS0}; landingpad -> - {aa_set_aliased(Dst, SS1), AAS0}; + {aa_set_aliased(Dst, SS0), AAS0}; make_fun -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), [Callee|Env] = Args, aa_make_fun(Dst, Callee, Env, SS1, AAS0); peek_message -> - {aa_set_aliased(Dst, SS1), AAS0}; + {aa_set_aliased(Dst, SS0), AAS0}; phi -> - {aa_phi(Dst, Args, SS1, AAS0), AAS0}; + aa_phi(Dst, Args, SS0, AAS0); put_list -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), Types = aa_map_arg_to_type(Args, maps:get(arg_types, Anno0, #{})), {aa_construct_pair(Dst, Args, Types, SS1, AAS0), AAS0}; put_map -> - {aa_construct_term(Dst, Args, SS1, AAS0), AAS0}; + {aa_construct_term(Dst, Args, SS0, AAS0), AAS0}; put_tuple -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), Types = aa_map_arg_to_type(Args, maps:get(arg_types, Anno0, #{})), Values = lists:enumerate(0, Args), {aa_construct_tuple(Dst, Values, Types, SS1, AAS0), AAS0}; update_tuple -> - {aa_construct_term(Dst, Args, SS1, AAS0), AAS0}; + {aa_construct_term(Dst, Args, SS0, AAS0), AAS0}; update_record -> + SS1 = beam_ssa_ss:add_var(Dst, unique, SS0), [#b_literal{val=Hint},_Size,Src|Updates] = Args, RecordType = maps:get(arg_types, Anno0, #{}), ?DP("UPDATE RECORD dst: ~p, src: ~p, type:~p~n", @@ -534,47 +603,45 @@ aa_is([I=#b_set{dst=Dst,op=Op,args=Args,anno=Anno0}|Is], SS0, %% Instructions which don't change the alias status {float,_} -> - {SS1, AAS0}; + {SS0, AAS0}; {succeeded,_} -> - {SS1, AAS0}; + {SS0, AAS0}; bs_init_writable -> - {SS1, AAS0}; + {SS0, AAS0}; bs_test_tail -> - {SS1, AAS0}; + {SS0, AAS0}; executable_line -> - {SS1, AAS0}; + {SS0, AAS0}; has_map_field -> - {SS1, AAS0}; + {SS0, AAS0}; is_nonempty_list -> - {SS1, AAS0}; + {SS0, AAS0}; is_tagged_tuple -> - {SS1, AAS0}; + {SS0, AAS0}; kill_try_tag -> - {SS1, AAS0}; + {SS0, AAS0}; match_fail -> - {SS1, AAS0}; + {SS0, AAS0}; new_try_tag -> - {SS1, AAS0}; + {SS0, AAS0}; nif_start -> - {SS1, AAS0}; + {SS0, AAS0}; raw_raise -> - {SS1, AAS0}; + {SS0, AAS0}; recv_marker_bind -> - {SS1, AAS0}; + {SS0, AAS0}; recv_marker_clear -> - {SS1, AAS0}; + {SS0, AAS0}; recv_marker_reserve -> - {SS1, AAS0}; + {SS0, AAS0}; recv_next -> - {SS1, AAS0}; + {SS0, AAS0}; remove_message -> - {SS1, AAS0}; + {SS0, AAS0}; resume -> - {SS1, AAS0}; + {SS0, AAS0}; wait_timeout -> - {SS1, AAS0}; - _ -> - exit({unknown_instruction, I}) + {SS0, AAS0} end, SS = case sets:is_element(Dst, ForcedAliases) of true -> @@ -607,7 +674,7 @@ aa_terminator(#b_ret{arg=Arg,anno=Anno0}, SS, Lbl2SS0) -> Lbl2SS = Lbl2SS0#{ returns => Type2Status }, {Lbl2SS, []}; aa_terminator(#b_switch{fail=F,list=Ls}, _SS, Lbl2SS) -> - {Lbl2SS,[F|[L || {_,L} <- Ls]]}. + {Lbl2SS,[F|[L || {_,L} <:- Ls]]}. %% Store the updated SS for the point where execution leaves the %% block. @@ -615,11 +682,25 @@ aa_set_block_exit_ss(ThisBlockLbl, SS, Lbl2SS) -> Lbl2SS#{ThisBlockLbl=>SS}. %% Extend the SS valid on entry to the blocks in the list with NewSS. -aa_add_block_entry_ss([?EXCEPTION_BLOCK|BlockLabels], NewSS, Lbl2SS) -> - aa_add_block_entry_ss(BlockLabels, NewSS, Lbl2SS); -aa_add_block_entry_ss([L|BlockLabels], NewSS, Lbl2SS) -> - aa_add_block_entry_ss(BlockLabels, NewSS, aa_merge_ss(L, NewSS, Lbl2SS)); -aa_add_block_entry_ss([], _, Lbl2SS) -> +aa_add_block_entry_ss([?EXCEPTION_BLOCK|BlockLabels], From, NewSS, + LiveOut, LiveIns, PhiLiveIns, Lbl2SS) -> + aa_add_block_entry_ss(BlockLabels, From, NewSS, LiveOut, + LiveIns, PhiLiveIns, Lbl2SS); +aa_add_block_entry_ss([L|BlockLabels], From, + NewSS, LiveOut, LiveIns, PhiLiveIns, Lbl2SS) -> + #{L:=LiveIn} = LiveIns, + PhiLiveIn = case PhiLiveIns of + #{{From,L}:=Vs} -> Vs; + #{} -> sets:new() + end, + AllLiveIn = sets:union(LiveIn, PhiLiveIn), + KilledOnEdge = sets:subtract(LiveOut, AllLiveIn), + ?DP("Killed on edge to ~p: ~p~n", [L, sets:to_list(KilledOnEdge)]), + ?DP("Live on edge to ~p: ~p~n", [L, sets:to_list(AllLiveIn)]), + Pruned = beam_ssa_ss:prune(AllLiveIn, KilledOnEdge, NewSS), + aa_add_block_entry_ss(BlockLabels, From, NewSS, LiveOut, LiveIns, + PhiLiveIns, aa_merge_ss(L, Pruned, Lbl2SS)); +aa_add_block_entry_ss([], _, _, _, _, _, Lbl2SS) -> Lbl2SS. %% Merge two sharing states when traversing the execution graph @@ -691,8 +772,7 @@ aa_update_annotations(Funs, #aas{alias_map=AliasMap0,st_map=StMap0}=AAS) -> foldl(fun(F, {StMapAcc,AliasMapAcc}) -> #{F:=Lbl2SS0} = AliasMapAcc, #{F:=OptSt0} = StMapAcc, - #b_local{name=#b_literal{val=_N},arity=_A} = F, - ?DP("Updating annotations for ~p/~p~n", [_N,_A]), + ?DP("Updating annotations for ~s~n", [fn(F)]), {OptSt,Lbl2SS} = aa_update_fun_annotation(OptSt0, Lbl2SS0, AAS#aas{caller=F}), @@ -807,7 +887,10 @@ aa_update_annotation_for_var(Var, Status, Anno0) -> ordsets:del_element(Var, Unique0)}; unique -> {ordsets:del_element(Var, Aliased0), - ordsets:add_element(Var, Unique0)} + ordsets:add_element(Var, Unique0)}; + no_info -> + {ordsets:del_element(Var, Aliased0), + ordsets:del_element(Var, Unique0)} end, Anno1 = case Aliased of [] -> @@ -826,7 +909,7 @@ aa_update_annotation_for_var(Var, Status, Anno0) -> %% instruction. dies_at(Var, #b_set{dst=Dst}, AAS) -> #aas{caller=Caller,kills=KillsMap} = AAS, - KillMap = map_get(Caller, KillsMap), + {_LiveIns,KillMap,_PhiLiveIns} = map_get(Caller, KillsMap), sets:is_element(Var, map_get(Dst, KillMap)). aa_set_aliased(Args, SS) -> @@ -874,7 +957,7 @@ aa_alias_surviving_args1([], SS, _KillSet) -> %% Return the kill-set for the instruction defining Dst. aa_killset_for_instr(Dst, #aas{caller=Caller,kills=Kills}) -> - KillMap = map_get(Caller, Kills), + {_LiveIns,KillMap,_PhiLiveIns} = map_get(Caller, Kills), map_get(Dst, KillMap). %% Predicate to check if all variables in `Vars` dies at `Where`. @@ -1005,8 +1088,8 @@ aa_construct_tuple(Dst, IdxValues, Types, SS, AAS) -> [Dst, [#{idx=>Idx,v=>V,status=>aa_get_status(V, SS, Types), killed=>aa_dies(V, Types, KillSet), plain=>aa_is_plain_value(V, Types)} - || {Idx,V} <- IdxValues]]), - ?DP("~p~n", [SS]), + || {Idx,V} <:- IdxValues]]), + ?DP("~s~n", [beam_ssa_ss:dump(SS)]), aa_build_tuple_or_pair(Dst, IdxValues, Types, KillSet, SS, []). aa_build_tuple_or_pair(Dst, [{Idx,#b_literal{val=Lit}}|IdxValues], Types, @@ -1040,7 +1123,8 @@ aa_build_tuple_or_pair(Dst, [], _Types, _KillSet, SS, Sources) -> aa_construct_pair(Dst, Args0, Types, SS, AAS) -> KillSet = aa_killset_for_instr(Dst, AAS), [Hd,Tl] = Args0, - ?DP("Constructing pair in ~p~n from ~p and ~p~n~p~n", [Dst,Hd,Tl,SS]), + ?DP("Constructing pair in ~p~n from ~p and ~p~n~s~n", + [Dst, Hd, Tl, beam_ssa_ss:dump(SS)]), Args = [{hd,Hd},{tl,Tl}], aa_build_tuple_or_pair(Dst, Args, Types, KillSet, SS, []). @@ -1054,8 +1138,9 @@ aa_bif(Dst, element, [#b_literal{val=Idx},Tuple], SS, _AAS) %% The element bif is always rewritten to a get_tuple_element %% instruction when the index is an integer and the second %% argument is a known to be a tuple. Therefore this code is only - %% reached when the type of is unknown, thus there is no point in - %% trying to provide aa_tuple_extraction/5 with type information. + %% reached when the type of Tuple is unknown, thus there is no + %% point in trying to provide aa_tuple_extraction/5 with type + %% information. aa_tuple_extraction(Dst, Tuple, #b_literal{val=Idx-1}, #{}, SS); aa_bif(Dst, element, [#b_literal{},Tuple], SS, _AAS) -> %% This BIF will fail, but in order to avoid any later transforms @@ -1066,21 +1151,24 @@ aa_bif(Dst, element, [#b_var{},Tuple], SS, _AAS) -> aa_bif(Dst, hd, [Pair], SS, _AAS) -> %% The hd bif is always rewritten to a get_hd instruction when the %% argument is known to be a pair. Therefore this code is only - %% reached when the type of is unknown, thus there is no point in - %% trying to provide aa_pair_extraction/5 with type information. + %% reached when the type of Pair is unknown, thus there is no + %% point in trying to provide aa_pair_extraction/5 with type + %% information. aa_pair_extraction(Dst, Pair, hd, SS); aa_bif(Dst, tl, [Pair], SS, _AAS) -> %% The tl bif is always rewritten to a get_tl instruction when the %% argument is known to be a pair. Therefore this code is only - %% reached when the type of is unknown, thus there is no point in - %% trying to provide aa_pair_extraction/5 with type information. + %% reached when the type of Pair is unknown, thus there is no + %% point in trying to provide aa_pair_extraction/5 with type + %% information. aa_pair_extraction(Dst, Pair, tl, SS); aa_bif(Dst, map_get, [_Key,Map], SS, AAS) -> aa_map_extraction(Dst, Map, SS, AAS); -aa_bif(Dst, binary_part, Args, SS, _AAS) -> +aa_bif(Dst, binary_part, Args, SS0, _AAS) -> %% bif:binary_part/{2,3} is the only guard bif which could lead to %% aliasing, it extracts a sub-binary with a reference to its %% argument. + SS = beam_ssa_ss:add_var(Dst, unique, SS0), aa_set_aliased([Dst|Args], SS); aa_bif(Dst, Bif, Args, SS, _AAS) -> Arity = length(Args), @@ -1097,28 +1185,32 @@ aa_bif(Dst, Bif, Args, SS, _AAS) -> aa_set_aliased([Dst|Args], SS) end. -aa_phi(Dst, Args0, SS0, AAS) -> - Args = [V || {V,_} <- Args0], - SS = aa_alias_surviving_args(Args, {phi,Dst}, SS0, AAS), - aa_derive_from(Dst, Args, SS). +aa_phi(Dst, Args0, SS0, #aas{cnt=Cnt0}=AAS) -> + %% TODO: Use type info? + Args = [V || {V,_} <:- Args0], + ?DP("Phi~n"), + SS1 = aa_alias_surviving_args(Args, {phi,Dst}, SS0, AAS), + ?DP(" after aa_alias_surviving_args:~n~s.~n", [beam_ssa_ss:dump(SS1)]), + {SS,Cnt} = beam_ssa_ss:phi(Dst, Args, SS1, Cnt0), + {SS,AAS#aas{cnt=Cnt}}. aa_call(Dst, [#b_local{}=Callee|Args], Anno, SS0, - #aas{alias_map=AliasMap,st_map=StMap,cnt=Cnt0}=AAS0) -> - #b_local{name=#b_literal{val=_N},arity=_A} = Callee, - ?DP("A Call~n callee: ~p/~p~n args: ~p~n", [_N, _A, Args]), - case is_map_key(Callee, AliasMap) of + #aas{alias_map=AliasMap,analyzed=Analyzed, + st_map=StMap,cnt=Cnt0}=AAS0) -> + ?DP("A Call~n callee: ~s~n args: ~p~n", [fn(Callee), Args]), + ?DP(" caller args: ~p~n", [Args]), + SS1 = aa_alias_surviving_args(Args, Dst, SS0, AAS0), + ?DP(" caller ss before call:~n~s.~n", [beam_ssa_ss:dump(SS1)]), + #aas{alias_map=AliasMap} = AAS = + aa_add_call_info(Callee, Args, SS1, AAS0), + case sets:is_element(Callee, Analyzed) of true -> - ?DP(" The callee is known~n"), + ?DP(" The callee has been analyzed~n"), #opt_st{args=_CalleeArgs} = map_get(Callee, StMap), ?DP(" callee args: ~p~n", [_CalleeArgs]), - ?DP(" caller args: ~p~n", [Args]), - SS1 = aa_alias_surviving_args(Args, Dst, SS0, AAS0), - ?DP(" caller ss before call:~n ~p.~n", [SS1]), - #aas{alias_map=AliasMap} = AAS = - aa_add_call_info(Callee, Args, SS1, AAS0), #{Callee:=#{0:=_CalleeSS}=Lbl2SS} = AliasMap, - ?DP(" callee ss: ~p~n", [_CalleeSS]), - ?DP(" caller ss after call: ~p~n", [SS1]), + ?DP(" callee ss:~n~s~n", [beam_ssa_ss:dump(_CalleeSS)]), + ?DP(" caller ss after call:~n~s~n", [beam_ssa_ss:dump(SS1)]), ReturnStatusByType = maps:get(returns, Lbl2SS, #{}), ?DP(" status by type: ~p~n", [ReturnStatusByType]), @@ -1132,12 +1224,14 @@ aa_call(Dst, [#b_local{}=Callee|Args], Anno, SS0, ?DP(" result status: ~p~n", [ResultStatus]), {SS,Cnt} = beam_ssa_ss:set_call_result(Dst, ResultStatus, SS1, Cnt0), - ?DP("~p~n", [SS]), + ?DP("~s~n", [beam_ssa_ss:dump(SS)]), {SS, AAS#aas{cnt=Cnt}}; false -> - %% We don't know anything about the function, don't change - %% the status of any variables - {SS0, AAS0} + ?DP(" The callee has not been analyzed~n"), + %% We don't know anything about the function, so + %% explicitly mark that we don't know anything about the + %% result. + {beam_ssa_ss:set_status(Dst, no_info, SS0), AAS} end; aa_call(_Dst, [#b_remote{mod=#b_literal{val=erlang}, name=#b_literal{val=exit}, @@ -1157,21 +1251,25 @@ aa_call(Dst, [_Callee|Args], _Anno, SS0, AAS) -> aa_add_call_info(Callee, Args, SS0, #aas{call_args=InInfo0,caller=_Caller}=AAS) -> #{Callee := InStatus0} = InInfo0, - ?DBG(#b_local{name=#b_literal{val=_CN},arity=_CA} = _Caller), - ?DBG(#b_local{name=#b_literal{val=_N},arity=_A} = Callee), - ?DP("Adding call info for ~p/~p when called by ~p/~p~n" - " args: ~p.~n ss:~p.~n", [_N,_A,_CN,_CA,Args,SS0]), + ?DP("Adding call info for ~s when called by ~s~n" + " args: ~p.~n ss:~n~s.~n", + [fn(Callee), fn(_Caller), Args, beam_ssa_ss:dump(SS0)]), InStatus = beam_ssa_ss:merge_in_args(Args, InStatus0, SS0), - ?DP(" orig in-info: ~p.~n", [InStatus0]), - ?DP(" updated in-info for ~p/~p:~n ~p.~n", [_N,_A,InStatus]), - InInfo = InInfo0#{Callee => InStatus}, - AAS#aas{call_args=InInfo}. + ?DP(" orig in-info:~n ~p.~n", [InStatus0]), + ?DP(" updated in-info for ~s:~n ~p.~n", [fn(Callee), InStatus]), + case InStatus0 =/= InStatus of + true -> + InInfo = InInfo0#{Callee => InStatus}, + aa_schedule_revisit(Callee, AAS#aas{call_args=InInfo}); + false -> + AAS + end. aa_init_fun_ss(Args, FunId, #aas{call_args=Info,st_map=StMap}) -> #{FunId:=ArgsStatus} = Info, #{FunId:=#opt_st{cnt=Cnt}} = StMap, - ?DP("aa_init_fun_ss: ~p~n args: ~p~n status: ~p~n cnt: ~p~n", - [FunId,Args,ArgsStatus,Cnt]), + ?DP("aa_init_fun_ss: ~s~n args: ~p~n status: ~p~n cnt: ~p~n", + [fn(FunId), Args, ArgsStatus, Cnt]), beam_ssa_ss:new(Args, ArgsStatus, Cnt). %% Pair extraction. @@ -1180,10 +1278,10 @@ aa_pair_extraction(Dst, Pair, Element, SS) -> aa_pair_extraction(Dst, #b_var{}=Pair, Element, Type, SS) -> IsPlainValue = case {Type,Element} of - {#t_cons{type=Ty},hd} -> - aa_is_plain_type(Ty); {#t_cons{terminator=Ty},tl} -> aa_is_plain_type(Ty); + {#t_cons{type=Ty},hd} -> + aa_is_plain_type(Ty); _ -> %% There is no type information, %% conservatively assume this isn't a plain @@ -1211,7 +1309,7 @@ aa_tuple_extraction(Dst, #b_var{}=Tuple, #b_literal{val=I}, Types, SS) -> TupleType = maps:get(0, Types, any), TypeIdx = I+1, %% In types tuple indices starting at zero. IsPlainValue = case TupleType of - #t_tuple{elements=#{TypeIdx:=T}} -> + #t_tuple{elements=#{TypeIdx:=T}} when T =/= any -> aa_is_plain_type(T); _ -> %% There is no type information, @@ -1222,19 +1320,19 @@ aa_tuple_extraction(Dst, #b_var{}=Tuple, #b_literal{val=I}, Types, SS) -> ?DP("tuple-extraction dst:~p, tuple: ~p, idx: ~p,~n" " type: ~p,~n plain: ~p~n", [Dst, Tuple, I, TupleType, IsPlainValue]), - if IsPlainValue -> + case IsPlainValue of + true -> %% A plain value was extracted, it doesn't change the %% alias status of Dst nor the tuple. SS; - true -> + false -> beam_ssa_ss:extract(Dst, Tuple, I, SS) end; aa_tuple_extraction(_, #b_literal{}, _, _, SS) -> SS. aa_make_fun(Dst, Callee=#b_local{name=#b_literal{}}, - Env0, SS0, - AAS0=#aas{call_args=Info0,repeats=Repeats0}) -> + Env0, SS0, AAS0=#aas{call_args=Info0}) -> %% When a value is copied into the environment of a fun we assume %% that it has been aliased as there is no obvious way to track %% and ensure that the value is only used once, even if the @@ -1248,21 +1346,24 @@ aa_make_fun(Dst, Callee=#b_local{name=#b_literal{}}, Status = [aliased || _ <- Status0], #{ Callee := PrevStatus } = Info0, Info = Info0#{ Callee := Status }, - Repeats = case PrevStatus =/= Status of - true -> - %% We have new information for the callee, we - %% have to revisit it. - sets:add_element(Callee, Repeats0); - false -> - Repeats0 + AAS1 = case PrevStatus =/= Status of + true -> + %% We have new information for the callee, we + %% have to revisit it. + aa_schedule_revisit(Callee, AAS0); + false -> + AAS0 end, - AAS = AAS0#aas{call_args=Info,repeats=Repeats}, - {SS, AAS}. - -aa_reverse_post_order(Funs, FuncDb) -> - %% In order to produce a reverse post order of the call graph, we - %% have to make sure all exported functions without local callers - %% are visited before exported functions with local callers. + {SS, AAS1#aas{call_args=Info}}. + +aa_order(Funs, FuncDb) -> + %% Information about the alias status flows from callers to + %% callees and then back through the status of the result. In + %% order to avoid the most pessimistic estimate of the aliasing + %% status we want to process callers before callees with one + %% exception: zero-arity functions are always processed before + %% their callers as they are likely to give the most precise alias + %% information to their callers. IsExportedNoLocalCallers = fun (F) -> #{ F := #func_info{exported=E,in=In} } = FuncDb, @@ -1275,10 +1376,13 @@ aa_reverse_post_order(Funs, FuncDb) -> #{ F := #func_info{exported=E,in=In} } = FuncDb, E andalso In =/= [] end, + + ZeroArityFunctions = lists:sort([ F || #b_local{arity=0}=F <- Funs]), ExportedLocalCallers = lists:sort([ F || F <- Funs, IsExportedLocalCallers(F)]), - aa_reverse_post_order(ExportedNoLocalCallers, ExportedLocalCallers, - sets:new([{version,2}]), FuncDb). + aa_reverse_post_order(ZeroArityFunctions ++ ExportedNoLocalCallers, + ExportedLocalCallers, + sets:new(), FuncDb). aa_reverse_post_order([F|Work], Next, Seen, FuncDb) -> case sets:is_element(F, Seen) of @@ -1304,6 +1408,22 @@ aa_reverse_post_order([], [], _Seen, _FuncDb) -> aa_reverse_post_order([], Next, Seen, FuncDb) -> aa_reverse_post_order(Next, [], Seen, FuncDb). +%% Schedule a function for revisting. +aa_schedule_revisit(FuncId, + #aas{func_db=FuncDb,st_map=StMap,repeats=Repeats}=AAS) + when is_map_key(FuncId, FuncDb), is_map_key(FuncId, StMap) -> + ?DP("Scheduling ~s for revisit~n", [fn(FuncId)]), + AAS#aas{repeats=sets:add_element(FuncId, Repeats)}; +aa_schedule_revisit(_, AAS) -> + AAS. + +%% Schedule the callers of a function for revisting. +aa_schedule_revisit_callers(FuncId, #aas{func_db=FuncDb}=AAS) -> + #{FuncId:=#func_info{in=In}} = FuncDb, + ?DP("Scheduling callers of ~s for revisit: ~s.~n", + [fn(FuncId), string:join([fn(I) || I <- In], ", ")]), + foldl(fun aa_schedule_revisit/2, AAS, In). + expand_record_update(#opt_st{ssa=Linear0,cnt=First,anno=Anno0}=OptSt) -> {Linear,Cnt} = eru_blocks(Linear0, First), Anno = Anno0#{orig_cnt=>First}, @@ -1320,17 +1440,11 @@ eru_blocks([], Cnt, Acc) -> eru_is([#b_set{op=update_record, args=[_Hint,#b_literal{val=Size},Src|Updates]=Args, - anno=Anno0}=I0|Rest], First, Acc) -> - ArgTypes0 = maps:get(arg_types, Anno0, #{}), + anno=#{arg_types:=ArgTypes0}=Anno0}=I0|Rest], First, Acc) -> TupleType = maps:get(2, ArgTypes0, any), {Extracts,ExtraArgs,Next,ArgTypes} = eru_args(Updates, First, Src, Size, TupleType, ArgTypes0), - Anno = if map_size(ArgTypes) =:= 0 -> - Anno0; - true -> - Anno0#{arg_types=>ArgTypes} - end, - I = I0#b_set{args=Args++ExtraArgs,anno=Anno}, + I = I0#b_set{args=Args++ExtraArgs,anno=Anno0#{arg_types=>ArgTypes}}, eru_is(Rest, Next, [I|Extracts]++Acc); eru_is([I|Rest], First, Acc) -> eru_is(Rest, First, [I|Acc]); @@ -1338,7 +1452,7 @@ eru_is([], First, Acc) -> {reverse(Acc), First}. eru_args(Updates, First, Src, Size, TupleType, ArgTypes) -> - eru_args1(Updates, sets:from_list(lists:seq(1, Size), [{version,2}]), + eru_args1(Updates, sets:from_list(lists:seq(1, Size)), 4, First, Src, TupleType, ArgTypes). eru_args1([#b_literal{val=Idx},_Val|Updates], @@ -1500,7 +1614,7 @@ fa_successors(#b_ret{}) -> fa_successors(#b_br{succ=S,fail=F}) -> [S,F]; fa_successors(#b_switch{list=Ls,fail=F}) -> - [F|[L || {_,L} <- Ls]]. + [F|[L || {_,L} <:- Ls]]. fa_merge(Seen, Succ, SeenDb) -> Other = maps:get(Succ, SeenDb, #{}), diff --git a/lib/compiler/src/beam_ssa_alias_debug.hrl b/lib/compiler/src/beam_ssa_alias_debug.hrl new file mode 100644 index 000000000000..1e3fc43002e0 --- /dev/null +++ b/lib/compiler/src/beam_ssa_alias_debug.hrl @@ -0,0 +1,43 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% The beam_ssa_alias and beam_ssa_ss modules are both used by the +%% alias analysis pass of the compiler, where beam_ssa_ss provides the +%% underlying database manipulated by the beam_ssa_alias +%% module. Debugging beam_ssa_alias is simplified when the module can +%% print out the internal state of beam_ssa_ss, but as that code is +%% redundant otherwise it is ifdefed-out, this header exist in order +%% to avoid having to modify multiple modules when toggling debugging +%% traces for beam_ssa_alias and beam_ssa_ss. + +%% Uncomment the following to get trace printouts. + +%% -define(DEBUG_ALIAS, true). % For beam_ssa_alias + +%% -define(DEBUG_SS, true). % For beam_ssa_ss + +%% Uncomment the following to check that all invariants for the state +%% hold. These checks are expensive and not enabled by default. + +%% -define(SS_EXTRA_ASSERTS, true). + +-if(defined(DEBUG_ALIAS) orelse defined(DEBUG_SS) + orelse defined(SS_EXTRA_ASSERTS)). +-define(PROVIDE_DUMP, true). +-endif. diff --git a/lib/compiler/src/beam_ssa_bc_size.erl b/lib/compiler/src/beam_ssa_bc_size.erl index 2045f6f46163..66bff27df674 100644 --- a/lib/compiler/src/beam_ssa_bc_size.erl +++ b/lib/compiler/src/beam_ssa_bc_size.erl @@ -140,7 +140,7 @@ call_size_func(#b_set{op=call,args=[Name|Args],dst=Dst}, Bs) -> StMap = map_get(st_map, Bs), case StMap of #{Name := #opt_st{ssa=Linear,args=Params}} -> - NewBs0 = setup_call_bs(Params, Args, Bs, #{}), + NewBs0 = setup_call_bs(Params, Args, Bs), case any(fun({writable,_}) -> true; (_) -> false end, maps:values(NewBs0)) of @@ -206,15 +206,16 @@ capture_generator_1(Dst, [_|T], Bs) -> capture_generator_1(_, [], Bs) -> Bs. -setup_call_bs([V|Vs], [A0|As], OldBs, NewBs) -> - A = case get_value(A0, OldBs) of - #b_literal{}=Lit -> {arg,Lit}; - {writable,#b_literal{val=0}}=Wr -> Wr; - {arg,_}=Arg -> Arg; - _ -> any - end, - setup_call_bs(Vs, As, OldBs, NewBs#{V => A}); -setup_call_bs([], [], #{}, NewBs) -> NewBs. +setup_call_bs(Vs, As, Bs) -> + #{V => setup_call_binding(A, Bs) || V <- Vs && A <- As}. + +setup_call_binding(A, Bs) -> + case get_value(A, Bs) of + #b_literal{}=Lit -> {arg,Lit}; + {writable,#b_literal{val=0}}=Wr -> Wr; + {arg,_}=Arg -> Arg; + _ -> any + end. calc_size([{L,#b_blk{is=Is,last=Last}}|Blks], Map0) -> case maps:take(L, Map0) of diff --git a/lib/compiler/src/beam_ssa_bool.erl b/lib/compiler/src/beam_ssa_bool.erl index 3cd7a4983b3e..c38061ede401 100644 --- a/lib/compiler/src/beam_ssa_bool.erl +++ b/lib/compiler/src/beam_ssa_bool.erl @@ -213,7 +213,7 @@ pre_opt(Blocks, Count) -> Sub = maps:remove(uses, Sub1), %% Now do the actual optimizations. - Reached = sets:from_list([hd(Top)], [{version, 2}]), + Reached = sets:from_list([hd(Top)]), pre_opt(Top, Sub, Reached, Count, Blocks). -spec get_phi_info(Ls, Blocks, Sub0) -> Sub when @@ -319,13 +319,13 @@ pre_opt([L|Ls], Sub0, Reached0, Count0, Blocks) -> Blk = Blk0#b_blk{is=Is++[Test],last=Br}, Successors = beam_ssa:successors(Blk), Reached = sets:union(Reached0, - sets:from_list(Successors, [{version, 2}])), + sets:from_list(Successors)), pre_opt(Ls, Sub, Reached, Count, Blocks#{L:=Blk}); Last -> Blk = Blk0#b_blk{is=Is,last=Last}, Successors = beam_ssa:successors(Blk), Reached = sets:union(Reached0, - sets:from_list(Successors, [{version, 2}])), + sets:from_list(Successors)), pre_opt(Ls, Sub, Reached, Count0, Blocks#{L:=Blk}) end end; @@ -333,7 +333,7 @@ pre_opt([], _, _, Count, Blocks) -> {Blocks,Count}. pre_opt_is([#b_set{op=phi,dst=Dst,args=Args0}=I0|Is], Reached, Sub0, Acc) -> - Args1 = [{Val,From} || {Val,From} <- Args0, + Args1 = [{Val,From} || {Val,From} <:- Args0, sets:is_element(From, Reached)], Args = sub_args(Args1, Sub0), case all_same(Args) of @@ -674,7 +674,7 @@ bool_opt_rewrite(Bool, From, Br, Blocks0, St0) -> %% because the map of definitions in St#st.defs would not be updated %% to include the newly optimized blocks. DomBlk0 = map_get(Dom, Blocks1), - Blocks2 = maps:without([L || {L,#b_blk{}} <- Bs], Blocks1), + Blocks2 = maps:without([L || {L,#b_blk{}} <:- Bs], Blocks1), %% Convert the optimized digraph back to SSA code. Blocks3 = digraph_to_ssa([Root], G, Blocks2), @@ -739,7 +739,7 @@ collect_phi_args(Args, Anno) -> [] -> %% This phi node only contains literal values. %% Force the inclusion of referenced blocks. - Ls = [{block,L} || {_,L} <- Args], + Ls = [{block,L} || {_,L} <:- Args], {[],Ls} end; false -> @@ -788,7 +788,7 @@ split_dom_block_is([], PreAcc) -> collect_digraph_blocks(FirstL, LastL, #b_br{succ=Succ,fail=Fail}, Blocks) -> Ws = gb_sets:singleton(FirstL), - Seen = sets:from_list([Succ,Fail], [{version, 2}]), + Seen = sets:from_list([Succ,Fail]), collect_digraph_blocks(Ws, LastL, Blocks, Seen, []). collect_digraph_blocks(Ws0, LastL, Blocks, Seen0, Acc0) -> @@ -874,7 +874,7 @@ build_digraph_is([#b_set{op=phi,args=Args0}=I0|Is], Last, Vtx, Map, G, St) -> Args = [{V,case Map of #{L:=Other} -> Other; #{} -> not_possible() - end} || {V,L} <- Args0], + end} || {V,L} <:- Args0], I = I0#b_set{args=Args}, build_digraph_is_1(I, Is, Last, Vtx, Map, G, St); build_digraph_is([#b_set{}=I|Is], Last, Vtx, Map, G, St) -> @@ -1582,7 +1582,7 @@ join_inits_1([], VarMap) -> %%% digraph_to_ssa(Ls, G, Blocks0) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), {Blocks,_} = digraph_to_ssa(Ls, G, Blocks0, Seen), Blocks. @@ -1632,7 +1632,7 @@ digraph_to_ssa_blk(From, G, Blocks, Acc0) -> {external,Sub} -> #b_blk{is=Is0} = Blk = map_get(From, Blocks), Is = [I#b_set{args=sub_args(Args0, Sub)} || - #b_set{args=Args0}=I <- Is0], + #b_set{args=Args0}=I <:- Is0], {Blk#b_blk{is=Is},[]} end. @@ -1704,7 +1704,7 @@ del_out_edges(V, G) -> covered(From, To, G) -> Seen0 = #{}, {yes,Seen} = covered_1(From, To, G, Seen0), - [V || {V,reached} <- maps:to_list(Seen)]. + [V || V := reached <- Seen]. covered_1(To, To, _G, Seen) -> {yes,Seen}; diff --git a/lib/compiler/src/beam_ssa_bsm.erl b/lib/compiler/src/beam_ssa_bsm.erl index bf3e19addee5..4cb285cd4584 100644 --- a/lib/compiler/src/beam_ssa_bsm.erl +++ b/lib/compiler/src/beam_ssa_bsm.erl @@ -525,7 +525,7 @@ cm_handle_priors(Src, DstCtx, Bool, Acc, MatchSeq, Lbl, State0) -> %% we can only consider the ones whose success path %% dominate us. Dominators = maps:get(Lbl, State0#cm.dominators, []), - [Ctx || {ValidAfter, Ctx} <- Priors, + [Ctx || {ValidAfter, Ctx} <:- Priors, member(ValidAfter, Dominators)]; error -> [] @@ -776,7 +776,7 @@ aca_cs_is([], Counter, VRs, _BRs, Acc) -> {VRs, reverse(Acc), Counter}. aca_cs_last(#b_switch{arg=Arg0,list=Switch0,fail=Fail0}=Sw, VRs, BRs) -> - Switch = [{Literal, maps:get(Lbl, BRs)} || {Literal, Lbl} <- Switch0], + Switch = [{Literal, maps:get(Lbl, BRs)} || {Literal, Lbl} <:- Switch0], Sw#b_switch{arg=aca_cs_arg(Arg0, VRs), fail=maps:get(Fail0, BRs), list=Switch}; @@ -821,7 +821,7 @@ aca_cs_arg(Arg, VRs) -> %% contexts to us. allow_context_passthrough({Fs, ModInfo0}) -> - FsUses = [{F, beam_ssa:uses(beam_ssa:rpo(Bs), Bs)} || #b_function{bs=Bs}=F <- Fs], + FsUses = [{F, beam_ssa:uses(beam_ssa:rpo(Bs), Bs)} || #b_function{bs=Bs}=F <:- Fs], ModInfo = acp_forward_params(FsUses, ModInfo0), {Fs, ModInfo}. diff --git a/lib/compiler/src/beam_ssa_check.erl b/lib/compiler/src/beam_ssa_check.erl index 29a1264daf6c..26a2e3babe86 100644 --- a/lib/compiler/src/beam_ssa_check.erl +++ b/lib/compiler/src/beam_ssa_check.erl @@ -159,6 +159,12 @@ op_check([set,Result,{{atom,_,bif},{atom,_,Op}}|PArgs], PAnno, [Op, Result, Dst, PArgs, AArgs, _I]), Env = op_check_call(Op, Result, Dst, PArgs, AArgs, Env0), check_annos(PAnno, AAnno, Env); +op_check([set,Result,{{atom,_,succeeded},{atom,_,Kind}}|PArgs], PAnno, + #b_set{dst=Dst,args=AArgs,op={succeeded,Kind},anno=AAnno}=_I, Env0) -> + ?DP("trying succeed ~p:~n res: ~p <-> ~p~n args: ~p <-> ~p~n i: ~p~n", + [Kind, Result, Dst, PArgs, AArgs, _I]), + Env = op_check_call(dont_care, Result, Dst, PArgs, AArgs, Env0), + check_annos(PAnno, AAnno, Env); op_check([none,{atom,_,ret}|PArgs], PAnno, #b_ret{arg=AArg,anno=AAnno}=_I, Env) -> ?DP("trying return:, arg: ~p <-> ~p~n i: ~p~n", @@ -340,7 +346,7 @@ build_map_key({list,_,Elems}, Env) -> build_map_key({tuple,_,Elems}, Env) -> list_to_tuple([build_map_key(E, Env) || E <- Elems]); build_map_key({map,_,Elems}, Env) -> - #{build_map_key(K, Env) => build_map_key(V, Env) || {K,V} <- Elems}; + #{build_map_key(K, Env) => build_map_key(V, Env) || {K,V} <:- Elems}; build_map_key({var,_,V}, Env) -> map_get(V, Env); build_map_key(_Key, _Env) -> diff --git a/lib/compiler/src/beam_ssa_codegen.erl b/lib/compiler/src/beam_ssa_codegen.erl index 9e7f94248a64..e5ff7da4c239 100644 --- a/lib/compiler/src/beam_ssa_codegen.erl +++ b/lib/compiler/src/beam_ssa_codegen.erl @@ -2028,7 +2028,7 @@ force_reg({Kind,_}=R, _) when Kind =:= x; Kind =:= y -> successors(#cg_br{succ=Succ,fail=Fail}) -> ordsets:from_list([Succ,Fail]); successors(#cg_switch{fail=Fail,list=List}) -> - ordsets:from_list([Fail|[Lbl || {_,Lbl} <- List]]); + ordsets:from_list([Fail|[Lbl || {_,Lbl} <:- List]]); successors(#cg_ret{}) -> []. %% linearize(Blocks) -> [{BlockLabel,#cg_blk{}}]. @@ -2134,7 +2134,7 @@ translate_phis(L, #cg_br{succ=Target,fail=Target}, Blocks) -> translate_phis(_, _, _) -> []. phi_copies([#b_set{dst=Dst,args=PhiArgs}|Sets], L) -> - CopyArgs = [V || {V,Target} <- PhiArgs, Target =:= L], + CopyArgs = [V || {V,Target} <:- PhiArgs, Target =:= L], [#cg_set{op=copy,dst=Dst,args=CopyArgs}|phi_copies(Sets, L)]; phi_copies([], _) -> []. diff --git a/lib/compiler/src/beam_ssa_dead.erl b/lib/compiler/src/beam_ssa_dead.erl index 8e676193562d..0dd0a9f37d5c 100644 --- a/lib/compiler/src/beam_ssa_dead.erl +++ b/lib/compiler/src/beam_ssa_dead.erl @@ -184,7 +184,7 @@ shortcut(L, _From, Bs, #st{test=none,target=one_way}) when map_size(Bs) =:= 0 -> %% block has a two-way `br` terminator. #b_br{bool=#b_literal{val=true},succ=L,fail=L}; shortcut(L, From, Bs, St) -> - shortcut_1(L, From, Bs, sets:new([{version, 2}]), St). + shortcut_1(L, From, Bs, sets:new(), St). shortcut_1(L, From, Bs0, UnsetVars0, St) -> case shortcut_2(L, From, Bs0, UnsetVars0, St) of @@ -389,7 +389,7 @@ update_unset_vars(L, Is, Br, UnsetVars, #st{skippable=Skippable}) -> false -> %% Some variables defined in this block are used by %% successors. We must update the set of unset variables. - SetInThisBlock = [V || #b_set{dst=V} <- Is], + SetInThisBlock = [V || #b_set{dst=V} <:- Is], list_set_union(SetInThisBlock, UnsetVars) end. @@ -1010,7 +1010,7 @@ comb_is([], _Bool, Safe) -> %% combine_lists(Fail, L1, L2, Blocks) -> - Ls = beam_ssa:rpo([Lbl || {_,Lbl} <- L1], Blocks), + Ls = beam_ssa:rpo([Lbl || {_,Lbl} <:- L1], Blocks), case member(Fail, Ls) of true -> %% One or more of labels in the first list @@ -1030,7 +1030,7 @@ combine_lists_1(List0, List1) -> case are_lists_compatible(List0, List1) of true -> First = maps:from_list(List0), - List0 ++ [{Val,Lbl} || {Val,Lbl} <- List1, + List0 ++ [{Val,Lbl} || {Val,Lbl} <:- List1, not is_map_key(Val, First)]; false -> none @@ -1415,7 +1415,7 @@ used_vars([{L,#b_blk{is=Is}=Blk}|Bs], UsedVars0, Skip0) -> %% shortcut_opt/1. Successors = beam_ssa:successors(Blk), - Used0 = used_vars_succ(Successors, L, UsedVars0, sets:new([{version, 2}])), + Used0 = used_vars_succ(Successors, L, UsedVars0, sets:new()), Used = used_vars_blk(Blk, Used0), UsedVars = used_vars_phis(Is, L, Used, UsedVars0), @@ -1425,8 +1425,8 @@ used_vars([{L,#b_blk{is=Is}=Blk}|Bs], UsedVars0, Skip0) -> %% successor). This information is also useful for speeding up %% shortcut_opt/1. - Defined0 = [Def || #b_set{dst=Def} <- Is], - Defined = sets:from_list(Defined0, [{version, 2}]), + Defined0 = [Def || #b_set{dst=Def} <:- Is], + Defined = sets:from_list(Defined0), MaySkip = sets:is_disjoint(Defined, Used0), case MaySkip of true -> @@ -1462,12 +1462,12 @@ used_vars_phis(Is, L, Live0, UsedVars0) -> [] -> UsedVars; [_|_] -> - PhiArgs = append([Args || #b_set{args=Args} <- Phis]), + PhiArgs = append([Args || #b_set{args=Args} <:- Phis]), case [{P,V} || {#b_var{}=V,P} <- PhiArgs] of [_|_]=PhiVars -> PhiLive0 = rel2fam(PhiVars), PhiLive = #{{L,P} => list_set_union(Vs, Live0) || - {P,Vs} <- PhiLive0}, + {P,Vs} <:- PhiLive0}, maps:merge(UsedVars, PhiLive); [] -> %% There were only literals in the phi node(s). @@ -1497,7 +1497,7 @@ list_set_union([], Set) -> list_set_union([E], Set) -> sets:add_element(E, Set); list_set_union(List, Set) -> - sets:union(sets:from_list(List, [{version, 2}]), Set). + sets:union(sets:from_list(List), Set). sub(#b_set{args=Args}=I, Sub) when map_size(Sub) =/= 0 -> I#b_set{args=[sub_arg(A, Sub) || A <- Args]}; diff --git a/lib/compiler/src/beam_ssa_destructive_update.erl b/lib/compiler/src/beam_ssa_destructive_update.erl index 668da13a2ffe..52788e0e53f7 100644 --- a/lib/compiler/src/beam_ssa_destructive_update.erl +++ b/lib/compiler/src/beam_ssa_destructive_update.erl @@ -92,7 +92,7 @@ -export([opt/2]). --import(lists, [foldl/3, foldr/3, keysort/2, reverse/1]). +-import(lists, [foldl/3, foldr/3, keysort/2, splitwith/2, reverse/1]). -include("beam_ssa_opt.hrl"). -include("beam_types.hrl"). @@ -140,7 +140,7 @@ opt(StMap, FuncDb) -> ForceCopy, StMap, FuncDb) catch throw:too_deep -> - %% Give up and leave the module onmodified. + %% Give up and leave the module unmodified. {StMap,FuncDb} end. @@ -268,7 +268,7 @@ patch_instructions(Applicable, InitialsToPatch, ForceCopy, StMap0, FuncDb) -> ?DP("Initial values to patch :~n ~p~n", [InitialsToPatch]), ?DP("Force copy :~n ~p~n", [ForceCopy]), %% Merge instructions and initial values so we only get one map - %% per fuctions which is indexed on the variable. + %% per function which is indexed on the variable. Merge = fun(A, B) -> maps:fold(fun(VarOrLbl, Info0, Acc) -> @@ -334,7 +334,7 @@ fiv_track_value_in_fun([{#b_var{}=V,Element}|Rest], Fun, Work0, Defs, ?DP("Tracking ~p of ~p in fun ~s~n", [Element, V, ff(Fun)]), ValuesInFun = ValuesInFun0#{{V,Element}=>visited}, case Defs of - #{V:=#b_set{dst=V,op=Op,args=Args}} -> + #{V:=#b_set{dst=V,op=Op,args=Args,anno=Anno}} -> case {Op,Args,Element} of {bs_create_bin,[#b_literal{val=append},_,Arg|_], {self,init_writable}} -> @@ -378,20 +378,74 @@ fiv_track_value_in_fun([{#b_var{}=V,Element}|Rest], Fun, Work0, Defs, %% be able to safely rewrite an accumulator in the %% tail field of the cons, thus we will never %% have to track it. - Depth = fiv_get_new_depth(Element), - ?DP("value is created by a get_hd, adding ~p.~n", - [{List,{hd,Element,Depth}}]), - fiv_track_value_in_fun( - [{List,{hd,Element,Depth}}|Rest], Fun, Work0, - Defs, ValuesInFun, FivSt0); + + %% We know that there will be type information + %% about the list as get_hd is never used + %% unprotected without a guard (which will allow + %% the type pass to deduce the type) or when + %% existing type information allows the guard to + %% be eliminated. + #{arg_types:=#{0:=#t_cons{type=Type}}} = Anno, + IsComp = fiv_elem_is_compatible(Element, Type), + ?DP("~p is ~scompatible with ~p~n", + [Element, + case IsComp of true -> ""; false -> "not " end, + Type]), + case IsComp of + true -> + Depth = fiv_get_new_depth(Element), + ?DP("value is created by a get_hd, adding ~p.~n", + [{List,{hd,Element,Depth}}]), + fiv_track_value_in_fun( + [{List,{hd,Element,Depth}}|Rest], Fun, Work0, + Defs, ValuesInFun, FivSt0); + false -> + ?DP("value type is not compatible with element.~n"), + fiv_track_value_in_fun( + Rest, Fun, Work0, Defs, ValuesInFun, FivSt0) + end; {get_tuple_element,[#b_var{}=Tuple,#b_literal{val=Idx}],_} -> - Depth = fiv_get_new_depth(Element), - ?DP("value is created by a get_tuple_element, adding ~p.~n", - [{Tuple,{tuple_element,Idx,Element,Depth}}]), - fiv_track_value_in_fun( - [{Tuple,{tuple_element,Idx,Element,Depth}}|Rest], - Fun, Work0, - Defs, ValuesInFun, FivSt0); + %% The type annotation is present following the + %% same argument as for get_hd. We know that it + %% must be either a #t_tuple{} or a #t_union{} + %% containing tuples. + #{arg_types:=#{0:=TupleType}} = Anno, + ?DP(" tuple-type: ~p~n", [TupleType]), + ?DP(" idx: ~p~n", [Idx]), + ?DP(" element: ~p~n", [Element]), + Type = + case TupleType of + #t_tuple{elements=Es} -> + T = maps:get(Idx + 1, Es, any), + ?DP(" type: ~p~n", [T]), + T; + #t_union{tuple_set=TS} -> + ?DP(" tuple-set: ~p~n", [TS]), + JointType = + fiv_get_effective_tuple_set_type(Idx, TS), + ?DP(" joint-type: ~p~n", [JointType]), + JointType + end, + IsComp = fiv_elem_is_compatible(Element, Type), + ?DP("~p is ~scompatible with ~p~n", + [Element, + case IsComp of true -> ""; false -> "not " end, + TupleType]), + case IsComp of + true -> + Depth = fiv_get_new_depth(Element), + ?DP("value is created by a get_tuple_element," + " adding ~p.~n", + [{Tuple,{tuple_element,Idx,Element,Depth}}]), + fiv_track_value_in_fun( + [{Tuple,{tuple_element,Idx,Element,Depth}}|Rest], + Fun, Work0, + Defs, ValuesInFun, FivSt0); + false -> + ?DP("value type is not compatible with element.~n"), + fiv_track_value_in_fun( + Rest, Fun, Work0, Defs, ValuesInFun, FivSt0) + end; {phi,_,_} -> ?DP("value is created by a phi~n"), {ToExplore,FivSt} = fiv_handle_phi(Fun, V, Args, @@ -702,6 +756,52 @@ fiv_get_new_depth({hd,_,D}) -> fiv_get_new_depth(_) -> 0. +fiv_elem_is_compatible({tuple_element,Idx,Element,_}, + #t_tuple{exact=true,elements=Types}) -> + %% There is no need to check if the index is within bounds as the + %% compiler will ensure that the size of the tuple, and that, in + %% turn, will ensure that there is type information. + fiv_elem_is_compatible(Element, maps:get(Idx + 1, Types, any)); +fiv_elem_is_compatible({tuple_element,_,_,_}=Element, + #t_union{tuple_set=TS}) -> + fiv_elem_is_compatible_with_ts(Element, TS); +fiv_elem_is_compatible({self,heap_tuple}, #t_tuple{}) -> + true; +fiv_elem_is_compatible({self,heap_tuple}=Element, #t_union{tuple_set=TS}) -> + fiv_elem_is_compatible_with_ts(Element, TS); +fiv_elem_is_compatible({self,heap_tuple}, any) -> + true; +fiv_elem_is_compatible({self,heap_tuple}, _) -> + %% With a heap_tuple, anything which isn't t_union{}, #t_tuple{} + %% or any is not compatible. + false; +fiv_elem_is_compatible({hd,Element,_}, #t_cons{type=T}) -> + fiv_elem_is_compatible(Element, T); +fiv_elem_is_compatible({hd,Element,_}, #t_union{list=T}) -> + fiv_elem_is_compatible(Element, T); +fiv_elem_is_compatible({hd,_,_}, _) -> + %% With a hd, anything which isn't t_list{}, t_cons{} or + %% #t_union{} is not compatible. + false; +fiv_elem_is_compatible(_Element, _Type) -> + %% Conservatively consider anything which isn't explicitly flagged + %% as incompatible as compatible. + true. + +fiv_get_effective_tuple_set_type(TupleIdx, TS) -> + beam_types:join([maps:get(TupleIdx + 1, Es, any) + || {_,#t_tuple{elements=Es}} <- TS]). + +%% Check if the element is compatible with a record_set() +fiv_elem_is_compatible_with_ts(Element, #t_tuple{}=Type) -> + fiv_elem_is_compatible(Element, Type); +fiv_elem_is_compatible_with_ts(Element, [{_,T}|Rest]) -> + fiv_elem_is_compatible(Element, T) + orelse fiv_elem_is_compatible_with_ts(Element, Rest); +fiv_elem_is_compatible_with_ts(_Element, []) -> + %% The element was not compatible with any of the record sets. + false. + patch_f(SSA0, Cnt0, Patches) -> patch_f(SSA0, Cnt0, Patches, [], []). @@ -730,19 +830,18 @@ patch_is([I0=#b_set{dst=Dst}|Rest], PD0, Cnt0, Acc, BlockAdditions0) PD = maps:remove(Dst, PD0), case Patches of [{opargs,Dst,_,_,_}|_] -> + Splitter = fun({opargs,D,_Idx,_Lit,_Element}) -> + Dst =:= D; + (_) -> + false + end, + {OpArgs0, Other} = splitwith(Splitter, Patches), OpArgs = [{Idx,Lit,Element} - || {opargs,D,Idx,Lit,Element} <- Patches, Dst =:= D], - Forced = [ F || {force_copy,_}=F <- Patches], - I1 = case Forced of - [] -> - I0; - _ -> - no_reuse(I0) - end, - 0 = length(Patches) - length(Forced) - length(OpArgs), + || {opargs,_D,Idx,Lit,Element} <:- OpArgs0], Ps = keysort(1, OpArgs), - {Is,Cnt} = patch_opargs(I1, Ps, Cnt0), - patch_is(Rest, PD, Cnt, Is++Acc, BlockAdditions0); + {Is,Cnt} = patch_opargs(I0, Ps, Cnt0), + patch_is([hd(Is)|Rest], PD#{Dst=>Other}, Cnt, + tl(Is)++Acc, BlockAdditions0); [{appendable_binary,Dst,#b_literal{val= <<>>}=Lit}] -> %% Special case for when the first fragment is a literal %% <<>> and it has to be replaced with a bs_init_writable. @@ -789,7 +888,7 @@ no_reuse(I) -> %% literal. patch_ret(Last=#b_ret{arg=#b_literal{val=Lit}}, Patches, Cnt0) -> ?DP("patch_appends_ret:~n lit: ~p~n Patches: ~p~n", [Lit, Patches]), - Element = aggregate_ret_patches(keysort(1, [E || {ret,_,E} <- Patches])), + Element = aggregate_ret_patches(keysort(1, [E || {ret,_,E} <:- Patches])), ?DP(" element: ~p~n", [Element]), {V,Extra,Cnt} = patch_literal_term(Lit, Element, Cnt0), {Last#b_ret{arg=V}, Extra, Cnt}. @@ -877,7 +976,7 @@ patch_phi(I0=#b_set{op=phi,args=Args0}, Patches, Cnt0) -> %% Should return the instructions in reversed order patch_literal_term(Tuple, {tuple_elements,Elems}, Cnt) -> - Es = [{tuple_element,I,E,0} || {I,E} <- keysort(1, Elems)], + Es = [{tuple_element,I,E,0} || {I,E} <:- keysort(1, Elems)], patch_literal_tuple(Tuple, Es, Cnt); patch_literal_term(Tuple, E={tuple_element,_,_,_}, Cnt) -> patch_literal_tuple(Tuple, [E], Cnt); @@ -918,7 +1017,7 @@ patch_literal_list(Lit, {hd,_,_}, Cnt) -> patch_literal_tuple(Tuple, Elements0, Cnt) -> ?DP("Will patch literal tuple~n tuple:~p~n elements: ~p~n", [Tuple,Elements0]), - Elements = [ E || {tuple_element,_,_,_}=E <- Elements0], + Elements = [ E || {tuple_element,_,_,_}=E <:- Elements0], patch_literal_tuple(erlang:tuple_to_list(Tuple), Elements, [], [], 0, Cnt). patch_literal_tuple([Lit|LitElements], diff --git a/lib/compiler/src/beam_ssa_lint.erl b/lib/compiler/src/beam_ssa_lint.erl index 70cadd321145..37deac88d130 100644 --- a/lib/compiler/src/beam_ssa_lint.erl +++ b/lib/compiler/src/beam_ssa_lint.erl @@ -108,7 +108,7 @@ validate_variables(#b_function{ args = Args, bs = Blocks }) -> -spec vvars_assert_unique(Blocks, [beam_ssa:b_var()]) -> ok when Blocks :: #{ beam_ssa:label() => beam_ssa:b_blk() }. vvars_assert_unique(Blocks, Args) -> - BlockIs = [Is || #b_blk{is=Is} <- maps:values(Blocks)], + BlockIs = [Is || #b_blk{is=Is} <:- maps:values(Blocks)], Defined0 = #{V => argument || V <- Args}, _ = foldl(fun(Is, Defined) -> vvars_assert_unique_1(Is, Defined) @@ -130,7 +130,7 @@ vvars_assert_unique_1([], Defined) -> -spec vvars_phi_nodes(State :: #vvars{}) -> ok. vvars_phi_nodes(#vvars{ blocks = Blocks }=State) -> _ = [vvars_phi_nodes_1(Is, Id, State) || - Id := #b_blk{ is = Is } <- Blocks], + Id := #b_blk{ is = Is } <:- Blocks], ok. -spec vvars_phi_nodes_1(Is, Id, State) -> ok when @@ -161,7 +161,7 @@ vvars_phi_nodes_1([], _Id, _State) -> vvars_assert_phi_paths(Phis, I, Id, State) -> BranchKeys = maps:keys(State#vvars.branches), RequiredPaths = ordsets:from_list([From || {From, To} <- BranchKeys, To =:= Id]), - ProvidedPaths = ordsets:from_list([From || {_Value, From} <- Phis]), + ProvidedPaths = ordsets:from_list([From || {_Value, From} <:- Phis]), case ordsets:subtract(RequiredPaths, ProvidedPaths) of [_|_]=MissingPaths -> throw({missing_phi_paths, MissingPaths, I}); [] -> ok @@ -308,8 +308,8 @@ vvars_terminator(#b_ret{arg=Arg,anno=Anno}=I, From, State) -> vvars_terminator(#b_switch{arg=Arg,fail=Fail,list=Switch,anno=Anno}=I, From, State) -> check_anno(Anno), ok = vvars_assert_args([Arg], I, State), - ok = vvars_assert_args([A || {A,_Lbl} <- Switch], I, State), - Labels = [Fail | [Lbl || {_Arg, Lbl} <- Switch]], + ok = vvars_assert_args([A || {A,_Lbl} <:- Switch], I, State), + Labels = [Fail | [Lbl || {_Arg, Lbl} <:- Switch]], ok = vvars_assert_labels(Labels, I, State), vvars_terminator_1(Labels, From, State); vvars_terminator(#b_br{bool=#b_literal{val=true},succ=Succ,anno=Anno}=I, From, State) -> diff --git a/lib/compiler/src/beam_ssa_opt.erl b/lib/compiler/src/beam_ssa_opt.erl index a6dfc0ddb384..82bde660df3b 100644 --- a/lib/compiler/src/beam_ssa_opt.erl +++ b/lib/compiler/src/beam_ssa_opt.erl @@ -295,7 +295,8 @@ epilogue_module_passes(Opts) -> early_epilogue_passes(Opts) -> Ps = [?PASS(ssa_opt_type_finish), ?PASS(ssa_opt_float), - ?PASS(ssa_opt_sw)], + ?PASS(ssa_opt_sw), + ?PASS(ssa_opt_no_reuse)], passes_1(Ps, Opts). late_epilogue_passes(Opts) -> @@ -319,7 +320,7 @@ late_epilogue_passes(Opts) -> passes_1(Ps, Opts0) -> Negations = [{list_to_atom("no_"++atom_to_list(N)),N} || - {N,_} <- Ps], + {N,_} <:- Ps], Expansions = [{no_bs_match,[no_ssa_opt_bs_ensure,no_bs_match]}], Opts = proplists:normalize(Opts0, [{expand,Expansions}, {negations,Negations}]), @@ -409,7 +410,7 @@ get_call_order_po(StMap, FuncDb) when is_map(FuncDb) -> gco_po(FuncDb) -> All = sort(maps:keys(FuncDb)), - {RPO,_} = gco_rpo(All, FuncDb, sets:new([{version, 2}]), []), + {RPO,_} = gco_rpo(All, FuncDb, sets:new(), []), reverse(RPO). gco_rpo([Id|Ids], FuncDb, Seen0, Acc0) -> @@ -639,7 +640,7 @@ c_rewrite_phis(Is, _Info) -> Is. c_rewrite_phi([{Var,Pred}|As], {Var,Pred,Values}) -> Values ++ As; c_rewrite_phi([{Value,Pred}|As], {_,Pred,Values}) -> - [{Value,P} || {_,P} <- Values] ++ As; + [{Value,P} || {_,P} <:- Values] ++ As; c_rewrite_phi([A|As], Info) -> [A|c_rewrite_phi(As, Info)]; c_rewrite_phi([], _Info) -> []. @@ -733,7 +734,7 @@ opt_tail_phi(Phis0, Is, Ret, Blocks0, Count0) -> end. reduce_phis([#b_set{dst=PhiDst,args=PhiArgs}|Is]) -> - [{L,{PhiDst,Val}} || {Val,L} <- PhiArgs] ++ reduce_phis(Is); + [{L,{PhiDst,Val}} || {Val,L} <:- PhiArgs] ++ reduce_phis(Is); reduce_phis([]) -> []. opt_tail_phi_arg({PredL,Sub0}, Is0, Ret0, {Blocks0,Count0,Cost0}) -> @@ -1588,7 +1589,7 @@ ssa_opt_live({#opt_st{ssa=Linear0}=St, FuncDb}) -> live_opt([{L,Blk0}|Bs], LiveMap0, Blocks) -> Blk1 = beam_ssa_share:block(Blk0, Blocks), Successors = beam_ssa:successors(Blk1), - Live0 = live_opt_succ(Successors, L, LiveMap0, sets:new([{version, 2}])), + Live0 = live_opt_succ(Successors, L, LiveMap0, sets:new()), {Blk,Live} = live_opt_blk(Blk1, Live0), LiveMap = live_opt_phis(Blk#b_blk.is, L, Live, LiveMap0), live_opt(Bs, LiveMap, Blocks#{L:=Blk}); @@ -1617,12 +1618,12 @@ live_opt_phis(Is, L, Live0, LiveMap0) -> [] -> LiveMap; [_|_] -> - PhiArgs = append([Args || #b_set{args=Args} <- Phis]), + PhiArgs = append([Args || #b_set{args=Args} <:- Phis]), case [{P,V} || {#b_var{}=V,P} <- PhiArgs] of [_|_]=PhiVars -> PhiLive0 = rel2fam(PhiVars), PhiLive = #{{L,P} => list_set_union(Vs, Live0) || - {P,Vs} <- PhiLive0}, + {P,Vs} <:- PhiLive0}, maps:merge(LiveMap, PhiLive); [] -> %% There were only literals in the phi node(s). @@ -1718,7 +1719,7 @@ opt_try(Linear, Count0) when is_list(Linear) -> Reduced = reduce_try(Shrunk, []), - EmptySet = sets:new([{version, 2}]), + EmptySet = sets:new(), Trimmed = trim_try(Reduced, EmptySet, EmptySet, []), {Count, Trimmed}. @@ -1824,7 +1825,7 @@ is_safe_sink_try(#b_set{op=Op}=I) -> reduce_try([{L,#b_blk{is=[#b_set{op=new_try_tag}], last=Last}=Blk0} | Bs0], Acc) -> #b_br{succ=Succ,fail=Fail} = Last, - Ws = sets:from_list([Succ,Fail], [{version, 2}]), + Ws = sets:from_list([Succ,Fail]), try do_reduce_try(Bs0, Ws) of Bs -> Blk = Blk0#b_blk{is=[], @@ -1892,6 +1893,24 @@ reduce_try_is([#b_set{op={succeeded,body}}=I0|Is], Acc) -> %% succeeded to the `guard`, since the try/catch will be removed. I = I0#b_set{op={succeeded,guard}}, reduce_try_is(Is, [I|Acc]); +reduce_try_is([#b_set{op=call,args=[#b_remote{mod=#b_literal{val=M}, + name=#b_literal{val=F}, + arity=A}=R0|Args0]}=I0|Is], + Acc) -> + %% Rewrite binary_to_(existing_)atom/1 call to binary_to_(existing_)atom/2. + {I1, Args1} = if {M, F, A} =:= {erlang, binary_to_atom, 1} orelse + {M, F, A} =:= {erlang, binary_to_existing_atom, 1} -> + Args = Args0++[#b_literal{val=utf8}], + {I0#b_set{args=[R0#b_remote{arity=2}|Args]},Args}; + true -> {I0, Args0} + end, + %% Remove try-catch for bifs that can be written as guards. + case beam_ssa:can_be_guard_bif(M, F, A) of + true -> + I = I1#b_set{op={bif,F},args=Args1}, + reduce_try_is(Is, [I|Acc]); + false -> unsafe + end; reduce_try_is([#b_set{op=Op}=I|Is], Acc) -> IsSafe = case Op of phi -> true; @@ -1957,7 +1976,7 @@ trim_try([], _Unreachable, Killed, Acc0) -> %% Remove all `kill_try_tag` instructions referencing removed %% try/catches. [{L, Blk#b_blk{is=trim_try_is(Is0, Killed)}} || - {L, #b_blk{is=Is0}=Blk} <- Acc0] + {L, #b_blk{is=Is0}=Blk} <:- Acc0] end. trim_try_is([#b_set{op=phi,dst=CatchEndVal}=Phi, @@ -1989,7 +2008,7 @@ trim_try_is([], _Killed) -> ssa_opt_bsm({#opt_st{ssa=Linear0}=St, FuncDb}) -> Extracted0 = bsm_extracted(Linear0), - Extracted = sets:from_list(Extracted0, [{version, 2}]), + Extracted = sets:from_list(Extracted0), Linear1 = bsm_skip(Linear0, Extracted), Linear = bsm_coalesce_skips(Linear1, #{}), {St#opt_st{ssa=Linear}, FuncDb}. @@ -2794,12 +2813,12 @@ partition_deflocs(DefLoc, _Defs, Blocks) -> {BlkNums0,_} = mapfoldl(fun(L, N) -> {{L,N},N+1} end, 0, beam_ssa:rpo(Blocks)), BlkNums = maps:from_list(BlkNums0), S = [{Tuple,{map_get(To, BlkNums),{V,{From,To}}}} || - {V,Tuple,{From,To}} <- DefLoc], + {V,Tuple,{From,To}} <:- DefLoc], F = rel2fam(S), partition_deflocs_1(F, Blocks). partition_deflocs_1([{Tuple,DefLocs0}|T], Blocks) -> - DefLocs1 = [DL || {_,DL} <- DefLocs0], + DefLocs1 = [DL || {_,DL} <:- DefLocs0], DefLocs = partition_dl(DefLocs1, Blocks), [{Tuple,DL} || DL <- DefLocs] ++ partition_deflocs_1(T, Blocks); partition_deflocs_1([], _) -> []. @@ -2826,9 +2845,9 @@ filter_deflocs([{Tuple,DefLoc0}|DLs], Preds, Blocks) -> %% execution order from the same tuple in the same clause. [{_,{_,First}}|_] = DefLoc0, Paths = find_paths_to_check(DefLoc0, First), - WillGC0 = ordsets:from_list([FromTo || {{_,_}=FromTo,_} <- Paths]), + WillGC0 = ordsets:from_list([FromTo || {{_,_}=FromTo,_} <:- Paths]), WillGC = #{{From,To} => will_gc(From, To, Preds, Blocks, true) || - {From,To} <- WillGC0}, + {From,To} <:- WillGC0}, %% Separate sinks that will force the reference to the tuple to be %% saved on the stack from sinks that don't force. @@ -2842,7 +2861,7 @@ filter_deflocs([{Tuple,DefLoc0}|DLs], Preds, Blocks) -> %% Construct the complete list of sink operations. DefLoc1 = DefLocGC ++ DefLocNoGC, - [DL || {_,{_,{From,To}}=DL} <- DefLoc1, From =/= To] ++ + [DL || {_,{_,{From,To}}=DL} <:- DefLoc1, From =/= To] ++ filter_deflocs(DLs, Preds, Blocks); filter_deflocs([], _, _) -> []. @@ -3156,8 +3175,8 @@ opt_get_tuple_element_is([#b_set{op=get_tuple_element, args=[#b_var{}=Src,_]}=I0|Is0], _AnyChange, Acc) -> {GetIs0,Is} = collect_get_tuple_element(Is0, Src, [I0]), - GetIs1 = sort([{Pos,I} || #b_set{args=[_,Pos]}=I <- GetIs0]), - GetIs = [I || {_,I} <- GetIs1], + GetIs1 = sort([{Pos,I} || #b_set{args=[_,Pos]}=I <:- GetIs0]), + GetIs = [I || {_,I} <:- GetIs1], opt_get_tuple_element_is(Is, true, reverse(GetIs, Acc)); opt_get_tuple_element_is([I|Is], AnyChange, Acc) -> opt_get_tuple_element_is(Is, AnyChange, [I|Acc]); @@ -3623,7 +3642,7 @@ is_bs_match_blk(L, Blocks) -> Blk = map_get(L, Blocks), case Blk of #b_blk{is=Is,last=#b_br{bool=#b_var{}}=Last} -> - case is_bs_match_is(Is) of + case is_bs_match_is(Is, true) of no -> no; {yes,CtxSizeUnit} -> @@ -3634,20 +3653,33 @@ is_bs_match_blk(L, Blocks) -> end. is_bs_match_is([#b_set{op=bs_match,dst=Dst}=I, - #b_set{op={succeeded,guard},args=[Dst]}]) -> - case is_viable_match(I) of - no -> + #b_set{op={succeeded,guard},args=[Dst]}], Safe) -> + case Safe of + false -> + %% This `bs_match` (SSA) instruction was preceded by other + %% instructions (such as guard BIF calls) that would + %% prevent this match operation to be incorporated into + %% the commands list of a `bs_match` (BEAM) instruction. no; - {yes,{Ctx,Size,Unit}} when Size bsr 24 =:= 0 -> - %% Only include matches of reasonable size. - {yes,{{Ctx,Dst},Size,Unit}}; - {yes,_} -> - %% Too large size. - no + true -> + case is_viable_match(I) of + no -> + no; + {yes,{Ctx,Size,Unit}} when Size bsr 24 =:= 0 -> + %% Only include matches of reasonable size. + {yes,{{Ctx,Dst},Size,Unit}}; + {yes,_} -> + %% Too large size. + no + end end; -is_bs_match_is([_|Is]) -> - is_bs_match_is(Is); -is_bs_match_is([]) -> no. +is_bs_match_is([#b_set{op=bs_extract}|Is], Safe) -> + is_bs_match_is(Is, Safe); +is_bs_match_is([#b_set{op=bs_start_match}|Is], _Safe) -> + is_bs_match_is(Is, true); +is_bs_match_is([_|Is], _Safe) -> + is_bs_match_is(Is, false); +is_bs_match_is([], _Safe) -> no. is_viable_match(#b_set{op=bs_match,args=Args}) -> case Args of @@ -3698,6 +3730,89 @@ build_bs_ensure_match(L, {_,Size,Unit}, Count0, Blocks0) -> {Blocks,Count}. +%%% +%%% Change the `reuse` hint to `copy` when it is highly probable that +%%% reuse will not happen. +%%% + +ssa_opt_no_reuse({#opt_st{ssa=Linear0}=St, FuncDb}) when is_list(Linear0) -> + New = sets:new([{version,2}]), + Linear = ssa_opt_no_reuse_blks(Linear0, New), + {St#opt_st{ssa=Linear}, FuncDb}. + +ssa_opt_no_reuse_blks([{L,#b_blk{is=Is0}=Blk0}|Bs], New0) -> + {Is,New} = ssa_opt_no_reuse_is(Is0, New0, []), + Blk = Blk0#b_blk{is=Is}, + [{L,Blk}|ssa_opt_no_reuse_blks(Bs, New)]; +ssa_opt_no_reuse_blks([], _) -> + []. + +ssa_opt_no_reuse_is([#b_set{op=update_record,args=Args}=I0|Is], New, Acc) -> + [_,_,_|Updates] = Args, + case cannot_reuse(Updates, New) of + true -> + I = I0#b_set{args=[#b_literal{val=copy}|tl(Args)]}, + ssa_opt_no_reuse_is(Is, New, [I|Acc]); + false -> + ssa_opt_no_reuse_is(Is, New, [I0|Acc]) + end; +ssa_opt_no_reuse_is([#b_set{dst=Dst}=I|Is], New0, Acc) -> + case inhibits_reuse(I, New0) of + true -> + New = sets:add_element(Dst, New0), + ssa_opt_no_reuse_is(Is, New, [I|Acc]); + false -> + ssa_opt_no_reuse_is(Is, New0, [I|Acc]) + end; +ssa_opt_no_reuse_is([], New, Acc) -> + {reverse(Acc),New}. + +inhibits_reuse(#b_set{op=phi,args=Args}, New) -> + all(fun({Value,_}) -> + sets:is_element(Value, New) + end, Args); +inhibits_reuse(#b_set{op=put_map,args=[_|Args]}, New) -> + cannot_reuse(Args, New); +inhibits_reuse(#b_set{op=call, + args=[#b_remote{mod=#b_literal{val=erlang}, + name=#b_literal{val=Name}}|_]}, + _New) -> + case Name of + '++' -> true; + '--' -> true; + atom_to_list -> true; + atom_to_binary -> true; + list_to_tuple -> true; + make_ref -> true; + monitor -> true; + setelement -> true; + send_after -> true; + spawn -> true; + spawn_link -> true; + spawn_monitor -> true; + tuple_to_list -> true; + _ -> false + end; +inhibits_reuse(#b_set{op={bif,Arith},args=[#b_var{},#b_literal{}]}, _New) + when Arith =:= '+'; Arith =:= '-' -> + %% This is probably a counter in a record being updated. (Heuristic, + %% but with a high probability of being correct). + true; +inhibits_reuse(#b_set{op=Op}, _New) -> + case Op of + bs_create_bin -> true; + bs_get_tail -> true; + make_fun -> true; + put_list -> true; + put_tuple -> true; + _ -> false + end. + +cannot_reuse([V|Values], New) -> + sets:is_element(V, New) orelse cannot_reuse(Values, New); +cannot_reuse([], _New) -> + false. + %%% %%% Common utilities. %%% @@ -3707,7 +3822,7 @@ list_set_union([], Set) -> list_set_union([E], Set) -> sets:add_element(E, Set); list_set_union(List, Set) -> - sets:union(sets:from_list(List, [{version, 2}]), Set). + sets:union(sets:from_list(List), Set). non_guards(Linear) -> gb_sets:from_list(non_guards_1(Linear)). @@ -3731,7 +3846,7 @@ sub(I, Sub) -> beam_ssa:normalize(sub_1(I, Sub)). sub_1(#b_set{op=phi,args=Args}=I, Sub) -> - I#b_set{args=[{sub_arg(A, Sub),P} || {A,P} <- Args]}; + I#b_set{args=[{sub_arg(A, Sub),P} || {A,P} <:- Args]}; sub_1(#b_set{args=Args}=I, Sub) -> I#b_set{args=[sub_arg(A, Sub) || A <- Args]}; sub_1(#b_br{bool=#b_var{}=Old}=Br, Sub) -> @@ -3849,7 +3964,7 @@ restore_nifs(#b_module{exports=Exports0}=Module0, {NIFsToExport, NIFs}) -> %% Remove the NIFs which where were forcibly exported by %% isolate_nifs/1 from the export list. Exports = [E - || E={N,A} <- Exports0, + || {N,A}=E <:- Exports0, not sets:is_element(#b_local{name=#b_literal{val=N}, arity=A}, NIFsToExport)], diff --git a/lib/compiler/src/beam_ssa_pp.erl b/lib/compiler/src/beam_ssa_pp.erl index 0616bbf8d9d2..c1a9c54e20fe 100644 --- a/lib/compiler/src/beam_ssa_pp.erl +++ b/lib/compiler/src/beam_ssa_pp.erl @@ -97,12 +97,12 @@ format_anno(parameter_info, Map) when is_map(Map) -> [format_var(V), Break, format_param_info(I, Break)]) || - {V,I} <- Params]] + {V,I} <:- Params]] end; format_anno(Key, Map) when is_map(Map) -> Sorted = maps:to_list(maps:iterator(Map, ordered)), [io_lib:format("%% ~s:\n", [Key]), - [io_lib:format("%% ~kw => ~kw\n", [K,V]) || {K,V} <- Sorted]]; + [io_lib:format("%% ~kw => ~kw\n", [K,V]) || {K,V} <:- Sorted]]; format_anno(Key, Value) -> io_lib:format("%% ~s: ~kp\n", [Key,Value]). @@ -241,7 +241,7 @@ format_arg(Other, _) -> format_switch_list(List, FuncAnno) -> Ss = [io_lib:format("{ ~ts, ~ts }", [format_arg(Val, FuncAnno), - format_label(L)]) || {Val,L} <- List], + format_label(L)]) || {Val,L} <:- List], io_lib:format("[\n ~ts\n ]", [lists:join(",\n ", Ss)]). format_label(L) -> @@ -266,9 +266,8 @@ format_instr_anno(#{arg_types:=Ts}=Anno0, FuncAnno, Args) -> Iota = lists:seq(0, length(Args) - 1), Formatted0 = [[format_arg(Arg, FuncAnno), " => ", - format_type(map_get(Idx, Ts), - Break)] - || {Idx, Arg} <- lists:zip(Iota, Args), is_map_key(Idx, Ts)], + format_type(map_get(Idx, Ts), Break)] || + Idx <- Iota && Arg <- Args, is_map_key(Idx, Ts)], Formatted = lists:join(Break, Formatted0), [io_lib:format(" %% Argument types:~s~ts\n", @@ -299,7 +298,7 @@ format_live_interval(#b_var{}=Dst, #{live_intervals:=Intervals}) -> case Intervals of #{Dst:=Rs0} -> Rs1 = [io_lib:format("~p..~p", [Start,End]) || - {Start,End} <- Rs0], + {Start,End} <:- Rs0], Rs = lists:join(" ", Rs1), io_lib:format(" %% ~ts: ~s\n", [format_var_1(Dst),Rs]); #{} -> diff --git a/lib/compiler/src/beam_ssa_pre_codegen.erl b/lib/compiler/src/beam_ssa_pre_codegen.erl index 80229fd23853..a985b7c8c3b5 100644 --- a/lib/compiler/src/beam_ssa_pre_codegen.erl +++ b/lib/compiler/src/beam_ssa_pre_codegen.erl @@ -290,7 +290,7 @@ bs_update_successors(#b_br{succ=Succ,fail=Fail}, SPos, FPos, D) -> join_positions([{Succ,SPos},{Fail,FPos}], D); bs_update_successors(#b_switch{fail=Fail,list=List}, SPos, FPos, D) -> SPos = FPos, %Assertion. - Update = [{L,SPos} || {_,L} <- List] ++ [{Fail,SPos}], + Update = [{L,SPos} || {_,L} <:- List] ++ [{Fail,SPos}], join_positions(Update, D); bs_update_successors(#b_ret{}, SPos, FPos, D) -> SPos = FPos, %Assertion. @@ -871,7 +871,7 @@ sanitize_arg(Arg, _Values) -> Arg. sanitize_instr(phi, PhiArgs0, I, Blocks) -> - PhiArgs = [{V,L} || {V,L} <- PhiArgs0, + PhiArgs = [{V,L} || {V,L} <:- PhiArgs0, is_map_key(L, Blocks)], case phi_all_same(PhiArgs) of true -> @@ -929,7 +929,8 @@ sanitize_instr({bif,Bif}, [#b_literal{val=Lit}], _I) -> end end; sanitize_instr({bif,Bif}, [#b_literal{val=Lit1},#b_literal{val=Lit2}], _I) -> - true = erl_bifs:is_pure(erlang, Bif, 2), %Assertion. + true = erl_bifs:is_pure(erlang, Bif, 2) orelse + beam_ssa:can_be_guard_bif(erlang, Bif, 2), %Assertion. try {subst,#b_literal{val=erlang:Bif(Lit1, Lit2)}} catch @@ -1089,7 +1090,7 @@ create_fc_stubs(Fs, #b_module{name=Mod}) -> #b_function{anno=Anno,args=Args, bs=#{0 => Blk}, cnt=1} - end || {{Name,Arity},Location} <- Stubs0], + end || {{Name,Arity},Location} <:- Stubs0], Fs ++ Stubs. find_fc_errors([#b_function{bs=Blocks}|Fs], Acc0) -> @@ -1188,7 +1189,7 @@ sort_update_tuple([_Index, _Value]=Args, []) -> sort_update_tuple([#b_literal{}=Index, Value | Updates], Acc) -> sort_update_tuple(Updates, [{Index, Value} | Acc]); sort_update_tuple([], Acc) -> - append([[Index, Value] || {Index, Value} <- sort(fun erlang:'>='/2, Acc)]). + append([[Index, Value] || {Index, Value} <:- sort(fun erlang:'>='/2, Acc)]). %%% %%% Find out where frames should be placed. @@ -1328,7 +1329,7 @@ place_frame_here(L, Blocks, Doms, Frames) -> phi_predecessors(L, Blocks) -> #b_blk{is=Is} = map_get(L, Blocks), - [P || #b_set{op=phi,args=Args} <- Is, {_,P} <- Args]. + [P || #b_set{op=phi,args=Args} <- Is, {_,P} <:- Args]. %% is_dominated_by(Label, DominatedBy, Dominators) -> true|false. %% Test whether block Label is dominated by block DominatedBy. @@ -1529,7 +1530,7 @@ rce_reroute_terminator(#b_switch{list=List0}=Last, Exit, New) -> List = [if Lbl =:= Exit -> {Arg, New}; Lbl =/= Exit -> {Arg, Lbl} - end || {Arg, Lbl} <- List0], + end || {Arg, Lbl} <:- List0], Last#b_switch{list=List}. %% recv_fix_common([CommonVar], LoopExit, [RemoveMessageLabel], @@ -1564,11 +1565,10 @@ recv_fix_common_1([V|Vs], [Rm|Rms], Msg, Blocks0) -> recv_fix_common_1(Vs, Rms, Msg, Blocks); recv_fix_common_1([], [], _Msg, Blocks) -> Blocks. -fix_exit_phi_args([V|Vs], [Rm|Rms], Exit, Blocks) -> - Path = beam_ssa:rpo([Rm], Blocks), - Preds = exit_predecessors(Path, Exit, Blocks), - [{V,Pred} || Pred <- Preds] ++ fix_exit_phi_args(Vs, Rms, Exit, Blocks); -fix_exit_phi_args([], [], _, _) -> []. +fix_exit_phi_args(Vs, Rms, Exit, Blocks) -> + [{V,Pred} || + V <- Vs && Rm <- Rms, + Pred <- exit_predecessors(beam_ssa:rpo([Rm], Blocks), Exit, Blocks)]. exit_predecessors([L|Ls], Exit, Blocks) -> Blk = map_get(L, Blocks), @@ -1594,7 +1594,7 @@ fix_receive([L|Ls], Defs, Blocks0, Count0) -> Blocks1 = beam_ssa:rename_vars(Ren, RPO, Blocks0), #b_blk{is=Is0} = Blk1 = map_get(L, Blocks1), Is = [#b_set{op=copy,dst=New,args=[Old]} || - {Old,New} <- Ren] ++ Is0, + {Old,New} <:- Ren] ++ Is0, Blk = Blk1#b_blk{is=Is}, Blocks = Blocks1#{L:=Blk}, fix_receive(Ls, Defs, Blocks, Count); @@ -1615,7 +1615,7 @@ find_loop_exit([_,_|_]=RmBlocks, Blocks) -> %% remove_message blocks. RPO = beam_ssa:rpo(Blocks), {Dominators,_} = beam_ssa:dominators(RPO, Blocks), - RmSet = sets:from_list(RmBlocks, [{version, 2}]), + RmSet = sets:from_list(RmBlocks), RmRPO = beam_ssa:rpo(RmBlocks, Blocks), find_loop_exit_1(RmRPO, RmSet, Dominators, Blocks); find_loop_exit(_, _) -> @@ -1732,10 +1732,10 @@ find_yregs(#st{frames=[_|_]=Frames,args=Args,ssa=Blocks0}=St) -> St#st{ssa=Blocks}. find_yregs_1([{F,Defs}|Fs], Blocks0) -> - DK = #dk{d=Defs,k=sets:new([{version, 2}])}, + DK = #dk{d=Defs,k=sets:new()}, D0 = #{F => DK,?EXCEPTION_BLOCK => DK#dk{d=[]}}, Ls = beam_ssa:rpo([F], Blocks0), - Yregs0 = sets:new([{version, 2}]), + Yregs0 = sets:new(), Yregs = find_yregs_2(Ls, Blocks0, D0, Yregs0), Blk0 = map_get(F, Blocks0), Blk = beam_ssa:add_anno(yregs, Yregs, Blk0), @@ -1810,7 +1810,7 @@ find_yregs_is([#b_set{dst=Dst}=I|Is], #dk{d=Defs0,k=Killed0}=Ys, Yregs0) -> Defs = ordsets:add_element(Dst, Defs0), find_yregs_is(Is, Ys#dk{d=Defs}, Yregs); true -> - Killed = sets:union(sets:from_list(Defs0, [{version, 2}]), Killed0), + Killed = sets:union(sets:from_list(Defs0), Killed0), Defs = [Dst], find_yregs_is(Is, Ys#dk{d=Defs,k=Killed}, Yregs) end; @@ -1825,17 +1825,17 @@ intersect_used(#b_br{bool=#b_var{}=V}, Set) -> intersect_used(#b_ret{arg=#b_var{}=V}, Set) -> intersect_used_keep_singleton(V, Set); intersect_used(#b_set{op=phi,args=Args}, Set) -> - sets:from_list([V || {#b_var{}=V,_} <- Args, sets:is_element(V, Set)], [{version, 2}]); + sets:from_list([V || {#b_var{}=V,_} <- Args, sets:is_element(V, Set)]); intersect_used(#b_set{args=Args}, Set) -> - sets:from_list(intersect_used_keep(used_args(Args), Set), [{version, 2}]); + sets:from_list(intersect_used_keep(used_args(Args), Set)); intersect_used(#b_switch{arg=#b_var{}=V}, Set) -> intersect_used_keep_singleton(V, Set); -intersect_used(_, _) -> sets:new([{version, 2}]). +intersect_used(_, _) -> sets:new(). intersect_used_keep_singleton(V, Set) -> case sets:is_element(V, Set) of - true -> sets:from_list([V], [{version, 2}]); - false -> sets:new([{version, 2}]) + true -> sets:from_list([V]); + false -> sets:new() end. intersect_used_keep(Vs, Set) -> @@ -2257,7 +2257,7 @@ live_interval_blk([L|Ls], Blocks, LiveMap0, Intervals0) -> %% Update what is live at the beginning of this block and %% store it. - Live = [V || {V,{From,_To}} <- Ranges, + Live = [V || {V,{From,_To}} <:- Ranges, From =< FirstNumber], LiveMap = LiveMap0#{L => Live}, live_interval_blk(Ls, Blocks, LiveMap, Intervals) @@ -2392,7 +2392,7 @@ reserve_yregs_1(L, #st{ssa=Blocks0,cnt=Count0,res=Res0}=St) -> {BeforeVars,Blocks,Count} = rename_vars(DefBefore, L, RPO, Blocks0, Count0), InsideVars = ordsets:subtract(UsedYregs, DefBefore), ResTryTags0 = reserve_try_tags(L, Blocks), - ResTryTags = [{V,{Reg,Count}} || {V,Reg} <- ResTryTags0], + ResTryTags = [{V,{Reg,Count}} || {V,Reg} <:- ResTryTags0], Vars = BeforeVars ++ InsideVars, Res = [{V,{y,Count}} || V <- Vars] ++ ResTryTags ++ Res0, St#st{res=Res,ssa=Blocks,cnt=Count+1}. @@ -2401,7 +2401,7 @@ reserve_try_tags(L, Blocks) -> Seen = gb_sets:empty(), {Res0,_} = reserve_try_tags_1([L], Blocks, Seen, #{}), Res1 = [maps:to_list(M) || M <- maps:values(Res0)], - Res = [{V,{y,Y}} || {V,Y} <- append(Res1)], + Res = [{V,{y,Y}} || {V,Y} <:- append(Res1)], ordsets:from_list(Res). reserve_try_tags_1([L|Ls], Blocks, Seen0, ActMap0) -> @@ -2454,7 +2454,7 @@ rename_vars(Vs, L, RPO, Blocks0, Count0) -> Ren = zip(Vs, NewVars), Blocks1 = beam_ssa:rename_vars(Ren, RPO, Blocks0), #b_blk{is=Is0} = Blk0 = map_get(L, Blocks1), - CopyIs = [#b_set{op=copy,dst=New,args=[Old]} || {Old,New} <- Ren], + CopyIs = [#b_set{op=copy,dst=New,args=[Old]} || {Old,New} <:- Ren], Is = insert_after_phis(Is0, CopyIs), Blk = Blk0#b_blk{is=Is}, Blocks = Blocks1#{L:=Blk}, @@ -2574,7 +2574,7 @@ reserve_arg_regs([], _, Acc) -> Acc. reserve_zregs(RPO, Blocks, Intervals, Res) -> ShortLived0 = [V || {V,[{Start,End}]} <- Intervals, Start+2 =:= End], - ShortLived = sets:from_list(ShortLived0, [{version, 2}]), + ShortLived = sets:from_list(ShortLived0), F = fun(_, #b_blk{is=Is,last=Last}, A) -> reserve_zreg(Is, Last, ShortLived, A) end, diff --git a/lib/compiler/src/beam_ssa_recv.erl b/lib/compiler/src/beam_ssa_recv.erl index afd3251b415a..71ad2d68d300 100644 --- a/lib/compiler/src/beam_ssa_recv.erl +++ b/lib/compiler/src/beam_ssa_recv.erl @@ -454,7 +454,7 @@ propagate_references(Candidates, G) -> propagate_references_1(Roots, G, #{}). propagate_references_1([{Vertex, Ref} | VRefs], G, Acc0) -> - Refs = maps:get(Vertex, Acc0, sets:new([{version, 2}])), + Refs = maps:get(Vertex, Acc0, sets:new()), Acc = case sets:is_element(Ref, Refs) of true -> %% Already visited @@ -667,13 +667,13 @@ intersect_uses(UsageMap, RefMap, Graph) -> [begin Vertex = {FuncId, Lbl}, {Vertex, Ref} - end || {Lbl, _I, Ref} <- Uses] ++ Acc + end || {Lbl, _I, Ref} <:- Uses] ++ Acc end, [], UsageMap), intersect_uses_1(Roots, RefMap, Graph, #{}). intersect_uses_1([{Vertex, Ref} | Vs], RefMap, Graph, Acc0) -> - PossibleRefs = maps:get(Vertex, RefMap, sets:new([{version, 2}])), - ActiveRefs0 = maps:get(Vertex, Acc0, sets:new([{version, 2}])), + PossibleRefs = maps:get(Vertex, RefMap, sets:new()), + ActiveRefs0 = maps:get(Vertex, Acc0, sets:new()), Acc = case {sets:is_element(Ref, PossibleRefs), sets:is_element(Ref, ActiveRefs0)} of {true, false} -> @@ -723,7 +723,7 @@ plan_markers(Candidates, UsageMap) -> end, #{}, Candidates). plan_markers_1(MakeRefs0, FuncId, UsageMap) -> - [Marker || {_, _, _, ExtractedAt, Ref}=Marker <- MakeRefs0, + [Marker || {_, _, _, ExtractedAt, Ref}=Marker <:- MakeRefs0, case UsageMap of #{ {FuncId, ExtractedAt} := Refs } -> sets:is_element(Ref, Refs); @@ -745,7 +745,7 @@ plan_clears(UsageMap, Graph) -> plan_clears_1([{From, To, branch} | Edges], ActiveRefs, UsageMap) -> %% Clear all references that are no longer active on the `To` block. - ToRefs = maps:get(To, UsageMap, sets:new([{version, 2}])), + ToRefs = maps:get(To, UsageMap, sets:new()), Refs = sets:subtract(ActiveRefs, ToRefs), {FuncId, FromLbl} = From, diff --git a/lib/compiler/src/beam_ssa_share.erl b/lib/compiler/src/beam_ssa_share.erl index d817a9a1accf..7f11659ed2b2 100644 --- a/lib/compiler/src/beam_ssa_share.erl +++ b/lib/compiler/src/beam_ssa_share.erl @@ -215,7 +215,7 @@ are_equivalent(_, _, _, _, _) -> false. share_switch(#b_switch{fail=Fail0,list=List0}=Sw, Blocks) -> Prep = share_prepare_sw([{value,Fail0}|List0], Blocks, 0, []), Res = do_share_switch(Prep, Blocks, []), - [{_,Fail}|List] = [VL || {_,VL} <- sort(Res)], + [{_,Fail}|List] = [VL || {_,VL} <:- sort(Res)], Sw#b_switch{fail=Fail,list=List}. share_prepare_sw([{V,L0}|T], Blocks, N, Acc) -> @@ -245,7 +245,7 @@ share_switch_2([[{done,{_,{_,Common}}}|_]=Eqs|T], Blocks, Acc0) -> %% are either terminated with a `ret` or a `br` to the same target %% block. Replace the labels in the `switch` for all of those %% blocks with the label for the first of the blocks. - Acc = [{N,{V,Common}} || {done,{N,{V,_}}} <- Eqs] ++ Acc0, + Acc = [{N,{V,Common}} || {done,{N,{V,_}}} <:- Eqs] ++ Acc0, share_switch_2(T, Blocks, Acc); share_switch_2([[{_,_}|_]=Prep|T], Blocks, Acc0) -> %% Two or more blocks are semantically equivalent, but they have diff --git a/lib/compiler/src/beam_ssa_ss.erl b/lib/compiler/src/beam_ssa_ss.erl index 7679ad4d45a7..771a54e3aa9a 100644 --- a/lib/compiler/src/beam_ssa_ss.erl +++ b/lib/compiler/src/beam_ssa_ss.erl @@ -43,38 +43,36 @@ merge_in_args/3, new/0, new/3, - prune/2, + phi/4, + prune/3, + prune_by_add/2, set_call_result/4, set_status/3, + size/1, variables/1]). -include("beam_ssa.hrl"). -include("beam_types.hrl"). +-include("beam_ssa_alias_debug.hrl"). + +-ifdef(PROVIDE_DUMP). +-export([dump/1]). +-endif. -import(lists, [foldl/3]). -define(ARGS_DEPTH_LIMIT, 4). -define(SS_DEPTH_LIMIT, 30). -%% -define(DEBUG, true). - --ifdef(DEBUG). +-ifdef(DEBUG_SS). -define(DP(FMT, ARGS), io:format(FMT, ARGS)). -define(DP(FMT), io:format(FMT)). --define(DBG(STMT), STMT). -else. -define(DP(FMT, ARGS), skip). -define(DP(FMT), skip). --define(DBG(STMT), skip). -endif. - -%% Uncomment the following to check that all invariants for the state -%% hold. These checks are expensive and not enabled by default. - -%% -define(EXTRA_ASSERTS, true). - --ifdef(EXTRA_ASSERTS). +-ifdef(SS_EXTRA_ASSERTS). -define(assert_state(State), assert_state(State)). -define(ASSERT(Assert), Assert). -else. @@ -83,7 +81,7 @@ -endif. -type sharing_state() :: any(). % A beam_digraph graph. --type sharing_status() :: 'unique' | 'aliased'. +-type sharing_status() :: 'unique' | 'aliased' | 'no_info'. -type element() :: 'hd' | 'tl' | non_neg_integer(). -spec add_var(beam_ssa:b_var(), sharing_status(), sharing_state()) -> @@ -124,15 +122,14 @@ add_edge(State, Src, Dst, Lbl) -> -spec derive_from(beam_ssa:b_var(), beam_ssa:b_var(), sharing_state()) -> sharing_state(). derive_from(Dst, Src, State) -> - ?DP("Deriving ~p from ~p~nSS:~p~n", [Dst,Src,State]), + ?DP("Deriving ~p from ~p~nSS:~n~s~n", [Dst, Src, dump(State)]), ?assert_state(State), - ?ASSERT(assert_variable_exists(Dst, State)), - ?ASSERT(assert_variable_exists(Src, State)), - case {beam_digraph:vertex(State, Dst),beam_digraph:vertex(State, Src)} of + case {beam_digraph:vertex(State, Dst, unique), + beam_digraph:vertex(State, Src, plain)} of + {_,plain} -> + State; {aliased,_} -> - %% Nothing to do, already aliased. This can happen when - %% handling Phis, no propagation to the source should be - %% done. + %% Nothing to do, already aliased. State; {_,aliased} -> %% The source is aliased, the destination will become aliased. @@ -147,33 +144,43 @@ derive_from(Dst, Src, State) -> false -> %% Source is not aliased and has not been embedded %% in a term, record that it now is. - ?assert_state(add_edge(State, Src, Dst, embed)) + State1 = case beam_digraph:has_vertex(State, Dst) of + true -> + State; + false -> + beam_ssa_ss:add_var(Dst, unique, State) + end, + ?assert_state(add_edge(State1, Src, Dst, embed)) end end. -spec embed_in(beam_ssa:b_var(), [{element(),beam_ssa:b_var()}], sharing_state()) -> sharing_state(). embed_in(Dst, Elements, State0) -> - ?DP("Embedding ~p into ~p~nSS:~p~n", [Elements,Dst,State0]), + ?DP("Embedding ~p into ~p~nSS:~n~s~n", [Elements, Dst, dump(State0)]), ?assert_state(State0), ?ASSERT(assert_variable_exists(Dst, State0)), - ?ASSERT([assert_variable_exists(Src, State0) - || {#b_var{},Src} <- Elements]), foldl(fun({Element,Src}, Acc) -> add_embedding(Dst, Src, Element, Acc) end, State0, Elements). add_embedding(Dst, Src, Element, State0) -> ?DP("add_embedding(~p, ~p, ~p, ...)~n", [Dst,Src,Element]), - - %% Create a node for literals as it isn't in the graph. + %% Create a node for literals and plain values as they are not in + %% the graph. The node is needed to record the status of the + %% element. State1 = case Src of plain -> beam_digraph:add_vertex(State0, Src, unique); #b_literal{} -> beam_digraph:add_vertex(State0, Src, unique); _ -> - State0 + case beam_digraph:has_vertex(State0, Src) of + true -> + State0; + false -> + beam_digraph:add_vertex(State0, Src, unique) + end end, %% Create the edge, this is done regardless of the aliasing status @@ -206,10 +213,7 @@ add_embedding(Dst, Src, Element, State0) -> extract(Dst, Src, Element, State) -> ?DP("Extracting ~p[~p] into ~p~n", [Src,Element,Dst]), ?assert_state(State), - ?ASSERT(assert_variable_exists(Dst, State)), - ?ASSERT(assert_variable_exists(Src, State)), - - case beam_digraph:vertex(State, Src) of + case beam_digraph:vertex(State, Src, plain) of aliased -> %% The pair/tuple is aliased, so what is extracted will be aliased. ?assert_state(set_status(Dst, aliased, State)); @@ -218,7 +222,17 @@ extract(Dst, Src, Element, State) -> OutEdges = beam_digraph:out_edges(State, Src), ?ASSERT(true = is_integer(Element) orelse (Element =:= hd) orelse (Element =:= tl)), - extract_element(Dst, Src, Element, OutEdges, State) + ?DP("dst: ~p, src: ~p, e: ~p, out-edges: ~p~n", + [Dst, Src, Element, OutEdges]), + extract_element(Dst, Src, Element, OutEdges, State); + no_info -> + ?assert_state(set_status(Dst, no_info, State)); + plain -> + %% Extracting from a plain value is not possible, but the + %% alias analysis pass can sometimes encounter it when no + %% type information is available. Conservatively set the + %% result to aliased. + ?assert_state(set_status(Dst, aliased, State)) end. %% Note that extract_element/5 will never be given an out edge with a @@ -236,42 +250,66 @@ extract_element(Dst, Src, Element, [], State0) -> %% aliased (checked in extract/4). It could be that we're about to %% extract an element which is known to be aliased. ?DP(" the element has not been extracted so far~n"), - State = ?assert_state(add_edge(State0, Src, Dst, {extract,Element})), + State1 = beam_ssa_ss:add_var(Dst, unique, State0), + State = ?assert_state(add_edge(State1, Src, Dst, {extract,Element})), extract_status_for_element(Element, Src, Dst, State). -extract_status_for_element(Element, Src, Dst, State) -> +extract_status_for_element(Element, Src, Dst, State0) -> ?DP(" extract_status_for_element(~p, ~p)~n", [Element, Src]), - InEdges = beam_digraph:in_edges(State, Src), - extract_status_for_element(InEdges, Element, Src, Dst, State). - -extract_status_for_element([{N,_,{embed,Element}}|_InEdges], - Element, _Src, Dst, State0) -> - ?DP(" found new source ~p~n", [N]), - ?DP(" SS ~p~n", [State0]), - ?DP(" status ~p~n", [beam_digraph:vertex(State0, N)]), - State = set_status(Dst, beam_digraph:vertex(State0, N), State0), - ?DP(" Returned SS ~p~n", [State]), - ?assert_state(State); -extract_status_for_element([{N,_,{extract,SrcElement}}|InEdges], - Element, Src, Dst, State0) -> - ?DP(" found source: ~p[~p]~n", [N,SrcElement]), - Origs = [Var || {Var,_,{embed,SE}} <- beam_digraph:in_edges(State0, N), - SrcElement =:= SE], - ?DP(" original var: ~p~n", [Origs]), - case Origs of - [] -> + InEdges = beam_digraph:in_edges(State0, Src), + ?DP(" in-edges: ~p~n", [InEdges]), + Embeddings = [Var || {Var,_,{embed,SE}} <- InEdges, Element =:= SE], + Extracts = [Ex || {_,_,{extract,_}}=Ex <- InEdges], + case {Embeddings,Extracts} of + {[],[]} -> + %% Nothing found, the status will be aliased. ?DP(" no known source~n"), - extract_status_for_element(InEdges, Element, Src, Dst, State0); - [Orig] -> - extract_status_for_element(Element, Orig, Dst, State0) + ?DP(" status of ~p will be aliased~n", [Dst]), + ?assert_state(set_status(Dst, aliased, State0)); + {[Var],[]} -> + %% The element which is looked up is an embedding. + ?DP(" found embedding~n"), + ?DP(" the source is ~p~n", [Var]), + ?DP(" SS~n~s~n", [dump(State0)]), + ?DP(" status ~p~n", [beam_digraph:vertex(State0, Var, unique)]), + State = set_status(Dst, beam_digraph:vertex(State0, Var, unique), + State0), + ?DP(" Returned SS~n~s~n", [dump(State)]), + ?assert_state(State); + {[], [{Aggregate,_Dst,{extract,E}}]} -> + %% We are trying extract from an extraction. + S = get_status_of_extracted_element(Aggregate, [E,Element], State0), + ?DP(" status of ~p will be ~p~n", [Dst, S]), + ?assert_state(set_status(Dst, S, State0)) + end. + + +get_status_of_extracted_element(Aggregate, [First|Rest]=Elements, State) -> + ?DP(" ~s(~p, ~p, ...)~n", [?FUNCTION_NAME, Aggregate, Elements]), + %% This clause will only be called when there is a chain of + %% extracts from unique aggregates. This implies that when the + %% chain is traced backwards, no aliased aggregates will be found, + %% but in case that invariant is ever broken, assert. + ?ASSERT(unique = beam_digraph:vertex(State, Aggregate, unique)), + ?DP(" aggregate is unique~n"), + InEdges = beam_digraph:in_edges(State, Aggregate), + Embeddings = [Src || {Src,_,{embed,E}} <- InEdges, First =:= E], + Extracts = [{Src,E} || {Src,_,{extract,E}} <- InEdges], + ?DP(" embeddings ~p~n", [Embeddings]), + ?DP(" extracts ~p~n", [Extracts]), + case {Embeddings,Extracts} of + {[Embedding],[]} -> + get_status_of_extracted_element(Embedding, Rest, State); + {[],[{Extract,E}]} -> + get_status_of_extracted_element(Extract, [E|Elements], State); + {[],[]} -> + aliased end; -extract_status_for_element([_Edge|InEdges], Element, Src, Dst, State) -> - ?DP(" ignoring in-edge ~p~n", [_Edge]), - extract_status_for_element(InEdges, Element, Src, Dst, State); -extract_status_for_element([], _Element, _Src, Dst, State) -> - %% Nothing found, the status will be aliased. - ?DP(" status of ~p will be aliased~n", [Dst]), - ?assert_state(set_status(Dst, aliased, State)). +get_status_of_extracted_element(Aggregate, [], State) -> + ?DP(" ~s(~p, [], ...)~n", [?FUNCTION_NAME, Aggregate]), + S = beam_digraph:vertex(State, Aggregate, unique), + ?DP(" bottomed out, status is ~p~n", [S]), + S. %% A cut-down version of merge/2 which only considers variables in %% Main and whether they have been aliased in Other. @@ -300,7 +338,7 @@ forward_status(Main, Other) -> -spec get_status(beam_ssa:b_var(), sharing_state()) -> sharing_status(). get_status(V=#b_var{}, State) -> - beam_digraph:vertex(State, V). + beam_digraph:vertex(State, V, unique). -spec merge(sharing_state(), sharing_state()) -> sharing_state(). merge(StateA, StateB) -> @@ -317,22 +355,17 @@ merge(StateA, StateB) -> end, ?DP("Merging Small into Large~nLarge:~n"), ?DP("Small:~n"), - ?DBG(dump(Small)), + ?DP(dump(Small)), ?DP("Large:~n"), - ?DBG(dump(Large)), + ?DP(dump(Large)), R = merge(Large, Small, beam_digraph:vertices(Small), - sets:new([{version,2}]), sets:new([{version,2}])), + sets:new(), sets:new()), ?assert_state(R). merge(Dest, Source, [{V,VStatus}|Vertices], Edges0, Forced) -> Edges = accumulate_edges(V, Source, Edges0), - DestStatus = case beam_digraph:has_vertex(Dest, V) of - true -> - beam_digraph:vertex(Dest, V); - false -> - false - end, + DestStatus = beam_digraph:vertex(Dest, V, false), case {DestStatus,VStatus} of {Status,Status} -> %% Same status in both states. @@ -348,11 +381,18 @@ merge(Dest, Source, [{V,VStatus}|Vertices], Edges0, Forced) -> {aliased,unique} -> %% V has to be revisited and non-aliased copied parts will %% be aliased. - merge(Dest, Source, Vertices, Edges, sets:add_element(V, Forced)) + merge(Dest, Source, Vertices, Edges, sets:add_element(V, Forced)); + {aliased,no_info} -> + %% Nothing to do. + merge(Dest, Source, Vertices, Edges, Forced); + {no_info,aliased} -> + %% Alias in Dest. + merge(set_status(V, aliased, Dest), Source, + Vertices, Edges, Forced) end; merge(Dest0, _Source, [], Edges, Forced) -> merge1(Dest0, _Source, sets:to_list(Edges), - sets:new([{version,2}]), Forced). + sets:new(), Forced). merge1(Dest0, Source, [{plain,To,Lbl}|Edges], Fixups, Forced) -> ?DP(" Adding edge ~p -> ~p, lbl: ~p~n", [plain,To,Lbl]), @@ -413,38 +453,123 @@ accumulate_edges(V, State, Edges0) -> new() -> beam_digraph:new(). +-spec phi(beam_ssa:b_var(), [beam_ssa:b_var()], + sharing_state(), non_neg_integer()) + -> sharing_state(). +phi(Dst, Args, State0, Cnt) -> + ?assert_state(State0), + ?DP("** phi **~n~s~n", [dump(State0)]), + ?DP(" dst: ~p~n", [Dst]), + ?DP(" args: ~p~n", [Args]), + Structure = foldl(fun(Arg, Acc) -> + merge_in_arg(Arg, Acc, ?ARGS_DEPTH_LIMIT, State0) + end, no_info, Args), + ?DP(" structure: ~p~n", [Structure]), + new([Dst], [Structure], Cnt, State0). + +%%% +%%% Throws `too_deep` if the depth of sharing state value chains +%%% exceeds SS_DEPTH_LIMIT. +%%% +-spec prune(sets:set(beam_ssa:b_var()), + sets:set(beam_ssa:b_var()), + sharing_state()) -> sharing_state(). +prune(LiveVars, Killed, State) -> + ?assert_state(State), + ?DP("** pruning **~n~s~n", [dump(State)]), + ?DP("pruning to: ~p~n", [sets:to_list(LiveVars)]), + ?DP("killed: ~p~n", [sets:to_list(Killed)]), + case sets:is_empty(LiveVars) of + false -> + Work = [{?SS_DEPTH_LIMIT,K} || K <- sets:to_list(Killed)], + R = prune(Work, Killed, LiveVars, State), + ?DP("Result:~n~s~n", [dump(R)]), + ?assert_state(R); + true -> + R = new(), + ?DP("Result (nothing killed):~n~s~n", [dump(R)]), + R + end. + +prune([{0,_}|_], _, _, _) -> + throw(too_deep); +prune([{Depth,V}|Work], Killed, LiveVars, State0) -> + case is_safe_to_prune(V, LiveVars, State0) of + true -> + State = beam_digraph:del_vertex(State0, V), + Ins = [{Depth - 1, I} + || I <- beam_digraph:in_neighbours(State0, V)], + prune(Ins++Work, Killed, LiveVars, State); + false -> + prune(Work, Killed, LiveVars, State0) + end; +prune([], _Killed, _LiveVars, State) -> + State. + +is_safe_to_prune(V, LiveVars, State) -> + case sets:is_element(V, LiveVars) of + true -> + false; + false -> + %% Safe to prune if all out-neighbours are safe-to-prune. + case beam_digraph:out_neighbours(State, V) of + [] -> + true; + Outs -> + lists:all(fun(X) -> + is_safe_to_prune(X, LiveVars, State) + end, Outs) + end + end. + +%%% +%%% As prune/3, but doing the pruning by rebuilding the surviving +%%% state from scratch. %%% %%% Throws `too_deep` if the depth of sharing state value chains %%% exceeds SS_DEPTH_LIMIT. %%% --spec prune(sets:set(beam_ssa:b_var()), sharing_state()) -> sharing_state(). -prune(LiveVars, State) -> +-spec prune_by_add(sets:set(beam_ssa:b_var()), sharing_state()) + -> sharing_state(). +prune_by_add(LiveVars, State) -> ?assert_state(State), ?DP("Pruning to ~p~n", [sets:to_list(LiveVars)]), - ?DBG(dump(State)), - R = prune([{0,V} || V <- sets:to_list(LiveVars)], [], new(), State), - ?DP("Pruned result~n"), - ?DBG(dump(R)), + ?DP("~s~n", [dump(State)]), + ?DP("Vertices: ~p~n", [beam_digraph:vertices(State)]), + R = prune_by_add([{0,V} || V <- sets:to_list(LiveVars), + beam_digraph:has_vertex(State, V)], + [], new(), State), + ?DP("Pruned result~n~s~n", [dump(R)]), ?assert_state(R). -prune([{Depth0,V}|Wanted], Edges, New0, Old) -> +prune_by_add([{Depth0,V}|Wanted], Edges, New0, Old) -> + ?DP("Looking at ~p~n", [V]), + ?DP("Curr:~n~s~n", [dump(New0)]), + ?DP("Wanted: ~p~n", [Wanted]), case beam_digraph:has_vertex(New0, V) of true -> %% This variable is already added. - prune(Wanted, Edges, New0, Old); + prune_by_add(Wanted, Edges, New0, Old); false when Depth0 < ?SS_DEPTH_LIMIT -> %% This variable has to be kept. Add it to the new graph. New = add_vertex(New0, V, beam_digraph:vertex(Old, V)), %% Add all incoming edges to this node. InEdges = beam_digraph:in_edges(Old, V), Depth = Depth0 + 1, - InNodes = [{Depth, From} || {From,_,_} <- InEdges], - prune(InNodes ++ Wanted, InEdges ++ Edges, New, Old); + InNodes = [{Depth, From} || {From,_,_} <:- InEdges], + prune_by_add(InNodes ++ Wanted, InEdges ++ Edges, New, Old); false -> - %% We're in too deep, give up. + %% We're in too deep, give up. This case will probably + %% never be hit as it would require a previous prune/3 + %% application which doesn't hit the depth limit and for + %% it to remove more than half of the nodes to trigger the + %% use of prune_by_add/2, and in a later iteration trigger + %% the depth limit. As it cannot be definitely ruled out, + %% take the hit against the coverage statistics, as the + %% handling code in beam_ssa_alias is tested. throw(too_deep) end; -prune([], Edges, New0, _Old) -> +prune_by_add([], Edges, New0, _Old) -> foldl(fun({Src,Dst,Lbl}, New) -> add_edge(New, Src, Dst, Lbl) end, New0, Edges). @@ -491,19 +616,23 @@ set_status(#b_var{}=V, Status, State0) -> %% is embedded remains unchanged. ?DP("Setting status of ~p to ~p~n", [V,Status]), - ?ASSERT(assert_variable_exists(V, State0)), - case beam_digraph:vertex(State0, V) of + case beam_digraph:vertex(State0, V, unique) of Status -> %% Status is unchanged. State0; unique when Status =:= aliased -> State = add_vertex(State0, V, Status), - set_alias(get_alias_edges(V, State), State) + set_alias(get_alias_edges(V, State), State); + no_info when Status =/= no_info -> + add_vertex(State0, V, Status); + unique when Status =:= no_info -> + %% Can only be used safely for newly created variables. + add_vertex(State0, V, Status) end. set_alias([#b_var{}=V|Vars], State0) -> %% TODO: fold into the above - case beam_digraph:vertex(State0, V) of + case beam_digraph:vertex(State0, V, unique) of aliased -> set_alias(Vars, State0); _ -> @@ -514,7 +643,12 @@ set_alias([], State) -> State. get_alias_edges(V, State) -> - OutEdges = [To || {#b_var{},To,_} <- beam_digraph:out_edges(State, V)], + OutEdges = [To + || {#b_var{},To,Kind} <- beam_digraph:out_edges(State, V), + case Kind of + {embed,_} -> false; + _ -> true + end], EmbedEdges = [Src || {#b_var{}=Src,_,Lbl} <- beam_digraph:in_edges(State, V), case Lbl of @@ -524,10 +658,13 @@ get_alias_edges(V, State) -> end], EmbedEdges ++ OutEdges. +-spec size(sharing_state()) -> non_neg_integer(). +size(State) -> + beam_digraph:no_vertices(State). + -spec variables(sharing_state()) -> [beam_ssa:b_var()]. variables(State) -> - %% TODO: Sink this beam_digraph to avoid splitting the list? - [V || {V,_Lbl} <- beam_digraph:vertices(State)]. + [V || {V,_Lbl} <:- beam_digraph:vertices(State)]. -type call_in_arg_status() :: no_info | unique @@ -596,8 +733,8 @@ meet_in_args_elems1([], Large, Result) -> -spec merge_in_args([beam_ssa:b_var()], call_in_arg_info(), sharing_state()) -> call_in_arg_info(). merge_in_args([Arg|Args], [ArgStatus|Status], State) -> - ?DP(" merge_in_arg: ~p~n current: ~p~n SS: ~p.~n", - [Arg,ArgStatus,State]), + ?DP(" merge_in_arg: ~p~n current: ~p~n SS:~n~s.~n", + [Arg, ArgStatus, dump(State)]), Info = merge_in_arg(Arg, ArgStatus, ?ARGS_DEPTH_LIMIT, State), [Info|merge_in_args(Args, Status, State)]; merge_in_args([], [], _State) -> @@ -607,28 +744,45 @@ merge_in_arg(_, aliased, _, _State) -> aliased; merge_in_arg(plain, _, _, _State) -> unique; -merge_in_arg(#b_var{}=V, _Status, 0, State) -> +merge_in_arg(#b_var{}=V, Status, 0, State) -> %% We will not traverse this argument further, this means that no %% element-level aliasing info will be kept for this element. - get_status(V, State); + case {Status, get_status(V, State)} of + {S,S} -> + S; + {no_info,S} -> + S; + {S,no_info} -> + S; + {_,aliased} -> + aliased + end; +merge_in_arg(#b_var{}=V, unique, _Cutoff, State) -> + case beam_digraph:vertex(State, V, unique) of + no_info -> + unique; + S -> + S + end; merge_in_arg(#b_var{}=V, Status, Cutoff, State) -> - case beam_digraph:vertex(State, V) of + case beam_digraph:vertex(State, V, unique) of aliased -> aliased; unique -> InEdges = beam_digraph:in_edges(State, V), Elements = case Status of - unique -> #{}; {unique,Es} -> Es; no_info -> #{} end, - merge_elements(InEdges, Elements, Cutoff, State) + merge_elements(InEdges, Elements, Cutoff, State); + no_info -> + Status end; -merge_in_arg(#b_literal{}, _, 0, _State) -> +merge_in_arg(#b_literal{}, Status, 0, _State) -> %% We have reached the cutoff while traversing a larger construct, - %% as we're not looking deeper down into the structure we indicate - %% that we have no information. - no_info; + %% as we're not looking deeper down into the structure we stop + %% constructing detailed information. + Status; merge_in_arg(#b_literal{val=[Hd|Tl]}, Status, Cutoff, State) -> {HdS,TlS,Elements0} = case Status of {unique,#{hd:=HdS0,tl:=TlS0}=All} -> @@ -644,12 +798,15 @@ merge_in_arg(#b_literal{val=[Hd|Tl]}, Status, Cutoff, State) -> {unique,Elements}; merge_in_arg(#b_literal{val=[]}, Status, _, _State) -> Status; +merge_in_arg(#b_literal{val=T}, unique, _Cutoff, _State) when is_tuple(T) -> + %% The uniqe status cannot be safely upgraded to a more detailed + %% info. + unique; merge_in_arg(#b_literal{val=T}, Status, Cutoff, State) when is_tuple(T) -> SrcElements = tuple_to_list(T), OrigElements = case Status of {unique,TupleElems} -> TupleElems; - unique -> #{}; no_info -> #{} end, Elements = merge_tuple_elems(SrcElements, OrigElements, Cutoff, State), @@ -700,15 +857,21 @@ merge_elements([{Src,_,{embed,Idx}}|Rest], Elements0, Cutoff, State) when merge_elements(Rest, Elements, Cutoff, State); merge_elements([{_Src,_,embed}|Rest], _Elements0, Cutoff, State) -> %% We don't know where this element is embedded. Src will always - %% be unique as otherwise erge_in_arg/4 will not bother merging + %% be unique as otherwise merge_in_arg/4 will not bother merging %% the in-edges. - ?ASSERT(unique = get_status(_Src, State)), + ?ASSERT(true = get_status(_Src, State) =:= unique + orelse get_status(_Src, State) =:= no_info), merge_elements(Rest, no_info, Cutoff, State); -merge_elements([{_,V,{extract,_}}|_Rest], _Elements0, _, State) -> - %% For now we don't try to derive the structure of this argument - %% further. - %% TODO: Revisit the decision above. - get_status(V, State). +merge_elements([{Src,V,{extract,E}}], Elements, Cutoff, State) -> + ?DP("Looking for an embedding of the ~p element from ~p~n", [E, Src]), + InEdges = beam_digraph:in_edges(State, Src), + case [Other || {Other,_,{embed,EdgeOp}} <- InEdges, EdgeOp =:= E] of + [Next] -> + ?DP("Found: ~p~n", [Next]), + merge_in_arg(Next, {unique,Elements}, Cutoff, State); + [] -> + get_status(V, State) + end. -spec new([beam_ssa:b_var()], call_in_arg_info(), non_neg_integer()) -> sharing_state(). @@ -718,12 +881,8 @@ new(Args, ArgsInfo, Cnt) -> ?assert_state(SS), R. -new([A|As], [S0|Stats], Cnt, SS) - when S0 =:= aliased; S0 =:= unique; S0 =:= no_info -> - S = case S0 of - no_info -> unique; - _ -> S0 - end, +new([A|As], [S|Stats], Cnt, SS) + when S =:= aliased; S =:= unique; S =:= no_info -> new(As, Stats, Cnt, add_var(A, S, SS)); new([A|As], [{unique,Elements}|Stats], Cnt0, SS0) -> SS1 = add_var(A, unique, SS0), @@ -756,17 +915,24 @@ has_out_edges(V, State) -> %% Debug support below --ifdef(EXTRA_ASSERTS). +-ifdef(SS_EXTRA_ASSERTS). -spec assert_state(sharing_state()) -> sharing_state(). assert_state(State) -> + assert_bad_edges(State), assert_aliased_parent_implies_aliased(State), assert_embedded_in_aliased_implies_aliased(State), assert_multiple_embeddings_force_aliasing(State), assert_multiple_extractions_force_aliasing(State), State. +%% Check that we don't have edges between non-existing nodes +assert_bad_edges(State) -> + [{assert_variable_exists(F, State), assert_variable_exists(T, State)} + || {F,T,_} <:- beam_digraph:edges(State)]. + + %% Check that extracted and embedded elements of an aliased variable %% are aliased. assert_aliased_parent_implies_aliased(State) -> @@ -774,18 +940,18 @@ assert_aliased_parent_implies_aliased(State) -> assert_apia(Parent, State) -> Children = [Child - || {_,Child,Info} <- beam_digraph:out_edges(State, Parent), + || {_,Child,Info} <:- beam_digraph:out_edges(State, Parent), case Info of {extract,_} -> true; embed -> true; {embed,_} -> false end], - [case beam_digraph:vertex(State, Child) of + [case beam_digraph:vertex(State, Child, unique) of aliased -> ok; _ -> io:format("Expected ~p to be aliased as is derived from ~p.~n" - "state: ~p", [Child, Parent, State]), + "state: ~s", [Child, Parent, dump(State)]), throw(assertion_failure) end || Child <- Children]. @@ -797,14 +963,15 @@ assert_embedded_in_aliased_implies_aliased(State) -> assert_eiaia(Embedder, State) -> NotAliased = [ Src || {Src,_,embed} <- beam_digraph:in_edges(State, Embedder), - beam_digraph:vertex(State, Src) =/= aliased], + beam_digraph:vertex(State, Src, unique) =/= aliased, + beam_digraph:vertex(State, Src, unique) =/= no_info], case NotAliased of [] -> State; _ -> io:format("Expected ~p to be aliased as" - " they are embedded in aliased values.~n~p.~n", - [NotAliased, State]), + " they are embedded in aliased values.~n~s.~n", + [NotAliased, dump(State)]), throw(assertion_failure) end. @@ -815,10 +982,10 @@ assert_multiple_embeddings_force_aliasing(State) -> assert_mefa(V, State) -> NotAliased = [ B || {B,_,embed} <- beam_digraph:out_edges(State, V), - beam_digraph:vertex(State, B) =/= aliased], + beam_digraph:vertex(State, B, unique) =/= aliased], case NotAliased of [_,_|_] -> - io:format("Expected ~p in ~p to be aliased.~n", [V,State]), + io:format("Expected ~p to be aliased in:~n~s.~n", [V, dump(State)]), throw(assertion_failure); _ -> State @@ -826,7 +993,7 @@ assert_mefa(V, State) -> %% Check that elements which are extracted twice are aliased. assert_multiple_extractions_force_aliasing(State) -> - [assert_mxfa(V, State) || {V,_} <- beam_digraph:vertices(State)]. + [assert_mxfa(V, State) || {V,_} <:- beam_digraph:vertices(State)]. assert_mxfa(V, State) -> %% Build a map of the extracted values keyed by element. @@ -841,7 +1008,8 @@ assert_mxfa(V, State) -> end, #{}, beam_digraph:out_edges(State, V)), Bad = maps:fold( fun(_Elem, [_,_|_]=Vars, Acc) -> - [X || X <- Vars, beam_digraph:vertex(State, X) =/= aliased] + [X || X <- Vars, + beam_digraph:vertex(State, X, unique) =/= aliased] ++ Acc; (_, _, Acc) -> Acc @@ -850,21 +1018,21 @@ assert_mxfa(V, State) -> [] -> State; _ -> - io:format("~p should be aliased~nstate:~p.~n", [V,State]), + io:format("~p should be aliased~nstate:~n~s.~n", [V, dump(State)]), throw(assertion_failure) end. assert_variable_exists(plain, State) -> case beam_digraph:has_vertex(State, plain) of false -> - io:format("Expected ~p in ~p.~n", [plain,State]), + io:format("Expected ~p in~n ~s.~n", [plain, dump(State)]), throw(assertion_failure); _ -> - case beam_digraph:vertex(State, plain) of + case beam_digraph:vertex(State, plain, unique) of unique -> State; Other -> - io:format("Expected plain in ~p to be unique," - " was ~p.~n", [State,Other]), + io:format("Expected plain to be unique, was ~p, in:~n~p~n", + [Other, dump(State)]), throw(assertion_failure) end end; @@ -873,16 +1041,28 @@ assert_variable_exists(#b_literal{}, State) -> assert_variable_exists(#b_var{}=V, State) -> case beam_digraph:has_vertex(State, V) of false -> - io:format("Expected ~p in ~p.~n", [V,State]), + io:format("Expected ~p in~n~s.~n", [V, dump(State)]), throw(assertion_failure); _ -> State end. -endif. --ifdef(DEBUG). +-ifdef(PROVIDE_DUMP). +-spec dump(sharing_state()) -> iolist(). dump(State) -> - io:format("~p~n", [State]). - + Ls = lists:enumerate(0, beam_digraph:vertices(State)), + V2Id = #{ V=>Id || {Id,{V,_}} <- Ls }, + [ + "digraph G {\n", + [ io_lib:format(" ~p [label=\"~p:~p\",shape=\"box\"]~n", + [Id,V,beam_digraph:vertex(State, V)]) + || V:=Id <- V2Id], + [ io_lib:format(" ~p -> ~p [label=\"~p\"]~n", + [maps:get(From, V2Id, plain), + maps:get(To, V2Id), + Lbl]) + || {From,To,Lbl} <- beam_digraph:edges(State)], + "}\n"]. -endif. diff --git a/lib/compiler/src/beam_ssa_throw.erl b/lib/compiler/src/beam_ssa_throw.erl index cfb9a802bf9a..9c9a8ca48e2c 100644 --- a/lib/compiler/src/beam_ssa_throw.erl +++ b/lib/compiler/src/beam_ssa_throw.erl @@ -57,7 +57,7 @@ %% Per-module scan state -record(gst, {tlh_roots :: gb_trees:tree(#b_local{}, gb_sets:set(handler())), tlh_edges=#{} :: #{ #b_local{} => gb_sets:set(#b_local{}) }, - throws=sets:new([{version, 2}]) :: sets:set(#b_local{})}). + throws=sets:new() :: sets:set(#b_local{})}). %% Per-function scan state -record(lst, {suitability=#{} :: #{ #b_var{} => suitability() }, @@ -401,7 +401,7 @@ ois_1([], _Blocks, _Ts) -> true. ois_successors(#b_switch{fail=Fail,list=List}, _Ts) -> - Lbls = [Lbl || {_, Lbl} <- List], + Lbls = [Lbl || {_, Lbl} <:- List], [Fail | Lbls]; ois_successors(#b_br{bool=Bool,succ=Succ,fail=Fail}, Ts) -> case beam_types:get_singleton_value(ois_get_type(Bool, Ts)) of diff --git a/lib/compiler/src/beam_ssa_type.erl b/lib/compiler/src/beam_ssa_type.erl index 9b4db8998361..de4533f7a2d6 100644 --- a/lib/compiler/src/beam_ssa_type.erl +++ b/lib/compiler/src/beam_ssa_type.erl @@ -92,7 +92,7 @@ opt_start_1([Id | Ids], ArgDb, StMap0, FuncDb0, MetaCache) -> #{ Id := ArgTypes } -> #opt_st{ssa=Linear0,args=Args} = St0 = map_get(Id, StMap0), - Ts = maps:from_list(zip(Args, ArgTypes)), + Ts = #{Arg => Type || Arg <- Args && Type <- ArgTypes}, {Linear, FuncDb} = opt_function(Linear0, Args, Id, Ts, FuncDb0, MetaCache), St = St0#opt_st{ssa=Linear}, @@ -202,7 +202,7 @@ sig_function_1(Id, StMap, State0, FuncDb) -> #opt_st{ssa=Linear,args=Args} = map_get(Id, StMap), {ArgTypes, State1} = sig_commit_args(Id, State0), - Ts = maps:from_list(zip(Args, ArgTypes)), + Ts = #{Arg => Type || Arg <- Args && Type <- ArgTypes}, FakeCall = #b_set{op=call,args=[#b_remote{mod=#b_literal{val=unknown}, name=#b_literal{val=unknown}, @@ -427,7 +427,7 @@ opt_continue(Linear0, Args, Anno, FuncDb) when FuncDb =/= #{} -> %% This is a local function and we're guaranteed to have visited %% every call site at least once, so we know that the parameter %% types are at least as narrow as the join of all argument types. - Ts = join_arg_types(Args, ArgTypes, #{}), + Ts = join_arg_types(Args, ArgTypes), opt_function(Linear0, Args, Id, Ts, FuncDb); #{ Id := #func_info{exported=true} } -> %% We can't infer the parameter types of exported functions, but @@ -443,11 +443,9 @@ opt_continue(Linear0, Args, Anno, _FuncDb) -> {Linear, _} = opt_function(Linear0, Args, Id, Ts, #{}), {Linear, #{}}. -join_arg_types([Arg | Args], [TypeMap | TMs], Ts) -> - Type = beam_types:join(maps:values(TypeMap)), - join_arg_types(Args, TMs, Ts#{ Arg => Type }); -join_arg_types([], [], Ts) -> - Ts. +join_arg_types(Args, TypeMaps) -> + #{Arg => beam_types:join(maps:values(TypeMap)) || + Arg <- Args && TypeMap <- TypeMaps}. %% %% Optimizes a function based on the type information inferred by signatures/2 @@ -589,10 +587,30 @@ opt_is([I0 | Is], Ts0, Ds0, Ls, Fdb, Sub0, Meta, Acc) -> opt_is([], Ts, Ds, _Ls, Fdb, Sub, _Meta, Acc) -> {reverse(Acc), Ts, Ds, Fdb, Sub}. -opt_anno_types(#b_set{op=Op,args=Args}=I, Ts) -> +%% opt_anno_types(Instruction0, Types) -> Instruction. +%% Maintain the invariant that the `arg_types` annotation only +%% contains type annotations for variable arguments whose types are +%% more specific than `any`. Literal arguments must not have any type +%% annotation. +%% +%% Also, ensure that the `arg_types` annotation is only present +%% in instructions that can benefit from it. +opt_anno_types(#b_set{anno=Anno0,op=Op,args=Args}=I, Ts) -> case benefits_from_type_anno(Op, Args) of - true -> opt_anno_types_1(I, Args, Ts, 0, #{}); - false -> I + true -> + opt_anno_types_1(I, Args, Ts, 0, #{}); + false -> + case Anno0 of + #{arg_types := _} -> + %% Remove `arg_types` from operations that don't + %% need them. This can happen, for example, when + %% the operation has been changed from + %% `{bif,is_list}` to `is_nonempty_list`. + Anno = maps:remove(arg_types, Anno0), + I#b_set{anno=Anno}; + _ -> + I + end end; opt_anno_types(#b_switch{anno=Anno0,arg=Arg}=I, Ts) -> case concrete_type(Arg, Ts) of @@ -621,10 +639,6 @@ opt_anno_types_1(#b_set{anno=Anno0}=I, [], _Ts, _Index, Acc) -> case Anno0 of #{ arg_types := Acc } -> I; - #{ arg_types := _ } when Acc =:= #{} -> - %% One or more arguments have been simplified to literal values. - Anno = maps:remove(arg_types, Anno0), - I#b_set{anno=Anno}; #{} -> Anno = Anno0#{ arg_types => Acc }, I#b_set{anno=Anno} @@ -957,7 +971,7 @@ simplify_terminator(#b_switch{arg=Arg0,fail=Fail,list=List0}=Sw0, Arg = simplify_arg(Arg0, Ts, Sub), %% Ensure that no label in the switch list is the same as the %% failure label. - List = [{Val,Lbl} || {Val,Lbl} <- List0, Lbl =/= Fail], + List = [{Val,Lbl} || {Val,Lbl} <:- List0, Lbl =/= Fail], case beam_ssa:normalize(Sw0#b_switch{arg=Arg,list=List}) of #b_switch{}=Sw -> case beam_types:is_boolean_type(concrete_type(Arg, Ts)) of @@ -1497,6 +1511,8 @@ will_succeed_1(#b_set{op=has_map_field}, _Src, _Ts) -> yes; will_succeed_1(#b_set{op=get_tuple_element}, _Src, _Ts) -> yes; +will_succeed_1(#b_set{op=put_map,args=[#b_literal{val=assoc}|_]}, _Src, _Ts) -> + yes; will_succeed_1(#b_set{op=put_tuple}, _Src, _Ts) -> yes; will_succeed_1(#b_set{op=update_tuple,args=[Tuple | Updates]}, _Src, Ts) -> @@ -1543,12 +1559,26 @@ will_succeed_1(#b_set{op=wait_timeout}, _Src, _Ts) -> will_succeed_1(#b_set{}, _Src, _Ts) -> 'maybe'. +%% Take care to not produce a reuse hint when more than one update +%% exists. There is no point in attempting the reuse optimization when +%% more than one element is updated, as checking more than one element +%% at runtime is known to be slower than just copying the tuple in +%% most cases. Additionally, using a copy hint occasionally allows the +%% alias analysis pass to do a better job. simplify_update_record(Src, Hint0, Updates, Ts) -> case sur_1(Updates, concrete_type(Src, Ts), Ts, Hint0, []) of + {#b_literal{val=reuse}, []} when length(Updates) > 2 -> + {changed, #b_literal{val=copy}, Updates}; {Hint0, []} -> unchanged; - {Hint, Skipped} -> - {changed, Hint, sur_skip(Updates, Skipped)} + {Hint1, Skipped} -> + Updates1 = sur_skip(Updates, Skipped), + Hint = if length(Updates1) > 2 -> + #b_literal{val=copy}; + true -> + Hint1 + end, + {changed, Hint, Updates1} end. sur_1([Index, Arg | Updates], RecordType, Ts, Hint, Skipped) -> @@ -1671,6 +1701,16 @@ simplify_remote_call(erlang, throw, [Term], Ts, I) -> beam_ssa:add_anno(thrown_type, Type, I); simplify_remote_call(erlang, '++', [#b_literal{val=[]},Tl], _Ts, _I) -> Tl; +simplify_remote_call(maps=Mod, put=Name, [Key,Val,Map], Ts, I) -> + case concrete_type(Map, Ts) of + #t_map{} -> + %% This call to maps:put/3 cannot fail. Replace with the + %% slightly more efficient `put_map` instruction. + Args = [#b_literal{val=assoc},Map,Key,Val], + I#b_set{op=put_map,args=Args}; + _ -> + simplify_pure_call(Mod, Name, [Key,Val,Map], I) + end; simplify_remote_call(Mod, Name, Args, _Ts, I) -> case erl_bifs:is_pure(Mod, Name, length(Args)) of true -> @@ -1917,7 +1957,7 @@ st_filter_reachable([], CallArgs, Deferred, Acc) -> %% We have no reachable self calls, so we know our argument types %% can't expand any further. Filter out our reachable sites and %% return. - [ST || {SuccArgs, _}=ST <- Acc, st_is_reachable(SuccArgs, CallArgs)] + [ST || {SuccArgs, _}=ST <:- Acc, st_is_reachable(SuccArgs, CallArgs)] end. st_join_return_types([{_SuccArgs, SuccRet} | Rest], Acc0) -> @@ -2602,7 +2642,7 @@ infer_relop('=/=', [LHS,RHS], [LType,RType], Ds) -> %% as it may be too specific. See beam_type_SUITE:type_subtraction/1 %% for details. {[{V,beam_types:subtract(ThisType, OtherType)} || - {V, ThisType, OtherType} <- [{RHS, RType, LType}, {LHS, LType, RType}], + {V, ThisType, OtherType} <:- [{RHS, RType, LType}, {LHS, LType, RType}], beam_types:is_singleton_type(OtherType)], NeTypes}; infer_relop(Op, Args, Types, _Ds) -> {infer_relop(Op, Args, Types), []}. @@ -2950,10 +2990,8 @@ subtract_types([{#b_var{}=V, T0}|Vs], Ts) -> subtract_types([], Ts) -> Ts. -parallel_join([A | As], [B | Bs]) -> - [beam_types:join(A, B) | parallel_join(As, Bs)]; -parallel_join([], []) -> - []. +parallel_join(As, Bs) -> + [beam_types:join(A, B) || A <- As && B <- Bs]. gcd(A, B) -> case A rem B of diff --git a/lib/compiler/src/beam_trim.erl b/lib/compiler/src/beam_trim.erl index cb21ace16f25..3e013d8ce143 100644 --- a/lib/compiler/src/beam_trim.erl +++ b/lib/compiler/src/beam_trim.erl @@ -351,7 +351,7 @@ safe_labels([{label,L}|Is], Acc) -> end; safe_labels([_|Is], Acc) -> safe_labels(Is, Acc); -safe_labels([], Acc) -> sets:from_list(Acc, [{version, 2}]). +safe_labels([], Acc) -> sets:from_list(Acc). is_safe_label([{'%',_}|Is]) -> is_safe_label(Is); @@ -394,7 +394,7 @@ frame_layout(N, Killed, {U,_}) -> Is = [[{R,{live,R}} || R <- U], [{R,{dead,R}} || R <- Dead], [{R,{kill,R}} || R <- Killed]], - [I || {_,I} <- lists:merge(Is)]. + [I || {_,I} <:- lists:merge(Is)]. %% usage([Instruction], SafeLabels) -> {FrameSize,[UsedYRegs]} %% Find out the frame size and usage information by looking at the diff --git a/lib/compiler/src/beam_types.erl b/lib/compiler/src/beam_types.erl index c07f96ec6ea6..500b0d7220d2 100644 --- a/lib/compiler/src/beam_types.erl +++ b/lib/compiler/src/beam_types.erl @@ -446,7 +446,7 @@ subtract(#t_union{list=List}=A, B) when ?IS_LIST_TYPE(B) -> shrink_union(A#t_union{list=subtract(List, B)}); subtract(#t_union{tuple_set=[_|_]=Records0}=A, #t_tuple{}=B) -> %% Filter out all records that are more specific than B. - NewSet = case [{Key, T} || {Key, T} <- Records0, meet(T, B) =/= T] of + NewSet = case [{Key, T} || {Key, T} <:- Records0, meet(T, B) =/= T] of [_|_]=Records -> Records; [] -> none end, @@ -1480,7 +1480,7 @@ convert_ext(?BEAM_TYPES_VERSION_25, Types0) -> <>; false -> <> - end || <> <= Types0 >>, + end || <> <:= Types0 >>, convert_ext(?BEAM_TYPES_VERSION_26, Types); convert_ext(_Version, _Types) -> none. diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index aa88a8a5fc11..9a85aaa4103c 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -102,10 +102,6 @@ replace_labels_1([{bs_create_bin,{f,Lbl},Alloc,Live,Unit,Dst,{list,List}}|Is], A when Lbl =/= 0 -> replace_labels_1(Is, [{bs_create_bin,{f,label(Lbl, D, Fb)}, Alloc,Live,Unit,Dst,{list,List}}|Acc], D, Fb); -replace_labels_1([{bs_init,{f,Lbl},Info,Live,Ss,Dst}|Is], Acc, D, Fb) when Lbl =/= 0 -> - replace_labels_1(Is, [{bs_init,{f,label(Lbl, D, Fb)},Info,Live,Ss,Dst}|Acc], D, Fb); -replace_labels_1([{bs_put,{f,Lbl},Info,Ss}|Is], Acc, D, Fb) when Lbl =/= 0 -> - replace_labels_1(Is, [{bs_put,{f,label(Lbl, D, Fb)},Info,Ss}|Acc], D, Fb); replace_labels_1([{put_map=I,{f,Lbl},Op,Src,Dst,Live,List}|Is], Acc, D, Fb) when Lbl =/= 0 -> replace_labels_1(Is, [{I,{f,label(Lbl, D, Fb)},Op,Src,Dst,Live,List}|Acc], D, Fb); diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index 3e5adbef2601..791f0bbb5bc0 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -182,7 +182,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) -> %% A set of all registers containing "fragile" terms. That is, terms %% that don't exist on our process heap and would be destroyed by a %% GC. - fragile=sets:new([{version, 2}]) :: sets:set(), + fragile=sets:new() :: sets:set(), %% Number of Y registers. %% %% Note that this may be 0 if there's a frame without saved values, @@ -229,7 +229,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) -> %% States at labels branched=#{} :: #{ label() => state() }, %% All defined labels - labels=sets:new([{version, 2}]) :: sets:set(), + labels=sets:new() :: sets:set(), %% Information of other functions in the module ft=#{} :: #{ label() => map() }, %% Counter for #value_ref{} creation @@ -302,7 +302,7 @@ init_vst({_, _, Arity}, Level, Ft) -> Vst = #vst{branched=#{}, current=#st{}, ft=Ft, - labels=sets:new([{version, 2}]), + labels=sets:new(), level=Level}, init_function_args(Arity - 1, Vst). @@ -1090,113 +1090,6 @@ vi({bs_create_bin,{f,Fail},Heap,Live,Unit,Dst,{list,List0}}, Vst0) -> create_term(#t_bitstring{size_unit=Unit}, bs_create_bin, [], Dst, SuccVst) end); -vi({bs_init2,{f,Fail},Sz,Heap,Live,_,Dst}, Vst0) -> - verify_live(Live, Vst0), - verify_y_init(Vst0), - if - is_integer(Sz) -> ok; - true -> assert_term(Sz, Vst0) - end, - Vst = heap_alloc(Heap, Vst0), - branch(Fail, Vst, - fun(SuccVst0) -> - SuccVst = prune_x_regs(Live, SuccVst0), - create_term(#t_bitstring{size_unit=8}, bs_init2, [], Dst, - SuccVst, SuccVst0) - end); -vi({bs_init_bits,{f,Fail},Sz,Heap,Live,_,Dst}, Vst0) -> - verify_live(Live, Vst0), - verify_y_init(Vst0), - if - is_integer(Sz) -> ok; - true -> assert_term(Sz, Vst0) - end, - Vst = heap_alloc(Heap, Vst0), - branch(Fail, Vst, - fun(SuccVst0) -> - SuccVst = prune_x_regs(Live, SuccVst0), - create_term(#t_bitstring{}, bs_init_bits, [], Dst, SuccVst) - end); -vi({bs_add,{f,Fail},[A,B,_],Dst}, Vst) -> - assert_term(A, Vst), - assert_term(B, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - create_term(#t_integer{}, bs_add, [A, B], Dst, SuccVst) - end); -vi({bs_utf8_size,{f,Fail},A,Dst}, Vst) -> - assert_term(A, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - create_term(#t_integer{}, bs_utf8_size, [A], Dst, SuccVst) - end); -vi({bs_utf16_size,{f,Fail},A,Dst}, Vst) -> - assert_term(A, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - create_term(#t_integer{}, bs_utf16_size, [A], Dst, SuccVst) - end); -vi({bs_append,{f,Fail},Bits,Heap,Live,Unit,Bin,_Flags,Dst}, Vst0) -> - verify_live(Live, Vst0), - verify_y_init(Vst0), - assert_term(Bits, Vst0), - assert_term(Bin, Vst0), - Vst = heap_alloc(Heap, Vst0), - branch(Fail, Vst, - fun(SuccVst0) -> - SuccVst = prune_x_regs(Live, SuccVst0), - create_term(#t_bitstring{size_unit=Unit}, bs_append, - [Bin], Dst, SuccVst, SuccVst0) - end); -vi({bs_private_append,{f,Fail},Bits,Unit,Bin,_Flags,Dst}, Vst) -> - assert_term(Bits, Vst), - assert_term(Bin, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - create_term(#t_bitstring{size_unit=Unit}, bs_private_append, - [Bin], Dst, SuccVst) - end); -vi({bs_put_string,Sz,_}, Vst) when is_integer(Sz) -> - Vst; -vi({bs_put_binary,{f,Fail},Sz,_,_,Src}, Vst) -> - assert_term(Sz, Vst), - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_bitstring{}, Src, SuccVst) - end); -vi({bs_put_float,{f,Fail},Sz,_,_,Src}, Vst) -> - assert_term(Sz, Vst), - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_float{}, Src, SuccVst) - end); -vi({bs_put_integer,{f,Fail},Sz,_,_,Src}, Vst) -> - assert_term(Sz, Vst), - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_integer{}, Src, SuccVst) - end); -vi({bs_put_utf8,{f,Fail},_,Src}, Vst) -> - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_integer{}, Src, SuccVst) - end); -vi({bs_put_utf16,{f,Fail},_,Src}, Vst) -> - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_integer{}, Src, SuccVst) - end); -vi({bs_put_utf32,{f,Fail},_,Src}, Vst) -> - assert_term(Src, Vst), - branch(Fail, Vst, - fun(SuccVst) -> - update_type(fun meet/2, #t_integer{}, Src, SuccVst) - end); vi(_, _) -> error(unknown_instruction). @@ -1439,7 +1332,7 @@ extract_map_keys([], _Vst) -> extract_map_vals(List, Src, SuccVst) -> - Seen = sets:new([{version, 2}]), + Seen = sets:new(), extract_map_vals(List, Src, Seen, SuccVst, SuccVst). extract_map_vals([Key0, Dst | Vs], Map, Seen0, Vst0, Vsti0) -> @@ -2206,7 +2099,7 @@ assert_unique_map_keys([_,_|_]=Ls) -> assert_literal(L), L end || L <- Ls], - case length(Vs) =:= sets:size(sets:from_list(Vs, [{version, 2}])) of + case length(Vs) =:= sets:size(sets:from_list(Vs)) of true -> ok; false -> error(keys_not_unique) end. @@ -3372,7 +3265,7 @@ mark_fragile(Reg, Vst) -> propagate_fragility(Reg, Args, #vst{current=St0}=Vst) -> #st{fragile=Fragile0} = St0, - Sources = sets:from_list(Args, [{version, 2}]), + Sources = sets:from_list(Args), Fragile = case sets:is_disjoint(Sources, Fragile0) of true -> sets:del_element(Reg, Fragile0); false -> sets:add_element(Reg, Fragile0) @@ -3396,7 +3289,7 @@ remove_fragility(Reg, Vst) -> %% Marks all registers as durable. remove_fragility(#vst{current=St0}=Vst) -> - St = St0#st{fragile=sets:new([{version, 2}])}, + St = St0#st{fragile=sets:new()}, Vst#vst{current=St}. assert_durable_term(Src, Vst) -> diff --git a/lib/compiler/src/beam_z.erl b/lib/compiler/src/beam_z.erl index 88f874f69a41..b750457e3dde 100644 --- a/lib/compiler/src/beam_z.erl +++ b/lib/compiler/src/beam_z.erl @@ -100,24 +100,6 @@ get_list(Src, Hd, Tl, [{swap,R1,R2}|Is]=Is0) -> get_list(Src, Hd, Tl, Is) -> [{get_list,Src,Hd,Tl}|undo_renames(Is)]. -undo_rename({bs_put,F,{I,U,Fl},[Sz,Src]}) -> - {I,F,Sz,U,Fl,Src}; -undo_rename({bs_put,F,{I,Fl},[Src]}) -> - {I,F,Fl,Src}; -undo_rename({bif,bs_add=I,F,[Src1,Src2,{integer,U}],Dst}) -> - {I,F,[Src1,Src2,U],Dst}; -undo_rename({bif,bs_utf8_size=I,F,[Src],Dst}) -> - {I,F,Src,Dst}; -undo_rename({bif,bs_utf16_size=I,F,[Src],Dst}) -> - {I,F,Src,Dst}; -undo_rename({bs_init,F,{I,U,Flags},none,[Sz,Src],Dst}) -> - {I,F,Sz,U,Src,Flags,Dst}; -undo_rename({bs_init,F,{I,Extra,Flags},Live,[Sz],Dst}) -> - {I,F,Sz,Extra,Live,Flags,Dst}; -undo_rename({bs_init,F,{I,Extra,U,Flags},Live,[Sz,Src],Dst}) -> - {I,F,Sz,Extra,Live,U,Src,Flags,Dst}; -undo_rename({bs_init,_,bs_init_writable=I,_,_,_}) -> - I; undo_rename({put_map,Fail,assoc,S,D,R,L}) -> {put_map_assoc,Fail,S,D,R,L}; undo_rename({put_map,Fail,exact,S,D,R,L}) -> diff --git a/lib/compiler/src/cerl.erl b/lib/compiler/src/cerl.erl index 0fcb08145166..cfde778cd7be 100644 --- a/lib/compiler/src/cerl.erl +++ b/lib/compiler/src/cerl.erl @@ -651,7 +651,7 @@ _See also: _`c_module/4`. -spec module_vars(Node :: c_module()) -> [cerl()]. module_vars(Node) -> - [F || {F, _} <- module_defs(Node)]. + [F || {F, _} <:- module_defs(Node)]. %% --------------------------------------------------------------------- @@ -2561,7 +2561,7 @@ _See also: _`c_letrec/2`. -spec letrec_vars(Node :: c_letrec()) -> [cerl()]. letrec_vars(Node) -> - [F || {F, _} <- letrec_defs(Node)]. + [F || {F, _} <:- letrec_defs(Node)]. %% --------------------------------------------------------------------- @@ -4027,16 +4027,16 @@ meta_1('catch', Node) -> meta_1(letrec, Node) -> meta_call(c_letrec, [make_list([c_tuple([meta(N), meta(F)]) - || {N, F} <- letrec_defs(Node)]), + || {N, F} <:- letrec_defs(Node)]), meta(letrec_body(Node))]); meta_1(module, Node) -> meta_call(c_module, [meta(module_name(Node)), make_list(meta_list(module_exports(Node))), make_list([c_tuple([meta(A), meta(V)]) - || {A, V} <- module_attrs(Node)]), + || {A, V} <:- module_attrs(Node)]), make_list([c_tuple([meta(N), meta(F)]) - || {N, F} <- module_defs(Node)])]). + || {N, F} <:- module_defs(Node)])]). meta_call(F, As) -> c_call(c_atom(?MODULE), c_atom(F), As). diff --git a/lib/compiler/src/cerl_inline.erl b/lib/compiler/src/cerl_inline.erl index 4e8b8df8dcb4..e1ce4d522e49 100644 --- a/lib/compiler/src/cerl_inline.erl +++ b/lib/compiler/src/cerl_inline.erl @@ -835,8 +835,8 @@ add_match_bindings(Bs, E) -> true -> E; false -> - Vs = [V || {V, E} <- Bs, E =/= any], - Es = [hd(get_ann(E)) || {_V, E} <- Bs, E =/= any], + Vs = [V || {V, E} <:- Bs, E =/= any], + Es = [hd(get_ann(E)) || {_V, E} <:- Bs, E =/= any], c_let(Vs, c_values(Es), E) end. @@ -935,7 +935,7 @@ i_letrec(Es, B, Xs, Ctxt, Ren, Env, NoInline, S) -> S, Es), %% Then we make recursive bindings for the definitions. - {Rs, Ren1, Env1, S2} = bind_recursive([F || {F, _} <- Es], + {Rs, Ren1, Env1, S2} = bind_recursive([F || {F, _} <:- Es], Opnds, Ren, Env, S1), %% For the function variables listed in Xs (none for a diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index 978553e56b51..10ddb07f077b 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -736,6 +736,37 @@ value are listed. this kind of warning for the types in `Types`, where `Types` is a tuple `{TypeName,Arity}` or a list of such tuples. +- **`nowarn_behaviours`** - By default, warnings are emitted for issues + with behaviours. Use this option to turn off all warnings of this kind. + +- **`nowarn_conflicting_behaviours`** - By default, warnings are emitted when + a module opts in to multiple behaviours that share the names of one or more + callback functions. Use this option to turn off this kind of warning. + +- **`nowarn_undefined_behaviour_func`** - By default, a warning is + emitted when a module that uses a behaviour does not export a + mandatory callback function required by that behaviour. Use this + option to turn off this kind of warning. + +- **`nowarn_undefined_behaviour`** - By default, a warning is emitted + when a module attempts to us an unknown behaviour. Use this option + to turn off this kind of warning. + +- **`nowarn_undefined_behaviour_callbacks`** - By default, a warning + is emitted when `behaviour_info(callbacks)` in the behaviour module + returns `undefined` instead of a list of callback functions. Use this + option to turn off this kind of warning. + +- **`nowarn_ill_defined_behaviour_callbacks`** - By default, a warning + is emitted when `behaviour_info(callbacks)` in the behaviour module + returns a badly formed list of functions. Use this option to turn + off this kind of warning. + +- **`nowarn_ill_defined_optional_callbacks`** - By default, a warning + is emitted when `behaviour_info(optional_callbacks)` in the + behaviour module returns a badly formed list of functions. Use this + option to turn off this kind of warning. + Other kinds of warnings are _opportunistic warnings_. They are generated when the compiler happens to notice potential issues during optimization and code generation. @@ -1036,14 +1067,13 @@ expand_opt(report, Os) -> [report_errors,report_warnings|Os]; expand_opt(return, Os) -> [return_errors,return_warnings|Os]; -expand_opt(r24, Os) -> - expand_opt(no_type_opt, [no_badrecord, no_bs_create_bin, no_ssa_opt_ranges | - expand_opt(r25, Os)]); expand_opt(r25, Os) -> [no_ssa_opt_update_tuple, no_bs_match, no_min_max_bifs | expand_opt(r26, Os)]; expand_opt(r26, Os) -> - [no_bsm_opt | Os]; + [no_bsm_opt | expand_opt(r27, Os)]; +expand_opt(r27, Os) -> + [no_long_atoms, compressed_literals | Os]; expand_opt({debug_info_key,_}=O, Os) -> [encrypt_debug_info,O|Os]; expand_opt(no_type_opt=O, Os) -> @@ -1280,9 +1310,9 @@ print_pass_times(File, Times) -> print_subpass_times(Times0, Name) -> Fam0 = rel2fam(Times0), - Fam1 = [{W,lists:sum(Times)} || {W,Times} <- Fam0], + Fam1 = [{W,lists:sum(Times)} || {W,Times} <:- Fam0], Fam = reverse(lists:keysort(2, Fam1)), - Total = case lists:sum([T || {_,T} <- Fam]) of + Total = case lists:sum([T || {_,T} <:- Fam]) of 0 -> 1; Total0 -> Total0 end, @@ -1368,7 +1398,7 @@ werror(#compile{options=Opts,warnings=Ws}) -> %% messages_per_file([{File,[Message]}]) -> [{File,[Message]}] messages_per_file(Ms) -> - T = lists:sort([{File,M} || {File,Messages} <- Ms, M <- Messages]), + T = lists:sort([{File,M} || {File,Messages} <:- Ms, M <- Messages]), PrioMs = [erl_scan, epp, erl_parse], {Prio0, Rest} = lists:mapfoldl(fun(M, A) -> @@ -1382,7 +1412,7 @@ messages_per_file(Ms) -> mpf(Ms) -> [{File,[M || {F,M} <- Ms, F =:= File]} || - File <- lists:usort([F || {F,_} <- Ms])]. + File <- lists:usort([F || {F,_} <:- Ms])]. %% passes(forms|file, [Option]) -> {Extension,[{Name,PassFun}]} %% Figure out the extension of the input file and which passes @@ -2348,6 +2378,9 @@ is_obsolete(r20) -> true; is_obsolete(r21) -> true; is_obsolete(r22) -> true; is_obsolete(r23) -> true; +is_obsolete(r24) -> true; +is_obsolete(no_badrecord) -> true; +is_obsolete(no_bs_create_bin) -> true; is_obsolete(no_bsm3) -> true; is_obsolete(no_get_hd_tl) -> true; is_obsolete(no_put_tuple2) -> true; @@ -2422,10 +2455,8 @@ beam_docs(Code, #compile{dir = Dir, options = Options, SourceName = deterministic_filename(St), case beam_doc:main(Dir, SourceName, Code, Options) of {ok, Docs, Ws} -> - MetaDocs = [{?META_DOC_CHUNK, - term_to_binary( - Docs, - ensure_deterministic(Options, []))} | ExtraChunks], + Binary = term_to_binary(Docs, [deterministic, compressed]), + MetaDocs = [{?META_DOC_CHUNK, Binary} | ExtraChunks], {ok, Code, St#compile{extra_chunks = MetaDocs, warnings = St#compile.warnings ++ Ws}}; {error, no_docs} -> @@ -2525,7 +2556,7 @@ keep_compile_option(Option, _Deterministic) -> effects_code_generation(Option). start_crypto() -> - try crypto:start() of + try application:start(crypto) of {error,{already_started,crypto}} -> ok; ok -> ok catch @@ -2575,7 +2606,7 @@ beam_asm(Code0, #compile{ifile=File,extra_chunks=ExtraChunks,options=CompilerOpt beam_strip_types(Beam0, #compile{}=St) -> {ok,_Module,Chunks0} = beam_lib:all_chunks(Beam0), - Chunks = [{Tag,Contents} || {Tag,Contents} <- Chunks0, + Chunks = [{Tag,Contents} || {Tag,Contents} <:- Chunks0, Tag =/= "Type"], {ok,Beam} = beam_lib:build_module(Chunks), {ok,Beam,St}. @@ -2834,7 +2865,7 @@ output_encoding(F, #compile{encoding = Encoding}) -> diffable(Code0, St) -> {Mod,Exp,Attr,Fs0,NumLabels} = Code0, EntryLabels = #{Entry => {Name,Arity} || - {function,Name,Arity,Entry,_} <- Fs0}, + {function,Name,Arity,Entry,_} <:- Fs0}, Fs = [diffable_fix_function(F, EntryLabels) || F <- Fs0], Code = {Mod,Exp,Attr,Fs,NumLabels}, {ok,Code,St}. diff --git a/lib/compiler/src/genop.tab b/lib/compiler/src/genop.tab index f9ac6e1b1d62..fdf038c29dcb 100755 --- a/lib/compiler/src/genop.tab +++ b/lib/compiler/src/genop.tab @@ -384,10 +384,10 @@ BEAM_FORMAT_NUMBER=0 # 87: -bs_init/2 88: -bs_final/2 -89: bs_put_integer/5 -90: bs_put_binary/5 -91: bs_put_float/5 -92: bs_put_string/2 +89: -bs_put_integer/5 +90: -bs_put_binary/5 +91: -bs_put_float/5 +92: -bs_put_string/2 # # Binary construction (R7B). @@ -421,9 +421,9 @@ BEAM_FORMAT_NUMBER=0 108: raise/2 # New instructions in R10B. -109: bs_init2/6 +109: -bs_init2/6 110: -bs_bits_to_bytes/3 -111: bs_add/5 +111: -bs_add/5 112: apply/1 113: apply_last/2 ## @spec is_boolean Lbl Arg1 @@ -482,15 +482,15 @@ BEAM_FORMAT_NUMBER=0 131: bs_test_unit/3 132: bs_match_string/4 133: bs_init_writable/0 -134: bs_append/8 -135: bs_private_append/6 +134: -bs_append/8 +135: -bs_private_append/6 ## @spec trim N Remaining ## @doc Reduce the stack usage by N words, ## keeping the CP on the top of the stack. 136: trim/2 -137: bs_init_bits/6 +137: -bs_init_bits/6 # R12B-5 138: bs_get_utf8/5 @@ -502,13 +502,13 @@ BEAM_FORMAT_NUMBER=0 142: bs_get_utf32/5 143: bs_skip_utf32/4 -144: bs_utf8_size/3 -145: bs_put_utf8/3 +144: -bs_utf8_size/3 +145: -bs_put_utf8/3 -146: bs_utf16_size/3 -147: bs_put_utf16/3 +146: -bs_utf16_size/3 +147: -bs_put_utf16/3 -148: bs_put_utf32/3 +148: -bs_put_utf32/3 # R13B03 diff --git a/lib/compiler/src/sys_core_alias.erl b/lib/compiler/src/sys_core_alias.erl index c1ff78b3beb4..344a373fa138 100644 --- a/lib/compiler/src/sys_core_alias.erl +++ b/lib/compiler/src/sys_core_alias.erl @@ -47,7 +47,7 @@ -define(HAS_SUBS(Sub), Sub#sub.t =/= none). -record(sub, {p=#{} :: #{term() => ?NOTSET | atom()}, %% Found pattern substitutions - v=sets:new([{version, 2}]) :: sets:set(cerl:var_name()), %% Variables used by patterns + v=sets:new() :: sets:set(cerl:var_name()), %% Variables used by patterns t=none :: temp()}). %% Temporary information from pre to post -type sub() :: #sub{}. @@ -238,7 +238,7 @@ new_var_name(Key, #sub{p=Pat}=Sub) -> %% merge_variables/2 get_variables(NodesList) -> - sets:from_list([Var || Node <- NodesList, Var <- cerl_trees:variables(Node)], [{version, 2}]). + sets:from_list([Var || Node <- NodesList, Var <- cerl_trees:variables(Node)]). is_disjoint_variables(Vars1, Vars2) -> sets:is_disjoint(Vars1, Vars2). diff --git a/lib/compiler/src/sys_core_bsm.erl b/lib/compiler/src/sys_core_bsm.erl index eff293f63e0d..f76aa83f7771 100644 --- a/lib/compiler/src/sys_core_bsm.erl +++ b/lib/compiler/src/sys_core_bsm.erl @@ -56,7 +56,7 @@ bsm_reorder_1(Vs0, #c_case{clauses=Cs0}=Case) -> Pos when Pos > 0, Pos =/= none -> Vs = core_lib:make_values(move_from_col(Pos, Vs0)), Cs = [C#c_clause{pats=move_from_col(Pos, Ps)} - || #c_clause{pats=Ps}=C <- Cs0], + || #c_clause{pats=Ps}=C <:- Cs0], Case#c_case{arg=Vs,clauses=Cs}; _ -> Case diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index b6ebaa6a924b..3165fa5bf523 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -99,7 +99,7 @@ %% Variable value info. -record(sub, {v=[], %Variable substitutions - s=sets:new([{version, 2}]) :: sets:set(), %Variables in scope + s=sets:new() :: sets:set(), %Variables in scope t=#{} :: map(), %Types in_guard=false, %In guard or not. top=true}). %Not inside a term. @@ -450,7 +450,7 @@ ifes_1(FVar, #c_fun{body=Body}, _Safe) -> ifes_1(FVar, #c_let{arg=Arg,body=Body}, Safe) -> ifes_1(FVar, Arg, false) andalso ifes_1(FVar, Body, Safe); ifes_1(FVar, #c_letrec{defs=Defs,body=Body}, Safe) -> - Funs = [Fun || {_,Fun} <- Defs], + Funs = [Fun || {_,Fun} <:- Defs], ifes_list(FVar, Funs, false) andalso ifes_1(FVar, Body, Safe); ifes_1(_FVar, #c_literal{}, _Safe) -> true; @@ -1081,7 +1081,7 @@ clause_1(#c_clause{guard=G0,body=B0}=Cl, Ps1, Cexpr, Ctxt, Sub1) -> let_substs(Vs0, As0, Sub0) -> {Vs1,Sub1} = var_list(Vs0, Sub0), {Vs2,As1,Ss} = let_substs_1(Vs1, As0, Sub1), - Sub2 = sub_add_scope([V || #c_var{name=V} <- Vs2], Sub1), + Sub2 = sub_add_scope([V || #c_var{name=V} <:- Vs2], Sub1), {Vs2,As1, foldl(fun ({V,S}, Sub) -> sub_set_name(V, S, Sub) end, Sub2, Ss)}. @@ -1332,7 +1332,7 @@ is_subst(_) -> false. %% to force renaming if variables in the scope occurs as pattern %% variables. -sub_new() -> #sub{v=orddict:new(),s=sets:new([{version, 2}]),t=#{}}. +sub_new() -> #sub{v=orddict:new(),s=sets:new(),t=#{}}. sub_new(#sub{}=Sub) -> Sub#sub{v=orddict:new(),t=#{}}. @@ -1707,14 +1707,14 @@ case_opt(Arg, Cs0, Sub) -> reverse(Ps), letify(Bs, cerl:clause_guard(C)), letify(Bs, cerl:clause_body(C))) || - {[],C,Ps,Bs} <- Cs2], + {[],C,Ps,Bs} <:- Cs2], {core_lib:make_values(Args),Cs}. case_opt_args([A0|As0], Cs0, Sub, LitExpr, Acc) -> case case_opt_arg(A0, Sub, Cs0, LitExpr) of {error,Cs1} -> %% Nothing to be done. Move on to the next argument. - Cs = [{Ps,C,[P|PsAcc],Bs} || {[P|Ps],C,PsAcc,Bs} <- Cs1], + Cs = [{Ps,C,[P|PsAcc],Bs} || {[P|Ps],C,PsAcc,Bs} <:- Cs1], case_opt_args(As0, Cs, Sub, LitExpr, [A0|Acc]); {ok,As1,Cs} -> %% The argument was either expanded (from tuple/list) or @@ -2032,7 +2032,7 @@ opt_not_in_let_2(#c_case{clauses=Cs0}=Case, NotCall) -> Cs = [begin Let = #c_let{vars=Vars,arg=B,body=Body}, C#c_clause{body=opt_not_in_let(Let)} - end || #c_clause{body=B}=C <- Cs0], + end || #c_clause{body=B}=C <:- Cs0], {yes,Case#c_case{clauses=Cs}}; opt_not_in_let_2(#c_call{}=Call0, _NotCall) -> invert_call(Call0); @@ -2124,7 +2124,7 @@ is_bool_expr_list([]) -> true. %% (i.e. it cannot fail). %% is_safe_bool_expr(Core) -> - is_safe_bool_expr_1(Core, sets:new([{version, 2}])). + is_safe_bool_expr_1(Core, sets:new()). is_safe_bool_expr_1(#c_call{module=#c_literal{val=erlang}, name=#c_literal{val=is_function}, @@ -2274,7 +2274,7 @@ opt_build_stacktrace(#c_let{vars=[#c_var{name=Cooked}], Cs = [begin B = opt_build_stacktrace(Let#c_let{body=B0}), C#c_clause{body=B} - end || #c_clause{body=B0}=C <- Cs0], + end || #c_clause{body=B0}=C <:- Cs0], Body#c_case{clauses=Cs}; true -> Let @@ -2427,7 +2427,7 @@ opt_let_1(#c_let{vars=Vs0,body=B0}=Let, Arg0, Ctxt, Sub0) -> %% Optimise let and add new substitutions. {Vs,Args,Sub1} = let_substs(Vs0, Arg0, Sub0), BodySub = update_let_types(Vs, Args, Sub1), - Sub = Sub1#sub{v=[],s=sets:new([{version, 2}])}, + Sub = Sub1#sub{v=[],s=sets:new()}, B = body(B0, Ctxt, BodySub), Arg = core_lib:make_values(Args), opt_let_2(Let, Vs, Arg, B, B0, Sub). diff --git a/lib/compiler/src/sys_core_inline.erl b/lib/compiler/src/sys_core_inline.erl index 9913e45f3b71..8098f5df267b 100644 --- a/lib/compiler/src/sys_core_inline.erl +++ b/lib/compiler/src/sys_core_inline.erl @@ -123,7 +123,7 @@ inline(Fs0, St0) -> %% Use fixed inline functions on all functions. Fs = [inline_func(F, Is1) || F <- Fs2], %% Regenerate module body. - [Def || #fstat{def=Def} <- Fs]. + [Def || #fstat{def=Def} <:- Fs]. %% is_inlineable(Fstat, Thresh, [Inline]) -> boolean(). diff --git a/lib/compiler/src/sys_coverage.erl b/lib/compiler/src/sys_coverage.erl index 2c0539a37c34..b3515f83e81a 100644 --- a/lib/compiler/src/sys_coverage.erl +++ b/lib/compiler/src/sys_coverage.erl @@ -553,14 +553,32 @@ munge_qs([{generate,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> A = element(2, Expr), {MungedExpr, Vars1} = munge_expr(Expr, Vars0), munge_qs1(Qs, A, {generate,Anno,Pattern,MungedExpr}, Vars0, Vars1, MQs); +munge_qs([{generate_strict,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> + A = element(2, Expr), + {MungedExpr, Vars1} = munge_expr(Expr, Vars0), + munge_qs1(Qs, A, {generate_strict,Anno,Pattern,MungedExpr}, Vars0, Vars1, MQs); munge_qs([{b_generate,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> A = element(2, Expr), {MExpr, Vars1} = munge_expr(Expr, Vars0), munge_qs1(Qs, A, {b_generate,Anno,Pattern,MExpr}, Vars0, Vars1, MQs); +munge_qs([{b_generate_strict,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> + A = element(2, Expr), + {MExpr, Vars1} = munge_expr(Expr, Vars0), + munge_qs1(Qs, A, {b_generate_strict,Anno,Pattern,MExpr}, Vars0, Vars1, MQs); munge_qs([{m_generate,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> A = element(2, Expr), {MExpr, Vars1} = munge_expr(Expr, Vars0), munge_qs1(Qs, A, {m_generate,Anno,Pattern,MExpr}, Vars0, Vars1, MQs); +munge_qs([{m_generate_strict,Anno,Pattern,Expr}|Qs], Vars0, MQs) -> + A = element(2, Expr), + {MExpr, Vars1} = munge_expr(Expr, Vars0), + munge_qs1(Qs, A, {m_generate_strict,Anno,Pattern,MExpr}, Vars0, Vars1, MQs); +munge_qs([{zip,Anno,Gs0}|Qs], Vars0, MQs) -> + {Gs1, Vars1} = munge_qualifiers(Gs0, Vars0), + %% Get rid of dummy filters inserted by munge_qualifiers/2 -- + %% they are not allowed in the zip construct. + Gs = [G || G <- Gs1, element(1, G) =/= block], + munge_qs1(Qs, Anno, {zip,Anno,Gs}, Vars0, Vars1, MQs); munge_qs([Expr|Qs], Vars0, MQs) -> A = element(2, Expr), {MungedExpr, Vars1} = munge_expr(Expr, Vars0), diff --git a/lib/compiler/src/sys_messages.erl b/lib/compiler/src/sys_messages.erl index d21d1b945d4c..96d823e13cc6 100644 --- a/lib/compiler/src/sys_messages.erl +++ b/lib/compiler/src/sys_messages.erl @@ -119,7 +119,7 @@ quote_source_2(Bin, Enc, StartLine, StartCol, EndLine, EndCol, Ctx) -> Before ++ [{0, "..."}] ++ After end, Lines2 = decorate(Lines1, StartLine, StartCol, EndLine, EndCol), - [[fmt_line(L, Text) || {L, Text} <- Lines2], $\n] + [[fmt_line(L, Text) || {L, Text} <:- Lines2], $\n] end. line_prefix() -> diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl index e315f6c7ef87..950e82d1a1d4 100644 --- a/lib/compiler/src/v3_core.erl +++ b/lib/compiler/src/v3_core.erl @@ -64,7 +64,7 @@ %% atom 'compiler_generated', to indicate that the compiler has generated %% them and that no warning should be generated if they are optimized %% away. -%% +%% %% %% In this translation: %% @@ -82,9 +82,12 @@ -export([module/2,format_error/1]). --import(lists, [any/2,reverse/1,reverse/2,map/2,member/2,foldl/3,foldr/3,mapfoldl/3, - splitwith/2,keydelete/3,keyfind/3,keymember/3,sort/1,droplast/1,last/1, - duplicate/2]). +-import(lists, [all/2,any/2,append/1,droplast/1,duplicate/2, + foldl/3,foldr/3, + keydelete/3,keyfind/3,keymember/3, + last/1,map/2,member/2,mapfoldl/3, + reverse/1,reverse/2, + split/2,splitwith/2,sort/1]). -import(ordsets, [add_element/2,del_element/2,is_element/2, union/1,union/2,intersection/2,subtract/2]). -import(cerl, [ann_c_cons/3,ann_c_tuple/2,c_tuple/1, @@ -121,8 +124,13 @@ -record(itry, {anno=#a{},args,vars,body,evars,handler}). -record(ifilter, {anno=#a{},arg}). -record(igen, {anno=#a{},acc_pat,acc_guard, - skip_pat,tail,tail_pat,arg, + nomatch_pat,nomatch_mode, + tail,tail_pat,arg, refill={nomatch,ignore}}). +-record(izip, {anno=#a{},acc_pats=[],acc_guard, + nomatch_pats=[],nomatch_total=[],skip_pats=[], + tails=[],tail_pats=[],pres=[],args=[], + refill_pats=[],refill_as=[]}). -record(isimple, {anno=#a{},term :: cerl:cerl()}). -type iapply() :: #iapply{}. @@ -143,13 +151,14 @@ -type itry() :: #itry{}. -type ifilter() :: #ifilter{}. -type igen() :: #igen{}. +-type izip() :: #izip{}. -type isimple() :: #isimple{}. -type i() :: iapply() | ibinary() | icall() | icase() | icatch() | iclause() | ifun() | iletrec() | imatch() | imap() | iprimop() | iprotect() | ireceive1() | ireceive2() | iset() | itry() | ifilter() - | igen() | isimple(). + | igen() | izip() | isimple(). -type warning() :: {file:filename(), [{integer(), module(), term()}]}. @@ -199,7 +208,7 @@ module(Forms0, Opts) -> true -> defined_functions(Forms); false -> Exp0 end, - Cexp = [#c_var{name=FA} || {_,_}=FA <- Exp], + Cexp = [#c_var{name=FA} || {_,_}=FA <:- Exp], Kfs1 = reverse(Kfs0), Kfs = if LoadNif and (Nifs =:= none) -> insert_nif_start(Kfs1); @@ -229,7 +238,7 @@ form({attribute,_,export,Es}, #imodule{exports=Exp0}=Module, _Opts) -> form({attribute,_,nifs,Ns}, #imodule{nifs=Nifs0}=Module, _Opts) -> Nifs1 = case Nifs0 of none -> - sets:new([{version, 2}]); + sets:new(); _ -> Nifs0 end, @@ -343,7 +352,7 @@ guard(Gs0, St0) -> end, guard_tests(last(Gs0)), droplast(Gs0)), {Gs,St} = gexpr_top(Gs1, St0#core{in_guard=true}), {Gs,St#core{in_guard=false}}. - + guard_tests(Gs) -> L = element(2, hd(Gs)), {protect,L,foldr(fun (G, Rhs) -> {op,L,'and',G,Rhs} end, last(Gs), droplast(Gs))}. @@ -1135,7 +1144,7 @@ badmap_term(Map, #core{in_guard=false}) -> c_tuple([#c_literal{val=badmap},Map]). map_build_pairs(Map, Es0, Ann, St0) -> - {Es,Pre,_,St1} = map_build_pairs_1(Es0, sets:new([{version, 2}]), St0), + {Es,Pre,_,St1} = map_build_pairs_1(Es0, sets:new(), St0), {ann_c_map(Ann, Map, Es),Pre,St1}. map_build_pairs_1([{Op0,L,K0,V0}|Es], Used0, St0) -> @@ -1515,7 +1524,7 @@ constant_bin_1(Es) -> end. %% verify_suitable_fields([{bin_element,_,Sz,Opts}=E|Es]) -> - + verify_suitable_fields([{bin_element,_,Val,SzTerm,Opts}|Es]) -> case member(big, Opts) orelse member(little, Opts) of true -> ok; @@ -1601,40 +1610,127 @@ fun_tq(Cs0, L, St0, NameInfo) -> %% lc_tq(Line, Exp, [Qualifier], Mc, State) -> {LetRec,[PreExp],State}. %% This TQ from Simon PJ pp 127-138. -lc_tq(Line, E, [#igen{anno=#a{anno=GA}=GAnno, +lc_tq(Line, E, [#igen{}|_T] = Qs, Mc, St) -> + lc_tq1(Line, E, Qs, Mc, St); +lc_tq(Line, E, [#izip{}=Zip|Qs], Mc, St) -> + zip_tq(Line, E, Zip, Mc, St, Qs); +lc_tq(Line, E, [#ifilter{}=Filter|Qs], Mc, St) -> + filter_tq(Line, E, Filter, Mc, St, Qs, fun lc_tq/5); +lc_tq(Line, E0, [], Mc0, St0) -> + {H1,Hps,St1} = safe(E0, St0), + {T1,Tps,St} = force_safe(Mc0, St1), + Anno = lineno_anno(Line, St), + E = ann_c_cons(Anno, H1, T1), + {set_anno(E, [compiler_generated|Anno]),Hps ++ Tps,St}. + +lc_tq1(Line, E, [#igen{anno=#a{anno=GA}=GAnno, acc_pat=AccPat,acc_guard=AccGuard, - skip_pat=SkipPat,tail=Tail,tail_pat=TailPat, + nomatch_pat=NomatchPat, + nomatch_mode=NomatchMode, + tail=Tail,tail_pat=TailPat, refill={RefillPat,RefillAction}, arg={Pre,Arg}}|Qs], Mc, St0) -> {Name,St1} = new_fun_name("lc", St0), LA = lineno_anno(Line, St1), F = #c_var{anno=LA,name={Name,1}}, - Nc = #iapply{anno=GAnno,op=F,args=[Tail]}, + Sc = #iapply{anno=GAnno,op=F,args=[Tail]}, + Nc = case NomatchMode of + skip -> + Sc; + BM -> + #icall{anno=GAnno, + module=#c_literal{anno=GA,val=erlang}, + name=#c_literal{anno=GA,val=error}, + args=[ann_c_tuple(GA, [#c_literal{val=badmatch},BM])]} + end, {[FcVar,Var],St2} = new_vars(2, St1), Fc = bad_generator([FcVar], FcVar, Arg), - SkipClause = make_clause([skip_clause,compiler_generated|LA], - SkipPat, [], [], [Nc]), + NomatchClause = make_clause([nomatch_clause,compiler_generated|LA], + NomatchPat, [], [], [Nc]), TailClause = make_clause(LA, TailPat, [], [], [Mc]), - {Lc,Lps,St3} = lc_tq(Line, E, Qs, Nc, St2), + {Lc,Lps,St3} = lc_tq(Line, E, Qs, Sc, St2), AccClause = make_clause(LA, AccPat, [], AccGuard, Lps ++ [Lc]), - RefillClause = make_clause(LA, RefillPat, [], [], [RefillAction,Nc]), - Cs0 = [AccClause,SkipClause,TailClause,RefillClause], + AccClauseNoGuards = if + AccGuard =:= [] -> + nomatch; + NomatchMode =:= skip -> + nomatch; + true -> + make_clause([compiler_generated|LA], + AccPat, [], [], [Sc]) + end, + RefillClause = make_clause(LA, RefillPat, [], [], [RefillAction,Sc]), + Cs0 = [AccClause,AccClauseNoGuards| + case TailPat of + #ibinary{segments=[]} -> + %% Order clauses for strict binary generator. + [TailClause,NomatchClause,RefillClause]; + _ -> + %% Order clauses for relaxed generator. + [NomatchClause,TailClause,RefillClause] + end], Cs = [C || C <- Cs0, C =/= nomatch], Fun = #ifun{anno=GAnno,id=[],vars=[Var],clauses=Cs,fc=Fc}, {#iletrec{anno=GAnno#a{anno=[list_comprehension|GA]},defs=[{{Name,1},Fun}], body=Pre ++ [#iapply{anno=GAnno,op=F,args=[Arg]}]}, - [],St3}; -lc_tq(Line, E, [#ifilter{}=Filter|Qs], Mc, St) -> - filter_tq(Line, E, Filter, Mc, St, Qs, fun lc_tq/5); -lc_tq(Line, E0, [], Mc0, St0) -> - {H1,Hps,St1} = safe(E0, St0), - {T1,Tps,St} = force_safe(Mc0, St1), - Anno = lineno_anno(Line, St), - E = ann_c_cons(Anno, H1, T1), - {set_anno(E, [compiler_generated|Anno]),Hps ++ Tps,St}. + [],St3}. + +%% zip_tq(Line, Exp, [Qualifier], Mc, State, TqFun) -> {LetRec,[PreExp],State}. +zip_tq(Line, E, #izip{anno=#a{anno=GA}=GAnno, + acc_pats=AccPats,acc_guard=AccGuard, + nomatch_total=NomatchTotal, + skip_pats=SkipPats, + tails=TailVars,tail_pats=TailPats, + refill_pats=RefillPats0, + refill_as=RefillAs,pres=Pres,args=Args}, Mc, St0, Qs) -> + {Name,St1} = new_fun_name("zlc", St0), + LA = lineno_anno(Line, St1), + NumGenerators = length(AccPats), + + %% Generate new vars for each generator, 1 for the regular call, and 1 for + %% the bad generator case. + {CallVars,St2} = new_vars(NumGenerators, St1), + {FcVars, St3} = new_vars(NumGenerators, St2), + + %% Generate the name for the letrec. + F = #c_var{anno=LA,name={Name,NumGenerators}}, + + %% Generate the clauses for the letrec. First, the accumulating + %% clause. + Sc = #iapply{anno=GAnno,op=F,args=TailVars}, + {Lc,Lps,St4} = lc_tq(Line, E, Qs, Sc, St3), + AccClause = make_clause(LA, AccPats, AccGuard, Lps++[Lc]), + + %% Generate the skip clause unless all generators are strict, in + %% which case no skipping is possible. + AccClauseNoGuards = + case NomatchTotal of + strict -> + nomatch; + _ -> + make_clause([skip_clause,compiler_generated|LA], + SkipPats, [], [Sc]) + end, + + %% Generate the clause testing for empty generators. + TailClause = make_clause(LA, TailPats, [], [Mc]), + + %% Generate refill clauses for map generators. + RefillClauses = make_refill(RefillPats0, 0, RefillAs, {TailVars, LA, [], Sc}), + + %% Gather clauses. + Cs0 = [AccClause, AccClauseNoGuards, TailClause | RefillClauses], + Cs = [C || C <- Cs0, C =/= nomatch], + + Fc = bad_generators(FcVars, hd(Args), lc, bad_generators), + Fun = #ifun{anno=GAnno,id=[],vars=CallVars,clauses=Cs,fc=Fc}, + {#iletrec{anno=GAnno#a{anno=[list_comprehension|GA]}, + defs=[{{Name,NumGenerators},Fun}], + body=append(Pres) ++ + [#iapply{anno=GAnno,op=F,args=Args}]},[],St4}. %% bc_tq(Line, Exp, [Qualifier], More, State) -> {LetRec,[PreExp],State}. -%% This TQ from Gustafsson ERLANG'05. +%% This TQ from Gustafsson ERLANG'05. %% More could be transformed before calling bc_tq. bc_tq(Line, Exp, Qs0, St0) -> @@ -1655,9 +1751,11 @@ bc_tq(Line, Exp, Qs0, St0) -> args=[InitialSize]}}] ++ BcPre, {E,Pre,St}. -bc_tq1(Line, E, [#igen{anno=GAnno, +bc_tq1(Line, E, [#igen{anno=#a{anno=GA}=GAnno, acc_pat=AccPat,acc_guard=AccGuard, - skip_pat=SkipPat,tail=Tail,tail_pat=TailPat, + nomatch_pat=NomatchPat, + nomatch_mode=NomatchMode, + tail=Tail,tail_pat=TailPat, refill={RefillPat,RefillAction}, arg={Pre,Arg}}|Qs], Mc, St0) -> {Name,St1} = new_fun_name("lbc", St0), @@ -1667,16 +1765,42 @@ bc_tq1(Line, E, [#igen{anno=GAnno, {[_,_]=FcVars,St3} = new_vars(LA, 2, St2), {IgnoreVar,St4} = new_var(LA, St3), F = #c_var{anno=LA,name={Name,2}}, - Nc = #iapply{anno=GAnno,op=F,args=[Tail,AccVar]}, + Sc = #iapply{anno=GAnno,op=F,args=[Tail,AccVar]}, + Nc = case NomatchMode of + skip -> + Sc; + BM -> + #icall{anno=GAnno, + module=#c_literal{anno=GA,val=erlang}, + name=#c_literal{anno=GA,val=error}, + args=[ann_c_tuple(GA, [#c_literal{val=badmatch},BM])]} + end, Fc = bad_generator(FcVars, hd(FcVars), Arg), - SkipClause = make_clause([compiler_generated,skip_clause|LA], - SkipPat, [IgnoreVar], [], [Nc]), + NomatchClause = make_clause([compiler_generated,nomatch_clause|LA], + NomatchPat, [IgnoreVar], [], [Nc]), TailClause = make_clause(LA, TailPat, [IgnoreVar], [], [AccVar]), {Bc,Bps,St5} = bc_tq1(Line, E, Qs, AccVar, St4), - Body = Bps ++ [#iset{var=AccVar,arg=Bc},Nc], + Body = Bps ++ [#iset{var=AccVar,arg=Bc},Sc], AccClause = make_clause(LA, AccPat, [IgnoreVar], AccGuard, Body), - RefillClause = make_clause(LA, RefillPat, [AccVar], [], [RefillAction,Nc]), - Cs0 = [AccClause,SkipClause,TailClause,RefillClause], + AccClauseNoGuards = if + AccGuard =:= [] -> + nomatch; + NomatchMode =:= skip -> + nomatch; + true -> + make_clause([compiler_generated|LA], + AccPat, [IgnoreVar], [], [Sc]) + end, + RefillClause = make_clause(LA, RefillPat, [AccVar], [], [RefillAction,Sc]), + Cs0 = [AccClause,AccClauseNoGuards| + case TailPat of + #ibinary{segments=[]} -> + %% Order clauses for strict binary generator. + [TailClause,NomatchClause,RefillClause]; + _ -> + %% Order clauses for relaxed generator. + [NomatchClause,TailClause,RefillClause] + end], Cs = [C || C <- Cs0, C =/= nomatch], Fun = #ifun{anno=GAnno,id=[],vars=Vars,clauses=Cs,fc=Fc}, @@ -1686,6 +1810,8 @@ bc_tq1(Line, E, [#igen{anno=GAnno, defs=[{{Name,2},Fun}], body=Pre ++ [#iapply{anno=LAnno,op=F,args=[Arg,Mc]}]}, [],St5}; +bc_tq1(Line, E, [#izip{}=Zip|Qs], Mc, St) -> + bzip_tq1(Line, E, Zip, Mc, St, Qs); bc_tq1(Line, E, [#ifilter{}=Filter|Qs], Mc, St) -> filter_tq(Line, E, Filter, Mc, St, Qs, fun bc_tq1/5); bc_tq1(_, {bin,Bl,Elements}, [], AccVar, St0) -> @@ -1722,6 +1848,66 @@ bc_tq_build(Line, Pre0, #c_var{name=AccVar}, Elements0, St0) -> Anno = Anno0#a{anno=[compiler_generated,single_use|A]}, {set_anno(E, Anno),Pre0++Pre,St}. +bzip_tq1(Line, E, #izip{anno=#a{anno=_GA}=GAnno, + acc_pats=AccPats,acc_guard=AccGuard, + nomatch_total=NomatchTotal, + skip_pats=SkipPats, + tails=TailVars,tail_pats=TailPats, + refill_pats=RefillPats0, + refill_as=RefillAs,pres=Pres,args=Args}, Mc, St0, Qs) -> + {Name,St1} = new_fun_name("bzip", St0), + LA = lineno_anno(Line, St1), + LAnno = #a{anno=LA}, + Arity = length(AccPats) + 1, + + %% Generate new vars for each generator, 1 for the regular call, and 1 for + %% the bad generator case. last(CallVars) is used as the accumulator var + %% when constructing the new binary. + {CallVars, St2} = new_vars(LA, Arity, St1), + {FcVars, St3} = new_vars(LA, Arity, St2), + + %% Generate the name for the letrec. + F = #c_var{anno=LA,name={Name,Arity}}, + + %% Generate the clauses for the letrec. First, the accumulating + %% clause. + BinAccVar = last(CallVars), + Sc = #iapply{anno=GAnno,op=F,args=TailVars++[BinAccVar]}, + {Bc,Bps,St4} = bc_tq1(Line, E, Qs, BinAccVar, St3), + Body = Bps++[#iset{var=hd(CallVars), arg=Bc}, Sc], + AccClause = make_clause(LA, AccPats++[Mc], AccGuard, Body), + + %% Generate the skip clause unless all generators are strict, in + %% which case no skipping is possible. + AccClauseNoGuards = + case NomatchTotal of + strict -> + nomatch; + _ -> + make_clause([skip_clause,compiler_generated|LA], + SkipPats++[Mc], [], [Sc]) + end, + + %% Generate the clause testing for empty generators. + TailClause = make_clause(LA, TailPats++[Mc], [], [Mc]), + + %% Generate refill clauses for map generators. + RefillClauses = make_refill(RefillPats0, 0, RefillAs, {TailVars, LA, [Mc], Sc}), + + %% Gather clauses. + Cs0 = [AccClause, AccClauseNoGuards, TailClause | RefillClauses], + Cs = [C || C <- Cs0, C =/= nomatch], + + Fc = bad_generators(FcVars, hd(Args), bc, bad_generators), + Fun = #ifun{anno=GAnno,id=[],vars=CallVars,clauses=Cs,fc=Fc}, + + %% Inlining would disable the size calculation optimization for + %% bs_init_writable. + {#iletrec{anno=LAnno#a{anno=[list_comprehension,no_inline|LA]}, + defs=[{{Name,Arity},Fun}], + body=append(Pres) ++ + [#iapply{anno=LAnno,op=F,args=Args++[Mc]}]},[],St4}. + mc_tq(Line, {map_field_assoc,Lf,K,V}, Qs, Mc, St0) -> E = {tuple,Lf,[K,V]}, {Lc,Pre0,St1} = lc_tq(Line, E, Qs, Mc, St0), @@ -1732,6 +1918,19 @@ mc_tq(Line, {map_field_assoc,Lf,K,V}, Qs, Mc, St0) -> args=[LcVar]}, {Call,Pre,St2}. +make_refill([nomatch|RefillPats], Index, [_|Bodies], Args) -> + make_refill(RefillPats, Index + 1, Bodies, Args); +make_refill([RefillPat0|RefillPats], Index, [RefillBody|Bodies], {TailVars, LA, Mc, Sc}=Args) -> + {H, [_|T]} = split(Index, TailVars), + RefillPat1 = H ++ [RefillPat0|T] ++ Mc, + RefillClause = make_clause(LA, RefillPat1, [], [RefillBody,Sc]), + [RefillClause|make_refill(RefillPats, Index + 1, Bodies, Args)]; +make_refill([], _Index, [], _Args) -> + []. + +make_clause(Anno, [Pat|PatExtra], Guard, Body) -> + make_clause(Anno, Pat, PatExtra, Guard, Body). + make_clause(_Anno, nomatch, _PatExtra, _Guard, _Body) -> nomatch; make_clause(Anno, Pat, PatExtra, Guard, Body) -> @@ -1782,6 +1981,28 @@ filter_tq(Line, E, #ifilter{anno=#a{anno=LA}=LAnno,arg=Guard}, preprocess_quals(Line, Qs, St) -> preprocess_quals(Line, Qs, St, []). +preprocess_quals(Line, [{zip,Anno,Gens}|Qs], St, Acc) -> + LAnno = #a{anno=lineno_anno(Anno, St)}, + {Gens1, St1} = preprocess_quals(Line, Gens, St, []), + [#igen{acc_guard=AccGuard}|_] = Gens1, + Zip0 = #izip{anno=LAnno, + acc_guard=AccGuard}, + Zip1 = preprocess_zip_generators(Gens1, Zip0), + Zip2 = Zip1#izip{skip_pats=[case NomatchMode of + skip -> NomatchPat; + _ -> AccPat + end || NomatchMode <- Zip1#izip.nomatch_total && + NomatchPat <- Zip1#izip.nomatch_pats && + AccPat <:-Zip1#izip.acc_pats], + tail_pats=[case {NomatchMode,AccPat} of + {skip,_} -> AccPat; + {_,#ibinary{}} -> AccPat#ibinary{segments=[]}; + {_,_} -> AccPat + end || + NomatchMode <- Zip1#izip.nomatch_total && + AccPat <- Zip1#izip.tail_pats], + nomatch_total=get_nomatch_total(Zip1#izip.nomatch_total)}, + preprocess_quals(Line, Qs, St1, [Zip2|Acc]); preprocess_quals(Line, [Q|Qs0], St0, Acc) -> case is_generator(Q) of true -> @@ -1810,9 +2031,45 @@ preprocess_quals(Line, [Q|Qs0], St0, Acc) -> preprocess_quals(_, [], St, Acc) -> {reverse(Acc),St}. +preprocess_zip_generators([#igen{}=Igen | Rest], #izip{}=Zip0) -> + Zip = preprocess_zip_generators(Rest, Zip0), + + #igen{arg={Pre,Arg}, + tail=Tail, + acc_pat=AccPat, + tail_pat=TailPat, + nomatch_mode=NomatchMode, + nomatch_pat=NomatchPat, + refill={RefillPat, RefillArg}} = Igen, + + Zip#izip{acc_pats=[AccPat | Zip#izip.acc_pats], + tails=[Tail | Zip#izip.tails], + tail_pats=[TailPat | Zip#izip.tail_pats], + nomatch_total = [NomatchMode | Zip#izip.nomatch_total], + nomatch_pats = [NomatchPat | Zip#izip.nomatch_pats], + refill_pats=[RefillPat | Zip#izip.refill_pats], + refill_as=[RefillArg | Zip#izip.refill_as], + pres=[Pre | Zip#izip.pres], + args=[Arg | Zip#izip.args]}; +preprocess_zip_generators([], Zip) -> + Zip. + +get_nomatch_total(NomatchModes) -> + case all(fun(X) -> X =:= skip end, NomatchModes) of + true -> skip; + false -> + case any(fun(X) -> X =:= skip end, NomatchModes) of + true -> mixed; + false -> strict + end + end. + is_generator({generate,_,_,_}) -> true; +is_generator({generate_strict,_,_,_}) -> true; is_generator({b_generate,_,_,_}) -> true; +is_generator({b_generate_strict,_,_,_}) -> true; is_generator({m_generate,_,_,_}) -> true; +is_generator({m_generate_strict,_,_,_}) -> true; is_generator(_) -> false. %% Retrieve the annotation from an Erlang AST form. @@ -1825,10 +2082,14 @@ get_qual_anno(Abstract) -> element(2, Abstract). %% - acc_pat is the accumulator pattern, e.g. [Pat|Tail] for Pat <- Expr. %% - acc_guard is the list of guards immediately following the current %% generator in the qualifier list input. -%% - skip_pat is the skip pattern, e.g. <> for -%% <> <= Expr. -%% - tail is the variable used in AccPat and SkipPat bound to the rest of the -%% generator input. +%% - nomatch_pat is the no-match pattern, e.g. <> +%% for <> <= Expr. +%% - nomatch_mode is either skip (not matching elements of the relaxed +%% generator have to be silently skipped by the comprehension) or a +%% value X (to be used in the {badmatch, X} error a strict generator +%% shall raise). +%% - tail is the variable used in AccPat and NomatchPat bound to the +%% rest of the generator input. %% - tail_pat is the tail pattern, respectively [] and <<_/bitstring>> for list %% and bit string generators. %% - refill is a pair {RefillPat,RefillAction}, used to refill the iterator @@ -1841,11 +2102,12 @@ get_qual_anno(Abstract) -> element(2, Abstract). %% generator(Line, Generator, Guard, State) -> {Generator',State}. %% Transform a given generator into its #igen{} representation. -generator(Line, {generate,Lg,P0,E}, Gs, St0) -> +generator(Line, {Generate,Lg,P0,E}, Gs, St0) when Generate =:= generate; + Generate =:= generate_strict -> LA = lineno_anno(Line, St0), GA = lineno_anno(Lg, St0), {Head,St1} = list_gen_pattern(P0, Line, St0), - {[Tail,Skip],St2} = new_vars(2, St1), + {[Tail,Nomatch],St2} = new_vars(2, St1), {Cg,St3} = lc_guard_tests(Gs, St2), AccPat = case Head of nomatch -> @@ -1853,17 +2115,56 @@ generator(Line, {generate,Lg,P0,E}, Gs, St0) -> _ -> ann_c_cons(LA, Head, Tail) end, - SkipPat = ann_c_cons(LA, Skip, Tail), + NomatchPat = ann_c_cons(LA, Nomatch, Tail), + NomatchMode = case Generate of + generate -> + skip; + generate_strict -> + Nomatch + end, {Ce,Pre,St4} = safe(E, St3), - Gen = #igen{anno=#a{anno=GA}, - acc_pat=AccPat,acc_guard=Cg,skip_pat=SkipPat, + Gen = #igen{anno=#a{anno=GA},acc_pat=AccPat,acc_guard=Cg, + nomatch_pat=NomatchPat,nomatch_mode=NomatchMode, tail=Tail,tail_pat=#c_literal{anno=LA,val=[]},arg={Pre,Ce}}, {Gen,St4}; -generator(Line, {b_generate,Lg,P,E}, Gs, St0) -> +generator(Line, {Generate,Lg,P,E}, Gs, St0) when Generate =:= b_generate; + Generate =:= b_generate_strict -> LA = lineno_anno(Line, St0), GA = lineno_anno(Lg, St0), + GAnno = #a{anno=GA}, + %% No-match patterns are very different between relaxed and strict + %% generators. Consider a relaxed generator like + %% <<0:1, X:15>> <= Expr. If the pattern doesn't match the beginning + %% of the bitstring Expr evaluates to, the non-matching part has to + %% be skipped. But, unlike in case of list or map generators, + %% bitstrings don't have a natural "first element" that can be + %% skipped (would it be 1 byte? or 1 bit?), so how many bits to + %% skip? + %% + %% In this example the pattern is always 16 bits long, so we will + %% skip 16 bits, unless the remaining bitstring is less than 16 bits + %% long, in which case no more elements are generated. + %% + %% However, patterns can be variable length too, like + %% <<0:1, X:15, Y:X>>. In this case we generate a skip pattern that + %% still attempts to parse the field lengths: + %% <<_:1, X:16, _:X, Tail/bitstring>>. If it matches, we can + %% continue the generator on the tail, otherwise we can stop. + %% + %% But for a strict generator there are only three possible + %% scenarios to consider depending on what kind of bitstring Expr + %% evaluates to: + %% - In case of an empty binary, we can stop. + %% - If the pattern matches the beginning of the bitstring, we can + %% continue. + %% - Otherwise the generator must fail. + %% + %% This means the skip pattern could be "any non-empty bitstring": + %% <<_:1, _/bitstring>>. However, to simplify raising the badmatch + %% exception, the code will instead use a variable for the pattern + %% and add the non-empty bitstring constraint as a guard. try pattern(P, St0) of - {#ibinary{segments=Segs}=Cp,St1} -> + {#ibinary{segments=Segs}=Cp,St1} when Generate =:= b_generate -> %% The function append_tail_segment/2 keeps variable %% patterns as-is, making it possible to have the same %% skip clause removal as with list generators. @@ -1871,26 +2172,39 @@ generator(Line, {b_generate,Lg,P,E}, Gs, St0) -> AccPat = Cp#ibinary{segments=AccSegs}, {Cg,St3} = lc_guard_tests(Gs, St2), {SkipSegs,St4} = skip_segments(AccSegs, St3, []), - SkipPat = Cp#ibinary{segments=SkipSegs}, + NomatchPat = Cp#ibinary{segments=SkipSegs}, {Ce,Pre,St5} = safe(E, St4), - Gen = #igen{anno=#a{anno=GA},acc_pat=AccPat,acc_guard=Cg, - skip_pat=SkipPat,tail=Tail, - tail_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]}, + Gen = #igen{anno=GAnno,acc_pat=AccPat,acc_guard=Cg, + nomatch_pat=NomatchPat,nomatch_mode=skip, + tail=Tail,tail_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]}, arg={Pre,Ce}}, - {Gen,St5} + {Gen,St5}; + {#ibinary{segments=Segs}=Cp,St1} when Generate =:= b_generate_strict -> + {AccSegs,Tail,TailSeg,St2} = append_tail_segment(Segs, St1), + AccPat = Cp#ibinary{segments=AccSegs}, + {Cg,St3} = lc_guard_tests(Gs, St2), + {Ce,Pre,St4} = safe(E, St3), + Gen = #igen{anno=GAnno,acc_pat=AccPat,acc_guard=Cg, + nomatch_pat=#ibinary{anno=#a{anno=LA},segments=[TailSeg]}, + nomatch_mode=Tail, + tail=Tail,tail_pat=#ibinary{anno=#a{anno=LA},segments=[]}, + arg={Pre,Ce}}, + {Gen,St4} catch throw:nomatch -> {Ce,Pre,St1} = safe(E, St0), Gen = #igen{anno=#a{anno=GA},acc_pat=nomatch,acc_guard=[], - skip_pat=nomatch, + nomatch_pat=nomatch,nomatch_mode=skip, tail_pat=#c_var{name='_'}, arg={Pre,Ce}}, {Gen,St1} end; -generator(Line, {m_generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) -> +generator(Line, {Generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) when + Generate =:= m_generate; + Generate =:= m_generate_strict -> %% Consider this example: %% - %% [{K,V} || K := V <- L]. + %% [{K,V} || K := V <:- L, is_integer(K)]. %% %% The following Core Erlang code will be generated: %% @@ -1898,17 +2212,23 @@ generator(Line, {m_generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) -> %% 'lc$^0'/1 = %% fun (Iter0) -> %% case Iter0 of - %% <{K,V,NextIter}> when 'true' -> + %% <{K,V,NextIter}> when call 'erlang':'is_integer' (K) -> %% let = %% apply 'lc$^0'/1(NextIter) %% in [{K,V}|Tail] %% <{_K,_V,NextIter}> when 'true' -> - %% %% Skip clause; will be optimized away later - %% %% since there are no filters. + %% %% Match clause without guards; this is always + %% %% a skip, even for strict generators + %% %% (since the generator does match in this case, + %% %% the skip happens due to the subsequent guard). %% apply 'lc$^0'/1(NextIter) + %% <{K,V,_NextIter}> when 'true' -> + %% %% Nomatch clause; will be optimized away later + %% %% since the left hand side pattern always matches. + %% call 'erlang':'error'({'badmatch',{K,V}}) %% <'none'> when 'true' -> %% [] - %% when 'true' -> + %% when 'true' -> %% let NextIter = %% call 'erts_internal':'mc_refill'(Iter) %% in apply 'lc$^0'/1(NextIter) @@ -1929,7 +2249,7 @@ generator(Line, {m_generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) -> LA = lineno_anno(Line, St0), GA = lineno_anno(Lg, St0), {Pat,St1} = list_gen_pattern({cons,Lg,K0,V0}, Line, St0), - {[SkipK,SkipV,IterVar,OuterIterVar,_BadGenVar],St2} = new_vars(5, St1), + {[NomatchK,NomatchV,IterVar,OuterIterVar,_BadGenVar],St2} = new_vars(5, St1), {Cg,St3} = lc_guard_tests(Gs, St2), {Ce,Pre0,St4} = safe(E, St3), AccPat = case Pat of @@ -1940,14 +2260,19 @@ generator(Line, {m_generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) -> V = cons_tl(Pat), #c_tuple{es=[K,V,IterVar]} end, - SkipPat = #c_tuple{es=[SkipK,SkipV,IterVar]}, - - Refill = {SkipK, + NomatchPat = #c_tuple{es=[NomatchK,NomatchV,IterVar]}, + NomatchMode = case Generate of + m_generate -> + skip; + m_generate_strict -> + #c_tuple{es=[NomatchK,NomatchV]} + end, + Refill = {ann_c_cons(GA,NomatchK,NomatchV), #iset{var=IterVar, arg=#icall{anno=#a{anno=GA}, module=#c_literal{val=erts_internal}, name=#c_literal{val=mc_refill}, - args=[SkipK]}}}, + args=[ann_c_cons(GA,NomatchK,NomatchV)]}}}, InitIter = #icall{anno=#a{anno=GA}, module=#c_literal{val=erts_internal}, @@ -1967,7 +2292,9 @@ generator(Line, {m_generate,Lg,{map_field_exact,_,K0,V0},E}, Gs, St0) -> Pre = Pre0 ++ [Before], Gen = #igen{anno=#a{anno=GA}, - acc_pat=AccPat,acc_guard=Cg,skip_pat=SkipPat, + acc_pat=AccPat,acc_guard=Cg, + nomatch_pat=NomatchPat, + nomatch_mode=NomatchMode, tail=IterVar,tail_pat=#c_literal{anno=LA,val=none}, refill=Refill, arg={Pre,OuterIterVar}}, @@ -2414,8 +2741,21 @@ new_vars_1(N, Anno, St0, Vs) when N > 0 -> new_vars_1(0, _, St, Vs) -> {Vs,St}. bad_generator(Ps, Generator, Arg) -> + L = [#c_literal{val=bad_generator}, Generator], + bad_generator_common(L, Ps, Arg). + +bad_generators(Ps, Arg, bc, ErrorType) -> + T1 = #c_tuple{es=droplast(Ps)}, + L = [#c_literal{val=ErrorType}, T1], + bad_generator_common(L, Ps, Arg); +bad_generators(Ps, Arg, lc, ErrorType) -> + T = #c_tuple{es=Ps}, + L = [#c_literal{val=ErrorType}, T], + bad_generator_common(L, Ps, Arg). + +bad_generator_common(L, Ps, Arg) -> Anno = get_anno(Arg), - Tuple = ann_c_tuple(Anno, [#c_literal{val=bad_generator},Generator]), + Tuple = ann_c_tuple(Anno, L), Call = #icall{anno=#a{anno=Anno}, %Must have an #a{} module=#c_literal{anno=Anno,val=erlang}, name=#c_literal{anno=Anno,val=error}, @@ -2664,16 +3004,16 @@ uclause(Cl0, Ks, St0) -> do_uclause(#iclause{anno=A0,pats=Ps0,guard=G0,body=B0}, Ks0, St0) -> {Ps1,Pg0,Pvs,Pus,St1} = upattern_list(Ps0, Ks0, St0), Anno = A0#a.anno, - {Pg,A} = case member(skip_clause, Anno) of + {Pg,A} = case member(nomatch_clause, Anno) of true -> - %% This is the skip clause for a binary generator. + %% This is the no-match clause for a binary generator. %% To ensure that it will properly skip the nonmatching %% patterns in generators such as: %% %% <> <= Gen %% %% we must remove any generated pre guard. - {[],A0#a{anno=Anno -- [skip_clause]}}; + {[],A0#a{anno=Anno -- [nomatch_clause]}}; false -> {Pg0,A0} end, @@ -3001,7 +3341,7 @@ upattern_list([P0|Ps0], Ks, St0) -> {P1,Pg,Pv,Pu,St1} = upattern(P0, Ks, St0), {Ps1,Psg,Psv,Psu,St2} = upattern_list(Ps0, known_union(Ks, Pv), St1), {[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2}; -upattern_list([], _, St) -> {[],[],[],[],St}. +upattern_list([], _, St) -> {[],[],[],[],St}. %% upat_bin([Pat], [KnownVar], State) -> %% {[Pat],[GuardTest],[NewVar],[UsedVar],State}. @@ -3028,7 +3368,7 @@ upat_bin([P0|Ps0], Ks, Bs, St0) -> {P1,Pg,Pv,Pu,Bs1,St1} = upat_element(P0, Ks, Bs, St0), {Ps1,Psg,Psv,Psu,St2} = upat_bin(Ps0, known_union(Ks, Pv), Bs1, St1), {[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2}; -upat_bin([], _, _, St) -> {[],[],[],[],St}. +upat_bin([], _, _, St) -> {[],[],[],[],St}. %% upat_element(Segment, [KnownVar], [LocalVar], State) -> @@ -3057,7 +3397,7 @@ upat_element(#ibitstr{val=H0,size=Sz0}=Seg, Ks, Bs0, St0) -> {Seg#ibitstr{val=H1,size=Sz1},Hg,Hv,Us,Bs1,St2}; Expr when is_list(Expr) -> Sz1 = [#iset{var=#c_var{name=Old},arg=#c_var{name=New}} || - {Old,New} <- Bs0] ++ Expr, + {Old,New} <:- Bs0] ++ Expr, {Sz2,_,St2} = uexprs(Sz1, Ks, St1), Us = used_in_expr(Sz2), {Seg#ibitstr{val=H1,size=Sz2},Hg,Hv,Us,Bs1,St2} @@ -4032,7 +4372,7 @@ lit_vars(#c_cons{hd=H,tl=T}, Vs) -> lit_vars(H, lit_vars(T, Vs)); lit_vars(#c_tuple{es=Es}, Vs) -> lit_list_vars(Es, Vs); lit_vars(#c_map{arg=V,es=Es}, Vs) -> lit_vars(V, lit_list_vars(Es, Vs)); lit_vars(#c_map_pair{key=K,val=V}, Vs) -> lit_vars(K, lit_vars(V, Vs)); -lit_vars(#c_var{name=V}, Vs) -> add_element(V, Vs); +lit_vars(#c_var{name=V}, Vs) -> add_element(V, Vs); lit_vars(_, Vs) -> Vs. %These are atomic lit_list_vars(Ls) -> lit_list_vars(Ls, []). @@ -4101,7 +4441,7 @@ is_simple(_) -> false. -spec is_simple_list([cerl:cerl()]) -> boolean(). -is_simple_list(Es) -> lists:all(fun is_simple/1, Es). +is_simple_list(Es) -> all(fun is_simple/1, Es). insert_nif_start([VF={V,F=#c_fun{body=Body}}|Funs]) -> case Body of diff --git a/lib/compiler/test/Makefile b/lib/compiler/test/Makefile index bf7e190cefb8..dc3cbe128b1c 100644 --- a/lib/compiler/test/Makefile +++ b/lib/compiler/test/Makefile @@ -52,8 +52,13 @@ MODULES= \ trycatch_SUITE \ warnings_SUITE \ z_SUITE \ + zlc_SUITE \ test_lib +NO_BOOL_OPT= \ + guard \ + andor + NO_OPT= \ andor \ apply \ @@ -83,7 +88,8 @@ NO_OPT= \ overridden_bif \ receive \ record \ - trycatch + trycatch \ + zlc INLINE= \ andor \ @@ -112,11 +118,6 @@ INLINE= \ receive \ record -R24= \ - bs_construct \ - bs_utf \ - bs_bincomp - R25= \ bs_construct \ bs_match \ @@ -137,6 +138,8 @@ NO_SSA_OPT = $(NO_OPT) NO_TYPE_OPT = $(NO_OPT) +NO_BOOL_OPT_MODULES= $(NO_BOOL_OPT:%=%_no_bool_opt_SUITE) +NO_BOOL_OPT_ERL_FILES= $(NO_BOOL_OPT_MODULES:%=%.erl) NO_OPT_MODULES= $(NO_OPT:%=%_no_opt_SUITE) NO_OPT_ERL_FILES= $(NO_OPT_MODULES:%=%.erl) POST_OPT_MODULES= $(NO_OPT:%=%_post_opt_SUITE) @@ -147,8 +150,6 @@ NO_CORE_SSA_OPT_MODULES= $(NO_OPT:%=%_no_copt_ssa_SUITE) NO_CORE_SSA_OPT_ERL_FILES= $(NO_CORE_SSA_OPT_MODULES:%=%.erl) INLINE_MODULES= $(INLINE:%=%_inline_SUITE) INLINE_ERL_FILES= $(INLINE_MODULES:%=%.erl) -R24_MODULES= $(R24:%=%_r24_SUITE) -R24_ERL_FILES= $(R24_MODULES:%=%.erl) R25_MODULES= $(R25:%=%_r25_SUITE) R25_ERL_FILES= $(R25_MODULES:%=%.erl) NO_MOD_OPT_MODULES= $(NO_MOD_OPT:%=%_no_module_opt_SUITE) @@ -192,12 +193,16 @@ EBIN = . DISABLE_SSA_OPT = +no_bool_opt +no_share_opt +no_bsm_opt +no_fun_opt +no_ssa_opt +no_recv_opt -make_emakefile: $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES) \ - $(NO_CORE_OPT_ERL_FILES) $(NO_CORE_SSA_OPT_ERL_FILES) \ - $(INLINE_ERL_FILES) $(NO_MOD_OPT_ERL_FILES) $(NO_TYPE_OPT_ERL_FILES) \ - $(DIALYZER_ERL_FILES) $(COVER_ERL_FILES) $(R24_ERL_FILES) $(R25_ERL_FILES) +make_emakefile: $(NO_BOOL_OPT_ERL_FILES) $(NO_OPT_ERL_FILES) \ + $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES) \ + $(NO_CORE_OPT_ERL_FILES) $(NO_CORE_SSA_OPT_ERL_FILES) \ + $(INLINE_ERL_FILES) $(NO_MOD_OPT_ERL_FILES) \ + $(NO_TYPE_OPT_ERL_FILES) $(DIALYZER_ERL_FILES) \ + $(COVER_ERL_FILES) $(R25_ERL_FILES) $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) \ > $(EMAKEFILE) + $(ERL_TOP)/make/make_emakefile +no_bool_opt $(ERL_COMPILE_FLAGS) \ + -o$(EBIN) $(NO_BOOL_OPT_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +no_copt $(DISABLE_SSA_OPT) +no_postopt \ $(ERL_COMPILE_FLAGS) -o$(EBIN) $(NO_OPT_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile $(DISABLE_SSA_OPT) $(ERL_COMPILE_FLAGS) \ @@ -210,8 +215,6 @@ make_emakefile: $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES -o$(EBIN) $(NO_CORE_SSA_OPT_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +inline $(ERL_COMPILE_FLAGS) \ -o$(EBIN) $(INLINE_MODULES) >> $(EMAKEFILE) - $(ERL_TOP)/make/make_emakefile +r24 $(ERL_COMPILE_FLAGS) \ - -o$(EBIN) $(R24_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +r25 $(ERL_COMPILE_FLAGS) \ -o$(EBIN) $(R25_MODULES) >> $(EMAKEFILE) $(ERL_TOP)/make/make_emakefile +no_module_opt $(ERL_COMPILE_FLAGS) \ @@ -239,6 +242,9 @@ docs: # Special targets # ---------------------------------------------------- +%_no_bool_opt_SUITE.erl: %_SUITE.erl + sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ + %_no_opt_SUITE.erl: %_SUITE.erl sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ @@ -257,12 +263,6 @@ docs: %_inline_SUITE.erl: %_SUITE.erl sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ -%_r23_SUITE.erl: %_SUITE.erl - sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ - -%_r24_SUITE.erl: %_SUITE.erl - sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ - %_r25_SUITE.erl: %_SUITE.erl sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@ @@ -280,7 +280,7 @@ docs: # ---------------------------------------------------- # Release Target -# ---------------------------------------------------- +# ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk release_spec: opt @@ -289,9 +289,11 @@ release_tests_spec: make_emakefile $(INSTALL_DIR) "$(RELSYSDIR)" $(INSTALL_DATA) compiler.spec compiler.cover \ $(EMAKEFILE) $(ERL_FILES) "$(RELSYSDIR)" - $(INSTALL_DATA) $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) \ + $(INSTALL_DATA) \ + $(NO_BOOL_OPT_ERL_FILES) \ + $(NO_OPT_ERL_FILES) \ + $(POST_OPT_ERL_FILES) \ $(INLINE_ERL_FILES) \ - $(R24_ERL_FILES) \ $(R25_ERL_FILES) \ $(NO_CORE_OPT_ERL_FILES) \ $(NO_CORE_SSA_OPT_ERL_FILES) \ diff --git a/lib/compiler/test/beam_doc_SUITE.erl b/lib/compiler/test/beam_doc_SUITE.erl index f347274efce2..6135fe09fa4e 100644 --- a/lib/compiler/test/beam_doc_SUITE.erl +++ b/lib/compiler/test/beam_doc_SUITE.erl @@ -2,7 +2,7 @@ -module(beam_doc_SUITE). -export([all/0, groups/0, init_per_group/2, end_per_group/2, singleton_moduledoc/1, singleton_doc/1, docmodule_with_doc_attributes/1, hide_moduledoc/1, docformat/1, - singleton_docformat/1, singleton_meta/1, slogan/1, + singleton_docformat/1, singleton_meta/1, source_path/1, behaviours/1, slogan/1, types_and_opaques/1, callback/1, hide_moduledoc2/1, private_types/1, export_all/1, equiv/1, spec/1, deprecated/1, warn_missing_doc/1, doc_with_file/1, doc_with_file_error/1, all_string_formats/1, @@ -36,6 +36,8 @@ documentation_generation_tests() -> docformat, singleton_docformat, singleton_meta, + source_path, + behaviours, slogan, types_and_opaques, callback, @@ -125,40 +127,57 @@ hide_moduledoc2(Conf) -> docformat(Conf) -> {ok, ModName} = default_compile_file(Conf, "docformat"), ModuleDoc = #{<<"en">> => <<"Moduledoc test module">>}, - Meta = #{format => "text/asciidoc", - deprecated => "Use something else", - otp_doc_vsn => {1,0,0}, - since => "1.0"}, Doc = #{<<"en">> => <<"Doc test module">>}, {ok, {docs_v1, _,_, <<"text/asciidoc">>, ModuleDoc, Meta, [{{function, main,_},_, _, Doc, _}]}} = code:get_doc(ModName), + #{format := "text/asciidoc", deprecated := "Use something else", otp_doc_vsn := {1,0,0}, since := "1.0"} = Meta, ok. singleton_docformat(Conf) -> {ok, ModName} = default_compile_file(Conf, "singleton_docformat"), ModuleDoc = #{<<"en">> => <<"Moduledoc test module">>}, - Meta = #{format => <<"text/asciidoc">>, - deprecated => ~"Use something else", - otp_doc_vsn => {1,0,0}, - since => ~"1.0"}, Doc = #{<<"en">> => <<"Doc test module\n\nMore info here">>}, - FunMeta = #{ authors => [<<"Beep Bop">>], equiv => <<"main/3">>, since => ~"1.0" }, {ok, {docs_v1, _,erlang, <<"text/asciidoc">>, ModuleDoc, Meta, [{{function, main,0},_, [<<"main()">>], Doc, FunMeta}]}} = code:get_doc(ModName), + #{format := <<"text/asciidoc">>, + deprecated := ~"Use something else", + otp_doc_vsn := {1,0,0}, + since := ~"1.0"} = Meta, + #{authors := [<<"Beep Bop">>], equiv := <<"main/3">>, since := ~"1.0"} = FunMeta, ok. singleton_meta(Conf) -> ModuleName = ?get_name(), {ok, ModName} = default_compile_file(Conf, ModuleName), - Meta = #{ authors => [<<"Beep Bop">>], equiv => <<"main/3">>, since => ~"1.0" }, DocMain1 = #{<<"en">> => <<"Returns always ok.">>}, - {ok, {docs_v1, _,erlang, <<"text/markdown">>, none, #{ since := ~"1.0" }, + Meta = #{authors => [<<"Beep Bop">>], equiv => <<"main/3">>, since => ~"1.0", source_anno => {9, 1}}, + {ok, {docs_v1, _,erlang, <<"text/markdown">>, none, #{ since := ~"1.0", source_anno := {1, 2} }, [{{function, main1,0},_, [<<"main1()">>], DocMain1, #{equiv := <<"main(_)">>, - since := ~"1.1"}}, + since := ~"1.1", + source_anno := {19, 1}}}, {{function, main,0},_, [<<"main()">>], none, Meta}]}} = code:get_doc(ModName), ok. +source_path(Conf) -> + ModuleName = ?get_name(), + % Includes absolute source path by default + FilePath = filename:absname(data_file_path(Conf, ModuleName)), + {ok, ModName} = default_compile_file(Conf, ModuleName), + {ok, {docs_v1, _, _, _, _, Meta1, _}} = code:get_doc(ModName), + #{source_path := FilePath} = Meta1, + % Excludes source path when deterministic + {ok, ModName} = default_compile_file(Conf, ModuleName, [deterministic]), + {ok, {docs_v1, _, _, _, _, Meta2, _}} = code:get_doc(ModName), + false = is_map_key(source_path, Meta2), + ok. + +behaviours(Conf) -> + ModuleName = ?get_name(), + {ok, ModName} = default_compile_file(Conf, ModuleName), + {ok, {docs_v1, _, _, _, _, #{behaviours := [gen_event, gen_server]}, _}} = code:get_doc(ModName), + ok. + slogan(Conf) -> ModuleName = ?get_name(), {ok, ModName} = default_compile_file(Conf, ModuleName), @@ -189,8 +208,6 @@ types_and_opaques(Conf) -> OpaqueDoc = #{<<"en">> => <<"Represents the name of a person that cannot be named.">>}, MaybeOpaqueDoc = #{<<"en">> => <<"mmaybe(X) ::= nothing | X.\n\nRepresents a maybe type.">>}, - MaybeMeta = #{ authors => "Someone else", exported => true }, - NaturalNumberMeta = #{since => "1.0", equiv => <<"non_neg_integer/0">>, exported => true}, {ok, {docs_v1, _,_, _, none, _, [%% Type Definitions @@ -202,7 +219,7 @@ types_and_opaques(Conf) -> UsesPublic, Ignore, MapFun, PrivateEncoding, Foo ]}} = code:get_doc(ModName), - {{type,public,0},{125,2},[<<"public()">>],none,#{exported := true}} = Public, + {{type,public,0},{125,2},[<<"public()">>],none,#{exported := true, source_anno := {125, 2}}} = Public, {{type,intermediate,0},{124,2},[<<"intermediate()">>],none,#{exported := false}} = Intermediate, {{type,hidden_nowarn_type,0},{120,2},[<<"hidden_nowarn_type()">>],hidden,#{exported := false}} = HiddenNoWarnType, {{type,hidden_type,0},{117,2},[<<"hidden_type()">>],hidden,#{exported := false}} = HiddenType, @@ -222,12 +239,12 @@ types_and_opaques(Conf) -> {{type,hidden,0},_,[<<"hidden()">>],hidden,#{exported := true}} = Hidden, {{type,hidden_false,0},_,[<<"hidden_false()">>],hidden, #{exported := true, authors := "Someone else"}} = HiddenFalse, - {{type, mmaybe,1},_,[<<"mmaybe(X)">>], MaybeOpaqueDoc, MaybeMeta} = MMaybe, + {{type, mmaybe,1},_,[<<"mmaybe(X)">>], MaybeOpaqueDoc, #{authors := "Someone else", exported := true}} = MMaybe, {{type, unnamed,0},{30,2},[<<"unnamed()">>], OpaqueDoc, #{equiv := <<"non_neg_integer()">>, exported := true}} = Unnamed, {{type, param,1},_,[<<"param(X)">>], GenericsDoc, #{equiv := <<"madeup()">>, exported := true}} = Param, - {{type, natural_number,0},_,[<<"natural_number()">>], none, NaturalNumberMeta} = NatNumber, + {{type, natural_number,0},_,[<<"natural_number()">>], none, #{since := "1.0", equiv := <<"non_neg_integer/0">>, exported := true}} = NatNumber, {{type, name,1},_,[<<"name(_)">>], TypeDoc, #{exported := true}} = Name, {{type, hidden_included_type, 0}, _, _, hidden, #{exported := false }} = HiddenIncludedType, @@ -267,7 +284,7 @@ callback(Conf) -> FunctionDoc = #{<<"en">> => <<"all_ok()\n\nCalls all_ok/0">>}, ChangeOrder = #{<<"en">> => <<"Test changing order">>}, {ok, {docs_v1, _,_, _, none, _, - [{{callback,nowarn,1},{39,2},[<<"nowarn(Arg)">>],hidden,#{}}, + [{{callback,nowarn,1},{39,2},[<<"nowarn(Arg)">>],hidden,#{source_anno := {41, 2}}}, {{callback,warn,0},{36,2},[<<"warn()">>],hidden,#{}}, {{callback,bounded,1},_,[<<"bounded(X)">>],none,#{}}, {{callback,multi,1},_,[<<"multi(Argument)">>], @@ -632,8 +649,7 @@ parse(Toks) -> [F | parse(Rest)]. compile_file(Conf, ModuleName, ExtraOpts) -> - ErlModName = ModuleName ++ ".erl", - Filename = filename:join(proplists:get_value(data_dir, Conf), ErlModName), + Filename = data_file_path(Conf, ModuleName), io:format("Compiling: ~ts~n~p~n",[Filename, ExtraOpts]), case compile:file(Filename, ExtraOpts) of Res when element(1, Res) =:= ok -> @@ -649,6 +665,10 @@ compile_file(Conf, ModuleName, ExtraOpts) -> Else end. +data_file_path(Conf, ModuleName) -> + ErlModName = ModuleName ++ ".erl", + filename:join(proplists:get_value(data_dir, Conf), ErlModName). + default_compile_file(Conf, ModuleName) -> default_compile_file(Conf, ModuleName, []). default_compile_file(Conf, ModuleName, ExtraOpts) -> diff --git a/lib/compiler/test/beam_doc_SUITE_data/behaviours.erl b/lib/compiler/test/beam_doc_SUITE_data/behaviours.erl new file mode 100644 index 000000000000..4c5de47fb3ed --- /dev/null +++ b/lib/compiler/test/beam_doc_SUITE_data/behaviours.erl @@ -0,0 +1,10 @@ +-module(behaviours). + +-export([]). + +-behaviour(gen_server). +-behaviour(gen_event). + +-moduledoc " +Moduledoc test module +". diff --git a/lib/compiler/test/beam_doc_SUITE_data/source_annotations.erl b/lib/compiler/test/beam_doc_SUITE_data/source_annotations.erl new file mode 100644 index 000000000000..9d59f1061687 --- /dev/null +++ b/lib/compiler/test/beam_doc_SUITE_data/source_annotations.erl @@ -0,0 +1,19 @@ +-module(source_annotations). + +-export([main/1, + bar/0, + no_slogan/1, + spec_slogan/1, + spec_slogan/2, + no_doc_slogan/1, + spec_no_doc_slogan/1, + spec_multiclause_slogan_ignored/1, + connect/2 + ]). + +-spec main(X :: integer()) -> ok. +main(_X) -> + ok. + +bar() -> + ok. diff --git a/lib/compiler/test/beam_doc_SUITE_data/source_path.erl b/lib/compiler/test/beam_doc_SUITE_data/source_path.erl new file mode 100644 index 000000000000..0ca4df4665aa --- /dev/null +++ b/lib/compiler/test/beam_doc_SUITE_data/source_path.erl @@ -0,0 +1,7 @@ +-module(source_path). + +-export([]). + +-moduledoc " +Moduledoc test module +". diff --git a/lib/compiler/test/beam_ssa_check_SUITE.erl b/lib/compiler/test/beam_ssa_check_SUITE.erl index 5aca677f38b6..b1ddcb93492a 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE.erl @@ -32,6 +32,8 @@ annotation_checks/1, appendable_checks/1, bs_size_unit_checks/1, + no_reuse_hint_checks/1, + no_type_info_checks/1, private_append_checks/1, ret_annotation_checks/1, sanity_checks/1, @@ -47,6 +49,8 @@ groups() -> [alias_checks, annotation_checks, appendable_checks, + no_reuse_hint_checks, + no_type_info_checks, private_append_checks, ret_annotation_checks, sanity_checks, @@ -99,13 +103,21 @@ appendable_checks(Config) when is_list(Config) -> bs_size_unit_checks(Config) when is_list(Config) -> gen_and_run_post_ssa_opt(bs_size_unit_checks, Config). +no_reuse_hint_checks(Config) when is_list(Config) -> + run_post_ssa_opt(no_reuse_hint, Config). + +no_type_info_checks(Config) when is_list(Config) -> + run_post_ssa_opt(no_type_info, Config). + private_append_checks(Config) when is_list(Config) -> run_post_ssa_opt(private_append, Config). tuple_inplace_checks(Config) when is_list(Config) -> run_post_ssa_opt(tuple_inplace_checks, Config), run_post_ssa_opt(tuple_inplace_abort0, Config), - run_post_ssa_opt(tuple_inplace_abort1, Config). + run_post_ssa_opt(tuple_inplace_abort1, Config), + run_post_ssa_opt(tuple_inplace_abort2, Config), + run_post_ssa_opt(tuple_inplace_abort3, Config). ret_annotation_checks(Config) when is_list(Config) -> run_post_ssa_opt(ret_annotation, Config). diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/alias.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/alias.erl index 2dcf0cc8f649..e208b0d5fb70 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/alias.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/alias.erl @@ -107,7 +107,14 @@ fuzz0/0, fuzz0/1, alias_after_phi/0, check_identifier_type/0, - gh9014_main/0]). + + gh9014_main/0, + + nested_tuple/0, + nested_cons/0, + nested_mixed/0, + + see_through/0]). %% Trivial smoke test transformable0(L) -> @@ -819,20 +826,21 @@ aliased_pair_tl_instr(Ls) -> aliasing_after_tuple_extract(N) -> aliasing_after_tuple_extract(N, {<<>>, dummy}). -%% Check that both the tuple (Acc) and the extracted element (X) are -%% aliased. +%% Check that the Acc tuple is unique on entry, but that the elements +%% are aliased. aliasing_after_tuple_extract(0, Acc) -> %ssa% (_,Acc) when post_ssa_opt -> -%ssa% X = get_tuple_element(Acc, 0) {aliased => [Acc]}, -%ssa% _ = bs_create_bin(_,_,X,...) {aliased => [X]}. +%ssa% X = get_tuple_element(Acc, 0) {unique => [Acc]}, +%ssa% Bin = bs_create_bin(_,_,X,...) {aliased => [X]}, +%ssa% Tuple = put_tuple(Bin, Acc) {aliased => [Bin], unique => [Acc]}. Acc; aliasing_after_tuple_extract(N, Acc) -> {X,_} = Acc, aliasing_after_tuple_extract(N - 1, {<>, Acc}). -%% Check that both the pair (Acc) and the extracted element (X) are -%% aliased. +%% Check that the pair (Acc) is unique on entry but that its contents +%% are alised. alias_after_pair_hd(N) -> alias_after_pair_hd(N, [<<>>|dummy]). @@ -840,13 +848,14 @@ alias_after_pair_hd(0, Acc) -> Acc; alias_after_pair_hd(N, Acc) -> %ssa% (_,Acc) when post_ssa_opt -> -%ssa% X = get_hd(Acc) {aliased => [Acc]}, -%ssa% _ = bs_create_bin(_,_,X,...) {aliased => [X]}. +%ssa% X = get_hd(Acc) {unique => [Acc]}, +%ssa% Bin = bs_create_bin(_,_,X,...) {aliased => [X]}, +%ssa% Tuple = put_list(Bin, Acc) {aliased => [Bin], unique => [Acc]}. [X|_] = Acc, alias_after_pair_hd(N - 1, [<>|Acc]). -%% Check that both the pair (Acc) and the extracted element (X) are -%% aliased. +%% Check that the pair (Acc) is unique on entry but that its contents +%% are alised. alias_after_pair_tl(N) -> alias_after_pair_tl(N, [dummy|<<>>]). @@ -854,8 +863,9 @@ alias_after_pair_tl(0, Acc) -> Acc; alias_after_pair_tl(N, Acc) -> %ssa% (_,Acc) when post_ssa_opt -> -%ssa% X = get_tl(Acc) {aliased => [Acc]}, -%ssa% _ = bs_create_bin(_,_,X,...) {aliased => [X]}. +%ssa% X = get_tl(Acc) {unique => [Acc]}, +%ssa% Bin = bs_create_bin(_,_,X,...) {aliased => [X]}, +%ssa% Tuple = put_list(Acc, Bin) {aliased => [Bin], unique => [Acc]}. [_|X] = Acc, alias_after_pair_tl(N - 1, [Acc|<>]). @@ -1069,7 +1079,7 @@ update_record0() -> update_record0([Val|Ls], Acc=#r0{not_aliased=N}) -> %ssa% (_, Rec) when post_ssa_opt -> -%ssa% _ = update_record(reuse, 3, Rec, 3, A, 2, NA) {unique => [Rec, NA], aliased => [A]}. +%ssa% _ = update_record(copy, 3, Rec, 3, A, 2, NA) {unique => [Rec, NA], aliased => [A]}. R = Acc#r0{not_aliased=N+1,aliased=Val}, update_record0(Ls, R); update_record0([], Acc) -> @@ -1082,7 +1092,7 @@ update_record1() -> update_record1([Val|Ls], Acc=#r1{not_aliased0=N0,not_aliased1=N1}) -> %ssa% (_, Rec) when post_ssa_opt -> -%ssa% _ = update_record(reuse, 3, Rec, 3, NA0, 2, NA1) {unique => [Rec, NA1, NA0], source_dies => true}. +%ssa% _ = update_record(copy, 3, Rec, 3, NA0, 2, NA1) {unique => [Rec, NA1, NA0], source_dies => true}. R = Acc#r1{not_aliased0=N0+1,not_aliased1=[Val|N1]}, update_record1(Ls, R); update_record1([], Acc) -> @@ -1180,3 +1190,58 @@ gh9014_wibble(State) -> gh9014_main() -> {counter, 1} = gh9014_wibble({state, {counter, 0}}). + + +%% Check that the alias analysis handles a chain of extracts from +%% tuples. +nested_tuple_inner() -> + {{{{<<>>, e:x()}}}}. + +nested_tuple() -> +%ssa% () when post_ssa_opt -> +%ssa% U = bs_create_bin(append, _, T, ...) { unique => [T] }, +%ssa% R = put_tuple(U, A) { aliased => [A], unique => [U] }, +%ssa% ret(R). + {{{{Z,X}}}} = nested_tuple_inner(), + {<>,X}. + +%% Check that the alias analysis handles a chain of extracts from +%% pairs. +nested_cons_inner() -> + [[[[<<>>, e:x()]]]]. + +nested_cons() -> +%ssa% () when post_ssa_opt -> +%ssa% U = bs_create_bin(append, _, T, ...) { unique => [T] }, +%ssa% R = put_tuple(U, A) { aliased => [A], unique => [U] }, +%ssa% ret(R). + [[[[Z,X]]]] = nested_cons_inner(), + {<>,X}. + +nested_mixed_inner() -> + [{[{<<>>, e:x()}]}]. + +nested_mixed() -> +%ssa% () when post_ssa_opt -> +%ssa% U = bs_create_bin(append, _, T, ...) { unique => [T] }, +%ssa% R = put_tuple(U, A) { aliased => [A], unique => [U] }, +%ssa% ret(R). + [{[{Z,X}]}] = nested_mixed_inner(), + {<>,X}. + +%% +%% Check that the analysis can see through embed-extract chains. +%% +-record(see_through, {a,b}). + +see_through() -> + [R] = see_through0(), + see_through1(R). + +see_through1({_,R}) -> +%ssa% (_) when post_ssa_opt -> +%ssa% _ = update_record(reuse, 3, Rec, _, _) {unique => [Rec], source_dies => true}. + R#see_through{a=e:f()}. + +see_through0() -> + [{foo, #see_through{a={bar, [foo]}}}]. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/no_info0.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/no_info0.erl new file mode 100644 index 000000000000..53b3b25344c1 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/no_info0.erl @@ -0,0 +1,60 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% Extracts from beam_clean.erl to test cases when special handling of +%% the no_info sharing state is required for correct functioning. +%% +-module(no_info0). +-moduledoc false. + +-export([clean_labels/1]). + +-import(lists, [reverse/1]). + +-type label() :: beam_asm:label(). + +-record(st, {lmap :: [{label(),label()}], %Translation tables for labels. + entry :: beam_asm:label(), %Number of entry label. + lc :: non_neg_integer() %Label counter + }). + +clean_labels(Fs0) -> + St0 = #st{lmap=[],entry=1,lc=1}, + function_renumber(Fs0, St0, []). + +function_renumber([{function,Name,Arity,_Entry,Asm0}|Fs], St0, Acc) -> + {Asm,St} = renumber_labels(Asm0, [], St0), + function_renumber(Fs, St, [{function,Name,Arity,St#st.entry,Asm}|Acc]); +function_renumber([], St, Acc) -> {Acc,St}. + +renumber_labels([{label,Old}|Is], [{label,New}|_]=Acc, #st{lmap=D0}=St) -> +%ssa% (_, _, Rec) when post_ssa_opt -> +%ssa% _ = update_record(inplace, 4, Rec, ...), +%ssa% _ = update_record(inplace, 4, Rec, ...), +%ssa% _ = update_record(inplace, 4, Rec, ...). + D = [{Old,New}|D0], + renumber_labels(Is, Acc, St#st{lmap=D}); +renumber_labels([{label,Old}|Is], Acc, St0) -> + New = St0#st.lc, + D = [{Old,New}|St0#st.lmap], + renumber_labels(Is, [{label,New}|Acc], St0#st{lmap=D,lc=New+1}); +renumber_labels([{func_info,_,_,_}=Fi|Is], Acc, St0) -> + renumber_labels(Is, [Fi|Acc], St0#st{entry=St0#st.lc}); +renumber_labels([I|Is], Acc, St0) -> + renumber_labels(Is, [I|Acc], St0); +renumber_labels([], Acc, St) -> {Acc,St}. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/no_reuse_hint.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/no_reuse_hint.erl new file mode 100644 index 000000000000..c04c63e4567e --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/no_reuse_hint.erl @@ -0,0 +1,102 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% This module tests the ssa_opt_no_reuse compiler pass. The test +%% strategy is to ensure 100% coverage of the pass and to check for +%% correct functioning for each of the different categories of +%% operations inhibiting reuse: phis, known bifs, functions and +%% instructions. +%% + +-module(no_reuse_hint). + +-export([coverage0/0, + inhibit_by_known_bif/2, + inhibit_by_known_fun/1, + inhibit_by_known_op/2, + inhibit_by_map/4, + inhibit_by_map_key/2, + inhibit_by_map_value/2, + inhibit_by_phi/1]). + +inhibit_by_known_bif({_}=X, Y) -> +%ssa% (X, Y) when post_ssa_opt -> +%ssa% Bif = bif:'+'(...), +%ssa% R = update_record(copy, 1, X, 1, Bif), +%ssa% ret(R). + setelement(1, X, Y + 1). + +inhibit_by_known_fun(X) -> + case X of + {_} -> +%ssa% (X) when post_ssa_opt -> +%ssa% KnownFun = call(fun erlang:'++'/2, ...), +%ssa% R = update_record(copy, 1, X, 1, KnownFun), +%ssa% ret(R). + setelement(1, X, e:f() ++ e:f()) + end. + +inhibit_by_known_op({_, _}=X, Y) -> +%ssa% (X, Y) when post_ssa_opt -> +%ssa% Op = put_tuple(...), +%ssa% R = update_record(copy, 2, X, 1, Op), +%ssa% ret(R). + setelement(1, X, {Y}). + +inhibit_by_map(A, B, C, {_}=D) -> +%ssa% (A, B, C, D) when post_ssa_opt -> +%ssa% Map1 = put_map(_, C, B, _), +%ssa% Map = put_map(_, Map1, A, _), +%ssa% R = update_record(copy, 1, D, 1, Map), +%ssa% ret(R). + setelement(1, D, C#{B => {e:f()}, A => e:f()}). + +inhibit_by_map_key({Y0}=Z, K) -> +%ssa% (X, Y) when post_ssa_opt -> +%ssa% Key = put_tuple(...), +%ssa% Map = put_map(_, _, Key, value), +%ssa% R = update_record(copy, 1, Z, 1, Map), +%ssa% ret(R). + Y = Y0#{{K} => value}, + setelement(1, Z, Y). + +inhibit_by_map_value(X, {Y}=Z) -> +%ssa% (X, Y) when post_ssa_opt -> +%ssa% T = put_tuple(...), +%ssa% Map = put_map(_, _, key, T), +%ssa% R = update_record(copy, 1, Z, 1, Map), +%ssa% ret(R). + M = Y#{key => {X}}, + setelement(1, Z, M). + +inhibit_by_phi({_}=X) -> +%ssa% (X) when post_ssa_opt -> +%ssa% Phi = phi(...), +%ssa% R = update_record(copy, 1, X, 1, Phi), +%ssa% ret(R). + Y = case e:f() of + a -> {e:f(), 1}; + b -> {e:f(), 2} + end, + setelement(1, X, Y). + +%% +%% Ensure full coverage of the functions in the ssa_opt_no_reuse pass. +%% +coverage0() -> + erlang:send_after(500, self(), fun() -> ok end). diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/no_type_info.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/no_type_info.erl new file mode 100644 index 000000000000..22505ee8eda6 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/no_type_info.erl @@ -0,0 +1,51 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% This module tests functions which have previously crashed the +%% compiler when the `no_type_opt` option was used. +%% + +-module(no_type_info). +-export([bug/0]). + +-compile(no_type_opt). + +bug() -> +%ssa% () when post_ssa_opt -> +%ssa% X = bif:hd(L) { unique => [L] }, +%ssa% _ = succeeded:body(X) { aliased => [X] }. + begin + + <<42 || + $s <- + try + something + catch + error:false -> + [] + end + >> + end:(hd(not girl))( + try home of + _ when 34 -> + 8 + catch + _:_ -> + whatever + after + ok + end). diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/non_throwing_bifs.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/non_throwing_bifs.erl new file mode 100644 index 000000000000..571a7b1972c6 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/non_throwing_bifs.erl @@ -0,0 +1,48 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% This module tests functions which have previously crashed the +%% compiler when the `no_type_opt` option was used. +%% + +-module(non_throwing_bifs). +-export([try_bif1/1, try_bif2/2, try_bif3/1]). + +try_bif1(B) -> +%ssa% () when post_ssa_opt -> +%ssa% X = bif:binary_to_atom(B), +%ssa% _ = succeeded:guard(X). + try binary_to_atom(B) + catch _:_ -> [] + end. + +try_bif2(A, B) -> +%ssa% () when post_ssa_opt -> +%ssa% X = bif:binary_to_atom(A, B), +%ssa% _ = succeeded:guard(X). + try binary_to_atom(A, B) + catch _:_ -> [] + end. + +try_bif3(A) -> +%ssa% () when post_ssa_opt -> +%ssa% X = erlang:float_to_list(A), +%ssa% _ = succeeded:body(X). + try float_to_list(A) + catch _:_ -> [] + end. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/phis.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/phis.erl new file mode 100644 index 000000000000..cff2b64338e2 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/phis.erl @@ -0,0 +1,57 @@ +%% Extracted from lib/syntax_tools/src/erl_recomment.erl to test +%% omissions in handling of Phi instructions. + +%% ===================================================================== +%% Licensed under the Apache License, Version 2.0 (the "License"); you may +%% not use this file except in compliance with the License. You may obtain +%% a copy of the License at +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% Alternatively, you may use this file under the terms of the GNU Lesser +%% General Public License (the "LGPL") as published by the Free Software +%% Foundation; either version 2.1, or (at your option) any later version. +%% If you wish to allow use of your version of this file only under the +%% terms of the LGPL, you should delete the provisions above and replace +%% them with the notice and other provisions required by the LGPL; see +%% . If you do not delete the provisions +%% above, a recipient may use your version of this file under the terms of +%% either the Apache License or the LGPL. +%% +%% @copyright 1997-2006 Richard Carlsson +%% @author Richard Carlsson +%% @end +%% ===================================================================== + +-module(phis). + +-export([filter_forms/1]). + +-record(filter, {file = undefined :: file:filename() | 'undefined', + line = 0 :: integer()}). + +filter_forms(Fs) -> + filter_forms(Fs, #filter{}). + +filter_forms([{A1, A2} | Fs], S) -> +%ssa% (_, Rec0) when post_ssa_opt -> +%ssa% Rec = update_record(inplace, 3, Rec0, ...), +%ssa% Phi = phi({Rec0, _}, {Rec, _}), +%ssa% _ = update_record(inplace, 3, Phi, ...). + S1 = case ex:f() of + undefined -> + S#filter{file = A1, line = A2}; + _ -> + S + end, + if S1#filter.file =:= A1 -> + filter_forms(Fs, S1#filter{line = A2}); + true -> + filter_forms(Fs, S1) + end; +filter_forms([], _) -> + []. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/private_append.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/private_append.erl index 40baae83b856..6c36fd429d3e 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/private_append.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/private_append.erl @@ -59,6 +59,7 @@ transformable32/0, transformable32/1, transformable33/0, + transformable34/0, not_transformable1/2, not_transformable2/1, diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/sanity_checks.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/sanity_checks.erl index a47665597916..9624f6000940 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/sanity_checks.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/sanity_checks.erl @@ -37,7 +37,8 @@ t35/1, t36/0, t37/0, t38/0, t39/1, t40/0, t41/0, t42/0, t43/0, t44/0, - check_env/0]). + check_env/0, + check_succeeded/1]). %% Check that we do not trigger on the wrong pass check_wrong_pass() -> @@ -339,3 +340,11 @@ check_env() -> A = <<>>, B = ex:f(), <>. + +%% Check that succeeded-instructions can be matched. +check_succeeded(L) -> +%ssa% (L) when post_ssa_opt -> +%ssa% X = bif:hd(L), +%ssa% Y = succeeded:body(X), +%ssa% ret(X). + hd(L). diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/ss_depth_limit.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/ss_depth_limit.erl index ec91b57f26fa..c0c714523890 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/ss_depth_limit.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/ss_depth_limit.erl @@ -16,18 +16,21 @@ do(N) -> "-export([f/0]).\n\n", "f() ->\n", "%ssa% fail () when post_ssa_opt ->\n" - "%ssa% ret(X) { unique => [X] }.\n" + "%ssa% ret(Y) { aliased => [Y] }.\n" + " Y = e:f(),\n", " X0 = e:f(),\n", [io_lib:format(" X~p = {X~p,e:f()},~n", [X, X-1]) || X<- lists:seq(1, N)], - io_lib:format(" X~p.~n", [N]) + io_lib:format(" e:f(X~p),~n", [N]), + " Y.\n" ], file:write_file("ss_depth_limit.erl", Data). -endif. f() -> %ssa% fail () when post_ssa_opt -> -%ssa% ret(X) { unique => [X] }. +%ssa% ret(Y) { aliased => [Y] }. + Y = e:f(), X0 = e:f(), X1 = {X0,e:f()}, X2 = {X1,e:f()}, @@ -60,4 +63,5 @@ f() -> X29 = {X28,e:f()}, X30 = {X29,e:f()}, X31 = {X30,e:f()}, - X31. + e:f(X31), + Y. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort0.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort0.erl index 4fbbd7aadb96..1fef906dca89 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort0.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort0.erl @@ -31,6 +31,6 @@ f() -> g([A]) -> g(A); g(#rec{} = A) -> -%ssa% xfail (_) when post_ssa_opt -> +%ssa% (_) when post_ssa_opt -> %ssa% _ = update_record(inplace, 3, ...). A#rec{ a = a }. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort1.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort1.erl index f92c0c43d6f3..b4e528985793 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort1.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort1.erl @@ -29,7 +29,7 @@ f() -> g({#rec{}}). g({A}) -> -%ssa% xfail (_) when post_ssa_opt -> +%ssa% (_) when post_ssa_opt -> %ssa% _ = update_record(inplace, 3, ...). g(A); g(#rec{} = A) -> diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort2.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort2.erl new file mode 100644 index 000000000000..cdaaf1ada885 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort2.erl @@ -0,0 +1,44 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% Check that the compiler doesn't enter an infinite loop while trying +%% to run the destructive update pass. +%% +-module(tuple_inplace_abort2). + +-export([f0/0,f1/0,f2/0]). + +-record(rec, {a, b = ext:ernal()}). + +f0() -> + g([#rec{}]). + +f1() -> + g({#rec{}}). + +f2() -> + g([[{#rec{}}]]). + +g([A]) -> + g(A); +g({A}) -> + g(A); +g(#rec{} = A) -> +%ssa% (_) when post_ssa_opt -> +%ssa% _ = update_record(reuse, 3, ...). + A#rec{ a = a }. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort3.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort3.erl new file mode 100644 index 000000000000..59817a4a65f4 --- /dev/null +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_abort3.erl @@ -0,0 +1,49 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +%% Check that the compiler doesn't enter an infinite loop while trying +%% to run the destructive update pass. +%% +-module(tuple_inplace_abort3). + +-export([f0/0,f1/0,f2/0,f3/0]). + +-record(rec, {a, b = ext:ernal()}). + +f0() -> + g([#rec{}]). + +f1() -> + g({#rec{}}). + +f2() -> + g([[{#rec{}}]]). + +f3() -> + g([[[#rec{}]]]). + +g({A}) -> + g(A); +g([[A]]) -> + g(A); +g([A]) -> + g(A); +g(#rec{} = A) -> +%ssa% (_) when post_ssa_opt -> +%ssa% _ = update_record(reuse, 3, ...). + A#rec{ a = a }. diff --git a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_checks.erl b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_checks.erl index 640da51d64ea..61e551b10806 100644 --- a/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_checks.erl +++ b/lib/compiler/test/beam_ssa_check_SUITE_data/tuple_inplace_checks.erl @@ -22,7 +22,7 @@ -export([do0a/0, do0b/2, different_sizes/2, ambiguous_inits/1, update_record0/0, fc/0, track_update_record/1, - gh8124_a/0, gh8124_b/0, + gh8124_a/0, gh8124_b/0, tuple_set_a/1, tuple_set_b/0, failure_to_patch_list/0]). -record(r, {a=0,b=0,c=0,tot=0}). @@ -238,6 +238,33 @@ gh8124_b() -> R#r{a = <<"value 2">>}. +%% Example which provides a get_tuple_element instruction with a tuple +%% typed as a tuple set. +tuple_set_a(Something) -> + case ex:f() of + a -> + {ok, + {key_a, Something}}; + b -> + {error, {override_include}} + end. + +tuple_set_b() -> +%ssa% () when post_ssa_opt -> +%ssa% _ = update_record(inplace, 2, _, ...). + case tuple_set_a(ex:f()) of + {ok, A} -> + case e:f() of + {} -> + case A of + {key_a, _} -> + setelement(1, A, aa) + end + end; + {error,_} -> + bad + end. + %% Check that the list of tuples is built on the heap. failure_to_patch_list() -> diff --git a/lib/compiler/test/beam_validator_SUITE.erl b/lib/compiler/test/beam_validator_SUITE.erl index d653a460858d..c986f66920ee 100644 --- a/lib/compiler/test/beam_validator_SUITE.erl +++ b/lib/compiler/test/beam_validator_SUITE.erl @@ -24,7 +24,7 @@ init_per_testcase/2,end_per_testcase/2, compiler_bug/1,stupid_but_valid/1, xrange/1,yrange/1,stack/1,call_last/1,merge_undefined/1, - uninit/1,unsafe_catch/1, + uninit/1, dead_code/1, overwrite_catchtag/1,overwrite_trytag/1,accessing_tags/1,bad_catch_try/1, cons_guard/1, @@ -65,7 +65,7 @@ groups() -> [{p,test_lib:parallel(), [compiler_bug,stupid_but_valid,xrange, yrange,stack,call_last,merge_undefined,uninit, - unsafe_catch,dead_code, + dead_code, overwrite_catchtag,overwrite_trytag,accessing_tags, bad_catch_try,cons_guard,freg_range,freg_uninit, bad_bin_match,bad_dsetel, @@ -209,15 +209,6 @@ uninit(Config) when is_list(Config) -> {unassigned,{y,0}}}}] = Errors, ok. -unsafe_catch(Config) when is_list(Config) -> - Errors = do_val(unsafe_catch, Config), - [{{t,small,2}, - {{bs_put_integer,{f,0},{integer,16},1, - {field_flags,[unsigned,big]},{y,0}}, - 21, - {unassigned,{y,0}}}}] = Errors, - ok. - dead_code(Config) when is_list(Config) -> [] = do_val(dead_code, Config), ok. diff --git a/lib/compiler/test/beam_validator_SUITE_data/unsafe_catch.S b/lib/compiler/test/beam_validator_SUITE_data/unsafe_catch.S deleted file mode 100644 index 81f035c6c8f6..000000000000 --- a/lib/compiler/test/beam_validator_SUITE_data/unsafe_catch.S +++ /dev/null @@ -1,68 +0,0 @@ -{module, unsafe_catch}. %% version = 0 - -{exports, [{small,2}]}. - -{attributes, []}. - -{labels, 14}. - - -{function, small, 2, 5}. - {label,4}. - {func_info,{atom,t},{atom,small},2}. - {label,5}. - {allocate,2,2}. - {init_yregs,{list,[{y,0},{y,1}]}}. - {'catch',{y,1},{f,6}}. - {bs_init2,{f,0},1,0,2,{field_flags,[]},{x,2}}. - {bs_put_integer,{f,0}, - {integer,8}, - 1, - {field_flags,[unsigned,big]}, - {x,0}}. - {move,{x,1},{y,0}}. - {move,{x,2},{x,0}}. - {label,6}. - {catch_end,{y,1}}. - {test,is_tuple,{f,7},[{x,0}]}. - {test,test_arity,{f,7},[{x,0},2]}. - {get_tuple_element,{x,0},0,{x,1}}. - {test,is_eq_exact,{f,7},[{x,1},{atom,'EXIT'}]}. - {bs_init2,{f,0},0,0,0,{field_flags,[]},{x,0}}. - {label,7}. - {'catch',{y,1},{f,8}}. - {bs_init2,{f,0},2,0,1,{field_flags,[]},{x,1}}. - {bs_put_integer,{f,0}, - {integer,16}, - 1, - {field_flags,[unsigned,big]}, - {y,0}}. - {move,{x,0},{y,0}}. - {move,{x,1},{x,0}}. - {label,8}. - {catch_end,{y,1}}. - {test,is_tuple,{f,9},[{x,0}]}. - {test,test_arity,{f,9},[{x,0},2]}. - {get_tuple_element,{x,0},0,{x,1}}. - {test,is_eq_exact,{f,9},[{x,1},{atom,'EXIT'}]}. - {bs_init2,{f,0},0,0,0,{field_flags,[]},{x,0}}. - {label,9}. - {move,{integer,0},{x,1}}. - {bif,size,{f,0},[{x,0}],{x,2}}. - {bs_add,{f,0},[{x,1},{x,2},1],{x,1}}. - {bif,size,{f,0},[{y,0}],{x,2}}. - {bs_add,{f,0},[{x,1},{x,2},1],{x,1}}. - {bs_init2,{f,0},{x,1},0,2,{field_flags,[]},{x,1}}. - {bs_put_binary,{f,0}, - {atom,all}, - 8, - {field_flags,[unsigned,big]}, - {y,0}}. - {bs_put_binary,{f,0}, - {atom,all}, - 8, - {field_flags,[unsigned,big]}, - {x,0}}. - {move,{x,1},{x,0}}. - {deallocate,2}. - return. diff --git a/lib/compiler/test/bif_SUITE.erl b/lib/compiler/test/bif_SUITE.erl index 41afebcfdf56..24cc12d7cf11 100644 --- a/lib/compiler/test/bif_SUITE.erl +++ b/lib/compiler/test/bif_SUITE.erl @@ -27,7 +27,8 @@ beam_validator/1,trunc_and_friends/1,cover_safe_and_pure_bifs/1, cover_trim/1, head_tail/1, - min_max/1]). + min_max/1, + non_throwing/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -43,7 +44,8 @@ groups() -> cover_safe_and_pure_bifs, cover_trim, head_tail, - min_max + min_max, + non_throwing ]}]. init_per_suite(Config) -> @@ -292,6 +294,24 @@ int_clamped_add(A) when is_integer(A) -> num_clamped_add(A) -> min(max(A, 0), 10) + 100. +non_throwing(_Config) -> + a = try binary_to_atom(<<"a">>) + catch _:_ -> [] + end, + l = try list_to_existing_atom([108]) + catch _:_ -> [] + end, + [] = try list_to_existing_atom([a]) + catch _:_ -> [] + end, + 'Erlang' = try binary_to_atom(<<"Erlang">>, unicode) + catch _:_ -> [] + end, + [] = try binary_to_existing_atom(a, unicode) + catch _:_ -> [] + end, + ok. + %%% %%% Common utilities. %%% diff --git a/lib/compiler/test/bs_bincomp_SUITE.erl b/lib/compiler/test/bs_bincomp_SUITE.erl index 4e4813eec263..8b4573b1979c 100644 --- a/lib/compiler/test/bs_bincomp_SUITE.erl +++ b/lib/compiler/test/bs_bincomp_SUITE.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 2006-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,7 +14,7 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% %% %% Originally based on Per Gustafsson's test suite. @@ -22,14 +22,14 @@ -module(bs_bincomp_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, verify_highest_opcode/1, byte_aligned/1,bit_aligned/1,extended_byte_aligned/1, extended_bit_aligned/1,mixed/1,filters/1,trim_coverage/1, nomatch/1,sizes/1,general_expressions/1, no_generator/1,zero_pattern/1,multiple_segments/1, - grab_bag/1,float_skip/1]). + grab_bag/1, strict_generators/1, float_skip/1]). -include_lib("common_test/include/ct.hrl"). @@ -41,7 +41,7 @@ all() -> extended_bit_aligned, mixed, filters, trim_coverage, nomatch, sizes, general_expressions, no_generator, zero_pattern, multiple_segments, - grab_bag, float_skip]. + grab_bag, strict_generators, float_skip]. groups() -> []. @@ -61,15 +61,7 @@ end_per_group(_GroupName, Config) -> verify_highest_opcode(_Config) -> case ?MODULE of - bs_construct_r24_SUITE -> - {ok,Beam} = file:read_file(code:which(?MODULE)), - case test_lib:highest_opcode(Beam) of - Highest when Highest =< 176 -> - ok; - TooHigh -> - ct:fail({too_high_opcode,TooHigh}) - end; - bs_construct_r25_SUITE -> + bs_bincomp_r25_SUITE -> {ok,Beam} = file:read_file(code:which(?MODULE)), case test_lib:highest_opcode(Beam) of Highest when Highest =< 180 -> @@ -330,7 +322,7 @@ trim_coverage(Config) when is_list(Config) -> <<0,0,0,2,0,0,5,48,0,11,219,174,0,0,0,0>> = coverage_materialiv(a, b, {1328,777134}), <<67,40,0,0,66,152,0,0,69,66,64,0>> = coverage_trimmer([42,19,777]), <<0,0,2,43,0,0,3,9,0,0,0,3,64,8,0,0,0,0,0,0, - 64,68,0,0,0,0,0,0,192,171,198,0,0,0,0,0>> = + 64,68,0,0,0,0,0,0,192,171,198,0,0,0,0,0>> = coverage_lightfv(555, 777, {3.0,40.0,-3555.0}), <<"abcabc">> = coverage_strange(0, <<"abc">>), ok. @@ -671,12 +663,45 @@ grab_bag(_Config) -> %% Cover a line v3_kernel:get_line/1. _ = catch << ok || <<>> <= ok, ok >>, + [] = grab_bag_gh_8617(<<>>), + [0] = grab_bag_gh_8617(<<1:1>>), + [0,0,0] = grab_bag_gh_8617(<<0:3>>), + ok. grab_bag_gh_6553(<>) -> %% Would crash in beam_ssa_pre_codegen. <> = <<_>>) = <<>>)>>. +grab_bag_gh_8617(Bin) -> + %% GH-8617: CSE would cause a call self/0 to be inserted in + %% the middle of a sequence of `bs_match` instructions, causing + %% unsafe matching code to be emitted. + [0 || <<_:0, _:(tuple_size({self()}))>> <= Bin, + is_pid(id(self()))]. + +strict_generators(_Config) -> + %% Basic strict generators (each generator type) + <<2,3,4>> = << <<(X+1)>> || X <:- [1,2,3]>>, + <<2,3,4>> = << <<(X+1)>> || <> <:= <<1,2,3>> >>, + <<2,12>> = << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4} >>, + + %% A failing guard following a strict generator is ok + <<3,4>> = << <<(X+1)>> || X <:- [1,2,3], X > 1>>, + <<3,4>> = << <<(X+1)>> || <> <:= <<1,2,3>>, X > 1 >>, + <<12>> = << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4}, X > 1 >>, + + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch << <> || {ok, X} <:- [{ok,1},2,{ok,3}] >>), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch << <> || <<0:1, X:7>> <:= <<1,128,2>> >>), + {'EXIT',{{badmatch,{2,error}},_}} = (catch << <> || X := ok <:- #{1 => ok, 2 => error, 3 => ok} >>), + + %% Extra bits cannot be skipped at the end of the binary either + {'EXIT',{{badmatch,<<0:2>>},_}} = (catch [X || <> <:= <<0>>]), + {'EXIT',{{badmatch,<<9,2>>},_}} = (catch [Y || <> <:= <<8,1,9,2>>]), + + ok. + cs_init() -> erts_debug:set_internal_state(available_internal_state, true), ok. @@ -700,8 +725,6 @@ cs(Bin) -> ok; bs_bincomp_post_opt_SUITE -> ok; - bs_bincomp_r24_SUITE -> - ok; bs_bincomp_r25_SUITE -> ok; bs_bincomp_r26_SUITE -> @@ -716,7 +739,7 @@ cs(Bin) -> %% Verify that the allocated size of the binary is the default size. cs_default(Bin) -> ByteSize = byte_size(Bin), - {refc_binary,ByteSize,{binary,256},_} = + {refc_binary,ByteSize,{binary,256},_} = erts_debug:get_internal_state({binary_info,Bin}), Bin. diff --git a/lib/compiler/test/bs_construct_SUITE.erl b/lib/compiler/test/bs_construct_SUITE.erl index f24074193726..58536c4d23ff 100644 --- a/lib/compiler/test/bs_construct_SUITE.erl +++ b/lib/compiler/test/bs_construct_SUITE.erl @@ -72,14 +72,6 @@ end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> verify_highest_opcode(_Config) -> case ?MODULE of - bs_construct_r24_SUITE -> - {ok,Beam} = file:read_file(code:which(?MODULE)), - case test_lib:highest_opcode(Beam) of - Highest when Highest =< 176 -> - ok; - TooHigh -> - ct:fail({too_high_opcode,TooHigh}) - end; bs_construct_r25_SUITE -> {ok,Beam} = file:read_file(code:which(?MODULE)), case test_lib:highest_opcode(Beam) of diff --git a/lib/compiler/test/bs_utf_SUITE.erl b/lib/compiler/test/bs_utf_SUITE.erl index beb0f4ef23f5..af5bd9217b4e 100644 --- a/lib/compiler/test/bs_utf_SUITE.erl +++ b/lib/compiler/test/bs_utf_SUITE.erl @@ -55,14 +55,6 @@ end_per_group(_GroupName, Config) -> verify_highest_opcode(_Config) -> case ?MODULE of - bs_construct_r24_SUITE -> - {ok,Beam} = file:read_file(code:which(?MODULE)), - case test_lib:highest_opcode(Beam) of - Highest when Highest =< 176 -> - ok; - TooHigh -> - ct:fail({too_high_opcode,TooHigh}) - end; bs_construct_r25_SUITE -> {ok,Beam} = file:read_file(code:which(?MODULE)), case test_lib:highest_opcode(Beam) of diff --git a/lib/compiler/test/compile_SUITE.erl b/lib/compiler/test/compile_SUITE.erl index a8f57ea5d57c..0c2fcb358d1e 100644 --- a/lib/compiler/test/compile_SUITE.erl +++ b/lib/compiler/test/compile_SUITE.erl @@ -645,7 +645,7 @@ encrypted_abstr(Config) when is_list(Config) -> OldPath = code:get_path(), try NewPath = OldPath -- [filename:dirname(code:which(crypto))], - (catch crypto:stop()), + (catch application:stop(crypto)), code:delete(crypto), code:purge(crypto), code:set_path(NewPath), @@ -805,8 +805,8 @@ verify_abstract(Beam, Backend) -> has_crypto() -> try - crypto:start(), - crypto:stop(), + application:start(crypto), + application:stop(crypto), true catch error:_ -> false @@ -944,19 +944,31 @@ test_sloppy() -> Turtle. utf8_atoms(Config) when is_list(Config) -> + do_utf8_atom(binary_to_atom(<<"こんにちは"/utf8>>, utf8)), + + LongAtom = binary_to_atom(binary:copy(<<240,159,159,166>>, 255)), + do_utf8_atom(LongAtom), + + ok. + +do_utf8_atom(Atom) -> + Mod = ?FUNCTION_NAME, Anno = erl_anno:new(1), - Atom = binary_to_atom(<<"こんにちは"/utf8>>, utf8), - Forms = [{attribute,Anno,compile,[export_all]}, + Forms = [{attribute,Anno,module,Mod}, + {attribute,Anno,compile,[export_all]}, {function,Anno,atom,0,[{clause,Anno,[],[],[{atom,Anno,Atom}]}]}], - Utf8AtomForms = [{attribute,Anno,module,utf8_atom}|Forms], - {ok,utf8_atom,Utf8AtomBin} = - compile:forms(Utf8AtomForms, [binary]), - {ok,{utf8_atom,[{atoms,_}]}} = - beam_lib:chunks(Utf8AtomBin, [atoms]), - code:load_binary(utf8_atom, "compile_SUITE", Utf8AtomBin), - Atom = utf8_atom:atom(), + {ok,Mod,Utf8AtomBin} = compile:forms(Forms, [binary,report]), + {ok,{Mod,[{atoms,_}]}} = beam_lib:chunks(Utf8AtomBin, [atoms]), + + code:load_binary(Mod, "compile_SUITE", Utf8AtomBin), + + Atom = Mod:atom(), true = is_atom(Atom), + + true = code:delete(Mod), + false = code:purge(Mod), + ok. utf8_functions(Config) when is_list(Config) -> @@ -1708,43 +1720,36 @@ bc_options(Config) -> DataDir = proplists:get_value(data_dir, Config), - L = [{171, small_float, [no_line_info, - no_ssa_opt_float, - no_type_opt]}, - {171, small_float, [no_line_info]}, - {171, small_float, []}, - {171, small_float, [r24]}, - {171, small_float, [r25]}, + L = [{177, small_float, []}, - {172, small, [no_ssa_opt_record, + {177, small, [no_ssa_opt_record, no_ssa_opt_float, no_line_info, no_type_opt, no_bs_match]}, - {172, small, [r24]}, - {172, funs, [no_ssa_opt_record, - no_ssa_opt_float,no_line_info, - no_type_opt]}, - {172, funs, [no_ssa_opt_record, + {177, funs, [no_ssa_opt_record, + no_ssa_opt_float, no_line_info, no_stack_trimming, no_type_opt]}, - {172, funs, [r24]}, - {172, small_maps, [r24]}, - {172, small_maps, [no_type_opt]}, + {177, small_maps, [no_type_opt]}, - {172, big, [no_ssa_opt_record, + {177, big, [no_ssa_opt_record, no_ssa_opt_float, no_line_info, no_type_opt]}, - {172, big, [r24]}, {178, small, [r25]}, {178, big, [r25]}, {178, funs, []}, - {178, big, []} + {178, big, []}, + + {182, small, [r26]}, + {182, small, []}, + + {183, small, [line_coverage]} ], Test = fun({Expected,Mod,Options}) -> @@ -1810,7 +1815,6 @@ deterministic_paths_1(DataDir, Name, Opts) -> deterministic_docs(Config) when is_list(Config) -> DataDir = proplists:get_value(data_dir, Config), Filepath = filename:join(DataDir, "ssh"), - false = deterministic_docs_1(Filepath, [binary], 25), true = deterministic_docs_1(Filepath, [binary, deterministic], 25), ok. diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl index 291992d26c9b..76edcedd50d6 100644 --- a/lib/compiler/test/guard_SUITE.erl +++ b/lib/compiler/test/guard_SUITE.erl @@ -41,7 +41,8 @@ check_qlc_hrl/1,andalso_semi/1,t_tuple_size/1,binary_part/1, bad_constants/1,bad_guards/1, guard_in_catch/1,beam_bool_SUITE/1, - repeated_type_tests/1,use_after_branch/1]). + repeated_type_tests/1,use_after_branch/1, + body_in_guard/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -60,7 +61,7 @@ groups() -> basic_andalso_orelse,traverse_dcd, check_qlc_hrl,andalso_semi,t_tuple_size,binary_part, bad_constants,bad_guards,guard_in_catch,beam_bool_SUITE, - repeated_type_tests,use_after_branch]}, + repeated_type_tests,use_after_branch,body_in_guard]}, {slow,[],[literal_type_tests,generated_combinations]}]. init_per_suite(Config) -> @@ -3348,6 +3349,18 @@ use_after_branch_1(A) -> false -> {id(Boolean), gaffel} end. +%% GH-8733: Benign bug where {succeeded,body} was emitted in a guard context, +%% crashing the compiler when +no_bool_opt was specified. +body_in_guard(_Config) -> + Pid = self(), + Mon = monitor(process, Pid), + receive + {'DOWN', Mon, process, Pid, _} -> + ok + after 0 -> + demonitor(Mon) + end. + %% Call this function to turn off constant propagation. id(I) -> I. diff --git a/lib/compiler/test/lc_SUITE.erl b/lib/compiler/test/lc_SUITE.erl index 5de383f92800..ea7232856e69 100644 --- a/lib/compiler/test/lc_SUITE.erl +++ b/lib/compiler/test/lc_SUITE.erl @@ -101,6 +101,16 @@ basic(Config) when is_list(Config) -> %% Not matching. [] = [3 || {3=4} <- []], + %% Strict generators (each generator type) + [2,3,4] = [X+1 || X <:- [1,2,3]], + [2,3,4] = [X+1 || <> <:= <<1,2,3>>], + [2,12] = [X*Y || X := Y <:- #{1 => 2, 3 => 4}], + + %% A failing guard following a strict generator is ok + [3,4] = [X+1 || X <:- [1,2,3], X > 1], + [3,4] = [X+1 || <> <:= <<1,2,3>>, X > 1], + [12] = [X*Y || X := Y <:- #{1 => 2, 3 => 4}, X > 1], + %% Error cases. [] = [{xx,X} || X <- L0, element(2, X) == no_no_no], {'EXIT',_} = (catch [X || X <- L1, list_to_atom(X) == dum]), @@ -109,6 +119,11 @@ basic(Config) when is_list(Config) -> {'EXIT',{{bad_generator,x},_}} = (catch [E || E <- id(x)]), {'EXIT',{{bad_filter,not_bool},_}} = (catch [E || E <- [1,2], id(not_bool)]), + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch [X || {ok, X} <:- [{ok,1},2,{ok,3}]]), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch [X || <<0:1, X:7>> <:= <<1,128,2>>]), + {'EXIT',{{badmatch,{2,error}},_}} = (catch [X || X := ok <:- #{1 => ok, 2 => error, 3 => ok}]), + %% Make sure that line numbers point out the generator. case ?MODULE of lc_inline_SUITE -> @@ -173,7 +188,7 @@ no_generator(Config) when is_list(Config) -> [a,b,c] = [a || true] ++ [b,c], ok. -no_gen(A, B) -> +no_gen(A, B) -> [{A,B} || A+B =:= 0] ++ [{A,B} || A*B =:= 0] ++ [{A,B} || A rem B =:= 3] ++ diff --git a/lib/compiler/test/mc_SUITE.erl b/lib/compiler/test/mc_SUITE.erl index 9f2628255723..296e8e51723f 100644 --- a/lib/compiler/test/mc_SUITE.erl +++ b/lib/compiler/test/mc_SUITE.erl @@ -122,6 +122,21 @@ basic(_Config) -> N rem 2 =:= 1]), Odd = lists:sort([V || #foo{a=N} := V <- RecordMap, N rem 2 =:= 1]), + %% Strict generators (each generator type) + #{1 := 2, 2 := 3, 3 := 4} = #{X => X+1 || X <:- [1,2,3]}, + #{1 := 2, 2 := 3, 3 := 4} = #{X => X+1 || <> <:= <<1,2,3>>}, + #{2 := 4, 4 := 8} = #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}}, + + %% A failing guard following a strict generator is ok + #{2 := 3, 3 := 4} = #{X => X+1 || X <:- [1,2,3], X > 1}, + #{2 := 3, 3 := 4} = #{X => X+1 || <> <:= <<1,2,3>>, X > 1}, + #{4 := 8} = #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}, X > 1}, + + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch #{X => X+1 || {ok, X} <:- [{ok,1},2,{ok,3}]}), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch #{X => X+1 || <<0:1, X:7>> <:= <<1,128,2>>}), + {'EXIT',{{badmatch,{2,error}},_}} = (catch #{X => X+1 || X := ok <:-#{1 => ok, 2 => error, 3 => ok}}), + ok. mc_double(Size) -> diff --git a/lib/compiler/test/property_test/compile_prop.erl b/lib/compiler/test/property_test/compile_prop.erl index 5b0e6ef13c40..7f0f9d77eb9a 100644 --- a/lib/compiler/test/property_test/compile_prop.erl +++ b/lib/compiler/test/property_test/compile_prop.erl @@ -82,7 +82,6 @@ spawn_compile(Forms, Options) -> compiler_variants() -> [ [ssalint,clint0,clint], - [r24,ssalint], [r25,ssalint], [r26,ssalint], [no_type_opt,ssalint], diff --git a/lib/compiler/test/random_code_SUITE.erl b/lib/compiler/test/random_code_SUITE.erl index 2c242ba437c9..80f43e097008 100644 --- a/lib/compiler/test/random_code_SUITE.erl +++ b/lib/compiler/test/random_code_SUITE.erl @@ -58,8 +58,9 @@ compile(_Config) -> list_to_integer(NumTests0) end, - %% Conservatively assume that we can run 10 tests each second. - TimeTrap = {seconds,60_000 + (NumTests+99) div 100}, + %% Conservatively assume that we can run 10 tests each + %% second. + TimeTrap = {seconds, (60 + (NumTests+9) div 10)}, ct:timetrap(TimeTrap), io:format("~p tests\n", [NumTests]), true = proper:quickcheck(compile_prop:compile(), diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl index 284528714ff2..982f1f9cfe50 100644 --- a/lib/compiler/test/warnings_SUITE.erl +++ b/lib/compiler/test/warnings_SUITE.erl @@ -868,7 +868,77 @@ maps(Config) when is_list(Config) -> {{25,20},v3_core,{map_key_repeated,#{"a" => 1}}}, {{28,21},v3_core,{map_key_repeated,#{"a" => <<"b">>}}}, {{32,21},v3_core,{map_key_repeated,#{<<"a">> => 1}}} - ]}} + ]}}, + {map_nomatch, + ~""" + match_map_1(#{}) -> + a; + match_map_1(#{first := First}) -> + {b,First}; + match_map_1(#{first := First, second := Second}) -> + {c,First,Second}. + + match_map_1(#{}, A) -> + {a,A}; + match_map_1(#{first := First}, A) -> + {b,A,First}; + match_map_1(#{first := First, second := Second}, A) -> + {c,A,First,Second}. + + match_map_2(#{first := First}) -> + {b,First}; + match_map_2(#{first := First, second := Second}) -> + {c,First,Second}. + + match_map_2(#{first := First}, A, B) -> + {b,A,B,First}; + match_map_2(#{first := First, second := Second}, A, B) -> + {c,A,B,First,Second}. + + match_map_3([#{} | _]) -> + a; + match_map_3([#{first := First} | _]) -> + {b,First}; + match_map_3([#{first := First, second := Second} | _]) -> + {c,First,Second}. + + match_map_4([#{first := First} | _]) -> + {b,First}; + match_map_4([#{first := First, second := Second} | _]) -> + {c,First,Second}. + """, + [], + {warnings,[{{3,1},beam_core_to_ssa,{nomatch,{shadow,1}}}, + {{10,1},beam_core_to_ssa,{nomatch,{shadow,8}}}, + {{17,1},beam_core_to_ssa,{nomatch,{shadow,15}}}, + {{22,1},beam_core_to_ssa,{nomatch,{shadow,20}}}, + {{27,1},beam_core_to_ssa,{nomatch,{shadow,25}}}, + {{34,1},beam_core_to_ssa,{nomatch,{shadow,32}}}]}}, + {map_nowarn, + %% There will be no warnings for shadowing for the + %% following functions, either because the first clause + %% actually can be executed or because the compiler's + %% checks are not sufficiently thorough. + ~""" + %% The compiler does not detect this shadowing. + match_map_nowarn_1([#{}]) -> no; + match_map_nowarn_1([#{a := A}]) -> {a,A}. + + %% The guard in the first clause can fail. + match_map_nowarn_2(#{}, X) when is_integer(X) -> {a,X}; + match_map_nowarn_2(#{b := B}, X) -> {b,X,B}. + + %% The first clause will fail to match if the second + %% argument is not `x`. + match_map_nowarn_3(#{}, x) -> a; + match_map_nowarn_3(#{b := B}, y) -> {b,B}. + + %% The compiler does not detect this shadowing. + match_map_nowarn_4(#{}, x) -> a; + match_map_nowarn_4(#{b := B}, x) -> {b,B}. + """, + [], + []} ], run(Config, Ts), ok. diff --git a/lib/compiler/test/zlc_SUITE.erl b/lib/compiler/test/zlc_SUITE.erl new file mode 100644 index 000000000000..eb043d79a559 --- /dev/null +++ b/lib/compiler/test/zlc_SUITE.erl @@ -0,0 +1,452 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(zlc_SUITE). + +-export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1, + init_per_group/2,end_per_group/2, + init_per_testcase/2,end_per_testcase/2, + basic/1,mixed_zlc/1,zmc/1,filter_guard/1, + filter_pattern/1,cartesian/1,nomatch/1,bad_generators/1, + strict_list/1,strict_binary/1]). + +-include_lib("common_test/include/ct.hrl"). +-include_lib("stdlib/include/assert.hrl"). + +suite() -> + [{ct_hooks,[ts_install_cth]}, + {timetrap,{minutes,1}}]. + +all() -> + [{group,p}]. + +groups() -> + [{p,test_lib:parallel(), + [basic, + mixed_zlc, + zmc, + filter_guard, + filter_pattern, + cartesian, + nomatch, + bad_generators, + strict_list, + strict_binary + ]}]. + +init_per_suite(Config) -> + test_lib:recompile(?MODULE), + Config. + +end_per_suite(_Config) -> + ok. + +init_per_group(_GroupName, Config) -> + Config. + +end_per_group(_GroupName, Config) -> + Config. + + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + Config. + +end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + ok. + +basic(Config) when is_list(Config) -> + [6, 7, 8] = [X + Y + Z || X <- [1, 2, 3] && Y <- [2, 2, 2] && Z <- [3,3,3]], + [{1, 2, 3}, {2, 2, 3}, {3, 2, 3}] = + [{X, Y, Z} || X <- [1, 2, 3] && Y <- [2, 2, 2] && Z <- [3,3,3]], + [6, 24] = zipwith4(fun(A, B, C, D) -> (A + B + C) * D end, + [1, 5], [2, 2], [0, 1], [2, 3]), + 96 = dot([1, 2, 3, 4], [24, 12, 8, 6]), + + [1, 4, 5] = ifelse([true, false, true], [1, 3, 5], [2, 4, 6]), + + [8, 14, 20] = [X + Y + Z || <> <= <<5, 10, 15>> && <> <= <<1, 2, 3>> + && <> <= <<2, 2, 2>>]. + + +zipwith4(F, As, Bs, Cs, Ds) -> + [F(A,B,C,D) || A <- As && B <- Bs && C <- Cs && D <- Ds]. + +dot(Xs, Ys) -> + lists:sum([X*Y || X <- Xs && Y <- Ys]). + +ifelse(Tests, Xs, Ys) -> + %% Simulate R's ifelse(,,) + [case T of + true -> X; + false -> Y + end || T <- Tests && X <- Xs && Y <- Ys + ]. + +mixed_zlc(Config) when is_list(Config) -> + [{a, 2}, {b, 4}, {c, 6}] = [{X,Y} || X <- [a,b,c] && <> <= <<2,4,6>>], + [{a, 2}, {b, 4}, {c, 6}] = [{X,Y} || <> <= <<2,4,6>> && X <- [a,b,c]], + [{a,c,1,3}, {b,d,2,4}] = [{K1,K2,V1,V2}|| + K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + K2 := V2 <- maps:iterator(#{c=>3, d=>4}, ordered)], + [{a,1,2}, {b,2,4}] = + [{K1,V1,Y} || K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + <> <= <<2,4>>], + [{a,1,2}, {b,2,4}] = [{K1,V1,Y} || + K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + <> <= <<2,4>>], + <<3,4,5>> = << <<(X+Y)/integer>> || X <- [1,2,3] && Y <- [2,2,2]>>, + <<3,4,5>> = << <<(X+V1)/integer>> || + X <- [1,2,3] && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + <<3,4,5>> = << <<(X+V1)/integer>> || + <> <= <<1,2,3>> && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + <<3,4,5>> = << <<(V1+V2)/integer>> || + _K1 := V1 <- maps:iterator(#{a=>1, b=>2, c=>3}, ordered) && + _K2 := V2 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + #{c := 3,b := 2,a := 1} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3]}, + #{c := 3,b := 2,a := 1} = #{X => Y || X <- [a,b,c] && <> <= <<1,2,3>>}, + ok. + +zmc(Config) when is_list(Config) -> + [{a,b,1,3}] = [{K1, K2, V1, V2} || K1 := V1 <- #{a=>1} && K2 := V2 <- #{b=>3}], + Seq = lists:seq(1, 50), + M1 = maps:iterator(#{X=>X || X <- Seq}, ordered), + M2 = maps:iterator(#{X=>X || X <- lists:seq(1,50)}, ordered), + true = [A * 4 || A <- Seq] =:= + [X+Y+Z+W || X := Y <- M1 && Z := W <- M2], + true = << <<(A * 4):64>> || A <- Seq>> =:= + << <<(X+Y+Z+W):64>> || X := Y <- M1 && Z := W <- M2>>, + + M3 = maps:iterator(#{X=>X*3 || X <- Seq}, ordered), + M4 = maps:iterator(#{X*2=>X*4 || X <- Seq}, ordered), + true = [{A, A*3, A*2, A*4} || A <- Seq] =:= + [{X, Y, Z, W} || X := Y <- M3 && Z := W <- M4], + true = [A * 3 || A <- Seq] =:= [X+Y+Z || X := Y <- M1 && Z <- Seq], + true = << <> || A <- Seq>> =:= + << <> || X := Y <- M3 && Z := W <- M4>>, + true = << <<(A*3):64>> || A <- Seq>> =:= + << <<(X+Y+Z):64>> || X := Y <- M1 && Z <- Seq>>, + + M5 = maps:iterator(#{X => + case X rem 2 of + 0 -> {ok,X}; + 1 -> {error,X} + end || X <- Seq}, ordered), + M6 = maps:iterator(#{X*2 => X*4 || X <- Seq}, ordered), + [] = [X || {{X,{ok,X}}, {_,X}} <- lists:zip(maps:to_list(M5), maps:to_list(M6))], + [] = [X || X := {ok,X} <- M5 && _ := X <- M6], + [] = [X || X := {e,X} <- M5 && X := {ok,X} <- M5], + ok. + +filter_guard(Config) when is_list(Config) -> + [[1,2,1]] = [X++Y || X <- [[1,2], [2,-3]] && Y <- [[1], [2]], lists:sum(X)>0], + [{a,2}, {b,4}, {c,6}] = [{X,Y} || X <- [a,b,c] && <> <= <<2,4,6>>, + Y rem 2 == 0], + [{b,4}, {c,6}] = [{X, Y} || X <- [a,b,c] && <> <= <<2,4,6>>, Y =/= 2], + [] = [{X,Y} || X <- [a, b, c] && <> <= <<2,4,6>>, Y rem 2 == 1], + [{b,4}] = [{X,Y} || <> <= <<2,4,6>> && X <- [a,b,c], X>a, X1, b=>2}, ordered) && + K2 := V2 <- maps:iterator(#{c=>3, d=>4}, ordered), + V2 rem 2 == 0], + <<5>> = << <<(X+Y)/integer>> || X <- [1,2,3] && Y <- [2,2,2], X rem 2 == 1, X+Y>4>>, + #{c := 3,a := 1} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3], Y rem 2 == 1}, + #{c := 3} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3], Y rem 2 == 1, Y > 1}, + #{c := 3,a := 1} = #{X => Y || X <- [a,b,c] && <> <= <<1,2,3>>, Y rem 2 == 1}. + +filter_pattern(Config) when is_list(Config) -> + [] = do_filter_pat_1([], []), + [] = do_filter_pat_1([a], [a]), + [] = do_filter_pat_1([{ok,a}], [{error,e}]), + + [] = do_filter_pat_2([], []), + [] = do_filter_pat_2([a], [b]), + [] = do_filter_pat_2([{a,1}], [{b,1}]), + [{1,7}] = do_filter_pat_2([{a,1}], [{a,7}]), + [{1,7},{10,20}] = do_filter_pat_2([{a,1},{b,9},{x,10}], + [{a,7},{wrong,8},{x,20}]), + + ok. + +do_filter_pat_1(L1, L2) -> + Res = [{A,B} || {ok,A} <- L1 && {ok,B} <- L2], + Res = [{A,B} || {{ok,A},{ok,B}} <- lists:zip(L1,L2)], + Res. + +do_filter_pat_2(L1, L2) -> + Res = [{A,B} || {Same,A} <- L1 && {Same,B} <- L2], + Res = [{A,B} || {{Same,A},{Same,B}} <- lists:zip(L1,L2)], + Res. + +cartesian(Config) when is_list(Config) -> + [{a,3}, {b,5}, {c,7}, {a,4}, {b,6}, {c,8}] = + [{X, W+Y} || W <- [1,2], + X <- [a,b,c] && <> <= <<2,4,6>>], + [{a,3}, {a,4}, {b,5}, {b,6}, {c,7}, {c,8}] = + [{X, W+Y} || X <- [a,b,c] && + <> <= <<2,4,6>>, W <- [1,2]], + [{a,4}, {b,6}, {c,8}] = + [{X, W+Y} || X <- [a,b,c] && + <> <= <<2,4,6>>, W <- [1,2], (W + Y) rem 2 == 0], + <<4,2,5,3,6,4>> = << <<(X+V1+Y)/integer>> || + X <- [1,2,3] && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered), + <> <= <<1,-1>> >>, + ok. + +strict_list(Config) when is_list(Config) -> + Seq100 = lists:seq(1, 100), + + [2,3,4] = [X+Y || X <:- [1,2,3] && Y <- [1,1,1]], + [3,4] = [X+Y || X <:- [1,2,3] && Y <:- [1,1,1], X > 1], + + [] = strict_list_mixed_1([], []), + [11,22] = strict_list_mixed_1([{i,1},{i,2}], [{i,10},{i,20}]), + [13,25] = strict_list_mixed_1([{i,3},{i,4},{i,5}], [{i,10},bad,{i,20}]), + {'EXIT',{{bad_generators,{[bad,{i,5}],[{i,15},{i,20}]}},_}} = + catch strict_list_mixed_1([{i,3},bad,{i,5}], [{i,10},{i,15},{i,20}]), + {'EXIT',{{bad_generators,{[{i,5}],[]}},_}} = + catch strict_list_mixed_1([{i,3},{i,5}], [bad]), + + [] = strict_list_mixed_2([], #{}), + [15] = strict_list_mixed_2([{i,3}], #{{k,4} => {v,3}}), + [15] = strict_list_mixed_2([{i,0},{i,3}], #{{a,0} => {a,0}, + {k,4} => {v,3}}), + + ?assertEqual([I * 3*I + 7*I || I <- Seq100], + strict_list_mixed_2([{i,I} || I <- Seq100], + #{{k,3*I} => {v,7*I} || I <- Seq100})), + SimpleMap = #{{k,1} => {v,2}}, + {'EXIT',{{bad_generators,{[{a,3}],{{k,1},{v,2},none}}},_}} = + catch strict_list_mixed_2([{a,3}], SimpleMap), + {'EXIT',{{bad_generators,{[],{{k,1},{v,2},none}}},_}} = + catch strict_list_mixed_2([], SimpleMap), + + [] = strict_list_strict_1([], []), + [11,22] = strict_list_strict_1([{i,1},{i,2}], [{i,10},{i,20}]), + {'EXIT',{{bad_generators,{[bad,{i,5}],[{i,15},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},bad,{i,5}], [{i,10},{i,15},{i,20}]), + {'EXIT',{{bad_generators,{[{i,4},{i,5}],[{wrong_tag,7},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},{i,4},{i,5}], [{i,10},{wrong_tag,7},{i,20}]), + {'EXIT',{{bad_generators,{[{a,b,c},{i,5}],[{wrong_tag,7},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},{a,b,c},{i,5}], [{i,10},{wrong_tag,7},{i,20}]), + {'EXIT',{{bad_generators,{[{i,5}],[]}},_}} = + catch strict_list_strict_1([{i,3},{i,5}], [{i,7}]), + + [] = strict_list_strict_2([], [], <<>>), + [5,23] = strict_list_strict_2([{i,1},{i,2}], [{i,2},{i,7}], <<3,9>>), + ?assertEqual([2*I * 3*I + I || I <- Seq100], + strict_list_strict_2([{i,2*I} || I <- Seq100], + [{i,3*I} || I <- Seq100], + list_to_binary(Seq100))), + {'EXIT',{{bad_generators,{[{i,2}],[{i,7}],<<9:7>>}},_}} = + catch strict_list_strict_2([{i,1},{i,2}], [{i,2},{i,7}], <<3,9:7>>), + {'EXIT',{{bad_generators,{[],[],[]}},_}} = + catch strict_list_strict_2([], [], []), + {'EXIT',{{bad_generators,{[{i,0}],[],<<>>}},_}} = + catch strict_list_strict_2([{i,0}], [], <<>>), + {'EXIT',{{bad_generators,{[{i,0}],[{bad,5}],<<99>>}},_}} = + catch strict_list_strict_2([{i,0}], [{bad,5}], <<99>>), + {'EXIT',{{bad_generators,{[{i,20}],[{i,21}],<<42:7>>}},_}} = + catch strict_list_strict_2([{i,20}], [{i,21}], <<42:7>>), + + [] = strict_list_strict_3([], <<>>), + [45] = strict_list_strict_3([{i,42}], <<3>>), + {'EXIT',{{bad_generators,{[],<<2>>}},_}} = + catch strict_list_strict_3([{i,1}], <<1,2>>), + {'EXIT',{{bad_generators,{[],<<0:7>>}},_}} = + catch strict_list_strict_3([], <<0:7>>), + {'EXIT',{{bad_generators,{[{i,1}],<<0:7>>}},_}} = + catch strict_list_strict_3([{i,1}], <<0:7>>), + + [] = strict_list_strict_4([], <<>>), + [100] = strict_list_strict_4([{i,100}], <<42>>), + {'EXIT',{{bad_generators,{[{i,100}],<<0>>}},_}} = + catch strict_list_strict_4([{i,100}], <<0>>), + {'EXIT',{{bad_generators,{[{i,100}],<<>>}},_}} = + catch strict_list_strict_4([{i,100}], <<>>), + {'EXIT',{{bad_generators,{[{i,100}],<<0:8,1:1>>}},_}} = + catch strict_list_strict_4([{i,100}], <<0:8,1:1>>), + + NaN = <<-1:64>>, + [] = strict_list_5(<<>>, <<>>), + [3.14] = strict_list_5(<<0:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>), + [0.0,3.14] = strict_list_5(<<1:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>), + {'EXIT',{{bad_generators,{<<>>,<<64,42.0/float>>}},_}} = + catch strict_list_5(<<>>, <<64,42.0/float>>), + {'EXIT',{{bad_generators,{<<0:1,1:1>>, + <<117,-1:117/signed,32,17.0:32/float>>}},_}} = + catch strict_list_5(<<0:1,1:1>>, <<117,-1:117, 32,17.0:32/float>>), + {'EXIT',{{bad_generators,{<<0:1>>,<<64,NaN/binary>>}},_}} = + catch strict_list_5(<<1:1,0:1>>, <<32,42.0:32/float, 64,NaN/binary>>), + {'EXIT',{{bad_generators,{<<1:1>>,<<64,NaN/binary>>}},_}} = + catch strict_list_5(<<1:1,1:1>>, <<32,42.0:32/float, 64,NaN/binary>>), + + ok. + +strict_list_mixed_1(X, Y) -> + [A + B || {i,A} <:- X && {i,B} <- Y]. + +strict_list_mixed_2(L, Map0) -> + Map = maps:iterator(Map0, ordered), + [A * B + C || {i,A} <:- L && {k,B} := {v,C} <- Map]. + +strict_list_strict_1(X, Y) -> + [A + B || {i,A} <:- X && {i,B} <:- Y]. + +strict_list_strict_2(X, Y, Z) -> + [A * B + C || {i,A} <:- X && {i,B} <:- Y && <> <:= Z]. + +strict_list_strict_3(List, Bin) -> + [A + B || {i,A} <:- List && <> <:= Bin]. + +strict_list_strict_4(List, Bin) -> + [A || {i,A} <:- List && <<42:8>> <:= Bin]. + +strict_list_5(Wanted, Floats) -> + Res = [F || <> <:= Wanted && <> <:= Floats, W =:= 1], + Res = [F || <<1:1>> <= Wanted && <> <:= Floats], + Res. + +strict_binary(Config) when is_list(Config) -> + Seq100 = lists:seq(1, 100), + + <<2,4,6>> = << <<(X+Y)>> || X <:- [1,2,3] && <> <= <<1,2,3>>>>, + <<2,4>> = << <<(X+Y)>> || <> <:= <<1,2,3>> && {X, Y} <- [{1,1},{2,2},{2,3}]>>, + <<2,24>> = << <<(X*Y*Z)>> || X := Y <:- #{1 => 2, 3 => 4} && <> <:= <<1,2>> >>, + + <<>> = strict_binary_1(#{}, <<>>), + <<24:64>> = strict_binary_1(#{2 => {val,3}}, <<4:8>>), + ?assertEqual(<< <<(5*I * 3*I * I):64>> || I <- Seq100 >>, + strict_binary_1(maps:iterator(#{5*I => {val,3*I} || I <- Seq100}, ordered), + list_to_binary(Seq100))), + {'EXIT',{{bad_generators,{none,<<42:8>>}},_}} = catch strict_binary_1(#{}, <<42:8>>), + {'EXIT',{{bad_generators,{none,<<42:7>>}},_}} = catch strict_binary_1(#{}, <<42:7>>), + {'EXIT',{{bad_generators,{none,<<0:4>>}},_}} = catch strict_binary_1(#{2 => {val,3}}, <<0,0:4>>), + + <<>> = strict_binary_mixed_1(<<>>, #{}, #{}), + <<>> = strict_binary_mixed_1(<<1:2>>, #{}, #{}), + <<999:64>> = strict_binary_mixed_1(<<1:1>>, #{0 => {v,0}}, #{1 => {v,999}}), + ?assertEqual(<< <> || I <- Seq100>>, + strict_binary_mixed_1(<<0:100>>, + #{I => {v,I} || I <- Seq100}, + #{I => {v,-I} || I <- Seq100})), + ?assertEqual(<< <<-I:64>> || I <- Seq100>>, + strict_binary_mixed_1(<<-1:100>>, + #{I => {v,I} || I <- Seq100}, + #{I => {v,-I} || I <- Seq100})), + {'EXIT',{{bad_generators,{<<0:1>>,{0,0,none},{0,{v,7},none}}},_}} = + catch strict_binary_mixed_1(<<0:1>>, #{0 => 0}, #{0 => {v,7}}), + + Island = ~"skärgårdsö", + IslandSeq = lists:seq(1, length([C || <> <= Island])), + ?assertEqual(<< <> || + {I,C} <:- lists:zip(IslandSeq, [C || <> <= Island]) >>, + strict_binary_utf8(IslandSeq, Island)), + {'EXIT',{{bad_generators,{[4,5,6,7,8],<<16#ff,16#ff,"def">>}},_}} = + catch strict_binary_utf8(lists:seq(1, 8), <<"abc",16#ff,16#ff,"def">>), + + ok. + +strict_binary_1(Map, Bin) -> + << <<(X*Y*Z):64>> || X := {val,Y} <:- Map && <> <:= Bin >>. + +strict_binary_utf8(List, Bin) -> + << <> || I <:- List && <> <:= Bin >>. + +strict_binary_mixed_1(Bin, MapA0, MapB0) -> + MapA = maps:iterator(MapA0, ordered), + MapB = maps:iterator(MapB0, ordered), + < <>; + 1 -> <> + end || <> <= Bin && _ := {v,V1} <:- MapA && _ := {v,V2} <- MapB>>. + +nomatch(Config) when is_list(Config) -> + [] = do_nomatch_1([], []), + [] = do_nomatch_1([1], [a]), + [] = do_nomatch_1([1,2], [a,b]), + {'EXIT',{{bad_generators,{[1,2,3],[]}},_}} = do_nomatch_1([1,2,3], []), + {'EXIT',{{bad_generators,{[3],[]}},_}} = do_nomatch_1([1,2,3], [a,b]), + + <<>> = do_nomatch_2([], <<>>), + <<>> = do_nomatch_2([a], <<1>>), + {'EXIT',{{bad_generators,{[2],<<>>}},_}} = do_nomatch_2([1,2], <<3>>), + ok. + +do_nomatch_1(L1, L2) -> + catch [{X, Y} || a=b=X <- L1 && Y <- L2]. + +do_nomatch_2(L, Bin) -> + catch << <<(X+Y)/integer>> || a=b=X <- L && <> <= Bin >>. + +bad_generators(Config) when is_list(Config) -> + {'EXIT',{{bad_generators,{x,[1,2]}},_}} = + catch [{X,Y} || X <- x && Y <- [1,2]], + {'EXIT',{{bad_generators,{[],[4]}},_}} = + catch [{X,Y} || X <- [1,2,3] && Y <- [1,2,3,4]], + {'EXIT',{{bad_generators,{[3,4],[]}},_}} = + catch [{X,Y} || X <- [1,2,3,4] && Y <- [1,2], X < 3], + {'EXIT',{{bad_generators,{[3,4],[]}},_}} = + catch << <<(X+Y)/integer>> || X <- [1,2,3,4] && Y <- [1,2], X < 3>>, + {'EXIT',{{bad_generators,{<<1,2>>,a}},_}} = + catch << <> || <> <= <<1:8,2:8>> && <> <= a>>, + {'EXIT',{{bad_generator,a},_}} = catch [X || X := X <- a && _Y <- [1]], + {'EXIT',{{bad_generators,{[d],[]}},_}} = + catch #{X => Y || X <- [a,b,c,d] && Y <- [1,2,3], Y > 1}, + + %% Make sure that line numbers point out the generator. + case ?MODULE of + zlc_inline_SUITE -> + %% No inline suite for now. Just a guard in case we add it later. + ok; + _ -> + {'EXIT',{{bad_generators,{[],[4]}}, + [{?MODULE,_,_, + [{file,"bad_zlc.erl"},{line,4}]}|_]}} = + catch bad_generators([1,2,3],[1,2,3,4]), + + {'EXIT',{{bad_generators,{a,[2,3]}}, + [{?MODULE,_,_, + [{file,"bad_zlc.erl"},{line,7}]}|_]}} = + catch bad_generators_bc(a,[2,3]), + + {'EXIT',{{bad_generators,{[2],[]}}, + [{?MODULE,_,_, + [{file,"bad_zlc.erl"},{line,10}]}|_]}} = + catch bad_generators_mc([1,2],[1]), + + %% List comprehensions with improper lists. + {'EXIT',{{bad_generators,{d,[d]}}, + [{?MODULE,_,_, + [{file,"bad_zlc.erl"},{line,4}]}|_]}} = + catch bad_generators([a,b,c|d],[a,b,c,d]) + end, + ok. + +-file("bad_zlc.erl", 1). +bad_generators(L1,L2) -> %Line 2 + [{I1, I2} || %Line 3 + I1 <- L1 && I2 <- L2]. %Line 4 +bad_generators_bc(L1,L2) -> %Line 5 + << <> || %Line 6 + I1 <- L1 && I2 <- L2>>. %Line 7 +bad_generators_mc(L1,L2) -> %Line 8 + #{I1 => I2 || %Line 9 + I1 <- L1 && I2 <- L2}. %Line 10 diff --git a/lib/crypto/configure b/lib/crypto/configure index 35b08dd78174..efc69ef0e2c6 100755 --- a/lib/crypto/configure +++ b/lib/crypto/configure @@ -3036,6 +3036,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi @@ -3160,6 +3171,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3174,6 +3192,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3188,6 +3213,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3199,18 +3231,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -8025,6 +8058,13 @@ LDFLAGS="$saveLDFLAGS" LIBS="$saveLIBS" +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi + + diff --git a/lib/crypto/configure.ac b/lib/crypto/configure.ac index b5b591424710..fb31f7d350df 100644 --- a/lib/crypto/configure.ac +++ b/lib/crypto/configure.ac @@ -30,6 +30,8 @@ m4_include([otp.m4]) AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf]) +ERL_PUSH_WERROR + ERL_CANONICAL_SYSTEM_TYPE AC_LANG(C) @@ -922,6 +924,8 @@ CFLAGS="$saveCFLAGS" LDFLAGS="$saveLDFLAGS" LIBS="$saveLIBS" +ERL_PUSH_WERROR + AC_SUBST(SSL_INCLUDE) AC_SUBST(SSL_INCDIR) AC_SUBST(SSL_LIBDIR) diff --git a/lib/crypto/doc/crypto_app.md b/lib/crypto/doc/crypto_app.md index 2bb7fd84426b..65144cf659fc 100644 --- a/lib/crypto/doc/crypto_app.md +++ b/lib/crypto/doc/crypto_app.md @@ -51,6 +51,7 @@ The following configuration parameters are defined for the crypto application. See [`app(3)`](`e:kernel:app.md`) for more information about configuration parameters. +[](){: #fips_mode } - **`fips_mode = boolean()`** - Specifies whether to run crypto in FIPS mode. This setting will take effect when the nif module is loaded. If FIPS mode is requested but not available at run time the nif module and thus the crypto diff --git a/lib/crypto/doc/guides/new_api.md b/lib/crypto/doc/guides/new_api.md index c1575afec2ef..fe5c431463d6 100644 --- a/lib/crypto/doc/guides/new_api.md +++ b/lib/crypto/doc/guides/new_api.md @@ -147,7 +147,7 @@ the cipher text, but divided into three blocks just to show that it is possible to divide the plain text and cipher text differently for some ciphers: ```erlang - 1> crypto:start(). + 1> application:start(crypto). ok 2> Key = <<1:128>>. <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1>> diff --git a/lib/crypto/src/crypto.app.src b/lib/crypto/src/crypto.app.src index 30e804c7e208..2c8790201522 100644 --- a/lib/crypto/src/crypto.app.src +++ b/lib/crypto/src/crypto.app.src @@ -25,6 +25,6 @@ {registered, []}, {applications, [kernel, stdlib]}, {env, [{fips_mode, false}, {rand_cache_size, 896}]}, - {runtime_dependencies, ["erts-9.0","stdlib-3.9","kernel-5.3"]}]}. + {runtime_dependencies, ["erts-9.0","stdlib-3.9","kernel-6.0"]}]}. diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index fceaae79bccc..385f5f9df27a 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -193,6 +193,10 @@ end %%%---------------------------------------------------------------- %% Deprecated functions +-deprecated([{start, 0, "use application:start(crypto) instead"}, + {stop, 0, "use application:stop(crypto) instead"}, + {enable_fips_mode, 1, "use config parameter fips_mode"} + ]). %%%---------------------------------------------------------------- %% Removed functions. @@ -789,7 +793,7 @@ format_error({Ex, {C_file,C_line}, Msg}, [{_M,_F,_Args,Opts} | _CallStack]) when end end. --doc(#{title => <<"Utility Functions">>}). +-doc(#{title => <<"Deprecated API">>}). -doc """ Use [`application:start(crypto)`](`application:start/1`) instead. @@ -803,7 +807,7 @@ Use [`application:start(crypto)`](`application:start/1`) instead. start() -> application:start(crypto). --doc(#{title => <<"Utility Functions">>}). +-doc(#{title => <<"Deprecated API">>}). -doc "Use [`application:stop(crypto)`](`application:stop/1`) instead.". -spec stop() -> ok | {error, Reason::term()}. stop() -> @@ -939,7 +943,8 @@ library. If crypto was built with FIPS support this can be either `enabled` (when running in FIPS mode) or `not_enabled`. For other builds this value is always `not_supported`. -See `enable_fips_mode/1` about how to enable FIPS mode. +See configuration parameter [fips_mode](`e:crypto:crypto_app.md#fips_mode`) +about how to enable FIPS mode. > #### Warning {: .warning } > @@ -964,7 +969,7 @@ option `--enable-fips`, and the underlying libcrypto must also support FIPS. See also `info_fips/0`. """. --doc(#{title => <<"Utility Functions">>, +-doc(#{title => <<"Deprecated API">>, since => <<"OTP 21.1">>}). -spec enable_fips_mode(Enable) -> Result when Enable :: boolean(), Result :: boolean(). @@ -2799,9 +2804,8 @@ generate_key(rsa, {ModulusSize, PublicExponent}, undefined) -> [rsa,{ModulusSize,PublicExponent}]); {Private, OldPrivate} when Private == OldPrivate -> {lists:sublist(Private,2), Private}; - {_Private, _OldPrivate} -> - Where = lists:map(fun({A,B}) -> A == B end, - lists:zip(_Private, _OldPrivate)), + {Private, OldPrivate} -> + Where = [A == B || A <- Private && B <- OldPrivate], erlang:error({new_old_differ,Where}, [rsa,{ModulusSize,PublicExponent}]); Private -> @@ -3467,7 +3471,15 @@ on_load() -> end, Lib = filename:join([PrivDir, "lib", LibName]), LibBin = path2bin(Lib), - FipsMode = application:get_env(crypto, fips_mode, false) == true, + {FipsMode,AppLoaded} = + case application:get_env(crypto, fips_mode) of + {ok, true} -> {true, loaded}; + {ok, _} -> {false, loaded}; + undefined -> + %% We assume application crypto has a default value for fips_mode. + %% If undefined the application has not been loaded. + {false, unloaded} + end, Status = case erlang:load_nif(Lib, {?CRYPTO_NIF_VSN,LibBin,FipsMode}) of ok -> ok; {error, {load_failed, _}}=Error1 -> @@ -3489,7 +3501,9 @@ on_load() -> Error1 -> Error1 end, case Status of - ok -> ok; + ok -> + warn_app_not_loaded_maybe(AppLoaded), + ok; {error, {E, Str}} -> Fmt = "Unable to load crypto library. Failed with error:~n\"~p, ~s\"~n~s", Extra = case E of @@ -3501,6 +3515,19 @@ on_load() -> Status end. +warn_app_not_loaded_maybe(loaded) -> + ok; +warn_app_not_loaded_maybe(unloaded) -> + %% For backward compatible reasons we allow application crypto + %% not being loaded. + case info_fips() of + not_enabled -> + logger:warning("Module 'crypto' loaded without application 'crypto' being loaded.\n" + "Without application config 'fips_mode' loaded, FIPS mode is disabled by default."); + _ -> + ok + end. + path2bin(Path) when is_list(Path) -> Encoding = file:native_name_encoding(), case unicode:characters_to_binary(Path,Encoding,Encoding) of diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl index 3683c6e3ccca..89c6343e8575 100644 --- a/lib/crypto/test/crypto_SUITE.erl +++ b/lib/crypto/test/crypto_SUITE.erl @@ -520,7 +520,7 @@ init_per_suite(Config) -> {ok, _} = zip:unzip("cmactestvectors.zip"), {ok, _} = zip:unzip("gcmtestvectors.zip"), - try is_ok(crypto:start()) of + try is_ok(application:start(crypto)) of ok -> catch ct:comment("~s",[element(3,hd(crypto:info_lib()))]), catch ct:log("crypto:info() -> ~p~n" @@ -755,13 +755,13 @@ no_support(Config) when is_list(Config) -> false = is_supported(Type). %%-------------------------------------------------------------------- crypto_load(_Config) -> - (catch crypto:stop()), + (catch application:stop(crypto)), code:delete(crypto), code:purge(crypto), - crypto:start(). + application:start(crypto). %%-------------------------------------------------------------------- crypto_load_and_call(_Config) -> - (catch crypto:stop()), + (catch application:stop(crypto)), code:delete(crypto), code:purge(crypto), Key0 = "ablurf123BX#$;3", diff --git a/lib/crypto/test/crypto_bench_SUITE.erl b/lib/crypto/test/crypto_bench_SUITE.erl index 5ec2d085ab14..683be4169e20 100644 --- a/lib/crypto/test/crypto_bench_SUITE.erl +++ b/lib/crypto/test/crypto_bench_SUITE.erl @@ -74,7 +74,7 @@ groups() -> %%%---------------------------------------------------------------- %%% init_per_suite(Config0) -> - try crypto:start() of + try application:start(crypto) of _ -> [{_,_,Info}] = crypto:info_lib(), ct:comment("~s",[Info]), diff --git a/lib/crypto/test/crypto_collect_labmachine_info_SUITE.erl b/lib/crypto/test/crypto_collect_labmachine_info_SUITE.erl index 04ed7a1859a1..ad3d22289ee0 100644 --- a/lib/crypto/test/crypto_collect_labmachine_info_SUITE.erl +++ b/lib/crypto/test/crypto_collect_labmachine_info_SUITE.erl @@ -65,7 +65,7 @@ init_per_suite(Config) -> Root = ct:get_config(collect_host_info), RemoteFile = filename:join([Root, "crypto_info", hostname()++".data"]), CryptoStarted = - try crypto:start() of + try application:start(crypto) of ok -> true; {error, already_started} -> true; _ -> false diff --git a/lib/crypto/test/crypto_property_test_SUITE.erl b/lib/crypto/test/crypto_property_test_SUITE.erl index 1c786c986ab6..a6ced25259ba 100644 --- a/lib/crypto/test/crypto_property_test_SUITE.erl +++ b/lib/crypto/test/crypto_property_test_SUITE.erl @@ -39,7 +39,7 @@ all() -> [encrypt_decrypt_one_time, %%% First prepare Config and compile the property tests for the found tool: init_per_suite(Config) -> case - try crypto:start() of + try application:start(crypto) of ok -> true; {error, already_started} -> true; {error,{already_started,crypto}} -> true; diff --git a/lib/crypto/test/engine_SUITE.erl b/lib/crypto/test/engine_SUITE.erl index 4d74452183af..81cbb7145664 100644 --- a/lib/crypto/test/engine_SUITE.erl +++ b/lib/crypto/test/engine_SUITE.erl @@ -154,7 +154,7 @@ init_per_suite(Config) -> {_,OS, Res} -> ct:log("crypto:info_lib() -> ~p\nos:type() -> ~p", [Res,OS]), - try crypto:start() of + try application:start(crypto) of ok -> Config; {error,{already_started,crypto}} -> diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl index 60a3dc85c8a5..3681edcc66d9 100644 --- a/lib/debugger/src/dbg_ieval.erl +++ b/lib/debugger/src/dbg_ieval.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 1998-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,7 +14,7 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% %% -module(dbg_ieval). @@ -69,7 +69,7 @@ exit_info(Int, AttPid, OrigPid, Reason, ExitInfo) -> put(breakpoints, dbg_iserver:call(Int, all_breaks)), put(self, OrigPid), put(exit_info, ExitInfo), - + case ExitInfo of {{Mod,Line},Bs,S} -> dbg_istk:from_external(S), @@ -216,7 +216,7 @@ meta(Int, Debugged, M, F, As) -> {M, F, As} end, Status = dbg_iserver:call(Int, {new_process,Debugged,self(),Pargs}), - + %% Initiate process dictionary put(int, Int), % pid() dbg_iserver put(attached, undefined),% pid() attached process @@ -283,7 +283,7 @@ meta_loop(Debugged, Bs, #ieval{level=Le} = Ieval) -> dbg_istk:init(), put(stacktrace, []), put(exit_info, undefined), - + dbg_iserver:cast(get(int), {set_status,self(),running,{}}), dbg_icmd:tell_attached(running), @@ -357,7 +357,7 @@ format_trace(What, Args, P) -> call -> {Called, {Le,Li,M,F,As}} = Args, case Called of - extern -> + extern -> io_lib:format("++ (~w) <~w> ~w:~tw~ts~n", [Le,Li,M,F,format_args(As, P)]); local -> @@ -404,7 +404,7 @@ catch_value(throw, Reason) -> %%--Code interpretation----------------------------------------------- %%-------------------------------------------------------------------- -%% Top level function of meta evaluator. +%% Top level function of meta evaluator. %% Return message to be replied to the target process. %%-------------------------------------------------------------------- eval_mfa(Debugged, M, F, As, #ieval{level=Le}=Ieval0) -> @@ -483,11 +483,11 @@ do_eval_function(Mod, Name, As0, Bs0, Called, Ieval0) -> lambda(eval_fun, [Cs,As,Bs,{Mod,Name}=F]) -> %% Fun defined in interpreted code, called from outside - if + if length(element(3,hd(Cs))) =:= length(As) -> db_ref(Mod), %% Adds ref between module and process {Cs,Mod,Name,As,Bs}; - true -> + true -> {error,{badarity,{F,As}}} end; lambda(eval_named_fun, [Cs,As,Bs0,FName,RF,{Mod,Name}=F]) -> @@ -514,7 +514,7 @@ lambda(Fun, As) when is_function(Fun) -> {M,F,add_binding(FName, Fun, Bs0), Cs0} end, {arity, Arity} = erlang:fun_info(Fun, arity), - if + if length(As) =:= Arity -> db_ref(Mod), %% Adds ref between module and process {Cs,Mod,Name,As,Bs}; @@ -586,7 +586,7 @@ db_ref(Mod) -> cache(Key, Data) -> put(cache, lists:sublist([{Key,Data}|get(cache)], 5)). - + cached(Key) -> case lists:keyfind(Key, 1, get(cache)) of {Key,Data} -> Data; @@ -806,7 +806,7 @@ expr({maybe_match,Line,Lhs,Rhs0}, Bs0, Ieval0) -> expr({make_fun,Line,Name,Cs}, Bs, #ieval{module=Module}=Ieval) -> Arity = length(element(3,hd(Cs))), Info = {{Module,Name},Bs,Cs}, - Fun = + Fun = case Arity of 0 -> fun() -> eval_fun([], Info) end; 1 -> fun(A) -> eval_fun([A], Info) end; @@ -815,33 +815,33 @@ expr({make_fun,Line,Name,Cs}, Bs, #ieval{module=Module}=Ieval) -> 4 -> fun(A,B,C,D) -> eval_fun([A,B,C,D], Info) end; 5 -> fun(A,B,C,D,E) -> eval_fun([A,B,C,D,E], Info) end; 6 -> fun(A,B,C,D,E,F) -> eval_fun([A,B,C,D,E,F], Info) end; - 7 -> fun(A,B,C,D,E,F,G) -> + 7 -> fun(A,B,C,D,E,F,G) -> eval_fun([A,B,C,D,E,F,G], Info) end; - 8 -> fun(A,B,C,D,E,F,G,H) -> + 8 -> fun(A,B,C,D,E,F,G,H) -> eval_fun([A,B,C,D,E,F,G,H], Info) end; - 9 -> fun(A,B,C,D,E,F,G,H,I) -> + 9 -> fun(A,B,C,D,E,F,G,H,I) -> eval_fun([A,B,C,D,E,F,G,H,I], Info) end; - 10 -> fun(A,B,C,D,E,F,G,H,I,J) -> + 10 -> fun(A,B,C,D,E,F,G,H,I,J) -> eval_fun([A,B,C,D,E,F,G,H,I,J], Info) end; - 11 -> fun(A,B,C,D,E,F,G,H,I,J,K) -> + 11 -> fun(A,B,C,D,E,F,G,H,I,J,K) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K], Info) end; - 12 -> fun(A,B,C,D,E,F,G,H,I,J,K,L) -> + 12 -> fun(A,B,C,D,E,F,G,H,I,J,K,L) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L], Info) end; - 13 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M) -> + 13 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M], Info) end; - 14 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N) -> + 14 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N], Info) end; - 15 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) -> + 15 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O], Info) end; - 16 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) -> + 16 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P], Info) end; - 17 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q) -> + 17 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q], Info) end; - 18 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R) -> + 18 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R], Info) end; - 19 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S) -> + 19 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S],Info) end; - 20 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) -> + 20 -> fun(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) -> eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T],Info) end; _Other -> exception(error, {'argument_limit',{'fun',Cs}}, Bs, @@ -1049,7 +1049,7 @@ expr({apply,Line,As0,Lc}, Bs0, Ieval0) -> Ieval = Ieval0#ieval{line=Line}, {[M,F,As],Bs} = eval_list(As0, Bs0, Ieval), eval_function(M, F, As, Bs, extern, Ieval, Lc); - + %% Receive statement expr({'receive',Line,Cs}, Bs0, #ieval{level=Le}=Ieval) -> trace(receivex, {Le,false}), @@ -1112,6 +1112,9 @@ eval_named_fun(As, RF, {Info,Bs,Cs,FName}) -> eval_lc(E, Qs, Bs, Ieval) -> {value,eval_lc1(E, Qs, Bs, Ieval),Bs}. +eval_lc1(E, [{zip, Anno, Gens}|Qs], Bs0, Ieval) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Ieval), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, fun eval_lc1/4, Ieval); eval_lc1(E, [{generator,G}|Qs], Bs, Ieval) -> CompFun = fun(NewBs) -> eval_lc1(E, Qs, NewBs, Ieval) end, eval_generator(G, Bs, CompFun, Ieval); @@ -1130,6 +1133,238 @@ eval_lc1(E, [], Bs, Ieval) -> {value,V,_} = expr(E, Bs, Ieval#ieval{top=false}), [V]. +%% convert values for generator vars from abstract form to flattened lists +convert_gen_values([{generator,{Generate, Line, P, L0}}|Qs], Acc, Bs0, Ieval0) + when Generate =:= generate; + Generate =:= generate_strict -> + Ieval = Ieval0#ieval{line=Line}, + {value,L1,_Bs1} = expr(L0, Bs0, Ieval#ieval{top=false}), + convert_gen_values(Qs, [{Generate, Line, P, L1}|Acc], Bs0, Ieval); +convert_gen_values([{generator,{Generate, Line, P, L0}}|Qs], Acc, Bs0, Ieval0) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> + Ieval = Ieval0#ieval{line=Line}, + {value,L1,_Bs1} = expr(L0, Bs0, Ieval#ieval{top=false}), + convert_gen_values(Qs, [{Generate, Line, P, L1}|Acc], Bs0, Ieval); +convert_gen_values([{generator,{Generate, Line, P, Map0}}|Qs], Acc, Bs0, Ieval0) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> + Ieval = Ieval0#ieval{line=Line}, + {map_field_exact,_,K,V} = P, + {value,Map,_Bs1} = expr(Map0, Bs0, Ieval#ieval{top=false}), + Iter = case is_map(Map) of + true -> + maps:iterator(Map); + false -> + %% Validate iterator. + try maps:foreach(fun(_, _) -> ok end, Map) of + _ -> + Map + catch + _:_ -> + exception(error,{bad_generator,Map}, Bs0, Ieval) + end + end, + convert_gen_values(Qs, [{Generate, Line, {tuple, Line, [K, V]}, Iter}|Acc], Bs0, Ieval); +convert_gen_values([], Acc, Bs0, _Ieval) -> + {lists:reverse(Acc), Bs0}. + +bind_all_generators(Gens, Bs0, Ieval) -> + bind_all_generators1(Gens, [], erl_eval:new_bindings(Bs0), Ieval, continue). + +bind_all_generators1([{Generate, Anno, P, <<_/bitstring>>=Bin}|Qs], + Acc, Bs0, Ieval, continue) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> + Mfun = match_fun(Bs0), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, #ieval{}) end, + case eval_bits:bin_gen(P, Bin, erl_eval:new_bindings(Bs0), Bs0, Mfun, Efun) of + {match, Rest, Bs1} -> + Bs2 = zip_add_bindings(Bs1, Bs0), + case Bs2 of + nomatch when Generate =:= b_generate -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], + Bs0, Ieval, skip); + nomatch -> {Acc, error}; + _ -> + bind_all_generators1(Qs, [{Generate, Anno, P, Rest}|Acc], + Bs2, Ieval, continue) + end; + {nomatch, Rest} when Generate =:= b_generate -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], Bs0, Ieval, skip); + {nomatch, _Rest} -> + {Acc, error}; + done when Generate =:= b_generate_strict, Bin =/= <<>> -> + {Acc, error}; + done -> + {[], done} + end; +bind_all_generators1([{Generate, Anno, P, <<_/bitstring>>=Bin}|Qs], Acc, Bs0, Ieval, skip) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> + Mfun = match_fun(Bs0), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, #ieval{}) end, + case eval_bits:bin_gen(P, Bin, erl_eval:new_bindings(Bs0), Bs0, Mfun, Efun) of + {match, Rest, _} -> + bind_all_generators1(Qs, [{Generate, Anno, P, Rest}|Acc], Bs0, Ieval, skip); + {nomatch, Rest} when Generate =:= b_generate -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], Bs0, Ieval, skip); + {nomatch, _Rest} -> + {Acc, error}; + done when Generate =:= b_generate_strict, Bin =/= <<>> -> + {Acc, error}; + done -> + {[], skip} + end; +bind_all_generators1([{Generate, Anno, P, [H|T]}|Qs], Acc, Bs0, Ieval, continue) + when Generate =:= generate; + Generate =:= generate_strict -> + case catch match1(P, H, erl_eval:new_bindings(Bs0), Bs0) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch when Generate =:= generate -> + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], Bs0, Ieval, skip); + nomatch -> {Acc, error}; + _ -> + bind_all_generators1(Qs,[{Generate, Anno, P, T}|Acc], Bs2, Ieval, continue) + end; + nomatch when Generate =:= generate -> + %% match/6 returns nomatch. Skip this value + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], Bs0, Ieval, skip); + nomatch -> + {Acc, error} + end; +bind_all_generators1([{generate, Anno, P, [_H|T]}|Qs], Acc, Bs0, Ieval, skip) -> + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], Bs0, Ieval, skip); +bind_all_generators1([{generate_strict, Anno, P, [H|T]}|Qs], Acc, Bs0, Ieval, continue) -> + case catch match1(P, H, erl_eval:new_bindings(Bs0), Bs0) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> {Acc, error}; + _ -> + bind_all_generators1(Qs,[{generate_strict, Anno, P, T}|Acc], Bs2, Ieval, continue) + end; + nomatch -> + {Acc, error} + end; +bind_all_generators1([{Generate, Anno, P, Iter0}|Qs], Acc, Bs0, Ieval, continue) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> + case maps:next(Iter0) of + {K,V,Iter} -> + case catch match1(P, {K,V}, erl_eval:new_bindings(Bs0), Bs0) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch when Generate =:= m_generate -> + bind_all_generators1(Qs,[{m_generate, Anno, P, Iter}|Acc], + Bs0, Ieval, skip); + nomatch -> + {Acc, error}; + _ -> + bind_all_generators1(Qs,[{Generate, Anno, P, Iter}|Acc], + Bs2, Ieval, continue) + end; + nomatch when Generate =:= m_generate -> + bind_all_generators1(Qs, [{m_generate, Anno, P, Iter}|Acc], + Bs0, Ieval, skip); + nomatch -> + {Acc, error} + end; + none -> + {[], done} + end; +bind_all_generators1([{m_generate, Anno, P, Iter0}|Qs], Acc, Bs0, Ieval, skip) -> + case maps:next(Iter0) of + {_K,_V,Iter} -> + bind_all_generators1(Qs, [{m_generate, Anno, P, Iter}|Acc], + Bs0, Ieval, skip); + none -> + {[], skip} + end; +bind_all_generators1([{m_generate_strict, Anno, P, Iter0}|Qs], Acc, Bs0, Ieval, continue) -> + case maps:next(Iter0) of + {K,V,Iter} -> + case catch match1(P, {K,V}, erl_eval:new_bindings(Bs0), Bs0) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> + {Acc, error}; + _ -> + bind_all_generators1(Qs,[{m_generate_strict, Anno, P, Iter}|Acc], + Bs2, Ieval, continue) + end; + nomatch -> {Acc, error} + end; + none -> + {[], done} + end; +bind_all_generators1([{generate,_,_,[]}|_], _, _, _, _) -> + %% no more values left for a var, time to return + {[],done}; +bind_all_generators1([{generate_strict,_,_,[]}|_], _, _, _, _) -> + %% no more values left for a var, time to return + {[],done}; +bind_all_generators1([{Generate, _Anno, _P, _Term}|_Qs], Acc, _Bs0, _Ieval,_) + when Generate =:= generate; + Generate =:= generate_strict; + Generate =:= b_generate; + Generate =:= b_generate_strict -> + {Acc, error}; +bind_all_generators1([], [_H|_T] = Acc, Bs0, _Ieval, continue) -> + %% all vars are bind for this round + {Acc, Bs0}; +bind_all_generators1([], [_H|_T] = Acc, _Bs0, _Ieval, skip) -> + {Acc, skip}. + +check_bad_generators([{Generate,_,_,V}|T], Env, Acc) + when Generate =:= generate; + Generate =:= generate_strict -> + check_bad_generators(T, Env, [V|Acc]); +check_bad_generators([{Generate,_,_,Iter0}|T], Env, Acc) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> + case maps:next(Iter0) of + none -> check_bad_generators(T, Env, [#{}|Acc]); + _ -> check_bad_generators(T, Env, [#{K => V || K := V <- Iter0}|Acc]) + end; +check_bad_generators([{Generate,_,P,<<_/bitstring>>=Bin}|T], Bs0, Acc) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> + Mfun = match_fun(Bs0), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, #ieval{}) end, + case eval_bits:bin_gen(P, Bin, erl_eval:new_bindings(Bs0), Bs0, Mfun, Efun) of + done -> + check_bad_generators(T, Bs0, [<<>>|Acc]); + _ -> + check_bad_generators(T, Bs0, [Bin|Acc]) + end; +check_bad_generators([{b_generate,_,_,Term}|T], Env, Acc) -> + check_bad_generators(T, Env, [Term|Acc]); +check_bad_generators([{b_generate_strict,_,_,Term}|T], Env, Acc) -> + check_bad_generators(T, Env, [Term|Acc]); +check_bad_generators([], _, Acc)-> + case lists:any(fun is_generator_end/1, Acc) of + false -> + %% None of the generators has reached its end. + {ok, list_to_tuple(lists:reverse(Acc))}; + true -> + case lists:all(fun(V) -> is_generator_end(V) end, Acc) of + true -> + %% All generators have reached their end. + {ok, list_to_tuple(lists:reverse(Acc))}; + false -> + {error, {bad_generators,list_to_tuple(lists:reverse(Acc))}} + end + end. + +is_generator_end([]) -> true; +is_generator_end(<<>>) -> true; +is_generator_end(Other) -> Other =:= #{}. + %% eval_bc(Expr,[Qualifier],Bindings,IevalState) -> %% {value,Value,Bindings}. %% This is evaluating list comprehensions "straight out of the book". @@ -1138,6 +1373,9 @@ eval_bc(E, Qs, Bs, Ieval) -> Val = erlang:list_to_bitstring(eval_bc1(E, Qs, Bs, Ieval)), {value,Val,Bs}. +eval_bc1(E, [{zip, Anno, Gens}|Qs], Bs0, Ieval) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Ieval), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, fun eval_bc1/4, Ieval); eval_bc1(E, [{generator,G}|Qs], Bs, Ieval) -> CompFun = fun(NewBs) -> eval_bc1(E, Qs, NewBs, Ieval) end, eval_generator(G, Bs, CompFun, Ieval); @@ -1160,6 +1398,9 @@ eval_mc(E, Qs, Bs, Ieval) -> Map = eval_mc1(E, Qs, Bs, Ieval), {value,maps:from_list(Map),Bs}. +eval_mc1(E, [{zip, Anno, Gens}|Qs], Bs0, Ieval) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Ieval), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, fun eval_mc1/4, Ieval); eval_mc1(E, [{generator,G}|Qs], Bs, Ieval) -> CompFun = fun(NewBs) -> eval_mc1(E, Qs, NewBs, Ieval) end, eval_generator(G, Bs, CompFun, Ieval); @@ -1179,15 +1420,37 @@ eval_mc1({map_field_assoc,_,K0,V0}, [], Bs, Ieval) -> {value,V,_} = expr(V0, Bs, Ieval#ieval{top=false}), [{K,V}]. -eval_generator({generate,Line,P,L0}, Bs0, CompFun, Ieval0) -> +eval_zip(E, [{zip, Anno, VarList}|Qs], Bs0, Fun, Ieval) -> + Gens = case check_bad_generators(VarList, Bs0, []) of + {ok, Acc} -> Acc; + {error, Reason} -> + exception(error, Reason, Bs0, Ieval) + end, + {Rest, Bs1} = bind_all_generators(VarList, Bs0, Ieval), + case {Rest, Qs, Bs1} of + {_, _, error} -> exception(error,{bad_generators,Gens}, Bs0, Ieval); + {[], [], _} -> []; + {[], _, _} -> []; + {_,_,done} -> []; + {_, _, skip} -> + eval_zip(E, [{zip, Anno, lists:reverse(Rest)}|Qs], Bs0, Fun, Ieval); + {_, _, _} -> + Fun(E, Qs, add_bindings(Bs1, Bs0), Ieval) ++ + eval_zip(E, [{zip, Anno, lists:reverse(Rest)}|Qs], Bs0, Fun, Ieval) + end. + +eval_generator({Generate,Line,P,L0}, Bs0, CompFun, Ieval0) when Generate =:= generate; + Generate =:= generate_strict -> Ieval = Ieval0#ieval{line=Line}, {value,L1,Bs1} = expr(L0, Bs0, Ieval#ieval{top=false}), - eval_generate(L1, P, Bs1, CompFun, Ieval); -eval_generator({b_generate,Line,P,Bin0}, Bs0, CompFun, Ieval0) -> + eval_generate(L1, P, Bs1, CompFun, Generate =:= generate, Ieval); +eval_generator({Generate,Line,P,Bin0}, Bs0, CompFun, Ieval0) when Generate =:= b_generate; + Generate =:= b_generate_strict -> Ieval = Ieval0#ieval{line=Line}, {value,Bin,Bs1} = expr(Bin0, Bs0, Ieval#ieval{top=false}), - eval_b_generate(Bin, P, Bs1, CompFun, Ieval); -eval_generator({m_generate,Line,P,Map0}, Bs0, CompFun, Ieval0) -> + eval_b_generate(Bin, P, Bs1, CompFun, Generate =:= b_generate, Ieval); +eval_generator({Generate,Line,P,Map0}, Bs0, CompFun, Ieval0) when Generate =:= m_generate; + Generate =:= m_generate_strict -> Ieval = Ieval0#ieval{line=Line}, {map_field_exact,_,K,V} = P, {value,Map,_Bs1} = expr(Map0, Bs0, Ieval), @@ -1204,45 +1467,53 @@ eval_generator({m_generate,Line,P,Map0}, Bs0, CompFun, Ieval0) -> exception(error, {bad_generator,Map}, Bs0, Ieval) end end, - eval_m_generate(Iter, {tuple,Line,[K,V]}, Bs0, CompFun, Ieval). + eval_m_generate(Iter, {tuple,Line,[K,V]}, Bs0, CompFun, Generate =:= m_generate, Ieval). -eval_generate([V|Rest], P, Bs0, CompFun, Ieval) -> +eval_generate([V|Rest], P, Bs0, CompFun, Relaxed, Ieval) -> case catch match1(P, V, erl_eval:new_bindings(), Bs0) of - {match,Bsn} -> - Bs2 = add_bindings(Bsn, Bs0), - CompFun(Bs2) ++ eval_generate(Rest, P, Bs0, CompFun, Ieval); - nomatch -> - eval_generate(Rest, P, Bs0, CompFun, Ieval) - end; -eval_generate([], _P, _Bs0, _CompFun, _Ieval) -> + {match,Bsn} -> + Bs2 = add_bindings(Bsn, Bs0), + CompFun(Bs2) ++ eval_generate(Rest, P, Bs0, CompFun, Relaxed, Ieval); + nomatch when Relaxed -> + eval_generate(Rest, P, Bs0, CompFun, Relaxed, Ieval); + nomatch -> + exception(error, {badmatch, V}, Bs0, Ieval) + end; +eval_generate([], _P, _Bs0, _CompFun, _Relaxed, _Ieval) -> []; -eval_generate(Term, _P, Bs, _CompFun, Ieval) -> +eval_generate(Term, _P, Bs, _CompFun, _Relaxed, Ieval) -> exception(error, {bad_generator,Term}, Bs, Ieval). -eval_b_generate(<<_/bitstring>>=Bin, P, Bs0, CompFun, Ieval) -> +eval_b_generate(<<_/bitstring>>=Bin, P, Bs0, CompFun, Relaxed, Ieval) -> Mfun = match_fun(Bs0), Efun = fun(Exp, Bs) -> expr(Exp, Bs, #ieval{}) end, case eval_bits:bin_gen(P, Bin, erl_eval:new_bindings(), Bs0, Mfun, Efun) of - {match,Rest,Bs1} -> - Bs2 = add_bindings(Bs1, Bs0), - CompFun(Bs2) ++ eval_b_generate(Rest, P, Bs0, CompFun, Ieval); - {nomatch,Rest} -> - eval_b_generate(Rest, P, Bs0, CompFun, Ieval); - done -> - [] + {match,Rest,Bs1} -> + Bs2 = add_bindings(Bs1, Bs0), + CompFun(Bs2) ++ eval_b_generate(Rest, P, Bs0, CompFun, Relaxed, Ieval); + {nomatch,Rest} when Relaxed -> + eval_b_generate(Rest, P, Bs0, CompFun, Relaxed, Ieval); + {nomatch,_Rest} -> + exception(error, {badmatch, Bin}, Bs0, Ieval); + done when not Relaxed, Bin =/= <<>> -> + exception(error, {badmatch, Bin}, Bs0, Ieval); + done -> + [] end; -eval_b_generate(Term, _P, Bs, _CompFun, Ieval) -> +eval_b_generate(Term, _P, Bs, _CompFun, _Relaxed, Ieval) -> exception(error, {bad_generator,Term}, Bs, Ieval). -eval_m_generate(Iter0, P, Bs0, CompFun, Ieval) -> +eval_m_generate(Iter0, P, Bs0, CompFun, Relaxed, Ieval) -> case maps:next(Iter0) of {K,V,Iter} -> case catch match1(P, {K,V}, erl_eval:new_bindings(), Bs0) of {match,Bsn} -> Bs2 = add_bindings(Bsn, Bs0), - CompFun(Bs2) ++ eval_m_generate(Iter, P, Bs0, CompFun, Ieval); + CompFun(Bs2) ++ eval_m_generate(Iter, P, Bs0, CompFun, Relaxed, Ieval); + nomatch when Relaxed -> + eval_m_generate(Iter, P, Bs0, CompFun, Relaxed, Ieval); nomatch -> - eval_m_generate(Iter, P, Bs0, CompFun, Ieval) + exception(error, {badmatch, {K,V}}, Bs0, Ieval) end; none -> [] @@ -1264,7 +1535,7 @@ safe_bif(M, F, As, Bs, Ieval0) -> eval_send(To, Msg, Bs, Ieval) -> try To ! Msg of - Msg -> + Msg -> trace(send, {To,Msg}), {value,Msg,Bs} catch @@ -1273,7 +1544,7 @@ eval_send(To, Msg, Bs, Ieval) -> end. %% Start tracing of messages before fetching current messages in -%% the queue to make sure that no messages are lost. +%% the queue to make sure that no messages are lost. eval_receive(Debugged, Cs, Bs0, #ieval{module=M,line=Line,level=Le}=Ieval) -> %% To avoid private message passing protocol between META @@ -1514,7 +1785,7 @@ rec_clauses([], _, _) -> %% Evaluate a list of guards. guard([], _) -> true; guard(Gs, Bs) -> or_guard(Gs, Bs). - + or_guard([G|Gs], Bs) -> %% Short-circuit OR. and_guard(G, Bs) orelse or_guard(Gs, Bs); @@ -1588,7 +1859,7 @@ guard_expr({map,_,E0,Fs0}, Bs) -> E, Fs), {value,Value}; guard_expr({bin,_,Flds}, Bs) -> - {value,V,_Bs} = + {value,V,_Bs} = eval_bits:expr_grp(Flds, Bs, fun(E,B) -> {value,V} = guard_expr(E,B), @@ -1678,7 +1949,7 @@ match1({match,_,Pat1,Pat2}, Term, Bs0, BBs) -> match1({cons,_,H,T}, [H1|T1], Bs0, BBs) -> {match,Bs} = match1(H, H1, Bs0, BBs), match1(T, T1, Bs, BBs); -match1({tuple,_,Elts}, Tuple, Bs, BBs) +match1({tuple,_,Elts}, Tuple, Bs, BBs) when length(Elts) =:= tuple_size(Tuple) -> match_tuple(Elts, Tuple, 1, Bs, BBs); match1({map,_,Fields}, Map, Bs, BBs) when is_map(Map) -> @@ -1724,7 +1995,7 @@ match_map([], _, Bs, _BBs) -> head_match([Par|Pars], [Arg|Args], Bs0, BBs) -> try match1(Par, Arg, Bs0, BBs) of {match,Bs} -> head_match(Pars, Args, Bs, BBs) - catch + catch Result -> Result end; head_match([],[],Bs,_) -> {match,Bs}. @@ -1787,7 +2058,7 @@ add_anon(Val,[]) -> [{'_',Val}]. %% merge_bindings(Bindings1, Bindings2, Ieval) -%% Merge bindings detecting bad matches. +%% Merge bindings detecting bad matches. %% Special case '_',save the new one !!! %% Bindings1 is the newest bindings. merge_bindings(Bs, Bs, _Ieval) -> @@ -1807,6 +2078,31 @@ merge_bindings([{Name,V}|B1s], B2s, Ieval) -> merge_bindings([], B2s, _Ieval) -> B2s. +zip_add_bindings(Bs1, Bs2) when is_map(Bs1), is_map(Bs2) -> + zip_add_bindings_map(maps:keys(Bs1), Bs1, Bs2); +zip_add_bindings(Bs1, Bs2) when is_list(Bs1), is_list(Bs2) -> + zip_add_bindings1(orddict:to_list(Bs1), Bs2). + +zip_add_bindings_map([Key | Keys], Bs1, Bs2) -> + case {Bs1, Bs2} of + {#{Key := Same}, #{Key := Same}} -> zip_add_bindings_map(Keys, Bs1, Bs2); + {_, #{Key := _}} -> nomatch; + {#{Key := Value},_} -> zip_add_bindings_map(Keys, Bs1, Bs2#{Key => Value}) + end; +zip_add_bindings_map([], _, Bs2) -> + Bs2. + +zip_add_bindings1([{Name,Val}|Bs1], Bs2) -> + case orddict:find(Name, Bs2) of + {ok, Val} -> + zip_add_bindings1(Bs1, Bs2); + {ok, _Value} -> nomatch; + error -> + zip_add_bindings1(Bs1, orddict:store(Name, Val, Bs2)) + end; +zip_add_bindings1([], Bs2) -> + Bs2. + %% add_bindings(Bindings1,Bindings2) %% Add Bindings1 to Bindings2. Bindings in %% Bindings1 hides bindings in Bindings2. diff --git a/lib/debugger/src/dbg_iload.erl b/lib/debugger/src/dbg_iload.erl index aba270a9290f..accb744bf78c 100644 --- a/lib/debugger/src/dbg_iload.erl +++ b/lib/debugger/src/dbg_iload.erl @@ -92,7 +92,7 @@ store_module(Mod, File, Binary, Db) -> erase(vcount), erase(funs), erase(fun_count), - + NewBinary = store_mod_line_no(Mod, Db, binary_to_list(Src)), dbg_idb:insert(Db, mod_bin, NewBinary), dbg_idb:insert(Db, mod_raw, <>). %% Add eos @@ -117,7 +117,7 @@ init_calltype_imports([_|T], Ctype) -> init_calltype_imports(T, Ctype); init_calltype_imports([], Ctype) -> Ctype. -%% Adjust line numbers using the file/2 attribute. +%% Adjust line numbers using the file/2 attribute. %% Also take the absolute value of line numbers. %% This simple fix will make the marker point at the correct line %% (assuming the file attributes are correct) in the source; it will @@ -676,7 +676,7 @@ expr({map_field_assoc,L,K0,V0}, _Lc, St) -> V = expr(V0, false, St), {map_field_assoc,L,K,V}. -consify([A|As]) -> +consify([A|As]) -> {cons,0,A,consify(As)}; consify([]) -> {value,0,[]}. @@ -694,17 +694,41 @@ expr_comprehension({Tag,Anno,E0,Gs0}, St) -> Gs = [case G of ({generate,L,P0,Qs}) -> {generator,{generate,L,pattern(P0, St),expr(Qs, false, St)}}; + ({generate_strict,L,P0,Qs}) -> + {generator,{generate_strict,L,pattern(P0, St),expr(Qs, false, St)}}; ({b_generate,L,P0,Qs}) -> %R12. {generator,{b_generate,L,pattern(P0, St),expr(Qs, false, St)}}; + ({b_generate_strict,L,P0,Qs}) -> %R12. + {generator,{b_generate_strict,L,pattern(P0, St),expr(Qs, false, St)}}; ({m_generate,L,P0,Qs}) -> %OTP 26 {generator,{m_generate,L,mc_pattern(P0, St),expr(Qs, false, St)}}; + ({m_generate_strict,L,P0,Qs}) -> %OTP 26 + {generator,{m_generate_strict,L,mc_pattern(P0, St),expr(Qs, false, St)}}; + ({zip,L,Gens}) -> + expr_comprehension({zip,L,Gens}, St); (Expr) -> case is_guard_test(Expr, St) of true -> {guard,guard([[Expr]], St)}; false -> expr(Expr, false, St) end end || G <- Gs0], - {Tag,ln(Anno),expr(E0, false, St),Gs}. + {Tag,ln(Anno),expr(E0, false, St),Gs}; +expr_comprehension({zip,Anno,Gens}, St) -> + Gs = [case G of + ({generate,L,P0,Qs}) -> + {generator,{generate,L,pattern(P0, St),expr(Qs, false, St)}}; + ({generate_strict,L,P0,Qs}) -> + {generator,{generate_strict,L,pattern(P0, St),expr(Qs, false, St)}}; + ({b_generate,L,P0,Qs}) -> %R12. + {generator,{b_generate,L,pattern(P0, St),expr(Qs, false, St)}}; + ({b_generate_strict,L,P0,Qs}) -> %R12. + {generator,{b_generate_strict,L,pattern(P0, St),expr(Qs, false, St)}}; + ({m_generate,L,P0,Qs}) -> %OTP 26 + {generator,{m_generate,L,mc_pattern(P0, St),expr(Qs, false, St)}}; + ({m_generate_strict,L,P0,Qs}) -> %OTP 26 + {generator,{m_generate_strict,L,mc_pattern(P0, St),expr(Qs, false, St)}} + end || G <- Gens], + {zip,ln(Anno),Gs}. mc_pattern({map_field_exact,L,KeyP0,ValP0}, St) -> KeyP1 = pattern(KeyP0, St), diff --git a/lib/debugger/src/debugger.app.src b/lib/debugger/src/debugger.app.src index 981e91f73b91..56b80b6c8438 100644 --- a/lib/debugger/src/debugger.app.src +++ b/lib/debugger/src/debugger.app.src @@ -49,5 +49,5 @@ {registered, [dbg_iserver, dbg_wx_mon, dbg_wx_winman]}, {applications, [kernel, stdlib, compiler]}, {optional_applications, [compiler, wx]}, - {runtime_dependencies, ["wx-2.0","stdlib-3.15","kernel-10.0","erts-15.0", + {runtime_dependencies, ["wx-2.0","stdlib-@OTP-19184@","kernel-10.0","erts-15.0", "compiler-8.0"]}]}. diff --git a/lib/debugger/test/Makefile b/lib/debugger/test/Makefile index bf464f8d76d7..4ecb3652ed36 100644 --- a/lib/debugger/test/Makefile +++ b/lib/debugger/test/Makefile @@ -53,6 +53,7 @@ MODULES= \ record_SUITE \ trycatch_SUITE \ test_lib \ + zlc_SUITE \ cleanup ERL_FILES= $(MODULES:%=%.erl) diff --git a/lib/debugger/test/bs_bincomp_SUITE.erl b/lib/debugger/test/bs_bincomp_SUITE.erl index fd0223ce83c7..cb4d9cab5b18 100644 --- a/lib/debugger/test/bs_bincomp_SUITE.erl +++ b/lib/debugger/test/bs_bincomp_SUITE.erl @@ -24,11 +24,11 @@ -module(bs_bincomp_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, init_per_testcase/2,end_per_testcase/2, byte_aligned/1,bit_aligned/1,extended_byte_aligned/1, - extended_bit_aligned/1,mixed/1,float_skip/1]). + extended_bit_aligned/1,mixed/1,strict_generators/1,float_skip/1]). -include_lib("common_test/include/ct.hrl"). @@ -43,11 +43,11 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,1}}]. -all() -> +all() -> [byte_aligned, bit_aligned, extended_byte_aligned, - extended_bit_aligned, mixed, float_skip]. + extended_bit_aligned, mixed, strict_generators, float_skip]. -groups() -> +groups() -> []. init_per_suite(Config) -> @@ -126,6 +126,28 @@ mixed(Config) when is_list(Config) -> [(X+Y) || <> <= <<1:3,2:3,3:3,4:3>>, Y <- [1,2]], ok. +strict_generators(Config) when is_list(Config) -> + %% Basic strict generators (each generator type) + <<2,3,4>> = << <<(X+1)>> || X <:- [1,2,3]>>, + <<2,3,4>> = << <<(X+1)>> || <> <:= <<1,2,3>> >>, + <<2,12>> = << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4} >>, + + %% A failing guard following a strict generator is ok + <<3,4>> = << <<(X+1)>> || X <:- [1,2,3], X > 1>>, + <<3,4>> = << <<(X+1)>> || <> <:= <<1,2,3>>, X > 1 >>, + <<12>> = << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4}, X > 1 >>, + + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch << <> || {ok, X} <:- [{ok,1},2,{ok,3}] >>), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch << <> || <<0:1, X:7>> <:= <<1,128,2>> >>), + {'EXIT',{{badmatch,{2,error}},_}} = (catch << <> || X := ok <:- #{1 => ok, 2 => error, 3 => ok} >>), + + %% Extra bits cannot be skipped at the end of the binary either + {'EXIT',{{badmatch,<<0:2>>},_}} = (catch [X || <> <:= <<0>>]), + {'EXIT',{{badmatch,<<9,2>>},_}} = (catch [Y || <> <:= <<8,1,9,2>>]), + + ok. + float_skip(Config) when is_list(Config) -> BadFloat = <<-1:64>>, [1.0,1.5,200.0] = [X || <> <= < [24.0,+48.5,21.0] =[X || <> <= <<24:64/float, BadFloat/binary, 48.5:64/float, 21:64/float>>], [a,a] =[a || <<0:64/float>> <= <<0:64/float, BadFloat/binary, - 0:64/float, 1.0:64/float>>]. \ No newline at end of file + 0:64/float, 1.0:64/float>>]. diff --git a/lib/debugger/test/dbg_ui_SUITE.erl b/lib/debugger/test/dbg_ui_SUITE.erl index ca66f49f0aa4..b4bee285f291 100644 --- a/lib/debugger/test/dbg_ui_SUITE.erl +++ b/lib/debugger/test/dbg_ui_SUITE.erl @@ -192,10 +192,10 @@ Interpret one module"). "Start the debugger and interpret the modules [test, lists1, ordsets1]. Close the Interpret dialog. Set Attach on First Call and Attach on Break."). ?MAN_CASE(all_step3, "Click Step through all evaluation", - "In the shell, call test:test1(). Use the Step button, the Process->Step menu item and the ctrl-s shortcut to step through the *entire* execution of the call. (Approx 36 steps). Then close the Attach window. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). + "In the shell, call test:test1(). Use the Step button, the Process->Step menu item and the Ctrl+S shortcut to step through the *entire* execution of the call. (Approx 36 steps). Then close the Attach window. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). ?MAN_CASE(all_next3,"Click Next through all evaluation", - "Again call test:test1() in the shell. This time Use the Next button, the Process->Next menu and the ctrl-n shortcut to quickly step over the execution of the four lines in the test1-function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). + "Again call test:test1() in the shell. This time Use the Next button, the Process->Next menu and the Ctrl+N shortcut to quickly step over the execution of the four lines in the test1-function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). ?MAN_CASE(save3, "Save the debugger state", "Use File->Save Settings to save the debugger state with the name 'three.state'"). @@ -256,7 +256,7 @@ Interpret one module"). ?MAN_CASE(all_step6, "Click Step through all evaluation", - "In the bar shell, call test:test1().This should open an attach window. Use the Step button, the Process->Step menu item and the ctrl-s shortcut to step through the *entire* execution of the call. (Approx 36 steps). Then close the Attach window. The result printed in the bar shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). + "In the bar shell, call test:test1().This should open an attach window. Use the Step button, the Process->Step menu item and the Ctrl+S shortcut to step through the *entire* execution of the call. (Approx 36 steps). Then close the Attach window. The result printed in the bar shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). ?MAN_CASE(all_next6,"Click Next through all evaluation", - "Again, in the bar shell, call test:test1(). This time Use the Next button, the Process->Next menu and the ctrl-n shortcut to quickly step over the execution of the four lines in the test1-function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). + "Again, in the bar shell, call test:test1(). This time Use the Next button, the Process->Next menu and the Ctrl+N shortcut to quickly step over the execution of the four lines in the test1-function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}"). diff --git a/lib/debugger/test/debugger_SUITE.erl b/lib/debugger/test/debugger_SUITE.erl index 1d77232ad7b1..3435678012cf 100644 --- a/lib/debugger/test/debugger_SUITE.erl +++ b/lib/debugger/test/debugger_SUITE.erl @@ -91,7 +91,7 @@ no_abstract_code(Config) when is_list(Config) -> ok. encrypted_debug_info(Config) when is_list(Config) -> - try begin crypto:start(), crypto:stop(), ok end of + try begin application:start(crypto), application:stop(crypto), ok end of ok -> encrypted_debug_info_1(Config) catch diff --git a/lib/debugger/test/erl_eval_SUITE.erl b/lib/debugger/test/erl_eval_SUITE.erl index 4977b33ee7f4..bfff31ef01d3 100644 --- a/lib/debugger/test/erl_eval_SUITE.erl +++ b/lib/debugger/test/erl_eval_SUITE.erl @@ -29,6 +29,9 @@ pattern_expr/1, guard_3/1, guard_4/1, lc/1, + zlc/1, + zbc/1, + zmc/1, simple_cases/1, unary_plus/1, apply_atom/1, @@ -64,7 +67,8 @@ suite() -> all() -> [guard_1, guard_2, match_pattern, string_plusplus, - pattern_expr, match_bin, guard_3, guard_4, lc, + pattern_expr, match_bin, guard_3, guard_4, + lc, zlc, zbc, zmc, simple_cases, unary_plus, apply_atom, otp_5269, otp_6539, otp_6543, otp_6787, otp_6977, otp_7550, otp_8133, funs, try_catch, eval_expr_5, eep37]. @@ -238,6 +242,160 @@ lc(Config) when is_list(Config) -> "[X || X <- [true,false], X].", [true]), ok. +zlc(Config) when is_list(Config) -> + check(fun() -> + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4,5,6]] + end, + "begin X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4,5,6]] end.", + [{1,4},{2,5},{3,6}]), + check(fun() -> + S1 = [x, y, z], S2 = [5, 10, 15], X = 32, Y = 32, + [{X, Y} || X <- S1 && Y <- S2] + end, + "begin + S1 = [x, y, z], S2 = [5, 10, 15], X = 32, Y = 32, + [{X, Y} || X <- S1 && Y <- S2] + end.", + [{x,5}, {y,10}, {z,15}]), + check(fun() -> + [{X, Y, K} || X <- [1,2,3] && Y:=K <- #{1=>a, 2=>b, 3=>c}] + end, + "begin [{X, Y, K} || X <- [1,2,3] && Y:=K <- #{1=>a, 2=>b, 3=>c}] end.", + [{1,1,a},{2,2,b},{3,3,c}]), + check(fun() -> + [{X, W+Y} || X <- [a, b, c] && <> <= <<2, 4, 6>>, W <- [1,2]] + end, + "begin [{X, W+Y} || X <- [a, b, c] && <> <= <<2, 4, 6>>, W <- [1,2]] end.", + [{a,3}, {a,4}, {b,5}, {b,6}, {c,7}, {c,8}]), + check(fun() -> + [{X, W+Y} || W <- [0], X <- [a, b, c] && <> <= <<2, 4, 6>>, Y<4] + end, + "begin [{X, W+Y} || W <- [0], X <- [a, b, c] && <> <= <<2, 4, 6>>, Y<4] end.", + [{a,2}]), + check(fun() -> + [{X,Y}|| a=b=X <- [1,2] && Y <-[1,2]] end, + "begin [{X,Y}|| a=b=X <- [1,2] && Y <-[1,2]] end.", + []), + check(fun() -> + [{A,B,W} || {Same,W} <- [{a,1}], + {Same,A} <- [{a,1},{b,9},{x,10}] && {Same,B} <- [{a,7},{wrong,8},{x,20}]] + end, + "begin [{A,B,W} || {Same,W} <- [{a,1}], + {Same,A} <- [{a,1},{b,9},{x,10}] && {Same,B} <- [{a,7},{wrong,8},{x,20}]] + end.", + [{1,7,1},{10,20,1}]), + error_check("[X || X <- a && Y <- [1]].",{bad_generators,{a,[1]}}), + error_check("[{X,Y} || X <- a && <> <= <<1,2>>].",{bad_generators,{a,<<1,2>>}}), + error_check("[{X,V} || X <- a && _K := V <- #{b=>3}].",{bad_generators,{a,#{b=>3}}}), + error_check("begin + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4]] end.", + {bad_generators,{[2,3],[]}}), + error_check("begin + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y:=_V <- #{1=>1}] end.", + {bad_generators,{[2,3],#{}}}), + ok. + +zbc(Config) when is_list(Config) -> + check(fun() -> + <<3, 4, 5>> + end, + "begin + X = 32, Y = 32, + << <<(X+Y)/integer>> || <> <= <<1,2,3>> && <> <= <<2,2,2>> >> + end.", + <<3, 4, 5>>), + check(fun() -> + <<4,5,6,5,6,7,6,7,8>> + end, + "begin + X = 32, Y = 32, Z = 32, + << <<(X+Y+Z)/integer>> || <> <= <<1,2,3>> && <> <= <<2,2,2>>, Z<-[1,2,3] >> + end.", + <<4,5,6,5,6,7,6,7,8>>), + check(fun() -> + <<4, 5, 6>> + end, + "begin + L1 = <<1, 2, 3>>, L2 = <<1, 1, 1>>, L3 = <<2, 2, 2>>, + << <<(X+Y+Z)/integer>> || <> <= L1 && <> <= L2 && <> <= L3 >> + end.", + <<4, 5, 6>>), + check(fun() -> + << <<(X+Y):64>>|| a=b=X <- [1,2] && Y <- [1,2] >> end, + "begin << <<(X+Y):64>>|| a=b=X <- [1,2] && Y <- [1,2] >> end.", + <<>>), + check(fun() -> + << <<(X+Y):64>>|| a=b=X <- [1,2] && <> <= <<1,2>> >> end, + "begin << <<(X+Y):64>>|| a=b=X <- [1,2] && <> <= <<1,2>> >> end.", + <<>>), + check(fun() -> + << <<(X+V):64>>|| a=b=X <- [1,2] && _K:=V <- #{a=>1,b=>2}>> end, + "begin << <<(X+V):64>>|| a=b=X <- [1,2] && _K:=V <- #{a=>1,b=>2}>> end.", + <<>>), + error_check("begin << <<(X+Y):8>> || <> <= <<1,2>> && <> <= <<1,2>> >> end.", + {bad_generators,{<<>>,<<1,2>>}}), + error_check("begin << <> || <> <= a && Y <- [1]>> end.",{bad_generators,{a,[1]}}), + error_check("begin + X = 32, Y = 32, + << <<(X+Y)/integer>> || X <- [1,2] && Y <- [1,2,3,4]>> + end.", + {bad_generators,{[],[3,4]}}), + error_check("begin << <> || X <- [1] && Y <- a && <> <= <<2>> >> end.", + {bad_generators,{[1], a, <<2>>}}), + ok. + +zmc(Config) when is_list(Config) -> + check(fun() -> + [{a,b,1,3}] + end, + "begin + M1 = #{a=>1}, M2 = #{b=>3}, + [{K1, K2, V1, V2} || K1 := V1 <- M1 && K2 := V2 <- M2] + end.", + [{a,b,1,3}]), + check(fun() -> + [A * 4 || A <- lists:seq(1, 50)] + end, + "begin + Seq = lists:seq(1, 50), + M1 = maps:iterator(#{X=>X || X <- Seq}, ordered), + M2 = maps:iterator(#{X=>X || X <- lists:seq(1,50)}, ordered), + [X+Y+Z+W || X := Y <- M1 && Z := W <- M2] + end.", + [A * 4 || A <- lists:seq(1, 50)]), + check(fun() -> + [{A, A*3, A*2, A*4} || A <- lists:seq(1, 50)] + end, + "begin + Seq = lists:seq(1, 50), + M3 = maps:iterator(#{X=>X*3 || X <- Seq}, ordered), + M4 = maps:iterator(#{X*2=>X*4 || X <- Seq}, ordered), + [{X, Y, Z, W} || X := Y <- M3 && Z := W <- M4] + end.", + [{A, A*3, A*2, A*4} || A <- lists:seq(1, 50)]), + check(fun() -> + #{K1 => V1+V2 || K1:=V1 <- #{a=>1} && _K2:=V2 <- #{b=>3}} + end, + "begin + #{K1 => V1+V2 || K1:=V1 <- #{a=>1} && _K2:=V2 <- #{b=>3}} + end.", + #{a=>4}), + check(fun() -> + #{K=>V || a := b <- #{x => y} && K := V <- #{x => y}} + end, + "begin + #{K=>V || a := b <- #{x => y} && K := V <- #{x => y}} + end.", + #{}), + error_check("begin + #{K1 => V1+V2 || K1:=V1 <- #{a=>1} && + _K2:=V2 <- maps:iterator(#{b=>3,c=>4}, ordered)} + end.", + {bad_generators,{#{},#{c=>4}}}), + error_check("begin #{X=>Y || X <- [1] && Y <- a && K1:=V1 <- #{b=>3}} end.", + {bad_generators,{[1], a, #{b=>3}}}), + ok. + %% Simple cases, just to cover some code. simple_cases(Config) when is_list(Config) -> check(fun() -> A = $C end, "A = $C.", $C), diff --git a/lib/debugger/test/lc_SUITE.erl b/lib/debugger/test/lc_SUITE.erl index 28415b412bcd..5764095f1b77 100644 --- a/lib/debugger/test/lc_SUITE.erl +++ b/lib/debugger/test/lc_SUITE.erl @@ -34,10 +34,10 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,1}}]. -all() -> +all() -> [basic, deeply_nested, no_generator, empty_generator]. -groups() -> +groups() -> []. init_per_group(_GroupName, Config) -> @@ -84,12 +84,27 @@ basic(Config) when is_list(Config) -> %% Filter expressions with andalso/orelse. "abc123" = alphanum("?abc123.;"), + %% Strict generators (each generator type) + [2,3,4] = [X+1 || X <:- [1,2,3]], + [2,3,4] = [X+1 || <> <:= <<1,2,3>>], + [2,12] = [X*Y || X := Y <:- #{1 => 2, 3 => 4}], + + %% A failing guard following a strict generator is ok + [3,4] = [X+1 || X <:- [1,2,3], X > 1], + [3,4] = [X+1 || <> <:= <<1,2,3>>, X > 1], + [12] = [X*Y || X := Y <:- #{1 => 2, 3 => 4}, X > 1], + %% Error cases. [] = [{xx,X} || X <- L0, element(2, X) == no_no_no], {'EXIT',_} = (catch [X || X <- L1, list_to_atom(X) == dum]), [] = [X || X <- L1, X+1 < 2], {'EXIT',_} = (catch [X || X <- L1, odd(X)]), + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch [X || {ok, X} <:- [{ok,1},2,{ok,3}]]), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch [X || <<0:1, X:7>> <:= <<1,128,2>>]), + {'EXIT',{{badmatch,{2,error}},_}} = (catch [X || X := ok <:- #{1 => ok, 2 => error, 3 => ok}]), + %% A bad generator has a different exception compared to BEAM. {'EXIT',{{bad_generator,x},_}} = (catch [E || E <- id(x)]), ok. diff --git a/lib/debugger/test/mc_SUITE.erl b/lib/debugger/test/mc_SUITE.erl index 0a374cb51ab7..8f304a75c989 100644 --- a/lib/debugger/test/mc_SUITE.erl +++ b/lib/debugger/test/mc_SUITE.erl @@ -125,6 +125,21 @@ basic(_Config) -> N rem 2 =:= 1]), Odd = lists:sort([V || #foo{a=N} := V <- RecordMap, N rem 2 =:= 1]), + %% Strict generators (each generator type) + #{1 := 2, 2 := 3, 3 := 4} = #{X => X+1 || X <:- [1,2,3]}, + #{1 := 2, 2 := 3, 3 := 4} = #{X => X+1 || <> <:= <<1,2,3>>}, + #{2 := 4, 4 := 8} = #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}}, + + %% A failing guard following a strict generator is ok + #{2 := 3, 3 := 4} = #{X => X+1 || X <:- [1,2,3], X > 1}, + #{2 := 3, 3 := 4} = #{X => X+1 || <> <:= <<1,2,3>>, X > 1}, + #{4 := 8} = #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}, X > 1}, + + %% Non-matching elements cause a badmatch error for strict generators + {'EXIT',{{badmatch,2},_}} = (catch #{X => X+1 || {ok, X} <:- [{ok,1},2,{ok,3}]}), + {'EXIT',{{badmatch,<<128,2>>},_}} = (catch #{X => X+1 || <<0:1, X:7>> <:= <<1,128,2>>}), + {'EXIT',{{badmatch,{2,error}},_}} = (catch #{X => X+1 || X := ok <:- #{1 => ok, 2 => error, 3 => ok}}), + ok. mc_double(Size) -> diff --git a/lib/debugger/test/zlc_SUITE.erl b/lib/debugger/test/zlc_SUITE.erl new file mode 100644 index 000000000000..1fd30d520c7b --- /dev/null +++ b/lib/debugger/test/zlc_SUITE.erl @@ -0,0 +1,410 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(zlc_SUITE). + +-export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1, + init_per_group/2,end_per_group/2, + init_per_testcase/2,end_per_testcase/2, + basic/1,mixed_zlc/1,zmc/1,filter_guard/1, + filter_pattern/1,cartesian/1,nomatch/1,bad_generators/1]). + +-include_lib("common_test/include/ct.hrl"). +-include_lib("stdlib/include/assert.hrl"). + +suite() -> + [{ct_hooks,[ts_install_cth]}, + {timetrap,{minutes,1}}]. + +all() -> + [basic, + mixed_zlc, + zmc, + filter_guard, + filter_pattern, + cartesian, + nomatch, + bad_generators]. + +groups() -> + []. + +init_per_suite(Config) when is_list(Config) -> + test_lib:interpret(?MODULE), + true = lists:member(?MODULE, int:interpreted()), + Config. + +end_per_suite(_Config) -> + ok. + +init_per_group(_GroupName, Config) -> + Config. + +end_per_group(_GroupName, Config) -> + Config. + + +init_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + Config. + +end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) -> + ok. + +basic(Config) when is_list(Config) -> + [6, 7, 8] = [X + Y + Z || X <- [1, 2, 3] && Y <- [2, 2, 2] && Z <- [3,3,3]], + [{1, 2, 3}, {2, 2, 3}, {3, 2, 3}] = + [{X, Y, Z} || X <- [1, 2, 3] && Y <- [2, 2, 2] && Z <- [3,3,3]], + [6, 24] = zipwith4(fun(A, B, C, D) -> (A + B + C) * D end, + [1, 5], [2, 2], [0, 1], [2, 3]), + 96 = dot([1, 2, 3, 4], [24, 12, 8, 6]), + + [1, 4, 5] = ifelse([true, false, true], [1, 3, 5], [2, 4, 6]), + + [8, 14, 20] = [X + Y + Z || <> <= <<5, 10, 15>> && <> <= <<1, 2, 3>> + && <> <= <<2, 2, 2>>]. + + +zipwith4(F, As, Bs, Cs, Ds) -> + [F(A,B,C,D) || A <- As && B <- Bs && C <- Cs && D <- Ds]. + +dot(Xs, Ys) -> + lists:sum([X*Y || X <- Xs && Y <- Ys]). + +ifelse(Tests, Xs, Ys) -> + %% Simulate R's ifelse(,,) + [case T of + true -> X; + false -> Y + end || T <- Tests && X <- Xs && Y <- Ys + ]. + +mixed_zlc(Config) when is_list(Config) -> + [{a, 2}, {b, 4}, {c, 6}] = [{X,Y} || X <- [a,b,c] && <> <= <<2,4,6>>], + [{a, 2}, {b, 4}, {c, 6}] = [{X,Y} || <> <= <<2,4,6>> && X <- [a,b,c]], + [{a,c,1,3}, {b,d,2,4}] = [{K1,K2,V1,V2}|| + K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + K2 := V2 <- maps:iterator(#{c=>3, d=>4}, ordered)], + [{a,1,2}, {b,2,4}] = + [{K1,V1,Y} || K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + <> <= <<2,4>>], + [{a,1,2}, {b,2,4}] = [{K1,V1,Y} || + K1 := V1 <- maps:iterator(#{a=>1, b=>2}, ordered) && + <> <= <<2,4>>], + <<3,4,5>> = << <<(X+Y)/integer>> || X <- [1,2,3] && Y <- [2,2,2]>>, + <<3,4,5>> = << <<(X+V1)/integer>> || + X <- [1,2,3] && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + <<3,4,5>> = << <<(X+V1)/integer>> || + <> <= <<1,2,3>> && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + <<3,4,5>> = << <<(V1+V2)/integer>> || + _K1 := V1 <- maps:iterator(#{a=>1, b=>2, c=>3}, ordered) && + _K2 := V2 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered)>>, + #{c := 3,b := 2,a := 1} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3]}, + #{c := 3,b := 2,a := 1} = #{X => Y || X <- [a,b,c] && <> <= <<1,2,3>>}, + ok. + +zmc(Config) when is_list(Config) -> + [{a,b,1,3}] = [{K1, K2, V1, V2} || K1 := V1 <- #{a=>1} && K2 := V2 <- #{b=>3}], + Seq = lists:seq(1, 50), + M1 = maps:iterator(#{X=>X || X <- Seq}, ordered), + M2 = maps:iterator(#{X=>X || X <- lists:seq(1,50)}, ordered), + true = [A * 4 || A <- Seq] =:= + [X+Y+Z+W || X := Y <- M1 && Z := W <- M2], + true = << <<(A * 4):64>> || A <- Seq>> =:= + << <<(X+Y+Z+W):64>> || X := Y <- M1 && Z := W <- M2>>, + + M3 = maps:iterator(#{X=>X*3 || X <- Seq}, ordered), + M4 = maps:iterator(#{X*2=>X*4 || X <- Seq}, ordered), + true = [{A, A*3, A*2, A*4} || A <- Seq] =:= + [{X, Y, Z, W} || X := Y <- M3 && Z := W <- M4], + true = [A * 3 || A <- Seq] =:= [X+Y+Z || X := Y <- M1 && Z <- Seq], + true = << <> || A <- Seq>> =:= + << <> || X := Y <- M3 && Z := W <- M4>>, + true = << <<(A*3):64>> || A <- Seq>> =:= + << <<(X+Y+Z):64>> || X := Y <- M1 && Z <- Seq>>, + + M5 = maps:iterator(#{X => + case X rem 2 of + 0 -> {ok,X}; + 1 -> {error,X} + end || X <- Seq}, ordered), + M6 = maps:iterator(#{X*2 => X*4 || X <- Seq}, ordered), + [] = [X || {{X,{ok,X}}, {_,X}} <- lists:zip(maps:to_list(M5), maps:to_list(M6))], + [] = [X || X := {ok,X} <- M5 && _ := X <- M6], + [] = [X || X := {e,X} <- M5 && X := {ok,X} <- M5], + ok. + +filter_guard(Config) when is_list(Config) -> + [[1,2,1]] = [X++Y || X <- [[1,2], [2,-3]] && Y <- [[1], [2]], lists:sum(X)>0], + [{a,2}, {b,4}, {c,6}] = [{X,Y} || X <- [a,b,c] && <> <= <<2,4,6>>, + Y rem 2 == 0], + [{b,4}, {c,6}] = [{X, Y} || X <- [a,b,c] && <> <= <<2,4,6>>, Y =/= 2], + [] = [{X,Y} || X <- [a, b, c] && <> <= <<2,4,6>>, Y rem 2 == 1], + [{b,4}] = [{X,Y} || <> <= <<2,4,6>> && X <- [a,b,c], X>a, X1, b=>2}, ordered) && + K2 := V2 <- maps:iterator(#{c=>3, d=>4}, ordered), + V2 rem 2 == 0], + <<5>> = << <<(X+Y)/integer>> || X <- [1,2,3] && Y <- [2,2,2], X rem 2 == 1, X+Y>4>>, + #{c := 3,a := 1} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3], Y rem 2 == 1}, + #{c := 3} = #{X => Y || X <- [a,b,c] && Y <- [1,2,3], Y rem 2 == 1, Y > 1}, + #{c := 3,a := 1} = #{X => Y || X <- [a,b,c] && <> <= <<1,2,3>>, Y rem 2 == 1}. + +filter_pattern(Config) when is_list(Config) -> + [] = do_filter_pat_1([], []), + [] = do_filter_pat_1([a], [a]), + [] = do_filter_pat_1([{ok,a}], [{error,e}]), + + [] = do_filter_pat_2([], []), + [] = do_filter_pat_2([a], [b]), + [] = do_filter_pat_2([{a,1}], [{b,1}]), + [{1,7}] = do_filter_pat_2([{a,1}], [{a,7}]), + [{1,7},{10,20}] = do_filter_pat_2([{a,1},{b,9},{x,10}], + [{a,7},{wrong,8},{x,20}]), + + ok. + +do_filter_pat_1(L1, L2) -> + Res = [{A,B} || {ok,A} <- L1 && {ok,B} <- L2], + Res = [{A,B} || {{ok,A},{ok,B}} <- lists:zip(L1,L2)], + Res. + +do_filter_pat_2(L1, L2) -> + Res = [{A,B} || {Same,A} <- L1 && {Same,B} <- L2], + Res = [{A,B} || {{Same,A},{Same,B}} <- lists:zip(L1,L2)], + Res. + +cartesian(Config) when is_list(Config) -> + [{a,3}, {b,5}, {c,7}, {a,4}, {b,6}, {c,8}] = + [{X, W+Y} || W <- [1,2], + X <- [a,b,c] && <> <= <<2,4,6>>], + [{a,3}, {a,4}, {b,5}, {b,6}, {c,7}, {c,8}] = + [{X, W+Y} || X <- [a,b,c] && + <> <= <<2,4,6>>, W <- [1,2]], + [{a,4}, {b,6}, {c,8}] = + [{X, W+Y} || X <- [a,b,c] && + <> <= <<2,4,6>>, W <- [1,2], (W + Y) rem 2 == 0], + <<4,2,5,3,6,4>> = << <<(X+V1+Y)/integer>> || + X <- [1,2,3] && + _K1 := V1 <- maps:iterator(#{a=>2, b=>2, c=>2}, ordered), + <> <= <<1,-1>> >>, + ok. + +strict_list(Config) when is_list(Config) -> + Seq100 = lists:seq(1, 100), + + [2,3,4] = [X+Y || X <:- [1,2,3] && Y <- [1,1,1]], + [3,4] = [X+Y || X <:- [1,2,3] && Y <:- [1,1,1], X > 1], + + [] = strict_list_mixed_1([], []), + [11,22] = strict_list_mixed_1([{i,1},{i,2}], [{i,10},{i,20}]), + [13,25] = strict_list_mixed_1([{i,3},{i,4},{i,5}], [{i,10},bad,{i,20}]), + {'EXIT',{{bad_generators,{[bad,{i,5}],[{i,15},{i,20}]}},_}} = + catch strict_list_mixed_1([{i,3},bad,{i,5}], [{i,10},{i,15},{i,20}]), + {'EXIT',{{bad_generators,{[{i,5}],[]}},_}} = + catch strict_list_mixed_1([{i,3},{i,5}], [bad]), + + [] = strict_list_mixed_2([], #{}), + [15] = strict_list_mixed_2([{i,3}], #{{k,4} => {v,3}}), + [15] = strict_list_mixed_2([{i,0},{i,3}], #{{a,0} => {a,0}, + {k,4} => {v,3}}), + + ?assertEqual([I * 3*I + 7*I || I <- Seq100], + strict_list_mixed_2([{i,I} || I <- Seq100], + #{{k,3*I} => {v,7*I} || I <- Seq100})), + SimpleMap = #{{k,1} => {v,2}}, + {'EXIT',{{bad_generators,{[{a,3}],{{k,1},{v,2},none}}},_}} = + catch strict_list_mixed_2([{a,3}], SimpleMap), + {'EXIT',{{bad_generators,{[],{{k,1},{v,2},none}}},_}} = + catch strict_list_mixed_2([], SimpleMap), + + [] = strict_list_strict_1([], []), + [11,22] = strict_list_strict_1([{i,1},{i,2}], [{i,10},{i,20}]), + {'EXIT',{{bad_generators,{[bad,{i,5}],[{i,15},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},bad,{i,5}], [{i,10},{i,15},{i,20}]), + {'EXIT',{{bad_generators,{[{i,4},{i,5}],[{wrong_tag,7},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},{i,4},{i,5}], [{i,10},{wrong_tag,7},{i,20}]), + {'EXIT',{{bad_generators,{[{a,b,c},{i,5}],[{wrong_tag,7},{i,20}]}},_}} = + catch strict_list_strict_1([{i,3},{a,b,c},{i,5}], [{i,10},{wrong_tag,7},{i,20}]), + {'EXIT',{{bad_generators,{[{i,5}],[]}},_}} = + catch strict_list_strict_1([{i,3},{i,5}], [{i,7}]), + + [] = strict_list_strict_2([], [], <<>>), + [5,23] = strict_list_strict_2([{i,1},{i,2}], [{i,2},{i,7}], <<3,9>>), + ?assertEqual([2*I * 3*I + I || I <- Seq100], + strict_list_strict_2([{i,2*I} || I <- Seq100], + [{i,3*I} || I <- Seq100], + list_to_binary(Seq100))), + {'EXIT',{{bad_generators,{[{i,2}],[{i,7}],<<9:7>>}},_}} = + catch strict_list_strict_2([{i,1},{i,2}], [{i,2},{i,7}], <<3,9:7>>), + {'EXIT',{{bad_generators,{[],[],[]}},_}} = + catch strict_list_strict_2([], [], []), + {'EXIT',{{bad_generators,{[{i,0}],[],<<>>}},_}} = + catch strict_list_strict_2([{i,0}], [], <<>>), + {'EXIT',{{bad_generators,{[{i,0}],[{bad,5}],<<99>>}},_}} = + catch strict_list_strict_2([{i,0}], [{bad,5}], <<99>>), + {'EXIT',{{bad_generators,{[{i,20}],[{i,21}],<<42:7>>}},_}} = + catch strict_list_strict_2([{i,20}], [{i,21}], <<42:7>>), + + [] = strict_list_strict_3([], <<>>), + [45] = strict_list_strict_3([{i,42}], <<3>>), + {'EXIT',{{bad_generators,{[],<<2>>}},_}} = + catch strict_list_strict_3([{i,1}], <<1,2>>), + {'EXIT',{{bad_generators,{[],<<0:7>>}},_}} = + catch strict_list_strict_3([], <<0:7>>), + {'EXIT',{{bad_generators,{[{i,1}],<<0:7>>}},_}} = + catch strict_list_strict_3([{i,1}], <<0:7>>), + + [] = strict_list_strict_4([], <<>>), + [100] = strict_list_strict_4([{i,100}], <<42>>), + {'EXIT',{{bad_generators,{[{i,100}],<<0>>}},_}} = + catch strict_list_strict_4([{i,100}], <<0>>), + {'EXIT',{{bad_generators,{[{i,100}],<<>>}},_}} = + catch strict_list_strict_4([{i,100}], <<>>), + {'EXIT',{{bad_generators,{[{i,100}],<<0:8,1:1>>}},_}} = + catch strict_list_strict_4([{i,100}], <<0:8,1:1>>), + + NaN = <<-1:64>>, + [] = strict_list_5(<<>>, <<>>), + [3.14] = strict_list_5(<<0:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>), + [0.0,3.14] = strict_list_5(<<1:1,1:1>>, <<32,0.0:32/float, 64,3.14:64/float>>), + {'EXIT',{{bad_generators,{<<>>,<<64,42.0/float>>}},_}} = + catch strict_list_5(<<>>, <<64,42.0/float>>), + {'EXIT',{{bad_generators,{<<0:1,1:1>>, + <<117,-1:117/signed,32,17.0:32/float>>}},_}} = + catch strict_list_5(<<0:1,1:1>>, <<117,-1:117, 32,17.0:32/float>>), + {'EXIT',{{bad_generators,{<<0:1>>,<<64,NaN/binary>>}},_}} = + catch strict_list_5(<<1:1,0:1>>, <<32,42.0:32/float, 64,NaN/binary>>), + {'EXIT',{{bad_generators,{<<1:1>>,<<64,NaN/binary>>}},_}} = + catch strict_list_5(<<1:1,1:1>>, <<32,42.0:32/float, 64,NaN/binary>>), + + ok. + +strict_list_mixed_1(X, Y) -> + [A + B || {i,A} <:- X && {i,B} <- Y]. + +strict_list_mixed_2(L, Map0) -> + Map = maps:iterator(Map0, ordered), + [A * B + C || {i,A} <:- L && {k,B} := {v,C} <- Map]. + +strict_list_strict_1(X, Y) -> + [A + B || {i,A} <:- X && {i,B} <:- Y]. + +strict_list_strict_2(X, Y, Z) -> + [A * B + C || {i,A} <:- X && {i,B} <:- Y && <> <:= Z]. + +strict_list_strict_3(List, Bin) -> + [A + B || {i,A} <:- List && <> <:= Bin]. + +strict_list_strict_4(List, Bin) -> + [A || {i,A} <:- List && <<42:8>> <:= Bin]. + +strict_list_5(Wanted, Floats) -> + Res = [F || <> <:= Wanted && <> <:= Floats, W =:= 1], + Res = [F || <<1:1>> <= Wanted && <> <:= Floats], + Res. + +strict_binary(Config) when is_list(Config) -> + Seq100 = lists:seq(1, 100), + + <<2,4,6>> = << <<(X+Y)>> || X <:- [1,2,3] && <> <= <<1,2,3>>>>, + <<2,4>> = << <<(X+Y)>> || <> <:= <<1,2,3>> && {X, Y} <- [{1,1},{2,2},{2,3}]>>, + <<2,24>> = << <<(X*Y*Z)>> || X := Y <:- #{1 => 2, 3 => 4} && <> <:= <<1,2>> >>, + + <<>> = strict_binary_1(#{}, <<>>), + <<24:64>> = strict_binary_1(#{2 => {val,3}}, <<4:8>>), + ?assertEqual(<< <<(5*I * 3*I * I):64>> || I <- Seq100 >>, + strict_binary_1(maps:iterator(#{5*I => {val,3*I} || I <- Seq100}, ordered), + list_to_binary(Seq100))), + {'EXIT',{{bad_generators,{none,<<42:8>>}},_}} = catch strict_binary_1(#{}, <<42:8>>), + {'EXIT',{{bad_generators,{none,<<42:7>>}},_}} = catch strict_binary_1(#{}, <<42:7>>), + {'EXIT',{{bad_generators,{none,<<0:4>>}},_}} = catch strict_binary_1(#{2 => {val,3}}, <<0,0:4>>), + + <<>> = strict_binary_mixed_1(<<>>, #{}, #{}), + <<>> = strict_binary_mixed_1(<<1:2>>, #{}, #{}), + <<999:64>> = strict_binary_mixed_1(<<1:1>>, #{0 => {v,0}}, #{1 => {v,999}}), + ?assertEqual(<< <> || I <- Seq100>>, + strict_binary_mixed_1(<<0:100>>, + #{I => {v,I} || I <- Seq100}, + #{I => {v,-I} || I <- Seq100})), + ?assertEqual(<< <<-I:64>> || I <- Seq100>>, + strict_binary_mixed_1(<<-1:100>>, + #{I => {v,I} || I <- Seq100}, + #{I => {v,-I} || I <- Seq100})), + {'EXIT',{{bad_generators,{<<0:1>>,{0,0,none},{0,{v,7},none}}},_}} = + catch strict_binary_mixed_1(<<0:1>>, #{0 => 0}, #{0 => {v,7}}), + + Island = ~"skärgårdsö", + IslandSeq = lists:seq(1, length([C || <> <= Island])), + ?assertEqual(<< <> || + {I,C} <:- lists:zip(IslandSeq, [C || <> <= Island]) >>, + strict_binary_utf8(IslandSeq, Island)), + {'EXIT',{{bad_generators,{[4,5,6,7,8],<<16#ff,16#ff,"def">>}},_}} = + catch strict_binary_utf8(lists:seq(1, 8), <<"abc",16#ff,16#ff,"def">>), + + ok. + +strict_binary_1(Map, Bin) -> + << <<(X*Y*Z):64>> || X := {val,Y} <:- Map && <> <:= Bin >>. + +strict_binary_utf8(List, Bin) -> + << <> || I <:- List && <> <:= Bin >>. + +strict_binary_mixed_1(Bin, MapA0, MapB0) -> + MapA = maps:iterator(MapA0, ordered), + MapB = maps:iterator(MapB0, ordered), + < <>; + 1 -> <> + end || <> <= Bin && _ := {v,V1} <:- MapA && _ := {v,V2} <- MapB>>. + +nomatch(Config) when is_list(Config) -> + [] = do_nomatch_1([], []), + [] = do_nomatch_1([1], [a]), + [] = do_nomatch_1([1,2], [a,b]), + {'EXIT',{{bad_generators,{[1,2,3],[]}},_}} = do_nomatch_1([1,2,3], []), + {'EXIT',{{bad_generators,{[3],[]}},_}} = do_nomatch_1([1,2,3], [a,b]), + + <<>> = do_nomatch_2([], <<>>), + <<>> = do_nomatch_2([a], <<1>>), + {'EXIT',{{bad_generators,{[2],<<>>}},_}} = do_nomatch_2([1,2], <<3>>), + ok. + +do_nomatch_1(L1, L2) -> + catch [{X, Y} || a=b=X <- L1 && Y <- L2]. + +do_nomatch_2(L, Bin) -> + catch << <<(X+Y)/integer>> || a=b=X <- L && <> <= Bin >>. + +bad_generators(Config) when is_list(Config) -> + {'EXIT',{{bad_generators,{x,[1,2]}},_}} = + catch [{X,Y} || X <- x && Y <- [1,2]], + {'EXIT',{{bad_generators,{[],[4]}},_}} = + catch [{X,Y} || X <- [1,2,3] && Y <- [1,2,3,4]], + {'EXIT',{{bad_generators,{[3,4],[]}},_}} = + catch [{X,Y} || X <- [1,2,3,4] && Y <- [1,2], X < 3], + {'EXIT',{{bad_generators,{[3,4],[]}},_}} = + catch << <<(X+Y)/integer>> || X <- [1,2,3,4] && Y <- [1,2], X < 3>>, + {'EXIT',{{bad_generators,{<<1,2>>,a}},_}} = + catch << <> || <> <= <<1:8,2:8>> && <> <= a>>, + {'EXIT',{{bad_generator,a},_}} = catch [X || X := X <- a && _Y <- [1]], + {'EXIT',{{bad_generators,{[d],[]}},_}} = + catch #{X => Y || X <- [a,b,c,d] && Y <- [1,2,3], Y > 1}, + + ok. diff --git a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl index a190e9e7af96..5ab85f170572 100644 --- a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl +++ b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl @@ -134,7 +134,7 @@ analysis_start(Parent, Analysis, LegalWarnings) -> Plt1 = dialyzer_plt:insert_callbacks(Plt1_a, NewCServer), State1 = State#analysis_state{codeserver = NewCServer, plt = Plt1}, Exports = dialyzer_codeserver:get_exports(NewCServer), - NonExports = sets:subtract(sets:from_list(AllNodes, [{version, 2}]), Exports), + NonExports = sets:subtract(sets:from_list(AllNodes), Exports), NonExportsList = sets:to_list(NonExports), State2 = analyze_callgraph(Callgraph, State1), ModTypeDeps = dict:from_list(maps:to_list(dialyzer_typegraph:module_type_deps(Analysis#analysis.use_contracts, CServer, Modules))), @@ -385,7 +385,7 @@ cleanup_callgraph(#analysis_state{plt = InitPlt, parent = Parent, {BadCalls1, RealExtCalls} = if ExtCalls1 =:= [] -> {[], []}; true -> - ModuleSet = sets:from_list(Modules, [{version, 2}]), + ModuleSet = sets:from_list(Modules), PltModuleSet = dialyzer_plt:all_modules(InitPlt), AllModules = sets:union(ModuleSet, PltModuleSet), Pred = fun({_From2, {M, _F, _A}}) -> sets:is_element(M, AllModules) end, @@ -478,7 +478,7 @@ get_exported_types_from_core(Core) -> cerl:concrete(L1) =:= 'export_type'], ExpTypes2 = lists:flatten(ExpTypes1), M = cerl:atom_val(cerl:module_name(Core)), - sets:from_list([{M, F, A} || {F, A} <- ExpTypes2], [{version, 2}]). + sets:from_list([{M, F, A} || {F, A} <- ExpTypes2]). get_exports_from_core(Core) -> Tree = cerl:from_records(Core), diff --git a/lib/dialyzer/src/dialyzer_callgraph.erl b/lib/dialyzer/src/dialyzer_callgraph.erl index 618a032ba742..ab622f01ba81 100644 --- a/lib/dialyzer/src/dialyzer_callgraph.erl +++ b/lib/dialyzer/src/dialyzer_callgraph.erl @@ -206,7 +206,7 @@ remove_external(#callgraph{digraph = DG} = CG) -> non_local_calls(#callgraph{digraph = DG}) -> Edges = digraph_edges(DG), - find_non_local_calls(Edges, sets:new([{version, 2}])). + find_non_local_calls(Edges, sets:new()). -type call_tab() :: sets:set(mfa_call()). @@ -258,7 +258,7 @@ modules(#callgraph{digraph = DG}) -> -spec module_postorder(callgraph()) -> {[module()], {'d', digraph:graph()}}. module_postorder(#callgraph{digraph = DG}) -> - Edges = lists:foldl(fun edge_fold/2, sets:new([{version, 2}]), digraph_edges(DG)), + Edges = lists:foldl(fun edge_fold/2, sets:new(), digraph_edges(DG)), Modules = ordsets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]), MDG = digraph:new([acyclic]), digraph_confirm_vertices(Modules, MDG), @@ -281,7 +281,7 @@ edge_fold(_, Set) -> Set. -spec module_call_deps(callgraph()) -> mod_deps(). module_call_deps(#callgraph{digraph = DG}) -> - Edges = lists:foldl(fun edge_fold/2, sets:new([{version, 2}]), digraph_edges(DG)), + Edges = lists:foldl(fun edge_fold/2, sets:new(), digraph_edges(DG)), Modules = ordsets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]), MDG = digraph:new(), digraph_confirm_vertices(Modules, MDG), diff --git a/lib/dialyzer/src/dialyzer_cl.erl b/lib/dialyzer/src/dialyzer_cl.erl index e827480687ec..9716e2792856 100644 --- a/lib/dialyzer/src/dialyzer_cl.erl +++ b/lib/dialyzer/src/dialyzer_cl.erl @@ -486,8 +486,8 @@ clean_plt(PltFile, RemovedMods) -> Plt, RemovedMods). expand_dependent_modules(Md5, DiffMd5, ModDeps) -> - ChangedMods = sets:from_list([M || {differ, M} <- DiffMd5], [{version, 2}]), - RemovedMods = sets:from_list([M || {removed, M} <- DiffMd5], [{version, 2}]), + ChangedMods = sets:from_list([M || {differ, M} <- DiffMd5]), + RemovedMods = sets:from_list([M || {removed, M} <- DiffMd5]), BigSet = sets:union(ChangedMods, RemovedMods), BigList = sets:to_list(BigSet), ExpandedSet = expand_dependent_modules_1(BigList, BigSet, ModDeps), @@ -705,10 +705,16 @@ set_location(Location, _EOpt) -> print_ext_calls(#cl_state{report_mode = quiet}) -> ok; -print_ext_calls(#cl_state{output = Output, - external_calls = Calls, - stored_warnings = Warnings, - output_format = Format}) -> +print_ext_calls(#cl_state{legal_warnings = LegalWarnings}=State) -> + case ordsets:is_element(?WARN_UNKNOWN, LegalWarnings) of + true -> print_ext_calls_1(State); + false -> ok + end. + +print_ext_calls_1(#cl_state{output = Output, + external_calls = Calls, + stored_warnings = Warnings, + output_format = Format}) -> case Calls =:= [] of true -> ok; false -> @@ -736,11 +742,17 @@ do_print_ext_calls(_, [], _) -> print_ext_types(#cl_state{report_mode = quiet}) -> ok; -print_ext_types(#cl_state{output = Output, - external_calls = Calls, - external_types = Types, - stored_warnings = Warnings, - output_format = Format}) -> +print_ext_types(#cl_state{legal_warnings = LegalWarnings}=State) -> + case ordsets:is_element(?WARN_UNKNOWN, LegalWarnings) of + true -> print_ext_types_1(State); + false -> ok + end. + +print_ext_types_1(#cl_state{output = Output, + external_calls = Calls, + external_types = Types, + stored_warnings = Warnings, + output_format = Format}) -> case Types =:= [] of true -> ok; false -> diff --git a/lib/dialyzer/src/dialyzer_codeserver.erl b/lib/dialyzer/src/dialyzer_codeserver.erl index 454a8c0d6a65..65a7887b8a66 100644 --- a/lib/dialyzer/src/dialyzer_codeserver.erl +++ b/lib/dialyzer/src/dialyzer_codeserver.erl @@ -124,7 +124,7 @@ ets_set_insert_list(List, Table) -> ets_set_to_set(Table) -> Fold = fun({E}, Set) -> sets:add_element(E, Set) end, - ets:foldl(Fold, sets:new([{version, 2}]), Table). + ets:foldl(Fold, sets:new(), Table). %%-------------------------------------------------------------------- diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl index fa8bbf00efd1..91879198b1c8 100644 --- a/lib/dialyzer/src/dialyzer_dataflow.erl +++ b/lib/dialyzer/src/dialyzer_dataflow.erl @@ -2904,7 +2904,7 @@ state__new(Callgraph, Codeserver, Tree, Plt, Module, Records) -> envs = Env, fun_tab = FunTab, fun_homes = FunHomes, opaques = Opaques, plt = Plt, records = Records, warning_mode = false, warnings = [], work = Work, tree_map = TreeMap, - module = Module, reachable_funs = sets:new([{version, 2}])}. + module = Module, reachable_funs = sets:new()}. state__warning_mode(#state{warning_mode = WM}) -> WM. @@ -3315,7 +3315,7 @@ state__translate_file(FakeFile, State) -> %%% =========================================================================== init_work(List) -> - {List, [], sets:from_list(List, [{version, 2}])}. + {List, [], sets:from_list(List)}. get_work({[], [], _Set}) -> none; diff --git a/lib/dialyzer/src/dialyzer_dep.erl b/lib/dialyzer/src/dialyzer_dep.erl index 83b86ba6e0a1..16afac00d803 100644 --- a/lib/dialyzer/src/dialyzer_dep.erl +++ b/lib/dialyzer/src/dialyzer_dep.erl @@ -384,10 +384,10 @@ is_literal_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> false. -record(set, {set :: sets:set()}). set__singleton(Val) -> - #set{set = sets:add_element(Val, sets:new([{version, 2}]))}. + #set{set = sets:add_element(Val, sets:new())}. set__from_list(List) -> - #set{set = sets:from_list(List, [{version, 2}])}. + #set{set = sets:from_list(List)}. set__is_element(_El, none) -> false; diff --git a/lib/dialyzer/src/dialyzer_iplt.erl b/lib/dialyzer/src/dialyzer_iplt.erl index f16f6399e09c..819592574fae 100644 --- a/lib/dialyzer/src/dialyzer_iplt.erl +++ b/lib/dialyzer/src/dialyzer_iplt.erl @@ -262,7 +262,7 @@ to_file_custom_vsn( Info = maps:from_list(dialyzer_utils:ets_tab2list(ETSInfo)), Types = dialyzer_utils:ets_tab2list(ETSTypes), Contracts = maps:from_list(dialyzer_utils:ets_tab2list(ETSContracts)), - ExpTypes = sets:from_list([E || {E} <- dialyzer_utils:ets_tab2list(ETSExpTypes)], [{version, 2}]), + ExpTypes = sets:from_list([E || {E} <- dialyzer_utils:ets_tab2list(ETSExpTypes)]), Record = #ifile_plt{version = Vsn, module_md5_list = MD5, info = term_to_binary(Info, [{compressed,9}]), diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl index 039b90585f84..1a4853cb239b 100644 --- a/lib/dialyzer/src/dialyzer_typesig.erl +++ b/lib/dialyzer/src/dialyzer_typesig.erl @@ -182,7 +182,7 @@ analyze_scc(SCC, NextLabel, CallGraph, CServer, Plt, PropTypes, Solvers0) -> Solvers = solvers(Solvers0), State1 = new_state(SCC, NextLabel, CallGraph, CServer, Plt, PropTypes, Solvers), - DefSet = add_def_list(maps:values(State1#state.name_map), sets:new([{version, 2}])), + DefSet = add_def_list(maps:values(State1#state.name_map), sets:new()), State2 = traverse_scc(SCC, CServer, DefSet, State1), State3 = state__finalize(State2), Funs = state__scc(State3), diff --git a/lib/dialyzer/src/dialyzer_utils.erl b/lib/dialyzer/src/dialyzer_utils.erl index 93eaaa6417cb..3868851b0a75 100644 --- a/lib/dialyzer/src/dialyzer_utils.erl +++ b/lib/dialyzer/src/dialyzer_utils.erl @@ -562,7 +562,7 @@ core_to_attr_tuples(Core) -> %% Starting from Erlang/OTP 26, locally defining a type having %% the same name as a built-in type is allowed. Change the tag %% from `type` to `user_type` for all such redefinitions. - massage_forms(As, sets:new([{version, 2}])) + massage_forms(As, sets:new()) end. get_core_location([L | _As]) when is_integer(L) -> L; diff --git a/lib/dialyzer/test/indent_SUITE_data/src/record_send_test.erl b/lib/dialyzer/test/indent_SUITE_data/src/record_send_test.erl index 87cd97bd85de..a6e297950b44 100644 --- a/lib/dialyzer/test/indent_SUITE_data/src/record_send_test.erl +++ b/lib/dialyzer/test/indent_SUITE_data/src/record_send_test.erl @@ -4,7 +4,7 @@ %% Description : A test inspired by a post of Mkcael Remond to the %% Erlang mailing list suggesting thst Dialyzer should %% be reporting sends to records rather than to pids. -%% Dialyzer v1.3.0 indeed reports one of the dicrepancies +%% Dialyzer v1.3.0 indeed reports one of the discrepancies %% (the one with the 4-tuple) but not the one where the %% message is sent to a pair which is a record. %% This should be fixed. diff --git a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl index 97c92a2dd176..f3eaa7847193 100644 --- a/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl +++ b/lib/dialyzer/test/r9c_SUITE_data/src/asn1/asn1rt_per.erl @@ -1346,7 +1346,7 @@ create_char_tab(_Min,[],_V) -> create_char_tab(Min,L,V) -> [false|create_char_tab(Min+1,L,V)]. -%% This very inefficient and should be moved to compiletime +%% This is very inefficient and should be moved to compile time charbits(NumOfChars,aligned) -> case charbits(NumOfChars) of 1 -> 1; diff --git a/lib/diameter/test/diameter_tls_SUITE.erl b/lib/diameter/test/diameter_tls_SUITE.erl index eb23ccbf2137..118cefb4d46b 100644 --- a/lib/diameter/test/diameter_tls_SUITE.erl +++ b/lib/diameter/test/diameter_tls_SUITE.erl @@ -143,7 +143,7 @@ init_per_suite(Config) -> try [] == (catch make_certs(dir(Config2))) orelse throw({?MODULE, no_certs}), - ok == crypto:start() orelse throw({?MODULE, no_crypto}), + ok == application:start(crypto) orelse throw({?MODULE, no_crypto}), ok == ssl:start() orelse throw({?MODULE, no_ssl}), Config2 catch @@ -155,7 +155,7 @@ end_per_suite(Config) -> ?TL("end_per_suite -> entry with" "~n Config: ~p", [Config]), ssl:stop(), - crypto:stop(), + application:stop(crypto), ?DUTIL:end_per_suite(Config). %% This test case can take a *long* time, so if the machine is too slow, skip @@ -208,7 +208,7 @@ run() -> run(Dir, B) -> ?TL("run -> start crypto"), - crypto:start(), + application:start(crypto), ?TL("run -> start ssl"), ssl:start(), try @@ -220,7 +220,7 @@ run(Dir, B) -> ?TL("run(after) -> stop ssl"), ssl:stop(), ?TL("run(after) -> stop crypto"), - crypto:stop(), + application:stop(crypto), ?TL("run(after) -> done"), ok end. diff --git a/lib/erl_interface/configure b/lib/erl_interface/configure index 9eb2eabe2707..13d1b0c15310 100755 --- a/lib/erl_interface/configure +++ b/lib/erl_interface/configure @@ -2898,6 +2898,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi #### Make srcdir absolute, if it isn't already. It's important to #### avoid running the path through pwd unnecessary, since pwd can @@ -3044,6 +3055,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3058,6 +3076,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3072,6 +3097,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3083,18 +3115,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -9922,7 +9955,7 @@ esac # --------------------------------------------------------------------------- -WFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS" +WFLAGS="$WERRORFLAGS $DED_WERRORFLAGS $DED_WARN_FLAGS" if test "x$GCC" = xyes then : WFLAGS="$WFLAGS -Wmissing-declarations -Wnested-externs -Winline" @@ -10015,6 +10048,11 @@ esac fi + +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + # --------------------------------------------------------------------------- # XXX # --------------------------------------------------------------------------- diff --git a/lib/erl_interface/configure.ac b/lib/erl_interface/configure.ac index 4874fd031348..1b20cc8d65b4 100644 --- a/lib/erl_interface/configure.ac +++ b/lib/erl_interface/configure.ac @@ -31,6 +31,8 @@ AC_PREREQ([2.72]) m4_include([otp.m4]) +ERL_PUSH_WERROR + dnl How to set srcdir absolute is taken from the GNU Emacs distribution #### Make srcdir absolute, if it isn't already. It's important to #### avoid running the path through pwd unnecessary, since pwd can @@ -325,7 +327,7 @@ AS_CASE(["$threads_disabled"], # --------------------------------------------------------------------------- AC_SUBST(WFLAGS) -WFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS" +WFLAGS="$WERRORFLAGS $DED_WERRORFLAGS $DED_WARN_FLAGS" AS_IF([test "x$GCC" = xyes], [WFLAGS="$WFLAGS -Wmissing-declarations -Wnested-externs -Winline"]) @@ -338,6 +340,8 @@ LM_TRY_ENABLE_CFLAG([-fno-common], [CFLAGS]) # No strict aliasing until we determined it is safe... LM_TRY_ENABLE_CFLAG([-fno-strict-aliasing], [CFLAGS]) +ERL_POP_WERROR + # --------------------------------------------------------------------------- # XXX # --------------------------------------------------------------------------- diff --git a/lib/erl_interface/src/misc/ei_format.c b/lib/erl_interface/src/misc/ei_format.c index 6ae5521357b0..74846cb50e7b 100644 --- a/lib/erl_interface/src/misc/ei_format.c +++ b/lib/erl_interface/src/misc/ei_format.c @@ -116,6 +116,7 @@ static int eiformat(const char** fmt, union arg** args, ei_x_buff* x) ei_x_free(&x2); break; } + EI_FALLTHROUGH(); default: if (isdigit((int)*p)) res = pdigit(&p, x); diff --git a/lib/erl_interface/src/misc/eidef.h b/lib/erl_interface/src/misc/eidef.h index 01479887c83d..09d8c8c26189 100644 --- a/lib/erl_interface/src/misc/eidef.h +++ b/lib/erl_interface/src/misc/eidef.h @@ -58,6 +58,16 @@ typedef int socklen_t; # define HAVE_ISFINITE #endif +/* Taken from https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html#warn-about-implicit-fallthrough-in-switch-statements */ +#ifdef __has_attribute +# if __has_attribute(__fallthrough__) +# define EI_FALLTHROUGH() __attribute__((__fallthrough__)) +# endif +#endif +#ifndef EI_FALLTHROUGH +# define EI_FALLTHROUGH() do {} while (0) /* fallthrough */ +#endif + typedef unsigned char uint8; /* FIXME use configure */ typedef unsigned short uint16; typedef unsigned int uint32; diff --git a/lib/erl_interface/src/misc/get_type.c b/lib/erl_interface/src/misc/get_type.c index d76119ca6264..8ff42fd9d5e7 100644 --- a/lib/erl_interface/src/misc/get_type.c +++ b/lib/erl_interface/src/misc/get_type.c @@ -38,12 +38,14 @@ int ei_get_type(const char *buf, const int *index, int *type, int *len) case ERL_SMALL_ATOM_EXT: case ERL_SMALL_ATOM_UTF8_EXT: *type = ERL_ATOM_EXT; + EI_FALLTHROUGH(); case ERL_SMALL_TUPLE_EXT: *len = get8(s); break; case ERL_ATOM_UTF8_EXT: *type = ERL_ATOM_EXT; + EI_FALLTHROUGH(); case ERL_ATOM_EXT: case ERL_STRING_EXT: *len = get16be(s); diff --git a/lib/erl_interface/src/misc/show_msg.c b/lib/erl_interface/src/misc/show_msg.c index 87fd9701653b..482788eee7a7 100644 --- a/lib/erl_interface/src/misc/show_msg.c +++ b/lib/erl_interface/src/misc/show_msg.c @@ -157,6 +157,7 @@ int ei_show_sendmsg(FILE *stream, const char *header, const char *msgbuf) if (ei_decode_pid(header,&index,&msg.from) || ei_decode_pid(header,&index,&msg.to)) return -1; mbuf = header+index; + break; case ERL_EXIT_TT: case ERL_EXIT2_TT: diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c index 74750d78de8e..bcbe11f8d9a9 100644 --- a/lib/erl_interface/src/prog/erl_call.c +++ b/lib/erl_interface/src/prog/erl_call.c @@ -78,6 +78,27 @@ #include #include +/* In VC++, noreturn is a declspec that has to be before the types, + * but in GNUC it is an attribute to be placed between return type + * and function name, hence __decl_noreturn __noreturn + * + * at some platforms (e.g. Android) __noreturn is defined at sys/cdef.h + */ +#if __GNUC__ +# define __decl_noreturn +# ifndef __noreturn +# define __noreturn __attribute__((noreturn)) +# endif +#else +# if defined(__WIN32__) && defined(_MSC_VER) +# define __noreturn +# define __decl_noreturn __declspec(noreturn) +# else +# define __noreturn +# define __decl_noreturn +# endif +#endif + #include "ei.h" #include "ei_resolve.h" @@ -125,9 +146,9 @@ struct call_flags { /* start an erlang system */ int erl_start_sys(ei_cnode *ec, char *alive, Erl_IpAddr addr, int flags, char *erl, char *add_args[]); -static void usage_arg(const char *progname, const char *switchname); -static void usage_error(const char *progname, const char *switchname); -static void usage(const char *progname); +__decl_noreturn static void __noreturn usage_arg(const char *progname, const char *switchname); +__decl_noreturn static void __noreturn usage_error(const char *progname, const char *switchname); +__decl_noreturn static void __noreturn usage(const char *progname); static int get_module(char **mbuf, char **mname); static int do_connect(ei_cnode *ec, char *nodename, struct call_flags *flags); static int read_stdin(char **buf); @@ -140,7 +161,9 @@ static char* ei_chk_strdup(char *s); static int rpc_print_node_stdout(ei_cnode* ec, int fd, char *mod, char *fun, const char* inbuf, int inbuflen, ei_x_buff* x); -static void exit_free_flags_fields(int exit_status, struct call_flags* flags); +__decl_noreturn static void __noreturn exit_free_flags_fields( + int exit_status, + struct call_flags* flags); /* Converts the given hostname to a shortname, if required. */ static void format_node_hostname(const struct call_flags *flags, @@ -1032,19 +1055,19 @@ static void usage_noexit(const char *progname) { fprintf(stderr," -x use specified erl start script, default is erl\n"); } -static void usage_arg(const char *progname, const char *switchname) { +__decl_noreturn static void __noreturn usage_arg(const char *progname, const char *switchname) { fprintf(stderr, "Missing argument(s) for \'%s\'.\n", switchname); usage_noexit(progname); exit(1); } -static void usage_error(const char *progname, const char *switchname) { +__decl_noreturn static void __noreturn usage_error(const char *progname, const char *switchname) { fprintf(stderr, "Illegal argument \'%s\'.\n", switchname); usage_noexit(progname); exit(1); } -static void usage(const char *progname) { +void __noreturn usage(const char *progname) { usage_noexit(progname); exit(0); } @@ -1181,7 +1204,8 @@ static int rpc_print_node_stdout(ei_cnode* ec, int fd, char *mod, } -void exit_free_flags_fields(int exit_status, struct call_flags* flags) { +__decl_noreturn static void __noreturn +exit_free_flags_fields(int exit_status, struct call_flags* flags) { if (flags->script != NULL) { free(flags->script); } diff --git a/lib/ftp/test/ftp_SUITE.erl b/lib/ftp/test/ftp_SUITE.erl index c1284f6ff617..9a3fc6781ab6 100644 --- a/lib/ftp/test/ftp_SUITE.erl +++ b/lib/ftp/test/ftp_SUITE.erl @@ -276,8 +276,8 @@ init_per_group(Group, Config) when Group == ftpes_passive; Group == ftpes_active_reuse; Group == ftps_passive_reuse; Group == ftps_active_reuse -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok when Group == ftpes_passive; Group == ftpes_active -> start_ftpd([{ftpd_ssl,true}|Config]); ok when Group == ftps_passive; Group == ftps_active -> @@ -305,8 +305,8 @@ init_per_testcase(Case, Config0) -> application:ensure_started(ftp), case Case of error_datafail -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> Config = start_ftpd([{ftpd_ssl,true},{ftpd_ssl_reuse,true}|Config0]), init_per_testcase2(Case, Config) diff --git a/lib/inets/examples/httpd_load_test/hdlt_client.erl b/lib/inets/examples/httpd_load_test/hdlt_client.erl index 56ca422a00b4..419a850ba5fd 100644 --- a/lib/inets/examples/httpd_load_test/hdlt_client.erl +++ b/lib/inets/examples/httpd_load_test/hdlt_client.erl @@ -208,7 +208,7 @@ client([SocketType, CertFile, URLBase, Sizes, Time, SendRate, Debug]) -> (SocketType =:= ossl) orelse (SocketType =:= essl) -> %% Ensure crypto and ssl started: - crypto:start(), + application:start(crypto), ssl:start(); true -> ok diff --git a/lib/inets/examples/httpd_load_test/hdlt_ctrl.erl b/lib/inets/examples/httpd_load_test/hdlt_ctrl.erl index 7ecf6c387612..790266cd5e77 100644 --- a/lib/inets/examples/httpd_load_test/hdlt_ctrl.erl +++ b/lib/inets/examples/httpd_load_test/hdlt_ctrl.erl @@ -193,7 +193,7 @@ do_init(Config) -> %% Start used applications ?DEBUG("ensure crypto started", []), - crypto:start(), + application:start(crypto), ?DEBUG("ensure ssh started", []), ssh:start(), diff --git a/lib/inets/examples/httpd_load_test/hdlt_server.erl b/lib/inets/examples/httpd_load_test/hdlt_server.erl index cd454c82cdc5..b65ccd7a77be 100644 --- a/lib/inets/examples/httpd_load_test/hdlt_server.erl +++ b/lib/inets/examples/httpd_load_test/hdlt_server.erl @@ -146,7 +146,7 @@ maybe_start_crypto_and_ssl(Config) -> (SocketType =:= ossl) orelse (SocketType =:= essl)) -> ?LOG("maybe start crypto and ssl", []), - (catch crypto:start()), + (catch application:start(crypto)), ssl:start(); _ -> ok diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl index 9fd09ae4d7da..d34fe1f9b335 100644 --- a/lib/inets/test/httpc_SUITE.erl +++ b/lib/inets/test/httpc_SUITE.erl @@ -31,6 +31,7 @@ -include("inets_test_lib.hrl"). -include("http_internal.hrl"). -include("httpc_internal.hrl"). +% -include("../../ssl/src/ssl_api.hrl"). %% Note: This directive should only be used in test suites. -compile([export_all, nowarn_export_all]). @@ -45,7 +46,6 @@ %% (maximum length supported by erlang) -define(UNIX_SOCKET, "/tmp/inets_httpc_SUITE.sock"). --record(sslsocket, {fd = nil, pid = nil}). %%-------------------------------------------------------------------- %% Common Test interface functions ----------------------------------- %%-------------------------------------------------------------------- @@ -250,8 +250,8 @@ init_per_group(misc = Group, Config) -> [{httpc_options, [{ipfamily, Inet}]} | Config]; init_per_group(Group, Config0) when Group =:= sim_https; Group =:= https; Group =:= sim_mixed -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> start_apps(Group), HttpcOptions = [{keep_alive_timeout, 50000}, {max_keep_alive_length, 5}], @@ -3020,29 +3020,29 @@ get_stat(S, Opt) -> E end. -getstat(#sslsocket{} = S, Opts) -> +getstat(S, Opts) when element(1, S) =:= sslsocket -> ssl:getstat(S, Opts); getstat(S, Opts) -> inet:getstat(S, Opts). -url_start(#sslsocket{}) -> +url_start(S) when element(1, S) =:= sslsocket -> {ok,Host} = inet:gethostname(), ?TLS_URL_START ++ Host ++ ":"; url_start(_) -> {ok,Host} = inet:gethostname(), ?URL_START ++ Host ++ ":". -send(#sslsocket{} = S, Msg) -> +send(S, Msg) when element(1, S) =:= sslsocket -> ssl:send(S, Msg); send(S, Msg) -> gen_tcp:send(S, Msg). -close(#sslsocket{} = S) -> +close(S) when element(1, S) =:= sslsocket -> ssl:close(S); close(S) -> gen_tcp:close(S). -sockname(#sslsocket{}= S) -> +sockname(S) when element(1, S) == sslsocket -> ssl:sockname(S); sockname(S) -> inet:sockname(S). diff --git a/lib/inets/test/httpc_proxy_SUITE.erl b/lib/inets/test/httpc_proxy_SUITE.erl index f7a97c09a9c9..639e144e0f6a 100644 --- a/lib/inets/test/httpc_proxy_SUITE.erl +++ b/lib/inets/test/httpc_proxy_SUITE.erl @@ -485,8 +485,8 @@ app_start(App, Config) -> try case App of crypto -> - crypto:stop(), - ok = crypto:start(); + application:stop(crypto), + ok = application:start(crypto); inets -> application:stop(App), ok = application:start(App), diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl index 1c751fe0cff6..fea0d7db3000 100644 --- a/lib/inets/test/httpd_SUITE.erl +++ b/lib/inets/test/httpd_SUITE.erl @@ -228,8 +228,8 @@ init_per_group(Group, Config0) when Group == https_basic; Group == https_not_sup; Group == https_alert -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> init_ssl(Group, [{http_version, "HTTP/1.0"} | Config0]) catch diff --git a/lib/inets/test/inets_test_lib.erl b/lib/inets/test/inets_test_lib.erl index fc28fbe30369..c91be028196b 100644 --- a/lib/inets/test/inets_test_lib.erl +++ b/lib/inets/test/inets_test_lib.erl @@ -176,7 +176,7 @@ ensure_started(crypto = App) -> %% only this function ensures that the NIF lib is actually %% loaded. And only by loading that lib can we know if it %% is even possible to run crypto. - do_ensure_started(App, fun() -> crypto:start() end); + do_ensure_started(App, fun() -> application:start(crypto) end); ensure_started(App) when is_atom(App) -> do_ensure_started(App, fun() -> application:start(App) end). diff --git a/lib/jinterface/doc/guides/jinterface_users_guide.md b/lib/jinterface/doc/guides/jinterface_users_guide.md index df6531262f76..3f6af16b8da0 100644 --- a/lib/jinterface/doc/guides/jinterface_users_guide.md +++ b/lib/jinterface/doc/guides/jinterface_users_guide.md @@ -256,12 +256,12 @@ while (true) { try { o = mbox.receive(); if (o instanceof OtpErlangTuple) { - msg = (OtpErlangTuple)o; - from = (OtpErlangPid)(msg.elementAt(0)); - mbox.send(from,msg.elementAt(1)); - } - catch (Exception e) { - System.out.println("" + e); + msg = (OtpErlangTuple) o; + from = (OtpErlangPid) (msg.elementAt(0)); + mbox.send(from, msg.elementAt(1)); + } + } catch (Exception e) { + System.out.println("" + e); } } ``` diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile b/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile index 1445eea60483..6f3a37f53ca5 100644 --- a/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile +++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile @@ -100,12 +100,14 @@ $(APP_TARGET): $(APP_SRC) $(ERL_TOP)/lib/jinterface/vsn.mk $(APPUP_TARGET): $(APPUP_SRC) $(ERL_TOP)/lib/jinterface/vsn.mk $(vsn_verbose)sed -e 's;%VSN%;$(JINTERFACE_VSN);' $< > $@ -$(TYPES): make_dirs $(JAVA_DEST_ROOT)$(JARFILE) +_create_dirs := $(shell mkdir -p $(JAVA_DEST_ROOT)) -make_dirs: - $(V_at)if [ ! -d "$(JAVA_DEST_ROOT)" ];then mkdir "$(JAVA_DEST_ROOT)"; fi +$(TYPES): $(JAVA_DEST_ROOT)$(JARFILE) -$(JAVA_DEST_ROOT)$(JARFILE): $(TARGET_FILES) +$(JAVA_DEST_ROOT): + -@mkdir -p $(JAVA_DEST_ROOT) + +$(JAVA_DEST_ROOT)$(JARFILE): $(JAVA_DEST_ROOT) $(TARGET_FILES) @(cd $(JAVA_DEST_ROOT) ; $(JAR) $(JARFLAGS) $(JARFILE) $(JAVA_CLASS_SUBDIR)) clean: diff --git a/lib/jinterface/prebuild.keep b/lib/jinterface/prebuild.keep index 8e695ec83aa8..bfe7f5b60c06 100644 --- a/lib/jinterface/prebuild.keep +++ b/lib/jinterface/prebuild.keep @@ -1 +1,2 @@ doc +priv diff --git a/lib/kernel/doc/guides/eep48_chapter.md b/lib/kernel/doc/guides/eep48_chapter.md index 7dce76200209..2f0704e666c2 100644 --- a/lib/kernel/doc/guides/eep48_chapter.md +++ b/lib/kernel/doc/guides/eep48_chapter.md @@ -105,8 +105,8 @@ For each entry in Docs, we have: `callback`. Other languages will add their own. For instance, Elixir and LFE might add `macro`. -- **`Anno`** - annotation (line, column, file) of the module documentation or of - the definition itself (see `m:erl_anno`). +- **`Anno`** - annotation (line, column, file) of the module documentation + (see `m:erl_anno`). - **`Signature`** - the signature of the entity. It is is a list of binaries. Each entry represents a binary in the signature that can be joined with @@ -134,6 +134,9 @@ information to each entry. This EEP documents the following metadata keys: - **`authors := [binary()]`** - a list of authors as binaries. +- **`behaviours := [module()]`** - a list of the behaviours implemented by + this module. + - **`cross_references := [module() | {module(), {Kind, Name, Arity}}]`** - a list of modules or module entries that can be used as cross references when generating documentation. @@ -145,8 +148,11 @@ information to each entry. This EEP documents the following metadata keys: - **`since := binary()`** - a binary representing the version such entry was added, such as `<<"1.3.0">>` or `<<"20.0">>`. -- **`edit_url := binary()`** - a binary representing a URL to change the - documentation itself. +- **`source_path := binary()`** - the absolute location of the source file for + this module. Applies only to the module metadata. + +- **`source_annos := [erl_anno:anno()]`** - a list of source code locations. + You may either store one for each clause or only for the first clause. Any key may be added to Metadata at any time. Keys that are frequently used by the community can be standardized in future versions. diff --git a/lib/kernel/doc/guides/logger_chapter.md b/lib/kernel/doc/guides/logger_chapter.md index 685450f61a06..e684c380d5a5 100644 --- a/lib/kernel/doc/guides/logger_chapter.md +++ b/lib/kernel/doc/guides/logger_chapter.md @@ -737,9 +737,8 @@ ways: originating from within OTP, except the former so called "SASL reports", look the same as before. -- **[](){: #sasl_reports } SASL Reports** - By SASL reports we mean supervisor reports, crash reports and progress - reports. +- **[](){: #sasl_reports } SASL Reports** - By SASL reports we mean supervisor + reports, crash reports and progress reports. Prior to Erlang/OTP 21.0, these reports were only logged when the SASL application was running, and they were printed through SASL's own event @@ -777,8 +776,8 @@ ways: See section [SASL User's Guide](`e:sasl:error_logging.md`) for more information about the old SASL error logging functionality. -- **[](){: #legacy_event_handlers } Legacy Event Handlers** - To use event handlers written for `error_logger`, just add your event handler +- **[](){: #legacy_event_handlers } Legacy Event Handlers** - To use event + handlers written for `error_logger`, just add your event handler with ```text @@ -973,10 +972,23 @@ do_log(Fd, LogEvent, #{formatter := {FModule, FConfig}}) -> ## Protecting the Handler from Overload -The default handlers, `m:logger_std_h` and `m:logger_disk_log_h`, feature an -overload protection mechanism, which makes it possible for the handlers to -survive, and stay responsive, during periods of high load (when huge numbers of -incoming log requests must be handled). The mechanism works as follows: +The default handlers, `m:logger_std_h` and `m:logger_disk_log_h`, feature +multiple overload protection mechanisms, which make it possible for the +handlers to survive, and stay responsive, during periods of high load +(when huge numbers of incoming log requests must be handled). + +The mechanisms are as follows: +* [**message queue length**](#message-queue-length): the handler process tracks +its message queue length and takes actions depending on its size, from turning +on a sync mode to dropping messages. +* [**limit the number of logs emitted**](#controlling-bursts-of-log-requests): +the handlers will handle a maximum number of log events per time unit, +defaulting to 500 per second. +* [**terminate an overloaded handler**](#terminating-an-overloaded-handler): +a handler can be terminated and restarted automatically if it exceeds message +queue length or memory thresholds - this is disabled by default. + +These mechanisms are described in more detail in the following sections. ### Message Queue Length @@ -1013,6 +1025,8 @@ actions, exist: message queue is reduced to a level below the threshold, synchronous or asynchronous mode is resumed. Notice that when the handler activates or deactivates drop mode, information about it is printed in the log. + The emitted log message is on the `:notice` level and looks like this: + `Handler :default switched from :sync to :drop mode` Defaults to `200` messages. @@ -1025,6 +1039,8 @@ actions, exist: make sure that no new events are received during the operation. Notice that after the flush operation is performed, the handler prints information in the log about how many events have been deleted. + The emitted log message is on the `:notice` level and looks like this: + `Handler :default flushed 1070 log events` Defaults to `1000` messages. @@ -1082,6 +1098,10 @@ period of time - can potentially cause problems, such as: - Circular logs wrap too quickly so that important data is overwritten. - Write buffers grow large, which slows down file sync operations. +Note that these examples apply to file-based logging. If you're logging to +the console the protections discussed below should be safe to disable or +tweak, as long as your system can handle the load of them. + For this reason, both built-in handlers offer the possibility to specify the maximum number of events to be handled within a certain time frame. With this burst control feature enabled, the handler can avoid choking the log with diff --git a/lib/kernel/doc/kernel_app.md b/lib/kernel/doc/kernel_app.md index 0428b911de30..12202e548042 100644 --- a/lib/kernel/doc/kernel_app.md +++ b/lib/kernel/doc/kernel_app.md @@ -86,6 +86,14 @@ Any event handler added to `erl_signal_server` must handle the following events. - **`sigtstp`** - Stop typed at terminal +- **`sigcont`** - Continue after stop + +- **`sigwinch`** - Window size change + +- **`siginfo`** - Status request from keyboard. Note several operating systems + (Linux in particular) do not support this signal. `os:set_signal/2` will thow + a `badarg` exception if support is missing. + Setting OS signals are described in `os:set_signal/2`. ## Configuration @@ -437,6 +445,11 @@ For more information about configuration parameters, see file Defaults to `false`. +- **`shell_docs_ansi = boolean()`{: #shell_docs_ansi }** - Specifies whether + the documentation rendered in the shell should use ANSI escape codes. + + See also `t:shell_docs:config/0`. + - **`shell_history = enabled | disabled | module()`{: #shell_history }** - Specifies whether shell history should be logged to disk between usages of `erl` (`enabled`), not logged at all (`disabled`), or a user-specified module diff --git a/lib/kernel/src/Makefile b/lib/kernel/src/Makefile index 62218a8c4aa5..fc317a77e058 100644 --- a/lib/kernel/src/Makefile +++ b/lib/kernel/src/Makefile @@ -146,6 +146,7 @@ MODULES = \ user_drv \ user_sup \ prim_tty \ + prim_tty_sighandler \ raw_file_io \ raw_file_io_compressed \ raw_file_io_inflate \ diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index a833a2f35139..172f4d5b280a 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -1752,7 +1752,8 @@ file containing object code for `Module` and returns the absolute filename. which(Module) when is_atom(Module) -> case is_loaded(Module) of false -> - which(Module, get_path()); + File = atom_to_list(Module) ++ objfile_extension(), + where_is_file(File); {file, File} -> File end. @@ -1774,8 +1775,7 @@ locate application resource files. Filename :: file:filename(), Absname :: file:filename(). where_is_file(File) when is_list(File) -> - Path = get_path(), - where_is_file(Path, File). + call({where_is_file, File}). %% To avoid unnecessary work when looking at many modules, this also %% accepts pairs of directories and pre-fetched contents in the path diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl index 76f3337ad2d4..9d9c88d82a22 100644 --- a/lib/kernel/src/code_server.erl +++ b/lib/kernel/src/code_server.erl @@ -307,6 +307,11 @@ handle_call({replace_path,Name,Dir,Control}, _From, handle_call(get_path, _From, S) -> {reply,[P || {P, _Cache} <- S#state.path],S}; +handle_call({where_is_file,File}, _From, + #state{path=Path,path_cache=Cache0}=S) -> + {Resp,Cache} = where_is_file(Path, File, Cache0), + {reply,Resp,S#state{path_cache=Cache}}; + handle_call(clear_cache, _From, S) -> {reply,ok,S#state{path_cache=#{}}}; @@ -1452,3 +1457,22 @@ archive_extension() -> to_list(X) when is_list(X) -> X; to_list(X) when is_atom(X) -> atom_to_list(X). + +where_is_file([], _File, Cache) -> + {non_existing, Cache}; +where_is_file([{Dir, nocache} | Tail], File, Cache) -> + Full = filename:append(Dir, File), + case erl_prim_loader:read_file_info(Full) of + {ok,_} -> + {Full, Cache}; + _Error -> + where_is_file(Tail, File, Cache) + end; +where_is_file([{Dir, CacheKey} | Tail], File, Cache) when is_integer(CacheKey) -> + case with_cache(CacheKey, Dir, File, Cache) of + {true, Cache1} -> + Full = filename:append(Dir, File), + {Full, Cache1}; + {false, Cache1} -> + where_is_file(Tail, File, Cache1) + end. diff --git a/lib/kernel/src/erl_signal_handler.erl b/lib/kernel/src/erl_signal_handler.erl index 4a1164695063..ae152d54fab3 100644 --- a/lib/kernel/src/erl_signal_handler.erl +++ b/lib/kernel/src/erl_signal_handler.erl @@ -29,12 +29,7 @@ start() -> %% add signal handler - case whereis(erl_signal_server) of - %% in case of minimal mode - undefined -> ok; - _ -> - gen_event:add_handler(erl_signal_server, erl_signal_handler, []) - end. + gen_event:add_handler(erl_signal_server, erl_signal_handler, []). init(_Args) -> {ok, #state{}}. diff --git a/lib/kernel/src/erpc.erl b/lib/kernel/src/erpc.erl index db28e54bb23d..c195a74a92b0 100644 --- a/lib/kernel/src/erpc.erl +++ b/lib/kernel/src/erpc.erl @@ -83,7 +83,10 @@ is available on the involved nodes. reqids_add/3, reqids_to_list/1]). --export_type([request_id/0, request_id_collection/0, timeout_time/0]). +-export_type([call_options/0, + request_id/0, + request_id_collection/0, + timeout_time/0]). %% Internal exports (also used by the 'rpc' module) @@ -121,16 +124,31 @@ The value can be: a time further into the future than `4294967295` milliseconds. Identifying the timeout using an absolute timeout value is especially handy when you have a deadline for responses corresponding to a complete collection of requests - (`t:request_id_collection/0`) , since you do not have to recalculate the + (`t:request_id_collection/0`), since you do not have to recalculate the relative time until the deadline over and over again. """. -type timeout_time() :: 0..?MAX_INT_TIMEOUT | 'infinity' | {abs, integer()}. +-doc """ +Options to be used in [`call/3,5`](`call/5`) and +[`multicall/3,5`](`multicall/5`) functions. + +- **`timeout`** - Upper time limit for call operations to complete, see + `t:timeout_time/0`. Default: `infinity`. + +- **`always_spawn`** - If `true`, the `apply()` will _always_ be performed + in a freshly spawned process. If `false`, the calling process _may_ be + used instead, if possible. Default: `false`. +""". +-doc(#{since => <<"OTP 28.0">>}). +-type call_options() :: #{'timeout' => Timeout :: timeout_time(), + 'always_spawn' => AlwaysSpawn :: boolean()}. + %%------------------------------------------------------------------------ %% Exported API %%------------------------------------------------------------------------ --doc(#{equiv => call(Node, Fun, infinity)}). +-doc(#{equiv => call(Node, Fun, #{timeout => infinity})}). -doc(#{since => <<"OTP 23.0">>}). -spec call(Node, Fun) -> Result when Node :: node(), @@ -138,28 +156,28 @@ The value can be: Result :: term(). call(N, Fun) -> - call(N, Fun, infinity). + call(N, Fun, #{timeout => infinity}). -doc """ Equivalent to -[`erpc:call(Node, erlang, apply, [Fun,[]], Timeout)`](`call/5`). +[`erpc:call(Node, erlang, apply, [Fun,[]], #{timeout => Timeout})`](`call/5`). May raise all the same exceptions as [`call/5`](`call/5`) plus an `{erpc, badarg}` `error` exception if `Fun` is not a fun of zero arity. """. -doc(#{since => <<"OTP 23.0">>}). --spec call(Node, Fun, Timeout) -> Result when +-spec call(Node, Fun, TimeoutOrOptions) -> Result when Node :: node(), Fun :: function(), - Timeout :: timeout_time(), + TimeoutOrOptions :: timeout_time() | call_options(), Result :: term(). -call(N, Fun, Timeout) when is_function(Fun, 0) -> - call(N, erlang, apply, [Fun, []], Timeout); +call(N, Fun, TimeoutOrOptions) when is_function(Fun, 0) -> + call(N, erlang, apply, [Fun, []], TimeoutOrOptions); call(_N, _Fun, _Timeout) -> error({?MODULE, badarg}). --doc(#{equiv => call(Node, Module, Function, Args, infinity)}). +-doc(#{equiv => call(Node, Module, Function, Args, #{timeout => infinity})}). -doc(#{since => <<"OTP 23.0">>}). -spec call(Node, Module, Function, Args) -> Result when Node :: node(), @@ -169,14 +187,16 @@ call(_N, _Fun, _Timeout) -> Result :: term(). call(N, M, F, A) -> - call(N, M, F, A, infinity). + call(N, M, F, A, #{timeout => infinity}). -dialyzer([{nowarn_function, call/5}, no_return]). -doc """ Evaluates [`apply(Module, Function, Args)`](`apply/3`) on node `Node` and -returns the corresponding value `Result`. `Timeout` sets an upper time limit for -the `call` operation to complete. +returns the corresponding value `Result`. + +`TimeoutOrOptions` can be either a [`timeout time`](`t:timeout_time/0`) or a +[`call options`](`t:call_options/0`) map (since OTP 28.0). The `call()` function only returns if the applied function successfully returned without raising any uncaught exceptions, the operation did not time out, and no @@ -239,23 +259,24 @@ communication may, of course, reach the calling process. > #### Note {: .info } > -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be the calling process itself, a server, or a freshly -> spawned process. +> If the `always_spawn` option is `false` (which is the default), you cannot make +> _any_ assumptions about the process that will perform the `apply()`. It may be +> the calling process itself, or a freshly spawned process. """. -doc(#{since => <<"OTP 23.0">>}). --spec call(Node, Module, Function, Args, Timeout) -> Result when +-spec call(Node, Module, Function, Args, TimeoutOrOptions) -> Result when Node :: node(), Module :: atom(), Function :: atom(), Args :: [term()], - Timeout :: timeout_time(), + TimeoutOrOptions :: timeout_time() | call_options(), Result :: term(). -call(N, M, F, A, infinity) when node() =:= N, %% Optimize local call - is_atom(M), - is_atom(F), - is_list(A) -> +call(N, M, F, A, #{timeout := infinity, + always_spawn := false}) when node() =:= N, %% Optimize local call + is_atom(M), + is_atom(F), + is_list(A) -> try {return, Return} = execute_call(M,F,A), Return @@ -271,10 +292,12 @@ call(N, M, F, A, infinity) when node() =:= N, %% Optimize local call error({exception, Reason, ErpcStack}) end end; -call(N, M, F, A, T) when is_atom(N), - is_atom(M), - is_atom(F), - is_list(A) -> +call(N, M, F, A, #{timeout := T, + always_spawn := AlwaysSpawn}) when is_atom(N), + is_atom(M), + is_atom(F), + is_list(A), + is_boolean(AlwaysSpawn) -> Timeout = timeout_value(T), Res = make_ref(), ReqId = spawn_request(N, ?MODULE, execute_call, [Res, M, F, A], @@ -287,8 +310,15 @@ call(N, M, F, A, T) when is_atom(N), after Timeout -> result(timeout, ReqId, Res, undefined) end; -call(_N, _M, _F, _A, _T) -> - error({?MODULE, badarg}). +call(_N, _M, _F, _A, #{timeout := _T, + always_spawn := _AlwaysSpawn} = _Opts) -> + error({?MODULE, badarg}); +call(N, M, F, A, #{} = Opts) -> + call(N, M, F, A, maps:merge(#{timeout => infinity, + always_spawn => false}, Opts)); +call(N, M, F, A, T) -> + call(N, M, F, A, #{timeout => T, + always_spawn => false}). %% Asynchronous call @@ -309,11 +339,6 @@ Fails with an `{erpc, badarg}` `error` exception if: - `Node` is not an atom. - `Fun` is not a fun of zero arity. - -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. """. -doc(#{since => <<"OTP 23.0">>}). -spec send_request(Node, Fun) -> RequestId when @@ -364,11 +389,6 @@ Fails with an `{erpc, badarg}` `error` exception if: - `Args` is not a list. Note that the list is not verified to be a proper list at the client side. -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. - Equivalent to [`erpc:send_request(Node, erlang, apply, [Fun,[]]), Label, RequestIdCollection)`](`send_request/6`). @@ -377,11 +397,6 @@ Fails with an `{erpc, badarg}` `error` exception if: - `Node` is not an atom. - `Fun` is not a fun of zero arity. - `RequestIdCollection` is detected not to be request identifier collection. - -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. """. -doc(#{since => <<"OTP 23.0">>}). -spec send_request(Node, Module, Function, Args) -> RequestId when @@ -433,11 +448,6 @@ Fails with an `{erpc, badarg}` `error` exception if: - `Args` is not a list. Note that the list is not verified to be a proper list at the client side. - `RequestIdCollection` is detected not to be request identifier collection. - -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. """. -doc(#{since => <<"OTP 25.0">>}). -spec send_request(Node, Module, Function, Args, @@ -992,7 +1002,7 @@ reqids_to_list(_) -> | {error, {?MODULE, Reason :: term()}}. --doc(#{equiv => multicall(Nodes, Fun, infinity)}). +-doc(#{equiv => multicall(Nodes, Fun, #{timeout => infinity})}). -doc(#{since => <<"OTP 23.0">>}). -spec multicall(Nodes, Fun) -> Result when Nodes :: [atom()], @@ -1000,28 +1010,28 @@ reqids_to_list(_) -> Result :: term(). multicall(Ns, Fun) -> - multicall(Ns, Fun, infinity). + multicall(Ns, Fun, #{timeout => infinity}). -doc """ Equivalent to -[`erpc:multicall(Nodes, erlang, apply, [Fun,[]], Timeout)`](`multicall/5`). +[`erpc:multicall(Nodes, erlang, apply, [Fun,[]], #{timeout => Timeout})`](`multicall/5`). May raise all the same exceptions as [`multicall/5`](`multicall/5`) plus an `{erpc, badarg}` `error` exception if `Fun` is not a fun of zero arity. """. -doc(#{since => <<"OTP 23.0">>}). --spec multicall(Nodes, Fun, Timeout) -> Result when +-spec multicall(Nodes, Fun, TimeoutOrOptions) -> Result when Nodes :: [atom()], Fun :: function(), - Timeout :: timeout_time(), + TimeoutOrOptions :: timeout_time() | call_options(), Result :: term(). -multicall(Ns, Fun, Timeout) when is_function(Fun, 0) -> - multicall(Ns, erlang, apply, [Fun, []], Timeout); -multicall(_Ns, _Fun, _Timeout) -> +multicall(Ns, Fun, TimeoutOrOptions) when is_function(Fun, 0) -> + multicall(Ns, erlang, apply, [Fun, []], TimeoutOrOptions); +multicall(_Ns, _Fun, _TimeoutOrOptions) -> error({?MODULE, badarg}). --doc(#{equiv => multicall(Nodes, Module, Function, Args, infinity)}). +-doc(#{equiv => multicall(Nodes, Module, Function, Args, #{timeout => infinity})}). -doc(#{since => <<"OTP 23.0">>}). -spec multicall(Nodes, Module, Function, Args) -> Result when Nodes :: [atom()], @@ -1031,14 +1041,18 @@ multicall(_Ns, _Fun, _Timeout) -> Result :: [{ok, ReturnValue :: term()} | caught_call_exception()]. multicall(Ns, M, F, A) -> - multicall(Ns, M, F, A, infinity). + multicall(Ns, M, F, A, #{timeout => infinity}). -doc """ Performs multiple `call` operations in parallel on multiple nodes. That is, evaluates [`apply(Module, Function, Args)`](`apply/3`) on the nodes `Nodes` in -parallel. `Timeout` sets an upper time limit for all `call` operations to -complete. The result is returned as a list where the result from each node is +parallel. + +`TimeoutOrOptions` can be either a [`timeout time`](`t:timeout_time/0`) or a +[`call options`](`t:call_options/0`) map (since OTP 28.0). + +The result is returned as a list where the result from each node is placed at the same position as the node name is placed in `Nodes`. Each item in the resulting list is formatted as either: @@ -1094,32 +1108,38 @@ calling process, such communication may, of course, reach the calling process. > #### Note {: .info } > -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be the calling process itself, a server, or a freshly -> spawned process. +> If the `always_spawn` option is `false` (which is the default), you cannot make +> _any_ assumptions about the processes that will perform the `apply()`s. It may be +> the calling process itself, or freshly spawned processes, or a mix of both. """. -doc(#{since => <<"OTP 23.0">>}). --spec multicall(Nodes, Module, Function, Args, Timeout) -> Result when +-spec multicall(Nodes, Module, Function, Args, TimeoutOrOptions) -> Result when Nodes :: [atom()], Module :: atom(), Function :: atom(), Args :: [term()], - Timeout :: timeout_time(), + TimeoutOrOptions :: timeout_time() | call_options(), Result :: [{ok, ReturnValue :: term()} | caught_call_exception()]. -multicall(Ns, M, F, A, T) -> +multicall(Ns, M, F, A, #{} = Opts) -> try true = is_atom(M), true = is_atom(F), true = is_list(A), Tag = make_ref(), - Timeout = timeout_value(T), - SendState = mcall_send_requests(Tag, Ns, M, F, A, Timeout), + Timeout = timeout_value(maps:get(timeout, Opts, infinity)), + LocalCall = case maps:get(always_spawn, Opts, false) of + true -> always_spawn; + false -> allow_local_call + end, + SendState = mcall_send_requests(Tag, Ns, M, F, A, LocalCall, Timeout), mcall_receive_replies(Tag, SendState) catch error:NotIErr when NotIErr /= internal_error -> error({?MODULE, badarg}) - end. + end; +multicall(Ns, M, F, A, T) -> + multicall(Ns, M, F, A, #{timeout => T}). -doc """ Equivalent to @@ -1155,11 +1175,6 @@ if: - `Function` is not an atom. - `Args` is not a list. Note that the list is not verified to be a proper list at the client side. - -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. """. -doc(#{since => <<"OTP 23.0">>}). -spec multicast(Nodes, Module, Function, Args) -> 'ok' when @@ -1215,11 +1230,6 @@ ignored. - `Function` is not an atom. - `Args` is not a list. Note that the list is not verified to be a proper list at the client side. - -> #### Note {: .info } -> -> You cannot make _any_ assumptions about the process that will perform the -> `apply()`. It may be a server, or a freshly spawned process. """. -doc(#{since => <<"OTP 23.0">>}). -spec cast(Node, Module, Function, Args) -> 'ok' when @@ -1515,9 +1525,9 @@ mcall_send_request(T, N, M, F, A) when is_reference(T), {reply_tag, T}, {monitor, [{tag, T}]}]). -mcall_send_requests(Tag, Ns, M, F, A, Tmo) -> +mcall_send_requests(Tag, Ns, M, F, A, LC, Tmo) -> DL = deadline(Tmo), - mcall_send_requests(Tag, Ns, M, F, A, [], DL, undefined, 0). + mcall_send_requests(Tag, Ns, M, F, A, [], DL, LC, 0). mcall_send_requests(_Tag, [], M, F, A, RIDs, DL, local_call, NRs) -> %% Timeout infinity and call on local node wanted; @@ -1527,7 +1537,7 @@ mcall_send_requests(_Tag, [], M, F, A, RIDs, DL, local_call, NRs) -> mcall_send_requests(_Tag, [], _M, _F, _A, RIDs, DL, _LC, NRs) -> {ok, RIDs, #{}, NRs, DL}; mcall_send_requests(Tag, [N|Ns], M, F, A, RIDs, - infinity, undefined, NRs) when N == node() -> + infinity, allow_local_call, NRs) when N == node() -> mcall_send_requests(Tag, Ns, M, F, A, [local_call|RIDs], infinity, local_call, NRs); mcall_send_requests(Tag, [N|Ns], M, F, A, RIDs, DL, LC, NRs) -> diff --git a/lib/kernel/src/erts_debug.erl b/lib/kernel/src/erts_debug.erl index fd86f870b326..4718920e7e60 100644 --- a/lib/kernel/src/erts_debug.erl +++ b/lib/kernel/src/erts_debug.erl @@ -39,7 +39,8 @@ size_shared/1, copy_shared/1, copy_shared/2, dirty_cpu/2, dirty_io/2, dirty/3, lcnt_control/1, lcnt_control/2, lcnt_collect/0, lcnt_clear/0, - lc_graph/0, lc_graph_to_dot/2, lc_graph_merge/2, + lc_graph/0, lc_graph_to_dot/2, + lc_graph_merge/0, lc_graph_merge/1, lc_graph_merge/2, alloc_blocks_size/1]). %% Reroutes calls to the given MFA to error_handler:breakpoint/3 @@ -439,16 +440,14 @@ lc_graph() -> %% Convert "lc_graph." file to https://www.graphviz.org dot format. lc_graph_to_dot(OutFile, InFile) -> - {ok, [LL0]} = file:consult(InFile), - - [{"NO LOCK",0} | LL] = LL0, - Map = #{Id => Name || {Name, Id, _, _} <- LL}, + LL0 = lcg_read_file(InFile), + LL1 = lcg_simplify_graph(LL0), case file:open(OutFile, [exclusive]) of {ok, Out} -> ok = file:write(Out, "digraph G {\n"), - [dot_print_lock(Out, Lck, Map) || Lck <- LL], + [dot_print_lock(Out, Lck) || Lck <- LL1], ok = file:write(Out, "}\n"), ok = file:close(Out); @@ -457,23 +456,25 @@ lc_graph_to_dot(OutFile, InFile) -> {"File already exists", OutFile} end. -dot_print_lock(Out, {_Name, Id, Lst, _}, Map) -> - [dot_print_edge(Out, From, Id, Map) || From <- Lst], +dot_print_lock(Out, {Name, Direct, _Indirect}) -> + [dot_print_edge(Out, From, Name) || From <- Direct], ok. -dot_print_edge(_, 0, _, _) -> - ignore; % "NO LOCK" -dot_print_edge(Out, From, To, Map) -> - io:format(Out, "~p -> ~p;\n", [maps:get(From,Map), maps:get(To,Map)]). +dot_print_edge(Out, From, To) -> + io:format(Out, "~p -> ~p;\n", [From, To]). %% Merge several "lc_graph" files into one file. +lc_graph_merge() -> + lc_graph_merge("lc_graph.merged"). + +lc_graph_merge(OutFile) -> + lc_graph_merge(OutFile, "lc_graph.*"). + +lc_graph_merge(OutFile, [C|_]=Wildcard) when is_integer(C) -> + lc_graph_merge(OutFile, filelib:wildcard(Wildcard)); lc_graph_merge(OutFile, InFiles) -> - LLs = lists:map(fun(InFile) -> - {ok, [LL]} = file:consult(InFile), - LL - end, - InFiles), + LLs = [lcg_read_file(File) || File <- InFiles], Res = lists:foldl(fun(A, B) -> lcg_merge(A, B) end, hd(LLs), @@ -490,17 +491,58 @@ lc_graph_merge(OutFile, InFiles) -> {"File already exists", OutFile} end. +lcg_read_file(File) -> + {ok, [LL]} = file:consult(File), + lcg_expand_lock_names(LL). + +lcg_expand_lock_names([{"NO LOCK", 0} | LL]) -> + Map = #{Id => Name || {Name, Id, _, _} <- LL}, + [begin + Direct = [maps:get(From,Map) || From <- DirectIds, From =/= 0], + Indirect = [maps:get(From,Map) || From <- IndirectIds, From =/= 0], + + {Name, Direct, Indirect} + end + || {Name, _Id, DirectIds, IndirectIds} <- LL]; +lcg_expand_lock_names(LL) -> + LL. % assume already expanded format + lcg_merge(A, B) -> lists:zipwith(fun(LA, LB) -> lcg_merge_locks(LA, LB) end, A, B). lcg_merge_locks(L, L) -> L; -lcg_merge_locks({Name, Id, DA, IA}, {Name, Id, DB, IB}) -> - Direct = lists:umerge(DA, DB), - Indirect = lists:umerge(IA, IB), - {Name, Id, Direct, Indirect -- Direct}. - +lcg_merge_locks({Name, DA, IA}, {Name, DB, IB}) -> + Direct = lists:umerge(lists:sort(DA), lists:sort(DB)), + Indirect = lists:umerge(lists:sort(IA), lists:sort(IB)), + {Name, Direct -- Indirect, Indirect -- Direct}. + +lcg_simplify_graph(LL) -> + [lcg_demote_indirects(L, LL) || L <- LL]. + +lcg_demote_indirects({Name, Directs0, Indirects0}, LL) -> + BeforeDirects = lcg_locked_before(Name, Directs0, LL, []), + {Demoted, KeptDirects} = + lists:partition(fun(Direct) -> + lists:member(Direct, BeforeDirects) + end, + Directs0), + %% case Demoted of + %% [] -> ok; + %% _ -> io:format("Lock ~p demoted ~p\n", [Name, Demoted]) + %% end, + {Name, KeptDirects, lists:usort(Indirects0 ++ Demoted)}. + +lcg_locked_before(_This, [], _LL, Acc) -> + lists:usort(Acc); +lcg_locked_before(This, [This|Tail], LL, Acc) -> + lcg_locked_before(This, Tail, LL, Acc); +lcg_locked_before(This, [Name|Tail], LL, Acc) -> + {Name, Directs0, _Indirects} = lists:keyfind(Name, 1, LL), + Directs1 = lists:delete(Name, Directs0), + DepthAcc = lcg_locked_before(Name, Directs1, LL, Acc), + lcg_locked_before(This, Tail, LL, Directs1 ++ DepthAcc). lcg_print(Out, LL) -> io:format(Out, "[", []), diff --git a/lib/kernel/src/group.erl b/lib/kernel/src/group.erl index 0a6a5afdfe0b..12c165b6e763 100644 --- a/lib/kernel/src/group.erl +++ b/lib/kernel/src/group.erl @@ -28,55 +28,142 @@ %% It then keeps that data as unicode in its state and converts it %% to latin1/unicode on a per request basis. If any data is left after %% a request, that data is again kept as unicode. - --export([start/2, start/3, whereis_shell/0, server/4]). - --export([server_loop/3]). - +%% +%% There are two major modes of group that work in similar though subtly different +%% ways, xterm and dumb. The xterm mode is used when a "newshell" is used and dumb +%% is used when "oldshell" or "noshell" are used. + +-export([start/1, start/2, start/3, whereis_shell/0, init/3, server/3, + xterm/3, dumb/3, handle_info/3]). + +%% gen statem callbacks +-export([init/1, callback_mode/0]). + +-type mfargs() :: {module(), atom(), [term()]}. +-type nmfargs() :: {node(), module(), atom(), [term()]}. + +-define(IS_PUTC_REQ(Req), element(1, Req) =:= put_chars orelse element(1, Req) =:= requests). +-define(IS_INPUT_REQ(Req), + element(1, Req) =:= get_chars orelse element(1, Req) =:= get_line orelse + element(1, Req) =:= get_until orelse element(1, Req) =:= get_password). + +-record(input_state, + { + %% Used by all input routines + from, + reply_as, + prompt_bytes, + encoding, + collect, + cont, + + %% Used by xterm state + lines = [], %% Previously entered lines that have not yet been consumed + save_history = true, %% Whether this input request should save history + + %% used by dumb state + get_fun, + io_lib_state = start + }). + +-record(state, + { read_type :: list | binary, + driver :: pid(), + echo :: boolean(), + dumb :: boolean(), + shell = noshell :: noshell | pid(), + + %% Only used by dumb + terminal_mode = cooked :: raw | cooked | disabled, + + %% Only used by xterm + line_history :: [string()] | undefined, + save_history :: boolean(), %% Whether get_line and get_until should save history + expand_fun :: function() | undefined, + expand_below :: boolean() | undefined, + + %% Used to push details about a input requests + %% if there are multiple ones in progress. + input_queue = queue:new(), + + %% Keeps extra data inbetween input routines + buf = [] :: unicode:chardata() | eof, + + input = undefined :: #input_state{} | undefined + }). + +-spec start(pid()) -> pid(). +start(Drv) -> + start(Drv, noshell). +-spec start(pid(), function() | nmfargs() | mfargs() | noshell) -> pid(). start(Drv, Shell) -> start(Drv, Shell, []). +-spec start(pid(), function() | nmfargs() | mfargs() | noshell, + [{name, atom()} | + {dumb, boolean()} | + {echo, boolean()} | + {expand_fun, function()} | + {expand_below, boolean()}]) -> pid(). start(Drv, Shell, Options) -> - Ancestors = [self() | case get('$ancestors') of - undefined -> []; - Anc -> Anc - end], - spawn_link(group, server, [Ancestors, Drv, Shell, Options]). + {ok, Pid} = + case proplists:get_value(name, Options) of + undefined -> + gen_statem:start(?MODULE, [Drv, Shell, Options], []); + Name -> + gen_statem:start({local, Name}, ?MODULE, [Drv, Shell, Options], []) + end, + Pid. -server(Ancestors, Drv, Shell, Options) -> +callback_mode() -> state_functions. + +init([Drv, Shell, Options]) -> process_flag(trap_exit, true), - _ = [put('$ancestors', Ancestors) || Shell =/= {}], - edlin:init(), - put(read_mode, list), - put(user_drv, Drv), - ExpandFun = normalize_expand_fun(Options, fun edlin_expand:expand/2), - put(expand_fun, ExpandFun), + %% Cleanup ancestors so that observer looks nice + _ = [put('$ancestors',tl(get('$ancestors'))) || Shell =:= noshell], - %% echo can be set to false by -oldshell and ssh_cli - put(echo, proplists:get_value(echo, Options, true)), + %% We link here instead of using start_link so that Drv does not become our parent + %% We don't want Drv as our parent as Drv will send EXIT signals to us and we need + %% to handle those and not just terminate. + link(Drv), - %% dumb can be set to true by ssh_cli - put(dumb, proplists:get_value(dumb, Options, false)), + Dumb = proplists:get_value(dumb, Options, Shell =:= noshell), - %% noshell can be set to true by user_drv - put(noshell, proplists:get_value(noshell, Options, false)), + State = #state{ + driver = Drv, + read_type = list, + dumb = Dumb, + save_history = not Dumb, - %% expand_below can be set by user_drv and ssh_cli - put(expand_below, proplists:get_value(expand_below, Options, true)), + %% echo is normally false for dumb and true for non-dumb, but when group is used by + %% ssh, it can also be set to true when dumb is true. + echo = proplists:get_value(echo, Options, not Dumb) - DefaultGroupHistory = - case not get(echo) of - true -> - []; - false -> - group_history:load() - end, + }, - put(line_buffer, proplists:get_value(line_buffer, Options, DefaultGroupHistory)), + edlin:init(), + + {ok, init, State, {next_event, internal, [Shell, Options]}}. + +init(internal, [Shell, Options], State = #state{ dumb = Dumb }) -> - server_loop(Drv, start_shell(Shell), []). + StartedShell = start_shell(Shell), + + NonDumbState = + if not Dumb -> + State#state{ + line_history = group_history:load(), + expand_below = proplists:get_value(expand_below, Options, not Dumb), + expand_fun = normalize_expand_fun(Options, fun edlin_expand:expand/2) + }; + Dumb -> + State + end, + {next_state, server, NonDumbState#state{ shell = StartedShell }}. + +-spec whereis_shell() -> undefined | pid(). whereis_shell() -> case node(group_leader()) of Node when Node =:= node() -> @@ -94,92 +181,352 @@ whereis_shell() -> %% Spawn a shell with its group_leader from the beginning set to ourselves. %% If Shell a pid the set its group_leader. +-spec start_shell(mfargs() | nmfargs() | + module() | function() | pid() | noshell) -> pid() | noshell. +start_shell(noshell) -> noshell; start_shell({Mod,Func,Args}) -> - start_shell1(Mod, Func, Args); + start_shell_mfa(Mod, Func, Args); start_shell({Node,Mod,Func,Args}) -> - start_shell1(rpc, call, [Node,Mod,Func,Args]); + start_shell_mfa(erpc, call, [Node,Mod,Func,Args]); start_shell(Shell) when is_atom(Shell) -> - start_shell1(Shell, start, []); + start_shell_mfa(Shell, start, []); start_shell(Shell) when is_function(Shell) -> - start_shell1(Shell); + start_shell_fun(Shell); start_shell(Shell) when is_pid(Shell) -> - group_leader(self(), Shell), % we are the shells group leader - link(Shell), % we're linked to it. + group_leader(self(), Shell), % we are the shells group leader + link(Shell), % we're linked to it. put(shell, Shell), - Shell; -start_shell(_Shell) -> - ok. + proc_lib:set_label({group, Shell}), + Shell. -start_shell1(M, F, Args) -> +start_shell_mfa(M, F, Args) -> G = group_leader(), group_leader(self(), self()), - case catch apply(M, F, Args) of - Shell when is_pid(Shell) -> - group_leader(G, self()), - link(Shell), % we're linked to it. - put(shell, Shell), + case apply(M, F, Args) of + Shell when is_pid(Shell) -> + group_leader(G, self()), + link(Shell), % we're linked to it. + proc_lib:set_label({group, {M, F, Args}}), + put(shell, Shell), Shell; - Error -> % start failure - exit(Error) % let the group process crash + Error -> % start failure + exit(Error) % let the group process crash end. -start_shell1(Fun) -> +start_shell_fun(Fun) -> G = group_leader(), group_leader(self(), self()), - case catch Fun() of - Shell when is_pid(Shell) -> - group_leader(G, self()), - link(Shell), % we're linked to it. - put(shell, Shell), + case Fun() of + Shell when is_pid(Shell) -> + group_leader(G, self()), + link(Shell), % we're linked to it. + proc_lib:set_label({group, Fun}), + put(shell, Shell), Shell; - Error -> % start failure - exit(Error) % let the group process crash + Error -> % start failure + exit(Error) % let the group process crash end. --spec server_loop(UserDrv :: pid(), Shell:: pid(), - Buffer :: unicode:chardata()) -> - no_return(). -server_loop(Drv, Shell, Buf0) -> - receive - {io_request,From,ReplyAs,Req} when is_pid(From) -> - %% This io_request may cause a transition to a couple of - %% selective receive loops elsewhere in this module. - Buf = io_request(Req, From, ReplyAs, Drv, Shell, Buf0), - ?MODULE:server_loop(Drv, Shell, Buf); - {reply,{From,ReplyAs},Reply} -> - io_reply(From, ReplyAs, Reply), - ?MODULE:server_loop(Drv, Shell, Buf0); - {driver_id,ReplyTo} -> - ReplyTo ! {self(),driver_id,Drv}, - ?MODULE:server_loop(Drv, Shell, Buf0); - {Drv, echo, Bool} -> - put(echo, Bool), - ?MODULE:server_loop(Drv, Shell, Buf0); - {'EXIT',Drv,interrupt} -> - %% Send interrupt to the shell. - exit_shell(interrupt), - ?MODULE:server_loop(Drv, Shell, Buf0); - {'EXIT',Drv,R} -> - exit(R); - {'EXIT',Shell,R} -> - exit(R); - %% We want to throw away any term that we don't handle (standard - %% practice in receive loops), but not any {Drv,_} tuples which are - %% handled in io_request/6. - NotDrvTuple when (not is_tuple(NotDrvTuple)) orelse - (tuple_size(NotDrvTuple) =/= 2) orelse - (element(1, NotDrvTuple) =/= Drv) -> - %% Ignore this unknown message. - ?MODULE:server_loop(Drv, Shell, Buf0) - end. +%% When there are no outstanding input requests we are in this state +server(info, {io_request,From,ReplyAs,Req}, Data) when is_pid(From), ?IS_INPUT_REQ(Req) -> + {next_state, + if Data#state.dumb orelse not Data#state.echo -> dumb; true -> xterm end, + Data#state{ input = #input_state{ from = From, reply_as = ReplyAs } }, + {next_event, internal, Req} }; +server(info, {Drv, _}, #state{ driver = Drv }) -> + %% We postpone any Drv event sent to us as they are handled in xterm or dumb states + {keep_state_and_data, postpone}; +server(info, Msg, Data) -> + handle_info(server, Msg, Data). + +%% This is the dumb terminal state, also used for noshell and xterm get_password + +%% When terminal_mode == raw, the terminal is in '{noshell,raw}' mode, which means that +%% for get_until and get_chars we change the behaviour a bit so that characters are +%% delivered as they are typed instead of at new-lines. +dumb(internal, {get_chars, Encoding, Prompt, N}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {collect_chars_eager, N, Prompt, Encoding, fun get_chars_dumb/5}, Data); +dumb(internal, {get_line, Encoding, Prompt}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {collect_line, [], Prompt, Encoding, fun get_line_dumb/5}, Data); +dumb(internal, {get_until, Encoding, Prompt, M, F, As}, Data = #state{ terminal_mode = raw }) -> + dumb(input_request, {get_until, {M, F, As}, Prompt, Encoding, fun get_chars_dumb/5}, Data); + +dumb(internal, {get_chars, Encoding, Prompt, N}, Data) -> + dumb(input_request, {collect_chars, N, Prompt, Encoding, fun get_chars_dumb/5}, Data); +dumb(internal, {get_line, Encoding, Prompt}, Data) -> + dumb(input_request, {collect_line, [], Prompt, Encoding, fun get_line_dumb/5}, Data); +dumb(internal, {get_until, Encoding, Prompt, M, F, As}, Data) -> + dumb(input_request, {get_until, {M, F, As}, Prompt, Encoding, fun get_line_dumb/5}, Data); + +dumb(internal, {get_password, _Encoding}, Data) -> + %% TODO: Implement for noshell by disabling characters echo if isatty(stdin) + io_reply(Data, {error, enotsup}), + pop_state(Data); + +dumb(input_request, {CollectF, CollectAs, Prompt, Encoding, GetFun}, + Data = #state{ input = OrigInputState }) -> + + InputState = OrigInputState#input_state{ + prompt_bytes = prompt_bytes(Prompt, Encoding), + collect = {CollectF, CollectAs}, + encoding = Encoding, get_fun = GetFun }, + + dumb(data, Data#state.buf, Data#state{ input = InputState, buf = [] }); + +%% If we get an input request while handling this request we push the current state +%% and re-issue event in server state +dumb(info, {io_request, _From, _ReplyAs, Req}, Data) when ?IS_INPUT_REQ(Req) -> + {next_state, server, push_state(dumb, Data), [{postpone, true}]}; +dumb(internal, restore_input_request, Data = #state{ buf = Buf }) -> + dumb(data, Buf, Data#state{ buf = [] }); + +dumb(data, Buf, Data = #state{ input = #input_state{ prompt_bytes = Pbs, encoding = Encoding, + io_lib_state = State, cont = Cont, + collect = {CollectF, CollectAs}, + get_fun = GetFun } = InputState }) -> + + %% Get a single line using get_line_dumb, or a single character using get_chars_dumb + case GetFun(Buf, Pbs, Cont, Encoding, Data) of + {no_translation, unicode, latin1} -> + io_reply(Data, {error,{no_translation, unicode, latin1}}), + pop_state(Data#state{ buf = [] }); + {done, NewLine, RemainBuf} -> + EncodedLine = cast(NewLine, Data#state.read_type, Encoding), + case io_lib:CollectF(State, EncodedLine, Encoding, CollectAs) of + {stop, eof, _} -> + io_reply(Data, eof), + pop_state(Data#state{ buf = eof }); + {stop, Result, eof} -> + io_reply(Data, Result), + pop_state(Data#state{ buf = eof }); + {stop, Result, Rest} -> + io_reply(Data, Result), + pop_state(Data#state{ buf = append(Rest, RemainBuf, Encoding) }); + {'EXIT',_} -> + io_reply(Data, {error,err_func(io_lib, CollectF, CollectAs)}), + pop_state(Data#state{ buf = [] }); + NewState -> + [Data#state.driver ! {self(), read, io_lib:CollectF(NewState)} || Data#state.shell =:= noshell], + dumb(data, RemainBuf, Data#state{ input = InputState#input_state{ cont = undefined, io_lib_state = NewState } }) + end; + {more_chars, NewCont} -> + [Data#state.driver ! {self(), read, 0} || Data#state.shell =:= noshell], + {keep_state, Data#state{ input = InputState#input_state{ cont = NewCont } } } + end; + +dumb(info, {Drv, activate}, #state{ driver = Drv }) -> + keep_state_and_data; +dumb(info, Msg, Data) -> + handle_info(dumb, Msg, Data). + +%% The xterm state handles the "newshell" mode. This is the most advanced shell +%% that has a shell history, can open text editors and navigate in multiline shell +%% expressions. +xterm(internal, {get_chars, Encoding, Prompt, N}, Data) -> + xterm(input_request, {collect_chars, N, Prompt, Encoding}, Data); +xterm(internal, {get_line, Encoding, Prompt}, Data) -> + xterm(input_request, {collect_line, [], Prompt, Encoding}, Data); +xterm(internal, {get_until, Encoding, Prompt, M, F, As}, Data) -> + xterm(input_request, {get_until, {M, F, As}, Prompt, Encoding}, Data); +xterm(internal, {get_password, Encoding}, Data) -> + + %% When getting the password we change state to dumb and use its + %% implementation and set echo to false. + GetLine = fun(Buf, Pbs, Cont, LineEncoding, LineData) -> + get_line_dumb(Buf, Pbs, Cont, LineEncoding, + LineData#state{ echo = false }) + end, + case dumb(input_request, {collect_line_no_eol, [], "", Encoding, GetLine}, Data) of + {keep_state, NewData} -> + %% As we are currently in the xterm state, we transition to dumb + {next_state, dumb, NewData}; + Else when element(1, Else) =:= next_state -> Else + end; +xterm(input_request, {CollectF, CollectAs, Prompt, Encoding}, + Data = #state{ input = OrigInputState }) -> + + InputState = OrigInputState#input_state{ + prompt_bytes = prompt_bytes(Prompt, Encoding), + collect = {CollectF, CollectAs}, + save_history = Data#state.save_history, + encoding = Encoding }, + + xterm(data, Data#state.buf, Data#state{ input = InputState, buf = [] }); + +xterm(info, {io_request, _From, _ReplyAs, Req}, Data = #state{ driver = Drv }) + when ?IS_INPUT_REQ(Req) -> + %% We got an new input request while serving this one, we: + %% * erase current line + %% * push the current input state + %% * re-issue the input event in the server state + send_drv_reqs(Drv, edlin:erase_line()), + {next_state, server, push_state(xterm, Data), [{postpone, true}]}; +xterm(internal, restore_input_request, + #state{ buf = Buf, driver = Drv, input = #input_state{ cont = {EdlinCont, _} }} = Data) -> + %% We are restoring an input request so we redraw the line + send_drv_reqs(Drv, edlin:redraw_line(EdlinCont)), + xterm(data, Buf, Data#state{ buf = [] }); + +xterm(data, Buf, Data = #state{ input = #input_state{ + prompt_bytes = Pbs, encoding = Encoding, + lines = Lines, cont = Cont, + save_history = SaveHistory, + collect = {CollectF, CollectAs} } = InputState }) -> + + %% Get a single line using edlin + case get_line_edlin(Buf, Pbs, Cont, Lines, Encoding, Data) of + {done, NewLines, RemainBuf} -> + CurrentLine = cast(edlin:current_line(NewLines), Data#state.read_type, Encoding), + case io_lib:CollectF(start, CurrentLine, Encoding, CollectAs) of + {stop, eof, _} -> + io_reply(Data, eof), + pop_state(Data#state{ buf = eof }); + {stop, Result, eof} -> + io_reply(Data, Result), + pop_state(Data#state{ buf = eof }); + {stop, Result, Rest} -> + %% Prompt was valid expression, clear the prompt in user_drv and redraw + %% the formatted expression. + FormattedLine = format_expression(NewLines, Data#state.driver), + [CL1|LB1] = lists:reverse(string:split(FormattedLine, "\n", all)), + LineCont1 = {LB1,{lists:reverse(CL1++"\n"), []},[]}, + MultiLinePrompt = lists:duplicate(shell:prompt_width(Pbs), $\s), + send_drv_reqs(Data#state.driver, [{redraw_prompt, Pbs, MultiLinePrompt, LineCont1},new_prompt]), + + NewHistory = + + if SaveHistory -> + %% Save into history buffer if issued from shell process + save_line_buffer(string:trim(FormattedLine, both)++"\n", + Data#state.line_history); + true -> + Data#state.line_history + end, + + io_reply(Data, Result), + pop_state( + Data#state{ line_history = NewHistory, + buf = append(Rest, RemainBuf, Encoding) }); + {'EXIT',_} -> + io_reply(Data, {error,err_func(io_lib, CollectF, CollectAs)}), + pop_state(Data#state{ buf = [] }); + _NewState -> + xterm(data, RemainBuf, Data#state{ input = InputState#input_state{ cont = undefined, lines = NewLines} }) + end; + {blink, NewCont} -> + {keep_state, Data#state{ input = InputState#input_state{ cont = NewCont } }, 1000}; + {more_chars, NewCont} -> + {keep_state, Data#state{ input = InputState#input_state{ cont = NewCont } } } + end; -exit_shell(Reason) -> - case get(shell) of - undefined -> true; - Pid -> exit(Pid, Reason) +xterm(info, {io_request,From,ReplyAs,Req}, + #state{ driver = Drv}) + when ?IS_PUTC_REQ(Req) -> + putc_request(Req, From, ReplyAs, Drv), + keep_state_and_data; + +xterm(info, {Drv, activate}, + #state{ driver = Drv, input = #input_state{ cont = {EdlinCont, _} } }) -> + send_drv_reqs(Drv, edlin:redraw_line(EdlinCont)), + keep_state_and_data; + +xterm(info, Msg, Data) -> + handle_info(xterm, Msg, Data); + +xterm(timeout, 1000, Data) -> + %% Blink timeout triggered + xterm(data, [], Data). + +%% Handle the info messages that needs to be managed in all states +handle_info(State, {Drv, {data, Buf}}, Data = #state{ driver = Drv }) -> + ?MODULE:State(data, Buf, Data); +handle_info(State, {Drv, eof}, Data = #state{ driver = Drv }) -> + ?MODULE:State(data, eof, Data); +handle_info(_State, {Drv, echo, Bool}, Data = #state{ driver = Drv }) -> + {keep_state, Data#state{ echo = Bool } }; +handle_info(_State, {Drv, {error, _} = Error}, Data = #state{ driver = Drv }) -> + io_reply(Data, Error), + pop_state(Data#state{ buf = [] }); +handle_info(_State, {Drv, terminal_mode, Mode}, Data = #state{ driver = Drv }) -> + noshell = Data#state.shell, + true = lists:member(Mode, [raw, cooked, disabled]), + {keep_state, Data#state{ terminal_mode = Mode }}; + +handle_info(_State, {io_request, From, ReplyAs, {setopts, Opts}}, Data) -> + {Reply, NewData} = setopts(Opts, Data), + io_reply(From, ReplyAs, Reply), + {keep_state, NewData}; +handle_info(_State, {io_request,From,ReplyAs, getopts}, Data) -> + io_reply(From, ReplyAs, getopts(Data)), + keep_state_and_data; +handle_info(_State, {io_request,From,ReplyAs, {get_geometry, What}}, Data) -> + case get_tty_geometry(Data#state.driver) of + {Width, _Height} when What =:= columns-> + io_reply(From, ReplyAs, Width); + {_Width, Height} when What =:= rows-> + io_reply(From, ReplyAs, Height); + _ -> + io_reply(From, ReplyAs, {error, enotsup}) + end, + keep_state_and_data; +handle_info(_State, {io_request,From,ReplyAs,Req}, Data) when ?IS_PUTC_REQ(Req) -> + putc_request(Req, From, ReplyAs, Data#state.driver); + +handle_info(_State, {reply, undefined, _Reply}, _Data) -> + %% Ignore any reply with an undefined From. + keep_state_and_data; +handle_info(_State, {reply,{From,ReplyAs},Reply}, _Data) -> + io_reply(From, ReplyAs, Reply), + keep_state_and_data; + +handle_info(_State, {driver_id,ReplyTo}, Data) -> %% TODO: Remove this? + ReplyTo ! {self(),driver_id, Data#state.driver}, + keep_state_and_data; +handle_info(_State, {'EXIT', Drv, interrupt}, #state{ driver = Drv, shell = Shell, input = undefined }) -> + %% Send interrupt to the shell of there is no current input request + [exit(Shell, interrupt) || is_pid(Shell)], + keep_state_and_data; +handle_info(_State, {'EXIT', Drv, interrupt}, #state{ driver = Drv } = Data) -> + %% Interrupt current input request + io_reply(Data, {error, interrupted}), + pop_state(Data#state{ buf = [] }); + +handle_info(_State, {'EXIT',Drv,_R}, #state{ driver = Drv } = Data) -> + [ exit(Data#state.shell, kill) + || is_pid(Data#state.shell) andalso Data#state.input =/= undefined], + {stop, normal}; +handle_info(_State, {'EXIT',Shell,R}, #state{ shell = Shell, driver = Drv }) -> + %% We propagate the error reason from the shell to the driver, but we don't + %% want to exit ourselves with that reason as it will generate crash report + %% messages that we do not want. + exit(Drv, R), + {stop, normal}; + +handle_info(_State, _UnknownEvent, _Data) -> + %% Ignore this unknown message. + erlang:display({unknown, _UnknownEvent}), + ok = _UnknownEvent, + keep_state_and_data. + +%% When we get an input request while already serving another, we +%% push the state of the current request into the input_queue and +%% switch to handling the new request. +push_state(State, Data) -> + Data#state{ input_queue = queue:in({State, Data#state.input}, Data#state.input_queue) }. + +%% When an input request is done we then need to check if there was +%% another request in progress, and if so we pop its state and resume it. +pop_state(Data) -> + case queue:out(Data#state.input_queue) of + {empty, _} -> + {next_state, server, Data#state{ input = undefined }}; + {{value, {State, InputState}}, NewInputQueue} -> + {next_state, State, Data#state{ input = InputState, input_queue = NewInputQueue }, + {next_event, internal, restore_input_request } } end. +%% Functions for getting data from the driver get_tty_geometry(Drv) -> Drv ! {self(),tty_geometry}, receive @@ -210,168 +557,104 @@ set_unicode_state(Drv,Bool) -> get_terminal_state(Drv) -> Drv ! {self(),get_terminal_state}, receive - {Drv,get_terminal_state,Terminal} -> - Terminal; - {Drv,get_terminal_state,error} -> - {error, internal} + {Drv,get_terminal_state,Terminal} -> + Terminal; + {Drv,get_terminal_state,error} -> + {error, internal} after 2000 -> - {error,timeout} + {error,timeout} end. -io_request(Req, From, ReplyAs, Drv, Shell, Buf0) -> - case io_request(Req, Drv, Shell, {From,ReplyAs}, Buf0) of - {ok,Reply,Buf} -> - io_reply(From, ReplyAs, Reply), - Buf; - {noreply,Buf} -> +%% This function handles any put_chars request +putc_request(Req, From, ReplyAs, Drv) -> + case putc_request(Req, Drv, {From, ReplyAs}) of + {reply,Reply} -> + io_reply(From, ReplyAs, Reply), + keep_state_and_data; + noreply -> %% We expect a {reply,_} message from the Drv when request is done - Buf; - {error,Reply,Buf} -> - io_reply(From, ReplyAs, Reply), - Buf; - {exit,R} -> - %% 'kill' instead of R, since the shell is not always in - %% a state where it is ready to handle a termination - %% message. - exit_shell(kill), - exit(R) + keep_state_and_data end. - %% Put_chars, unicode is the normal message, characters are always in %% standard unicode format. %% You might be tempted to send binaries unchecked, but the driver %% expects unicode, so that is what we should send... -%% io_request({put_chars,unicode,Binary}, Drv, Buf) when is_binary(Binary) -> +%% putc_request({put_chars,unicode,Binary}, Drv, Buf) when is_binary(Binary) -> %% send_drv(Drv, {put_chars,Binary}), %% {ok,ok,Buf}; %% %% These put requests have to be synchronous to the driver as otherwise %% there is no guarantee that the data has actually been printed. -io_request({put_chars,unicode,Chars}, Drv, _Shell, From, Buf) -> +putc_request({put_chars,unicode,Chars}, Drv, From) -> case catch unicode:characters_to_binary(Chars,utf8) of - Binary when is_binary(Binary) -> - send_drv(Drv, {put_chars_sync, unicode, Binary, From}), - {noreply,Buf}; - _ -> - {error,{error,{put_chars, unicode,Chars}},Buf} - end; -io_request({put_chars,unicode,M,F,As}, Drv, _Shell, From, Buf) -> - case catch apply(M, F, As) of - Binary when is_binary(Binary) -> - send_drv(Drv, {put_chars_sync, unicode, Binary, From}), - {noreply,Buf}; - Chars -> - case catch unicode:characters_to_binary(Chars,utf8) of - B when is_binary(B) -> - send_drv(Drv, {put_chars_sync, unicode, B, From}), - {noreply,Buf}; - _ -> - {error,{error,F},Buf} - end - end; -io_request({put_chars,latin1,Binary}, Drv, _Shell, From, Buf) when is_binary(Binary) -> - send_drv(Drv, {put_chars_sync, unicode, - unicode:characters_to_binary(Binary,latin1), - From}), - {noreply,Buf}; -io_request({put_chars,latin1,Chars}, Drv, _Shell, From, Buf) -> - case catch unicode:characters_to_binary(Chars,latin1) of Binary when is_binary(Binary) -> send_drv(Drv, {put_chars_sync, unicode, Binary, From}), - {noreply,Buf}; + noreply; _ -> - {error,{error,{put_chars,latin1,Chars}},Buf} + {reply,{error,{put_chars, unicode,Chars}}} end; -io_request({put_chars,latin1,M,F,As}, Drv, _Shell, From, Buf) -> +putc_request({put_chars,unicode,M,F,As}, Drv, From) -> case catch apply(M, F, As) of - Binary when is_binary(Binary) -> - send_drv(Drv, {put_chars_sync, unicode, - unicode:characters_to_binary(Binary,latin1), - From}), - {noreply,Buf}; - Chars -> - case catch unicode:characters_to_binary(Chars,latin1) of - B when is_binary(B) -> - send_drv(Drv, {put_chars_sync, unicode, B, From}), - {noreply,Buf}; - _ -> - {error,{error,F},Buf} - end - end; - -io_request({get_chars,Encoding,Prompt,N}, Drv, Shell, _From, Buf) -> - get_chars_n(Prompt, io_lib, collect_chars, N, Drv, Shell, Buf, Encoding); -io_request({get_line,Encoding,Prompt}, Drv, Shell, _From, Buf) -> - get_chars_line(Prompt, io_lib, collect_line, [], Drv, Shell, Buf, Encoding); -io_request({get_until,Encoding, Prompt,M,F,As}, Drv, Shell, _From, Buf) -> - get_chars_line(Prompt, io_lib, get_until, {M,F,As}, Drv, Shell, Buf, Encoding); -io_request({get_password,_Encoding},Drv,Shell,_From,Buf) -> - get_password_chars(Drv, Shell, Buf); -io_request({setopts,Opts}, Drv, _Shell, _From, Buf) when is_list(Opts) -> - setopts(Opts, Drv, Buf); -io_request(getopts, Drv, _Shell, _From, Buf) -> - getopts(Drv, Buf); -io_request({requests,Reqs}, Drv, Shell, From, Buf) -> - io_requests(Reqs, {ok,ok,Buf}, From, Drv, Shell); - -%% New in R12 -io_request({get_geometry,columns},Drv,_Shell,_From,Buf) -> - case get_tty_geometry(Drv) of - {W,_H} -> - {ok,W,Buf}; - _ -> - {error,{error,enotsup},Buf} + Binary when is_binary(Binary) -> + send_drv(Drv, {put_chars_sync, unicode, Binary, From}), + noreply; + Chars -> + case catch unicode:characters_to_binary(Chars,utf8) of + B when is_binary(B) -> + send_drv(Drv, {put_chars_sync, unicode, B, From}), + noreply; + _ -> + {reply,{error,F}} + end end; -io_request({get_geometry,rows},Drv,_Shell,_From,Buf) -> - case get_tty_geometry(Drv) of - {_W,H} -> - {ok,H,Buf}; - _ -> - {error,{error,enotsup},Buf} +putc_request({put_chars,latin1,Output}, Drv, From) -> + send_drv(Drv, {put_chars_sync, latin1, Output, From}), + noreply; +putc_request({put_chars,latin1,M,F,As}, Drv, From) -> + case catch apply(M, F, As) of + Ret when is_list(Ret) =:= false, is_binary(Ret) =:= false -> + {reply, {error, F}}; + Chars -> send_drv(Drv, {put_chars_sync, latin1, Chars, From}), + noreply end; +putc_request({requests,Reqs}, Drv, From) -> + putc_requests(Reqs, {reply, ok}, Drv, From); %% BC with pre-R13 -io_request({put_chars,Chars}, Drv, Shell, From, Buf) -> - io_request({put_chars,latin1,Chars}, Drv, Shell, From, Buf); -io_request({put_chars,M,F,As}, Drv, Shell, From, Buf) -> - io_request({put_chars,latin1,M,F,As}, Drv, Shell, From, Buf); -io_request({get_chars,Prompt,N}, Drv, Shell, From, Buf) -> - io_request({get_chars,latin1,Prompt,N}, Drv, Shell, From, Buf); -io_request({get_line,Prompt}, Drv, Shell, From, Buf) -> - io_request({get_line,latin1,Prompt}, Drv, Shell, From, Buf); -io_request({get_until, Prompt,M,F,As}, Drv, Shell, From, Buf) -> - io_request({get_until,latin1, Prompt,M,F,As}, Drv, Shell, From, Buf); -io_request(get_password,Drv,Shell,From,Buf) -> - io_request({get_password,latin1},Drv,Shell,From,Buf); - - +putc_request({put_chars,Chars}, Drv, From) -> + putc_request({put_chars,latin1,Chars}, Drv, From); +putc_request({put_chars,M,F,As}, Drv, From) -> + putc_request({put_chars,latin1,M,F,As}, Drv, From); -io_request(_, _Drv, _Shell, _From, Buf) -> - {error,{error,request},Buf}. +putc_request(_, _Drv, _From) -> + {error,{error,request}}. -%% Status = io_requests(RequestList, PrevStat, From, Drv, Shell) +%% Status = putc_requests(RequestList, PrevStat, From, Drv, Shell) %% Process a list of output requests as long as %% the previous status is 'ok' or noreply. %% %% We use undefined as the From for all but the last request %% in order to discards acknowledgements from those requests. %% -io_requests([R|Rs], {noreply,Buf}, From, Drv, Shell) -> +putc_requests([R|Rs], noreply, Drv, From) -> ReqFrom = if Rs =:= [] -> From; true -> undefined end, - io_requests(Rs, io_request(R, Drv, Shell, ReqFrom, Buf), From, Drv, Shell); -io_requests([R|Rs], {ok,ok,Buf}, From, Drv, Shell) -> + putc_requests(Rs, putc_request(R, Drv, ReqFrom), Drv, From); +putc_requests([R|Rs], {reply,ok}, Drv, From) -> ReqFrom = if Rs =:= [] -> From; true -> undefined end, - io_requests(Rs, io_request(R, Drv, Shell, ReqFrom, Buf), From, Drv, Shell); -io_requests([_|_], Error, _From, _Drv, _Shell) -> + putc_requests(Rs, putc_request(R, Drv, ReqFrom), Drv, From); +putc_requests([_|_], Error, _Drv, _From) -> Error; -io_requests([], Stat, _From, _, _Shell) -> +putc_requests([], Stat, _Drv, _From) -> Stat. %% io_reply(From, ReplyAs, Reply) %% The function for sending i/o command acknowledgement. %% The ACK contains the return value. +io_reply(#state{ input = #input_state{ from = From, reply_as = As } }, Reply) -> + io_reply(From, As, Reply). + io_reply(undefined, _ReplyAs, _Reply) -> %% Ignore these replies as they are generated from io_requests/5. ok; @@ -399,207 +682,100 @@ expand_encoding([unicode | T]) -> expand_encoding([H|T]) -> [H|expand_encoding(T)]. %% setopts -setopts(Opts0,Drv,Buf) -> +setopts(Opts0,Data) -> Opts = proplists:unfold( - proplists:substitute_negations( - [{list,binary}], - expand_encoding(Opts0))), - case check_valid_opts(Opts) of - true -> - do_setopts(Opts,Drv,Buf); - false -> - {error,{error,enotsup},Buf} + proplists:substitute_negations( + [{list,binary}], + expand_encoding(Opts0))), + case check_valid_opts(Opts, Data#state.shell =/= noshell) of + true -> + do_setopts(Opts,Data); + false -> + {{error,enotsup},Data} end. -check_valid_opts([]) -> +check_valid_opts([], _) -> true; -check_valid_opts([{binary,Flag}|T]) when is_boolean(Flag) -> - check_valid_opts(T); -check_valid_opts([{encoding,Valid}|T]) when Valid =:= unicode; - Valid =:= utf8; - Valid =:= latin1 -> - check_valid_opts(T); -check_valid_opts([{echo,Flag}|T]) when is_boolean(Flag) -> - check_valid_opts(T); -check_valid_opts([{expand_fun,Fun}|T]) when is_function(Fun, 1); - is_function(Fun, 2) -> - check_valid_opts(T); -check_valid_opts(_) -> +check_valid_opts([{binary,Flag}|T], HasShell) when is_boolean(Flag) -> + check_valid_opts(T, HasShell); +check_valid_opts([{encoding,Valid}|T], HasShell) when Valid =:= unicode; + Valid =:= utf8; + Valid =:= latin1 -> + check_valid_opts(T, HasShell); +check_valid_opts([{echo,Flag}|T], HasShell) when is_boolean(Flag) -> + check_valid_opts(T, HasShell); +check_valid_opts([{line_history,Flag}|T], HasShell = true) when is_boolean(Flag) -> + check_valid_opts(T, HasShell); +check_valid_opts([{expand_fun,Fun}|T], HasShell = true) when is_function(Fun, 1); + is_function(Fun, 2) -> + check_valid_opts(T, HasShell); +check_valid_opts(_, _HasShell) -> false. -do_setopts(Opts, Drv, Buf) -> - put(expand_fun, normalize_expand_fun(Opts, get(expand_fun))), - put(echo, proplists:get_value(echo, Opts, get(echo))), +do_setopts(Opts, Data) -> + ExpandFun = normalize_expand_fun(Opts, Data#state.expand_fun), + Echo = proplists:get_value(echo, Opts, Data#state.echo), case proplists:get_value(encoding, Opts) of - Valid when Valid =:= unicode; Valid =:= utf8 -> - set_unicode_state(Drv,true); - latin1 -> - set_unicode_state(Drv,false); - undefined -> - ok + Valid when Valid =:= unicode; Valid =:= utf8 -> + set_unicode_state(Data#state.driver,true); + latin1 -> + set_unicode_state(Data#state.driver,false); + undefined -> + ok end, - case proplists:get_value(binary, Opts, case get(read_mode) of - binary -> true; - _ -> false - end) of - true -> - put(read_mode, binary), - {ok,ok,Buf}; - false -> - put(read_mode, list), - {ok,ok,Buf} - end. + ReadType = + case proplists:get_value(binary, Opts, + case Data#state.read_type of + binary -> true; + _ -> false + end) of + true -> + binary; + false -> + list + end, + LineHistory = proplists:get_value(line_history, Opts, true), + {ok, Data#state{ expand_fun = ExpandFun, echo = Echo, read_type = ReadType, + save_history = LineHistory }}. normalize_expand_fun(Options, Default) -> case proplists:get_value(expand_fun, Options, Default) of - Fun when is_function(Fun, 1) -> fun(X,_) -> Fun(X) end; - Fun -> Fun + Fun when is_function(Fun, 1) -> fun(X,_) -> Fun(X) end; + Fun -> Fun end. -getopts(Drv,Buf) -> - Exp = {expand_fun, case get(expand_fun) of - Func when is_function(Func) -> - Func; - _ -> - false - end}, - Echo = {echo, case get(echo) of - Bool when Bool =:= true; Bool =:= false -> - Bool; - _ -> - false - end}, - Bin = {binary, case get(read_mode) of - binary -> - true; - _ -> - false - end}, - Uni = {encoding, case get_unicode_state(Drv) of - true -> unicode; - _ -> latin1 - end}, - Terminal = get_terminal_state(Drv), +getopts(Data) -> + Exp = {expand_fun, case Data#state.expand_fun of + Func when is_function(Func) -> + Func; + _ -> + false + end}, + Echo = {echo, case Data#state.echo of + Bool when Bool =:= true; Bool =:= false -> + Bool; + _ -> + false + end}, + LineHistory = {line_history, + case Data#state.save_history of + HistBool when HistBool =:= true; HistBool =:= false -> + HistBool; + _ -> + false + end}, + Bin = {binary, case Data#state.read_type of + binary -> + true; + _ -> + false + end}, + Uni = {encoding, case get_unicode_state(Data#state.driver) of + true -> unicode; + _ -> latin1 + end}, + Terminal = get_terminal_state(Data#state.driver), Tty = {terminal, maps:get(stdout, Terminal)}, - {ok,[Exp,Echo,Bin,Uni,Tty|maps:to_list(Terminal)],Buf}. - -%% get_chars_*(Prompt, Module, Function, XtraArgument, Drv, Buffer) -%% Gets characters from the input Drv until as the applied function -%% returns {stop,Result,Rest}. Does not block output until input has been -%% received. -%% Returns: -%% {Result,NewSaveBuffer} -%% {error,What,NewSaveBuffer} - -get_password_chars(Drv,Shell,Buf) -> - case get(echo) of - true -> - case get_password_line(Buf, Drv, Shell) of - {done, Line, Buf1} -> - {ok, Line, Buf1}; - interrupted -> - {error, {error, interrupted}, []}; - terminated -> - {exit, terminated} - end; - false -> - %% Echo needs to be set to true, otherwise the - %% password will be printed to the shell and we - %% do not want that. - {error, {error, enotsup}, []} - end. - -get_chars_n(Prompt, M, F, Xa, Drv, Shell, Buf, Encoding) -> - Pbs = prompt_bytes(Prompt, Encoding), - case get(echo) of - true -> - get_chars_loop(Pbs, M, F, Xa, Drv, Shell, Buf, start, [], Encoding); - false -> - get_chars_n_loop(Pbs, M, F, Xa, Drv, Shell, Buf, start, Encoding) - end. - -get_chars_line(Prompt, M, F, Xa, Drv, Shell, Buf, Encoding) -> - Pbs = prompt_bytes(Prompt, Encoding), - get_chars_loop(Pbs, M, F, Xa, Drv, Shell, Buf, start, [], Encoding). - -get_chars_loop(Pbs, M, F, Xa, Drv, Shell, Buf0, State, LineCont0, Encoding) -> - Result = case not(get(dumb)) andalso get(echo) of - true -> - get_line(Buf0, Pbs, LineCont0, Drv, Shell, Encoding); - false -> - get_line_echo_off(Buf0, Encoding, Pbs, Drv, Shell) - end, - case Result of - {done,LineCont1,Buf} -> - get_chars_apply(Pbs, M, F, Xa, Drv, Shell, append(Buf, [], Encoding), - State, LineCont1, Encoding); - {no_translation, unicode, latin1} -> - {error,{error,{no_translation, unicode, latin1}}, []}; - interrupted -> - {error,{error,interrupted},[]}; - terminated -> - {exit,terminated} - end. - -get_chars_apply(Pbs, M, F, Xa, Drv, Shell, Buf, State0, LineCont, Encoding) -> - %% multi line support means that we should not keep the state - %% but we need to keep it for oldshell mode - {State, Line} = case not(get(dumb)) andalso get(echo) of - true -> {start, edlin:current_line(LineCont)}; - false -> {State0, LineCont} - end, - case catch M:F(State, cast(Line,get(read_mode), Encoding), Encoding, Xa) of - {stop,eof,_} -> - {ok,eof,eof}; - {stop,Result,eof} -> - {ok,Result,eof}; - {stop,Result,Rest} -> - %% Prompt was valid expression, clear the prompt in user_drv - %% First redraw without the multi line prompt - FormattedLine = format_expression(LineCont, Drv), - case LineCont of - {[_|_], _, _} -> - [CL1|LB1] = lists:reverse(string:split(FormattedLine, "\n", all)), - LineCont1 = {LB1,{lists:reverse(CL1++"\n"), []},[]}, - MultiLinePrompt = lists:duplicate(shell:prompt_width(Pbs), $\s), - send_drv_reqs(Drv, [{redraw_prompt, Pbs, MultiLinePrompt, LineCont1},new_prompt]); - _ -> skip %% oldshell mode - end, - _ = case {M,F} of - {io_lib, get_until} -> - save_line_buffer(string:trim(FormattedLine, both)++"\n", get_lines(new_stack(get(line_buffer)))); - _ -> - skip - end, - {ok,Result,append(Rest, Buf, Encoding)}; - {'EXIT',_} -> - {error,{error,err_func(M, F, Xa)},[]}; - State1 -> - get_chars_loop(Pbs, M, F, Xa, Drv, Shell, Buf, State1, LineCont, Encoding) - end. - -get_chars_n_loop(Pbs, M, F, Xa, Drv, Shell, Buf0, State, Encoding) -> - case check_encoding(Buf0, Encoding) of - false -> - {error,{error,{no_translation,unicode,Encoding}},[]}; - true -> - try M:F(State, cast(Buf0, get(read_mode), Encoding), Encoding, Xa) of - {stop,eof,_} -> - {ok, eof, eof}; - {stop,Result,Rest} -> - {ok, Result, append(Rest,[],Encoding)}; - State1 -> - case get_chars_echo_off(Pbs, Drv, Shell) of - interrupted -> - {error,{error,interrupted},[]}; - terminated -> - {exit,terminated}; - Buf -> - get_chars_n_loop(Pbs, M, F, Xa, Drv, Shell, Buf, State1, Encoding) - end - catch _:_ -> - {error,{error,err_func(M, F, Xa)},[]} - end - end. + [Exp,Echo,LineHistory,Bin,Uni,Tty|maps:to_list(Terminal)]. %% Convert error code to make it look as before err_func(io_lib, get_until, {_,F,_}) -> @@ -608,24 +784,37 @@ err_func(_, F, _) -> F. %% get_line(Chars, PromptBytes, Drv) -%% Get a line with eventual line editing. Handle other io requests -%% while getting line. +%% Get a line with eventual line editing. %% Returns: %% {done,LineChars,RestChars} -%% interrupted -get_line(Chars, Pbs, Cont, Drv, Shell, Encoding) -> - {more_chars,Cont1,Rs} = case Cont of +%% {more_data, Cont, Ls} +%% {blink, Cons, Ls} + +-record(get_line_edlin_state, {history, encoding, expand_fun, expand_below, + search, search_quit_prompt, search_result}). + +get_line_edlin(Chars, Pbs, undefined, Lines, Encoding, + #state{ driver = Drv, line_history = History, + expand_fun = ExpandFun, expand_below = ExpandBelow}) -> + {more_chars,Cont1,Rs} = case Lines of [] -> edlin:start(Pbs); - _ -> edlin:start(Pbs, Cont) + _ -> edlin:start(Pbs, Lines) end, send_drv_reqs(Drv, Rs), - get_line1(edlin:edit_line(Chars, Cont1), Drv, Shell, new_stack(get(line_buffer)), - Encoding). - -get_line1({done, Cont, Rest, Rs}, Drv, _Shell, _Ls, _Encoding) -> + get_line_edlin(edlin:edit_line(Chars, Cont1), Drv, #get_line_edlin_state{ + history = new_stack(History), + encoding = Encoding, + expand_fun = ExpandFun, + expand_below = ExpandBelow }); +get_line_edlin(Chars, _Pbs, {EdlinCont, GetLineState}, _Lines, _Encoding, + #state{ driver = Drv }) -> + get_line_edlin(edlin:edit_line(cast(Chars, list), EdlinCont), + Drv, GetLineState). + +get_line_edlin({done, Cont, Rest, Rs}, Drv, _State) -> send_drv_reqs(Drv, Rs), {done, Cont, Rest}; -get_line1({open_editor, _Cs, Cont, Rs}, Drv, Shell, Ls0, Encoding) -> +get_line_edlin({open_editor, _Cs, Cont, Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), Buffer = edlin:current_line(Cont), send_drv(Drv, {open_editor, Buffer}), @@ -634,52 +823,52 @@ get_line1({open_editor, _Cs, Cont, Rs}, Drv, Shell, Ls0, Encoding) -> send_drv_reqs(Drv, edlin:erase_line()), {more_chars,NewCont,NewRs} = edlin:start(edlin:prompt(Cont)), send_drv_reqs(Drv, NewRs), - get_line1(edlin:edit_line(Cs1, NewCont), Drv, Shell, Ls0, Encoding) + get_line_edlin(edlin:edit_line(Cs1, NewCont), Drv, State); + {Drv, not_supported} -> + get_line_edlin(edlin:edit_line(_Cs, Cont), Drv, State) end; -get_line1({format_expression, _Cs, {line, _, _, _} = Cont, Rs}, Drv, Shell, Ls, Encoding) -> +get_line_edlin({format_expression, _Cs, {line, _, _, _} = Cont, Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), Cs1 = format_expression(Cont, Drv), send_drv_reqs(Drv, edlin:erase_line()), {more_chars,NewCont,NewRs} = edlin:start(edlin:prompt(Cont)), send_drv_reqs(Drv, NewRs), - get_line1(edlin:edit_line(Cs1, NewCont), Drv, Shell, Ls, Encoding); + get_line_edlin(edlin:edit_line(Cs1, NewCont), Drv, State); %% Move Up, Down in History: Ctrl+P, Ctrl+N -get_line1({history_up,Cs,{_,_,_,Mode0}=Cont,Rs}, Drv, Shell, Ls0, Encoding) -> +get_line_edlin({history_up,Cs,{_,_,_,Mode0}=Cont,Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), - case up_stack(save_line(Ls0, edlin:current_line(Cont))) of + case up_stack(save_line(State#get_line_edlin_state.history, edlin:current_line(Cont))) of {none,_Ls} -> send_drv(Drv, beep), - get_line1(edlin:edit_line(Cs, Cont), Drv, Shell, Ls0, Encoding); + get_line_edlin(edlin:edit_line(Cs, Cont), Drv, State); {Lcs,Ls} -> send_drv_reqs(Drv, edlin:erase_line()), {more_chars,{A,B,C,_},Nrs} = edlin:start(edlin:prompt(Cont)), Ncont = {A,B,C,Mode0}, send_drv_reqs(Drv, Nrs), - get_line1( + get_line_edlin( edlin:edit_line1( string:to_graphemes( lists:sublist(Lcs, 1, length(Lcs)-1)), Ncont), - Drv, Shell, Ls, Encoding) + Drv, State#get_line_edlin_state{ history = Ls }) end; -get_line1({history_down,Cs,{_,_,_,Mode0}=Cont,Rs}, Drv, Shell, Ls0, Encoding) -> +get_line_edlin({history_down,Cs,{_,_,_,Mode0}=Cont,Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), - case down_stack(save_line(Ls0, edlin:current_line(Cont))) of + case down_stack(save_line(State#get_line_edlin_state.history, edlin:current_line(Cont))) of {none,_Ls} -> send_drv(Drv, beep), - get_line1(edlin:edit_line(Cs, Cont), Drv, Shell, Ls0, Encoding); + get_line_edlin(edlin:edit_line(Cs, Cont), Drv, State); {Lcs,Ls} -> send_drv_reqs(Drv, edlin:erase_line()), {more_chars,{A,B,C,_},Nrs} = edlin:start(edlin:prompt(Cont)), Ncont = {A,B,C,Mode0}, send_drv_reqs(Drv, Nrs), - get_line1(edlin:edit_line1(string:to_graphemes(lists:sublist(Lcs, - 1, - length(Lcs)-1)), - Ncont), - Drv, - Shell, - Ls, Encoding) + get_line_edlin(edlin:edit_line1(string:to_graphemes(lists:sublist(Lcs, + 1, + length(Lcs)-1)), + Ncont), + Drv, State#get_line_edlin_state{ history = Ls }) end; %% ^R = backward search, ^S = forward search. %% Search is tricky to implement and does a lot of back-and-forth @@ -691,16 +880,16 @@ get_line1({history_down,Cs,{_,_,_,Mode0}=Cont,Rs}, Drv, Shell, Ls0, Encoding) -> %% new modes: search, search_quit, search_found. These are added to %% the regular ones (none, meta_left_sq_bracket) and handle special %% cases of history search. -get_line1({search,Cs,Cont,Rs}, Drv, Shell, Ls, Encoding) -> +get_line_edlin({search,Cs,Cont,Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), %% drop current line, move to search mode. We store the current %% prompt ('N>') and substitute it with the search prompt. - put(search_quit_prompt, Cont), - Pbs = prompt_bytes("\033[;1;4msearch:\033[0m ", Encoding), + Pbs = prompt_bytes("\033[;1;4msearch:\033[0m ", State#get_line_edlin_state.encoding), {more_chars,Ncont,_Nrs} = edlin:start(Pbs, {search,none}), - put(search, new_search), - get_line1(edlin:edit_line1(Cs, Ncont), Drv, Shell, Ls, Encoding); -get_line1({Help, Before, Cs0, Cont, Rs}, Drv, Shell, Ls0, Encoding) + get_line_edlin(edlin:edit_line1(Cs, Ncont), Drv, + State#get_line_edlin_state{ search = new_search, + search_quit_prompt = Cont}); +get_line_edlin({Help, Before, Cs0, Cont, Rs}, Drv, State) when Help =:= help; Help =:= help_full -> send_drv_reqs(Drv, Rs), NLines = case Help of @@ -709,26 +898,26 @@ get_line1({Help, Before, Cs0, Cont, Rs}, Drv, Shell, Ls0, Encoding) end, {_,Word,_} = edlin:over_word(Before, [], 0), {R,Docs} = case edlin_context:get_context(Before) of - {function, Mod} when Word =/= [] -> try - {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), - {ok, [{atom,_,Word1}], _} = erl_scan:string(Word), - {function, c:h1(Module, Word1)} - catch _:_ -> - {ok, [{atom,_,Module1}], _} = erl_scan:string(Mod), - {module, c:h1(Module1)} - end; - {function, Mod} -> - {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), - {module, c:h1(Module)}; - {function, Mod, Fun, _Args, _Unfinished, _Nesting} -> - {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), - {ok, [{atom,_,Function}], _} = erl_scan:string(Fun), - {function, c:h1(Module, Function)}; - {term, _, {atom, Word1}}-> - {ok, [{atom,_,Module}], _} = erl_scan:string(Word1), - {module, c:h1(Module)}; - _ -> {error, {error, no_help}} - end, + {function, Mod} when Word =/= [] -> try + {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), + {ok, [{atom,_,Word1}], _} = erl_scan:string(Word), + {function, c:h1(Module, Word1)} + catch _:_ -> + {ok, [{atom,_,Module1}], _} = erl_scan:string(Mod), + {module, c:h1(Module1)} + end; + {function, Mod} -> + {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), + {module, c:h1(Module)}; + {function, Mod, Fun, _Args, _Unfinished, _Nesting} -> + {ok, [{atom,_,Module}], _} = erl_scan:string(Mod), + {ok, [{atom,_,Function}], _} = erl_scan:string(Fun), + {function, c:h1(Module, Function)}; + {term, _, {atom, Word1}}-> + {ok, [{atom,_,Module}], _} = erl_scan:string(Word1), + {module, c:h1(Module)}; + _ -> {error, {error, no_help}} + end, case {R, Docs} of {_, {error, _}} -> send_drv(Drv, beep); {module, _} -> @@ -740,18 +929,17 @@ get_line1({Help, Before, Cs0, Cont, Rs}, Drv, Shell, Ls0, Encoding) send_drv(Drv, {put_expand, unicode, [unicode:characters_to_binary(Docs1)], NLines}) end, - get_line1(edlin:edit_line(Cs0, Cont), Drv, Shell, Ls0, Encoding); -get_line1({Expand, Before, Cs0, Cont,Rs}, Drv, Shell, Ls0, Encoding) + get_line_edlin(edlin:edit_line(Cs0, Cont), Drv, State); +get_line_edlin({Expand, Before, Cs0, Cont,Rs}, Drv, State = #get_line_edlin_state{ expand_fun = ExpandFun }) when Expand =:= expand; Expand =:= expand_full -> send_drv_reqs(Drv, Rs), - ExpandFun = get(expand_fun), {Found, CompleteChars, Matches} = ExpandFun(Before, []), case Found of no -> send_drv(Drv, beep); _ -> ok end, {Width, _Height} = get_tty_geometry(Drv), - Cs1 = append(CompleteChars, Cs0, Encoding), + Cs1 = append(CompleteChars, Cs0, State#get_line_edlin_state.encoding), MatchStr = case Matches of [] -> []; @@ -763,65 +951,62 @@ get_line1({Expand, Before, Cs0, Cont,Rs}, Drv, Shell, Ls0, Encoding) _ -> NlMatchStr = unicode:characters_to_binary("\n"++MatchStr), NLines = case Expand of - expand -> 7; - expand_full -> 0 - end, - case get(expand_below) of + expand -> 7; + expand_full -> 0 + end, + case State#get_line_edlin_state.expand_below of true -> - send_drv(Drv, {put_expand, unicode, unicode:characters_to_binary(string:trim(MatchStr, trailing)), NLines}), - Cs1; + send_drv(Drv, {put_expand, unicode, unicode:characters_to_binary(string:trim(MatchStr, trailing)), NLines}), + Cs1; false -> send_drv(Drv, {put_chars, unicode, NlMatchStr}), [$\e, $l | Cs1] end end, - get_line1(edlin:edit_line(Cs, Cont), Drv, Shell, Ls0, Encoding); + get_line_edlin(edlin:edit_line(Cs, Cont), Drv, State); %% The search item was found and accepted (new line entered on the exact %% result found) -get_line1({search_found,_Cs,_,Rs}, Drv, Shell, Ls0, Encoding) -> - SearchResult = get(search_result), - LineCont = case SearchResult of +get_line_edlin({search_found,_Cs,_,Rs}, Drv, State) -> + LineCont = case State#get_line_edlin_state.search_result of [] -> {[],{[],[]},[]}; - _ -> [Last| LB] = lists:reverse(SearchResult), - {LB, {lists:reverse(Last),[]},[]} + SearchResult -> + [Last| LB] = lists:reverse(SearchResult), + {LB, {lists:reverse(Last),[]},[]} end, - Prompt = edlin:prompt(get(search_quit_prompt)), + Prompt = edlin:prompt(State#get_line_edlin_state.search_quit_prompt), send_drv_reqs(Drv, Rs), send_drv_reqs(Drv, edlin:erase_line()), send_drv_reqs(Drv, edlin:redraw_line({line, Prompt, LineCont, {normal,none}})), - put(search_result, []), - get_line1({done, LineCont, "\n", Rs}, Drv, Shell, Ls0, Encoding); + get_line_edlin({done, LineCont, "\n", Rs}, Drv, State#get_line_edlin_state{ search_result = []}); %% The search mode has been exited, but the user wants to remain in line %% editing mode wherever that was, but editing the search result. -get_line1({search_quit,_Cs,_,Rs}, Drv, Shell, Ls, Encoding) -> +get_line_edlin({search_quit,_Cs,_,Rs}, Drv, State) -> %% Load back the old prompt with the correct line number. - case edlin:prompt(get(search_quit_prompt)) of + case edlin:prompt(State#get_line_edlin_state.search_quit_prompt) of Prompt -> % redraw the line and keep going with the same stack position - SearchResult = get(search_result), - L = case SearchResult of + L = case State#get_line_edlin_state.search_result of [] -> {[],{[],[]},[]}; - _ -> [Last|LB] = lists:reverse(SearchResult), - {LB, {lists:reverse(Last), []}, []} + SearchResult -> + [Last|LB] = lists:reverse(SearchResult), + {LB, {lists:reverse(Last), []}, []} end, NCont = {line,Prompt,L,{normal,none}}, - put(search_result, []), send_drv_reqs(Drv, [delete_line|Rs]), send_drv_reqs(Drv, edlin:redraw_line(NCont)), - get_line1({more_chars, NCont ,[]}, Drv, Shell, pad_stack(Ls), Encoding) + get_line_edlin({more_chars, NCont ,[]}, Drv, + State#get_line_edlin_state{ history = pad_stack(State#get_line_edlin_state.history), + search_result = [] }) end; -get_line1({search_cancel,_Cs,_,Rs}, Drv, Shell, Ls, Encoding) -> - NCont = get(search_quit_prompt), - put(search_result, []), +get_line_edlin({search_cancel,_Cs,_,Rs}, Drv, State = #get_line_edlin_state{ search_quit_prompt = NCont }) -> send_drv_reqs(Drv, [delete_line|Rs]), send_drv_reqs(Drv, edlin:redraw_line(NCont)), - get_line1({more_chars, NCont, []}, Drv, Shell, Ls, Encoding); + get_line_edlin({more_chars, NCont, []}, Drv, State#get_line_edlin_state{ search_result = [] }); %% Search mode is entered. -get_line1({What,{line,Prompt,{_,{RevCmd0,_},_},{search, none}}=Cont0,Rs}, - Drv, Shell, Ls0, Encoding) -> +get_line_edlin({What,{line,Prompt,{_,{RevCmd0,_},_},{search, none}}=Cont0,Rs}, + Drv, State = #get_line_edlin_state{ search = OldSearch, history = Ls0 }) -> %% Figure out search direction. ^S and ^R are returned through edlin %% whenever we received a search while being already in search mode. - OldSearch = get(search), {Search, Ls1, RevCmd} = case RevCmd0 of [$\^S|RevCmd1] -> {fun search_down_stack/2, Ls0, RevCmd1}; @@ -832,140 +1017,34 @@ get_line1({What,{line,Prompt,{_,{RevCmd0,_},_},{search, none}}=Cont0,Rs}, _ -> {skip, Ls0, RevCmd0} end, - put(search, RevCmd), Cmd = lists:reverse(RevCmd), if Search =:= skip -> - %% Move expand are the only valid requests to bypass search mode - %% Sending delete_chars, insert_chars, etc. will result in - %% expand area being cleared. - Rs1 = [R||{move_expand,_}=R<-Rs], - send_drv_reqs(Drv, Rs1), - more_data(What, Cont0, Drv, Shell, Ls0, Encoding); + %% Move expand are the only valid requests to bypass search mode + %% Sending delete_chars, insert_chars, etc. will result in + %% expand area being cleared. + Rs1 = [R||{move_expand,_}=R<-Rs], + send_drv_reqs(Drv, Rs1), + {What, {Cont0, State#get_line_edlin_state{ search = RevCmd }}}; true -> - {Ls, NewStack} = case Search(Ls1, Cmd) of - {none, Ls2} -> - send_drv(Drv, beep), - put(search_result, []), - send_drv(Drv, delete_line), - send_drv(Drv, {insert_chars, unicode, unicode:characters_to_binary(Prompt++Cmd)}), - {Ls2, {[],{RevCmd, []},[]}}; - {Line, Ls2} -> % found. Complete the output edlin couldn't have done. - Lines = string:split(string:to_graphemes(Line), "\n", all), - put(search_result, Lines), - send_drv(Drv, delete_line), - send_drv(Drv, {insert_chars, unicode, unicode:characters_to_binary(Prompt++Cmd)}), - send_drv(Drv, {put_expand, unicode, unicode:characters_to_binary(" "++lists:join("\n ",Lines)), 7}), - {Ls2, {[],{RevCmd, []},[]}} - end, - Cont = {line,Prompt,NewStack,{search, none}}, - more_data(What, Cont, Drv, Shell, Ls, Encoding) + {Ls, SearchResult, NewStack} = case Search(Ls1, Cmd) of + {none, Ls2} -> + send_drv(Drv, beep), + send_drv(Drv, delete_line), + send_drv(Drv, {insert_chars, unicode, unicode:characters_to_binary(Prompt++Cmd)}), + {Ls2, [], {[],{RevCmd, []},[]}}; + {Line, Ls2} -> % found. Complete the output edlin couldn't have done. + Lines = string:split(string:to_graphemes(Line), "\n", all), + send_drv(Drv, delete_line), + send_drv(Drv, {insert_chars, unicode, unicode:characters_to_binary(Prompt++Cmd)}), + send_drv(Drv, {put_expand, unicode, unicode:characters_to_binary(" "++lists:join("\n ",Lines)), 7}), + {Ls2, Lines, {[],{RevCmd, []},[]}} + end, + Cont = {line,Prompt,NewStack,{search, none}}, + {What, {Cont, State#get_line_edlin_state{ history = Ls, search = RevCmd, search_result = SearchResult }}} end; -get_line1({What,Cont0,Rs}, Drv, Shell, Ls, Encoding) -> +get_line_edlin({What,Cont0,Rs}, Drv, State) -> send_drv_reqs(Drv, Rs), - more_data(What, Cont0, Drv, Shell, Ls, Encoding). - -more_data(What, Cont0, Drv, Shell, Ls, Encoding) -> - receive - {Drv, activate} -> - send_drv_reqs(Drv, edlin:redraw_line(Cont0)), - more_data(What, Cont0, Drv, Shell, Ls, Encoding); - {Drv,{data,Cs}} -> - Res = edlin:edit_line(cast(Cs, list), Cont0), - get_line1(Res, - Drv, Shell, Ls, Encoding); - {Drv,eof} -> - get_line1(edlin:edit_line(eof, Cont0), Drv, Shell, Ls, Encoding); - {io_request,From,ReplyAs,Req} when is_pid(From) -> - {more_chars,Cont,_More} = edlin:edit_line([], Cont0), - send_drv_reqs(Drv, edlin:erase_line()), - io_request(Req, From, ReplyAs, Drv, Shell, []), %WRONG!!! - send_drv_reqs(Drv, edlin:redraw_line(Cont)), - get_line1({more_chars,Cont,[]}, Drv, Shell, Ls, Encoding); - {reply,{From,ReplyAs},Reply} -> - %% We take care of replies from puts here as well - io_reply(From, ReplyAs, Reply), - more_data(What, Cont0, Drv, Shell, Ls, Encoding); - {'EXIT',Drv,interrupt} -> - interrupted; - {'EXIT',Drv,_} -> - terminated; - {'EXIT',Shell,R} -> - exit(R) - after - get_line_timeout(What)-> - get_line1(edlin:edit_line([], Cont0), Drv, Shell, Ls, Encoding) - end. - -get_line_echo_off(Chars, ToEnc, Pbs, Drv, Shell) -> - send_drv_reqs(Drv, [{put_chars, unicode,Pbs}]), - case get_line_echo_off1(edit_line(Chars,[]), Drv, Shell) of - {done, Line, _Rest} = Res when ToEnc =:= latin1 -> - case check_encoding(Line, ToEnc) of - false -> - {no_translation, unicode, ToEnc}; - true -> - Res - end; - Res -> - Res - end. - -get_line_echo_off1({Chars,[],Rs}, Drv, Shell) -> - case get(echo) of - true -> send_drv_reqs(Drv, Rs); - false -> skip - end, - receive - {Drv,{data,Cs}} -> - get_line_echo_off1(edit_line(cast(Cs, list), Chars), Drv, Shell); - {Drv,eof} -> - get_line_echo_off1(edit_line(eof, Chars), Drv, Shell); - {io_request,From,ReplyAs,Req} when is_pid(From) -> - io_request(Req, From, ReplyAs, Drv, Shell, []), - get_line_echo_off1({Chars,[],[]}, Drv, Shell); - {reply,{From,ReplyAs},Reply} when From =/= undefined -> - %% We take care of replies from puts here as well - io_reply(From, ReplyAs, Reply), - get_line_echo_off1({Chars,[],[]},Drv, Shell); - {'EXIT',Drv,interrupt} -> - interrupted; - {'EXIT',Drv,_} -> - terminated; - {'EXIT',Shell,R} -> - exit(R) - end; -get_line_echo_off1(eof, _Drv, _Shell) -> - {done,eof,eof}; -get_line_echo_off1({Chars,Rest,Rs}, Drv, _Shell) -> - case get(echo) of - true -> send_drv_reqs(Drv, Rs); - false -> skip - end, - {done,lists:reverse(Chars),case Rest of done -> []; _ -> Rest end}. -get_chars_echo_off(Pbs, Drv, Shell) -> - send_drv_reqs(Drv, [{insert_chars, unicode,Pbs}]), - get_chars_echo_off1(Drv, Shell). - -get_chars_echo_off1(Drv, Shell) -> - receive - {Drv, {data, Cs}} -> - cast(Cs, list); - {Drv, eof} -> - eof; - {io_request,From,ReplyAs,Req} when is_pid(From) -> - io_request(Req, From, ReplyAs, Drv, Shell, []), - get_chars_echo_off1(Drv, Shell); - {reply,{From,ReplyAs},Reply} when From =/= undefined -> - %% We take care of replies from puts here as well - io_reply(From, ReplyAs, Reply), - get_chars_echo_off1(Drv, Shell); - {'EXIT',Drv,interrupt} -> - interrupted; - {'EXIT',Drv,_} -> - terminated; - {'EXIT',Shell,R} -> - exit(R) - end. + {What, {Cont0, State}}. format_expression(Cont, Drv) -> FormatingCommand = application:get_env(stdlib, format_shell_func, default), @@ -988,11 +1067,11 @@ format_expression1(Buffer, FormatingCommand) -> %% Write the current expression to a file, format it with a formatting tool %% provided by the user and read the file back MkTemp = case os:type() of - {win32, _} -> - os:cmd("powershell \"write-host (& New-TemporaryFile | Select-Object -ExpandProperty FullName)\""); - {unix,_} -> - os:cmd("mktemp") - end, + {win32, _} -> + os:cmd("powershell \"write-host (& New-TemporaryFile | Select-Object -ExpandProperty FullName)\""); + {unix,_} -> + os:cmd("mktemp") + end, TmpFile = string:chomp(MkTemp) ++ ".erl", _ = file:write_file(TmpFile, unicode:characters_to_binary(Buffer, unicode)), FormattingCommand1 = string:replace(FormatingCommand, "${file}", TmpFile), @@ -1006,20 +1085,58 @@ format_expression1(Buffer, FormatingCommand) -> end, string:chomp(Unicode). -%% Edit line is used in echo=false mode which has two users -%% Either we are running in "oldshell" or we run using "noshell". -%% -%% For "oldshell" we need to take care of certain special characters -%% that can be entered, but for "noshell" we don't want to do any of -%% that. -edit_line(Input, State) -> - case get(noshell) of - false -> - edit_line(Input, State, []); - true -> - edit_line_raw(Input, State, []) +get_line_dumb(Buf, Pbs, undefined, ToEnc, Data) -> + send_drv_reqs(Data#state.driver, [{put_chars, unicode, Pbs}]), + get_line_dumb(Buf, Pbs, [], ToEnc, Data); +get_line_dumb(Buf, _Pbs, Cont, ToEnc, Data = #state{ driver = Drv }) -> + + EditLineRes = + if + Data#state.shell =:= noshell -> + edit_line_noshell(cast(Buf, list), Cont, [], Data#state.terminal_mode); + true -> edit_line_dumb(cast(Buf, list), Cont, []) + end, + + case EditLineRes of + {more, NewCont, Rs} -> + [send_drv_reqs(Drv, Rs) || Data#state.echo], + {more_chars, NewCont}; + eof -> + {done, eof, eof}; + {done, Enil, Rest, Rs} -> + [send_drv_reqs(Drv, Rs) || Data#state.echo], + + Line = lists:reverse(Enil), + case check_encoding(Line, ToEnc) of + false -> + {no_translation, unicode, ToEnc}; + true -> + {done, Line, Rest} + end + end. + +get_chars_dumb(Buf, Pbs, undefined, ToEnc, Data) -> + send_drv_reqs(Data#state.driver, [{put_chars, unicode, Pbs}]), + get_chars_dumb(Buf, Pbs, [], ToEnc, Data); +get_chars_dumb(Buf, _Pbs, _Cont, ToEnc, Data = #state{ driver = Drv }) -> + + case cast(Buf, list) of + [] -> + {more_chars, []}; + eof -> + {done, eof, eof}; + Chars -> + [send_drv_reqs(Drv, [{put_chars, unicode, Chars}]) || Data#state.echo], + + case check_encoding(Chars, ToEnc) of + false -> + {no_translation, unicode, ToEnc}; + true -> + {done, Chars, []} + end end. +%% This is used by oldshell to get a basic line editor %% We support line editing for the ICANON mode except the following %% line editing characters, which already has another meaning in %% echo-on mode (See Advanced Programming in the Unix Environment, 2nd ed, @@ -1029,42 +1146,43 @@ edit_line(Input, State) -> %% - ^d in posix/icanon mode: eof, delete-forward in edlin %% - ^r in posix/icanon mode: reprint (silly in echo-off mode :-)) %% - ^w in posix/icanon mode: word-erase (produces a beep in edlin) -edit_line(eof, [], _) -> +edit_line_dumb(eof, [], _) -> eof; -edit_line(eof, Chars, Rs) -> - {Chars,eof, lists:reverse(Rs)}; -edit_line([],Chars, Rs) -> - {Chars,[],lists:reverse(Rs)}; -edit_line([$\r,$\n|Cs],Chars, Rs) -> - {[$\n | Chars], remainder_after_nl(Cs), lists:reverse([{put_chars, unicode, "\n"}|Rs])}; -edit_line([NL|Cs],Chars, Rs) when NL =:= $\r; NL =:= $\n -> - {[$\n | Chars], remainder_after_nl(Cs), lists:reverse([{put_chars, unicode, "\n"}|Rs])}; -edit_line([Erase|Cs],[], Rs) when Erase =:= $\177; Erase =:= $\^H -> - edit_line(Cs,[], Rs); -edit_line([Erase|Cs],[_|Chars], Rs) when Erase =:= $\177; Erase =:= $\^H -> - edit_line(Cs,Chars, [{delete_chars, -1}|Rs]); -edit_line([CtrlChar|Cs],Chars, Rs) when CtrlChar < 32 -> - edit_line(Cs,Chars,Rs); -edit_line([Char|Cs],Chars, Rs) -> - edit_line(Cs,[Char|Chars], [{put_chars, unicode, [Char]}|Rs]). - -edit_line_raw(eof, [], _) -> +edit_line_dumb(eof, Chars, Rs) -> + {done, Chars, eof, lists:reverse(Rs)}; +edit_line_dumb([], Chars, Rs) -> + {more, Chars, lists:reverse(Rs)}; +edit_line_dumb([$\r,$\n|Cs],Chars, Rs) -> + {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\n"}|Rs])}; +edit_line_dumb([NL|Cs],Chars, Rs) when NL =:= $\r; NL =:= $\n -> + {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\n"}|Rs])}; +edit_line_dumb([Erase|Cs],[], Rs) when Erase =:= $\177; Erase =:= $\^H -> + edit_line_dumb(Cs,[], Rs); +edit_line_dumb([Erase|Cs],[_|Chars], Rs) when Erase =:= $\177; Erase =:= $\^H -> + edit_line_dumb(Cs,Chars, [{delete_chars, -1}|Rs]); +edit_line_dumb([$\e, $l |Cs],Chars, Rs) -> + %% this is a key sequence sent by to_erl to refresh the screen + edit_line_dumb(Cs,Chars, Rs); +edit_line_dumb([CtrlChar|Cs],Chars, Rs) when CtrlChar < 32 -> + edit_line_dumb(Cs,Chars,Rs); +edit_line_dumb([Char|Cs],Chars, Rs) -> + edit_line_dumb(Cs,[Char|Chars], [{put_chars, unicode, [Char]}|Rs]). + +%% This is used by noshell to get just get everything until the next \n +edit_line_noshell(eof, [], _, _) -> eof; -edit_line_raw(eof, Chars, Rs) -> - {Chars,eof, lists:reverse(Rs)}; -edit_line_raw([],Chars, Rs) -> - {Chars,[],lists:reverse(Rs)}; -edit_line_raw([NL|Cs],Chars, Rs) when NL =:= $\n -> - {[$\n | Chars], remainder_after_nl(Cs), lists:reverse([{put_chars, unicode, "\n"}|Rs])}; -edit_line_raw([Char|Cs],Chars, Rs) -> - edit_line_raw(Cs,[Char|Chars], [{put_chars, unicode, [Char]}|Rs]). - -remainder_after_nl("") -> done; -remainder_after_nl(Cs) -> Cs. - -get_line_timeout(blink) -> 1000; -get_line_timeout(more_chars) -> infinity. - +edit_line_noshell(eof, Chars, Rs, _) -> + {done, Chars, eof, lists:reverse(Rs)}; +edit_line_noshell([],Chars, Rs, _) -> + {more, Chars, lists:reverse(Rs)}; +edit_line_noshell([NL|Cs],Chars, Rs, raw) when NL =:= $\r -> + {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\r\n"}|Rs])}; +edit_line_noshell([NL|Cs],Chars, Rs, _) when NL =:= $\n -> + {done, [$\n | Chars], Cs, lists:reverse([{put_chars, unicode, "\n"}|Rs])}; +edit_line_noshell([Char|Cs],Chars, Rs, TerminalMode) -> + edit_line_noshell(Cs, [Char|Chars], [{put_chars, unicode, [Char]}|Rs], TerminalMode). + +%% Handling of the line history stack new_stack(Ls) -> {stack,Ls,{},[]}. up_stack({stack,[L|U],{},D}) -> @@ -1122,9 +1240,9 @@ pad_stack({stack, U, L, D}) -> {stack, U, L, D++["\n"]}. save_line_buffer("\n", Lines) -> - save_line_buffer(Lines); + Lines; save_line_buffer(Line, [Line|_Lines]=Lines) -> - save_line_buffer(Lines); + Lines; save_line_buffer(Line, Lines) -> try group_history:add(Line) @@ -1132,10 +1250,7 @@ save_line_buffer(Line, Lines) -> ?LOG_ERROR(#{ msg => "Failed to write to shell history", error => {E, R, ST} }) end, - save_line_buffer([Line|Lines]). - -save_line_buffer(Lines) -> - put(line_buffer, Lines). + [Line|Lines]. search_up_stack(Stack, Substr) -> case up_stack(Stack) of @@ -1157,50 +1272,6 @@ search_down_stack(Stack, Substr) -> end end. - -%% This is get_line without line editing (except for backspace) and -%% without echo. -get_password_line(Chars, Drv, Shell) -> - get_password1(edit_password(Chars,[]),Drv,Shell). - -get_password1({Chars,[]}, Drv, Shell) -> - receive - {Drv,{data,Cs}} -> - get_password1(edit_password(cast(Cs,list),Chars),Drv,Shell); - {io_request,From,ReplyAs,Req} when is_pid(From) -> - io_request(Req, From, ReplyAs, Drv, Shell, []), %WRONG!!! - %% I guess the reason the above line is wrong is that Buf is - %% set to []. But do we expect anything but plain output? - - get_password1({Chars, []}, Drv, Shell); - {reply,{From,ReplyAs},Reply} -> - %% We take care of replies from puts here as well - io_reply(From, ReplyAs, Reply), - get_password1({Chars, []}, Drv, Shell); - {'EXIT',Drv,interrupt} -> - interrupted; - {'EXIT',Drv,_} -> - terminated; - {'EXIT',Shell,R} -> - exit(R) - end; -get_password1({Chars,Rest},Drv,_Shell) -> - send_drv_reqs(Drv,[{insert_chars, unicode, "\n"}]), - {done,lists:reverse(Chars),case Rest of done -> []; _ -> Rest end}. - -edit_password([],Chars) -> - {Chars,[]}; -edit_password([$\r],Chars) -> - {Chars,done}; -edit_password([$\r|Cs],Chars) -> - {Chars,Cs}; -edit_password([$\177|Cs],[]) -> %% Being able to erase characters is - edit_password(Cs,[]); %% the least we should offer, but -edit_password([$\177|Cs],[_|Chars]) ->%% is backspace enough? - edit_password(Cs,Chars); -edit_password([Char|Cs],Chars) -> - edit_password(Cs,[Char|Chars]). - %% prompt_bytes(Prompt, Encoding) %% Return a flat list of characters for the Prompt. prompt_bytes(Prompt, Encoding) -> @@ -1231,8 +1302,6 @@ append(L, A, _) when is_list(L) -> append(B, L, FromEnc) -> append(unicode:characters_to_list(B, FromEnc), L, FromEnc). -check_encoding(eof, _) -> - true; check_encoding(ListOrBinary, unicode) when is_list(ListOrBinary); is_binary(ListOrBinary) -> true; check_encoding(List, latin1) when is_list(List) -> diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src index 897e9aa70a68..03cb36e8f32d 100644 --- a/lib/kernel/src/kernel.app.src +++ b/lib/kernel/src/kernel.app.src @@ -89,6 +89,7 @@ user_drv, user_sup, prim_tty, + prim_tty_sighandler, disk_log, disk_log_1, disk_log_server, diff --git a/lib/kernel/src/kernel.erl b/lib/kernel/src/kernel.erl index c7ecc855e8c1..1616ddf82f34 100644 --- a/lib/kernel/src/kernel.erl +++ b/lib/kernel/src/kernel.erl @@ -135,6 +135,14 @@ init([]) -> type => worker, modules => [?MODULE]}, + %% Must be started before user + SigSrv = #{id => erl_signal_server, + start => {gen_event, start_link, [{local, erl_signal_server}]}, + restart => permanent, + shutdown => 2000, + type => worker, + modules => dynamic}, + User = #{id => user, start => {user_sup, start, []}, restart => temporary, @@ -189,7 +197,7 @@ init([]) -> {ok, {SupFlags, [Code, StdError | EarlyFile] ++ [OnLoad | LateFile] ++ - Peer ++ + [SigSrv | Peer] ++ [User, LoggerSup, Config, RefC, SafeSup]}}; _ -> DistChildren = @@ -205,13 +213,6 @@ init([]) -> type => worker, modules => [inet_db]}, - SigSrv = #{id => erl_signal_server, - start => {gen_event, start_link, [{local, erl_signal_server}]}, - restart => permanent, - shutdown => 2000, - type => worker, - modules => dynamic}, - Timer = start_timer(), CompileServer = start_compile_server(), diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl index 83a23ba32129..d1c97991e333 100644 --- a/lib/kernel/src/net_kernel.erl +++ b/lib/kernel/src/net_kernel.erl @@ -205,13 +205,13 @@ in the Erlang Reference Manual. -record(tick, {ticker :: pid(), %% ticker time :: pos_integer(), %% net tick time (ms) - intensity :: 4..1000 %% ticks until timout + intensity :: 4..1000 %% ticks until timeout }). -record(tick_change, {ticker :: pid(), %% ticker time :: pos_integer(), %% net tick time (ms) - intensity :: 4..1000, %% ticks until timout + intensity :: 4..1000, %% ticks until timeout how :: 'longer' | 'shorter' %% What type of change }). @@ -248,13 +248,26 @@ that list will be rejected. Subsequent calls to [`allow/1`](`allow/1`) will add the specified nodes to the list of allowed nodes. It is not possible to remove nodes from the list. -Returns `error` if any element in `Nodes` is not an atom. +Disallowing an already connected node will not cause it to be disconnected. It +will, however, prevent any future reconnection attempts. + +Passing `Nodes` as an empty list has never any affect at all. + +Returns `error` if any element in `Nodes` is not an atom, and `ignored` if the +local node is not alive. """. --spec allow(Nodes) -> ok | error when +-spec allow(Nodes) -> ok | error | ignored when Nodes :: [node()]. allow(Nodes) -> request({allow, Nodes}). --doc false. +-doc """ +Returns a list of nodes that are explicitly allowed to connect to the node by calling +[`allow/1`](`allow/1`). If empty list is returned, it means that any node using the +same cookie will be able to connect. +""". +-doc(#{since => <<"OTP @OTP-19287@">>}). +-spec allowed() -> {ok, Nodes} | ignored when + Nodes :: [node()]. allowed() -> request(allowed). -doc false. @@ -1193,8 +1206,8 @@ handle_call({spawn_opt,M,F,A,O,L,Gleader},{From,Tag},State) when is_pid(From) -> handle_call({allow, Nodes}, From, State) -> case all_atoms(Nodes) of true -> - Allowed = State#state.allowed, - async_reply({reply,ok,State#state{allowed = Allowed ++ Nodes}}, + Allowed = lists:uniq(State#state.allowed ++ Nodes), + async_reply({reply,ok,State#state{allowed = Allowed}}, From); false -> async_reply({reply,error,State}, From) diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl index 76dffe851806..bba2b847365d 100644 --- a/lib/kernel/src/os.erl +++ b/lib/kernel/src/os.erl @@ -304,7 +304,8 @@ Each signal my be set to one of the following options: -spec set_signal(Signal, Option) -> 'ok' when Signal :: 'sighup' | 'sigquit' | 'sigabrt' | 'sigalrm' | 'sigterm' | 'sigusr1' | 'sigusr2' | 'sigchld' | - 'sigstop' | 'sigtstp', + 'sigstop' | 'sigtstp' | 'sigcont' | 'sigwinch' | + 'siginfo', Option :: 'default' | 'handle' | 'ignore'. set_signal(_Signal, _Option) -> diff --git a/lib/kernel/src/prim_tty.erl b/lib/kernel/src/prim_tty.erl index 6f1c4a96eba4..9135f8668516 100644 --- a/lib/kernel/src/prim_tty.erl +++ b/lib/kernel/src/prim_tty.erl @@ -105,22 +105,25 @@ %% * Same problem as insert mode, it only deleted current line, and does not move %% to previous line automatically. --export([init/1, reinit/2, isatty/1, handles/1, unicode/1, unicode/2, - handle_signal/2, window_size/1, handle_request/2, write/2, write/3, +-export([init/1, init_ssh/3, reinit/2, isatty/1, handles/1, unicode/1, unicode/2, + handle_signal/2, window_size/1, update_geometry/3, handle_request/2, + write/2, write/3, npwcwidth/1, npwcwidth/2, ansi_regexp/0, ansi_color/2]). --export([reader_stop/1, disable_reader/1, enable_reader/1, is_reader/2, is_writer/2]). +-export([reader_stop/1, disable_reader/1, enable_reader/1, read/1, read/2, + is_reader/2, is_writer/2, output_mode/1]). --nifs([isatty/1, tty_create/0, tty_init/3, tty_set/1, setlocale/1, - tty_select/3, tty_window_size/1, tty_encoding/1, write_nif/2, read_nif/2, isprint/1, +-nifs([isatty/1, tty_create/0, tty_init/2, setlocale/1, + tty_select/2, tty_window_size/1, + tty_encoding/1, tty_is_open/2, write_nif/2, read_nif/3, isprint/1, wcwidth/1, wcswidth/1, sizeof_wchar/0, tgetent_nif/1, tgetnum_nif/1, tgetflag_nif/1, tgetstr_nif/1, - tgoto_nif/1, tgoto_nif/2, tgoto_nif/3, tty_read_signal/2]). + tgoto_nif/1, tgoto_nif/2, tgoto_nif/3]). --export([reader_loop/6, writer_loop/2]). +-export([reader_loop/2, writer_loop/2]). %% Exported in order to remove "unused function" warning --export([sizeof_wchar/0, wcswidth/1, tgoto/1, tgoto/2, tgoto/3]). +-export([sizeof_wchar/0, wcswidth/1, tgoto/1, tgoto/2, tgoto/3, tty_is_open/2]). %% proc_lib exports -export([reader/1, writer/1]). @@ -138,7 +141,7 @@ -record(state, {tty :: tty() | undefined, reader :: {pid(), reference()} | undefined, writer :: {pid(), reference()} | undefined, - options, + options = #{ input => cooked, output => cooked } :: options(), unicode = true :: boolean(), lines_before = [], %% All lines before the current line in reverse order lines_after = [], %% All lines after the current line. @@ -147,6 +150,7 @@ buffer_expand, %% Characters in expand buffer buffer_expand_row = 1, buffer_expand_limit = 0 :: non_neg_integer(), + putc_buffer = <<>>, %% Buffer for putc containing the last row of characters cols = 80, rows = 24, xn = false, @@ -165,12 +169,8 @@ ansi_regexp }). --type options() :: #{ tty => boolean(), - input => boolean(), - canon => boolean(), - echo => boolean(), - sig => boolean() - }. +-type options() :: #{ input := cooked | raw | disabled, + output := raw | cooked }. -type request() :: {putc_raw, binary()} | {putc, unicode:unicode_binary()} | @@ -240,7 +240,7 @@ on_load(Extra) -> -spec window_size(state()) -> {ok, {non_neg_integer(), non_neg_integer()}} | {error, term()}. window_size(State = #state{ tty = TTY }) -> case tty_window_size(TTY) of - {error, enotsup} when map_get(tty, State#state.options) -> + {error, enotsup} when map_get(input, State#state.options) =:= raw -> %% When the TTY is enabled, we should return a "dummy" row and column %% when we cannot find the proper size. {ok, {State#state.cols, State#state.rows}}; @@ -274,28 +274,25 @@ init(UserOptions) when is_map(UserOptions) -> init_term(#state{ tty = TTY, unicode = UnicodeMode, options = Options, ansi_regexp = ANSI_RE_MP }). init_term(State = #state{ tty = TTY, options = Options }) -> TTYState = - case maps:get(tty, Options) of - true -> - %% If a reader has been started already, we disable it to avoid race conditions when - %% upgrading the terminal - [disable_reader(State) || State#state.reader =/= undefined], - - try - case tty_init(TTY, stdout, Options) of - ok -> ok; - {error, enotsup} -> error(enotsup) - end, - NewState = init(State, os:type()), - ok = tty_set(TTY), - - NewState - after - [enable_reader(State) || State#state.reader =/= undefined] - end; - false -> + case maps:get(input, Options) of + raw -> + init(State, os:type()); + Else when Else =:= cooked; Else =:= disabled -> State end, + try + [disable_reader(State) || State#state.reader =/= undefined], + + case tty_init(TTY, Options) of + ok -> ok; + {error, enotsup} -> error(enotsup) + end + + after + [enable_reader(State) || State#state.reader =/= undefined] + end, + WriterState = if TTYState#state.writer =:= undefined -> {ok, Writer} = proc_lib:start_link(?MODULE, writer, [State#state.tty]), @@ -304,14 +301,31 @@ init_term(State = #state{ tty = TTY, options = Options }) -> TTYState end, ReaderState = - case {maps:get(input, Options), TTYState#state.reader} of + case {maps:get(input, Options) =/= disabled, TTYState#state.reader} of {true, undefined} -> DefaultReaderEncoding = if State#state.unicode -> utf8; not State#state.unicode -> latin1 end, - {ok, Reader} = proc_lib:start_link( - ?MODULE, reader, - [[State#state.tty, DefaultReaderEncoding, self()]]), + {ok, {_, ReaderRef} = Reader} = + proc_lib:start_link( + ?MODULE, reader, + [[State#state.tty, DefaultReaderEncoding, self()]]), + + case os:type() of + {unix, _} -> + %% `prim_tty' has signal handlers for SIGCONT and SIGWINCH. + %% + %% Historically, these signals were caught by `prim_tty_nif.c' and + %% forwarded to this process. + %% + %% After SIGCONT and SIGWINCH support was added, this module uses a + %% gen_event handler in `prim_tty_sighandler'. + ok = gen_event:add_handler( + erl_signal_server, prim_tty_sighandler, + #{parent => self(), reader => ReaderRef}); + _ -> + ok + end, WriterState#state{ reader = Reader }; {true, _} -> WriterState; @@ -321,17 +335,31 @@ init_term(State = #state{ tty = TTY, options = Options }) -> update_geometry(ReaderState). +init_ssh(UserOptions, {Cols, Rows}, IOEncoding) -> + {ok, ANSI_RE_MP} = re:compile(?ANSI_REGEXP, [unicode]), + Options = options(UserOptions), + UnicodeMode = if IOEncoding =:= unicode -> true; + IOEncoding =:= utf8 -> true; + true -> false + end, + State = init(#state{ tty = undefined, unicode = UnicodeMode, + options = Options, ansi_regexp = ANSI_RE_MP }, ssh), + update_geometry(State, Cols, Rows). + + -spec reinit(state(), options()) -> state(). -reinit(State, UserOptions) -> - init_term(State#state{ options = options(UserOptions) }). +reinit(State = #state{ options = OldOptions }, UserOptions) -> + case options(UserOptions) of + OldOptions -> State; + _ -> + init_term(State#state{ options = options(UserOptions) }) + end. options(UserOptions) -> - maps:merge( - #{ input => true, - tty => true, - canon => false, - echo => false }, UserOptions). + maps:merge(#{ input => raw, output => cooked }, UserOptions). +init(State, ssh) -> + State#state{ xn = true }; init(State, {unix,_}) -> case os:getenv("TERM") of @@ -448,6 +476,11 @@ is_writer(#state{ writer = {WriterPid, _} }, WriterPid) -> is_writer(_, _) -> false. +-spec output_mode(state()) -> cooked | raw. +output_mode(State) -> + #{output := Output} = State#state.options, + Output. + -spec unicode(state()) -> boolean(). unicode(State) -> State#state.unicode. @@ -468,11 +501,13 @@ reader_stop(#state{ reader = {ReaderPid, _} } = State) -> {error, _} = call(ReaderPid, stop), State#state{ reader = undefined }. --spec handle_signal(state(), winch | cont) -> state(). -handle_signal(State, winch) -> +-spec handle_signal(state(), sigwinch | sigcont | resize) -> state(). +handle_signal(State, sigwinch) -> update_geometry(State); -handle_signal(State, cont) -> - tty_set(State#state.tty), +handle_signal(State, resize) -> + update_geometry(State); +handle_signal(State, sigcont) -> + tty_init(State#state.tty, State#state.options), State. -spec disable_reader(state()) -> ok. @@ -483,6 +518,18 @@ disable_reader(#state{ reader = {ReaderPid, _} }) -> enable_reader(#state{ reader = {ReaderPid, _} }) -> ok = call(ReaderPid, enable). +-spec read(state()) -> ok. +read(#state{ reader = {ReaderPid, _} }) -> + ReaderPid ! {read, infinity}, + ok. + +-spec read(state(), pos_integer()) -> ok. +read(State, 0) -> + read(State, 1024); +read(#state{ reader = {ReaderPid, _} }, N) -> + ReaderPid ! {read, N}, + ok. + call(Pid, Msg) -> Alias = erlang:monitor(process, Pid, [{alias, reply_demonitor}]), Pid ! {Alias, Msg}, @@ -496,81 +543,91 @@ call(Pid, Msg) -> reader([TTY, Encoding, Parent]) -> register(user_drv_reader, self()), ReaderRef = make_ref(), - SignalRef = make_ref(), - ok = tty_select(TTY, SignalRef, ReaderRef), + ok = tty_select(TTY, ReaderRef), proc_lib:init_ack({ok, {self(), ReaderRef}}), FromEnc = case tty_encoding(TTY) of utf8 -> Encoding; Else -> Else end, - reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, <<>>). + reader_loop(#{ tty => TTY, parent => Parent, + reader => ReaderRef, enc => FromEnc, read => 0, + ready_input => false}, <<>>). -reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, Acc) -> +reader_loop(State = #{ tty := TTY, reader := ReaderRef, enc := FromEnc, read := Read, + ready_input := ReadyInput }, Acc) -> receive {DisableAlias, disable} -> DisableAlias ! {DisableAlias, ok}, receive {EnableAlias, enable} -> EnableAlias ! {EnableAlias, ok}, - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, Acc) + ?MODULE:reader_loop(State, Acc) end; - {select, TTY, SignalRef, ready_input} -> - {ok, Signal} = tty_read_signal(TTY, SignalRef), - Parent ! {ReaderRef,{signal,Signal}}, - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, Acc); {set_unicode_state, _} when FromEnc =:= {utf16, little} -> - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, Acc); + ?MODULE:reader_loop(State, Acc); {set_unicode_state, Bool} -> NewFromEnc = if Bool -> utf8; not Bool -> latin1 end, - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, NewFromEnc, Acc); + ?MODULE:reader_loop(State#{ enc := NewFromEnc }, Acc); {_Alias, stop} -> ok; - {select, TTY, ReaderRef, ready_input} -> - %% This call may block until data is available - case read_nif(TTY, ReaderRef) of - {error, closed} -> - Parent ! {ReaderRef, eof}, - ok; - {error, aborted} -> - %% The read operation was aborted. This only happens on - %% Windows when we change from "noshell" to "newshell". - %% When it happens we need to re-read the tty_encoding as - %% it has changed. - reader_loop(TTY, Parent, SignalRef, ReaderRef, tty_encoding(TTY), Acc); - {ok, <<>>} -> - %% EAGAIN or EINTR - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, FromEnc, Acc); - {ok, UtfXBytes} -> - - %% read_nif may have blocked for a long time, so we check if - %% there have been any changes to the unicode state before - %% decoding the data. - UpdatedFromEnc = flush_unicode_state(FromEnc), - - {Bytes, NewAcc, NewFromEnc} = - case unicode:characters_to_binary([Acc, UtfXBytes], UpdatedFromEnc, utf8) of - {error, B, Error} -> - %% We should only be able to get incorrect encoded data when - %% using utf8 - UpdatedFromEnc = utf8, - Parent ! {self(), set_unicode_state, false}, + {read, N} when ReadyInput -> + reader_read(State#{ read := N }, Acc); + {read, N} when not ReadyInput -> + ?MODULE:reader_loop(State#{ read := N }, Acc); + {select, TTY, ReaderRef, ready_input} when Read > 0; Read =:= infinity -> + reader_read(State, Acc); + {select, TTY, ReaderRef, ready_input} when Read =:= 0 -> + ?MODULE:reader_loop(State#{ ready_input := true }, Acc); + _M -> + % erlang:display(_M), + ?MODULE:reader_loop(State, Acc) + end. + +reader_read(State = #{ tty := TTY, parent := Parent, reader := ReaderRef, + enc := FromEnc, read := Read }, Acc) -> + %% This call may block until data is available + case read_nif(TTY, ReaderRef, if Read =:= infinity -> 1024; true -> Read end) of + {error, closed} -> + Parent ! {ReaderRef, eof}, + ok; + {ok, <<>>} -> + %% EAGAIN or EINTR + ?MODULE:reader_loop(State#{ ready_input := false }, Acc); + {ok, UtfXBytes} -> + + %% read_nif may have blocked for a long time, so we check if + %% there have been any changes to the unicode state before + %% decoding the data. + UpdatedFromEnc = flush_unicode_state(FromEnc), + + {Bytes, NewAcc, NewFromEnc} = + case unicode:characters_to_binary([Acc, UtfXBytes], UpdatedFromEnc, utf8) of + {error, B, Error} -> + %% We should only be able to get incorrect encoded data when + %% using utf8 + UpdatedFromEnc = utf8, + Parent ! {self(), set_unicode_state, false}, + receive + {set_unicode_state, false} -> receive - {set_unicode_state, false} -> - receive - {Parent, set_unicode_state, _} -> ok - end - end, - Latin1Chars = unicode:characters_to_binary(Error, latin1, utf8), - {<>, <<>>, latin1}; - {incomplete, B, Inc} -> - {B, Inc, UpdatedFromEnc}; - B when is_binary(B) -> - {B, <<>>, UpdatedFromEnc} + {Parent, set_unicode_state, _} -> ok + end end, - Parent ! {ReaderRef, {data, Bytes}}, - ?MODULE:reader_loop(TTY, Parent, SignalRef, ReaderRef, NewFromEnc, NewAcc) - end + Latin1Chars = unicode:characters_to_binary(Error, latin1, utf8), + {<>, <<>>, latin1}; + {incomplete, B, Inc} -> + {B, Inc, UpdatedFromEnc}; + B when is_binary(B) -> + {B, <<>>, UpdatedFromEnc} + end, + Parent ! {ReaderRef, {data, Bytes}}, + ResetRead = if + Read =:= infinity -> infinity; + true -> 0 + end, + ?MODULE:reader_loop(State#{ read := ResetRead, ready_input := false, + enc := NewFromEnc }, NewAcc) end. flush_unicode_state(FromEnc) -> @@ -617,7 +674,7 @@ writer_loop(TTY, WriterRef) -> end. -spec handle_request(state(), request()) -> {erlang:iovec(), state()}. -handle_request(State = #state{ options = #{ tty := false } }, Request) -> +handle_request(State = #state{ options = #{ output := raw } }, Request) -> case Request of {putc_raw, Binary} -> {Binary, State}; @@ -742,17 +799,48 @@ handle_request(State, {expand, Expand, N}) -> %% putc prints Binary and overwrites any existing characters handle_request(State = #state{ unicode = U }, {putc, Binary}) -> %% Todo should handle invalid unicode? - %% print above the prompt if we have a prompt. - %% otherwise print on the current line. + %% print above the prompt + %% if it does not contain a new line we have to print an artificial one + SubString = lists:last(binary:split(Binary, [<<"\n">>], [global])), + NewPutcBuffer = if SubString =:= Binary -> + %% No new line in Binary, keep putc_buffer and add the new binary + <<(State#state.putc_buffer)/binary, Binary/binary>>; + true -> + %% New line in Binary, add the new binary and putc_buffer + SubString + end, + PutcBufferState = State#state{putc_buffer = NewPutcBuffer}, case {State#state.lines_before,{State#state.buffer_before, State#state.buffer_after}, State#state.lines_after} of {[],{[],[]},[]} -> {PutBuffer, _} = insert_buf(State, Binary), - {[encode(PutBuffer, U)], State}; + {[encode(PutBuffer, U)], PutcBufferState}; _ -> - {Delete, DeletedState} = handle_request(State, delete_line), - {PutBuffer, _} = insert_buf(DeletedState, Binary), + %% Clear the prompt (will be redrawn later + {Delete, _} = handle_request(State, delete_line), + if State#state.putc_buffer =:= <<>> -> + %% No artificial newline has been printed + %% so we are already on the correct position to output + Moves = []; + true -> + WidthPutcBuffer = shell:prompt_width(State#state.putc_buffer), + Remainder = (WidthPutcBuffer rem State#state.cols), + ToCol =if Remainder =:= 0 -> + State#state.cols; + true -> + Remainder + end, + Moves = move_cursor(State, State#state.cols, ToCol) + end, + Binary1 = if PutcBufferState#state.putc_buffer =:= <<>> -> + %% Binary has a real new line at the end + Binary; + true -> + %% Binary does not have a real new line, add artificial one + <> + end, + {PutBuffer, _} = insert_buf(PutcBufferState, Binary1), {Redraw, _} = handle_request(State, redraw_prompt_pre_deleted), - {[Delete, encode(PutBuffer, U), Redraw], State} + {[Delete, Moves, encode(PutBuffer, U), Redraw], PutcBufferState} end; handle_request(State = #state{}, delete_after_cursor) -> {[State#state.delete_after_cursor], @@ -782,13 +870,18 @@ handle_request(State = #state{ unicode = U, cols = W }, {delete, N}) when N < 0 BBCols = cols(State#state.buffer_before, U), BACols = cols(State#state.buffer_after, U), NewBBCols = cols(NewBB, U), - Output = [move_cursor(State, NewBBCols + DelCols, NewBBCols), - encode(State#state.buffer_after,U), - lists:duplicate(DelCols, $\s), - xnfix(State, NewBBCols + BACols + DelCols), - move_cursor(State, NewBBCols + BACols + DelCols, NewBBCols)], + %% DelCols is 0 only when we are removing a ZWJ or a ZWNJ that is the first character of + %% the user buffer. We remove the character from the buffer, but we don't output anything + Output = if + DelCols =:= 0 -> ""; + true -> [move_cursor(State, NewBBCols + DelCols, NewBBCols), + encode(State#state.buffer_after,U), + lists:duplicate(DelCols, $\s), + xnfix(State, NewBBCols + BACols + DelCols), + move_cursor(State, NewBBCols + BACols + DelCols, NewBBCols)] + end, NewState0 = State#state{ buffer_before = NewBB }, - if State#state.lines_after =/= [], (BBCols+BACols+N) rem W =:= 0 -> + if DelCols =/= 0, State#state.lines_after =/= [], (BBCols+BACols+N) rem W =:= 0 -> {Delete, _} = handle_request(State, delete_line), {Redraw, NewState1} = handle_request(NewState0, redraw_prompt_pre_deleted), {[Delete, Redraw], NewState1}; @@ -940,9 +1033,15 @@ split_cols(_N, [], Acc, Chars, Cols, _Unicode) -> {Chars, Cols, Acc, []}; split_cols(N, [Char | T], Acc, Cnt, Cols, Unicode) when is_integer(Char) -> split_cols(N - npwcwidth(Char), T, [Char | Acc], Cnt + 1, Cols + npwcwidth(Char, Unicode), Unicode); -split_cols(N, [Chars | T], Acc, Cnt, Cols, Unicode) when is_list(Chars) -> - split_cols(N - length(Chars), T, [Chars | Acc], - Cnt + length(Chars), Cols + cols(Chars, Unicode), Unicode). +split_cols(N, [GC|T], Acc, Cnt, Cols, Unicode) when is_list(GC) -> + %% We have to remove parts of the grapheme cluster + CGC = cols(GC, Unicode), + if CGC > N -> + {CntList2, ColsList2, List2, List1} = split_cols(N, GC, Unicode), + split_cols(N-ColsList2, [List1|T], List2 ++ Acc, Cnt+CntList2, Cols+ColsList2, Unicode); + true -> + split_cols(N-CGC, T, GC ++ Acc, Cnt+length(GC), Cols+CGC, Unicode) + end. %% Split the buffer after N logical characters returning %% the number of real characters deleted and the column length @@ -959,6 +1058,9 @@ split(_N, [], Acc, Chars, Cols, _Unicode) -> {Chars, Cols, Acc, []}; split(N, [Char | T], Acc, Cnt, Cols, Unicode) when is_integer(Char) -> split(N - 1, T, [Char | Acc], Cnt + 1, Cols + npwcwidth(Char, Unicode), Unicode); +split(N, [GC|T], Acc, Cnt, Cols, Unicode) when is_list(GC), N < length(GC) -> + {NumL2, ColsL2, List2, List1} = split(N, GC, Unicode), + split(N-NumL2, List1 ++ T, List2 ++ Acc, Cnt+NumL2, Cols+ColsL2, Unicode); split(N, [Chars | T], Acc, Cnt, Cols, Unicode) when is_list(Chars) -> split(N - length(Chars), T, [Chars | Acc], Cnt + length(Chars), Cols + cols(Chars, Unicode), Unicode); @@ -1117,6 +1219,9 @@ update_geometry(State) -> ?dbg({?FUNCTION_NAME, _Error}), State end. +%% Functions for non ttys to update the geometry. +update_geometry(State, NewCols, NewRows) -> + State#state{cols = NewCols, rows = NewRows}. npwcwidth(Char) -> npwcwidth(Char, true). @@ -1365,19 +1470,19 @@ isatty(_Fd) -> -spec tty_create() -> {ok, tty()}. tty_create() -> erlang:nif_error(undef). -tty_init(_TTY, _Fd, _Options) -> - erlang:nif_error(undef). -tty_set(_TTY) -> +tty_init(_TTY, _Options) -> erlang:nif_error(undef). setlocale(_TTY) -> erlang:nif_error(undef). -tty_select(_TTY, _SignalRef, _ReadRef) -> +tty_select(_TTY, _ReadRef) -> erlang:nif_error(undef). tty_encoding(_TTY) -> erlang:nif_error(undef). +tty_is_open(_TTY, _Fd) -> + erlang:nif_error(undef). write_nif(_TTY, _IOVec) -> erlang:nif_error(undef). -read_nif(_TTY, _Ref) -> +read_nif(_TTY, _Ref, _N) -> erlang:nif_error(undef). tty_window_size(_TTY) -> erlang:nif_error(undef). @@ -1422,6 +1527,3 @@ tgoto_nif(_Ent, _Arg) -> erlang:nif_error(undef). tgoto_nif(_Ent, _Arg1, _Arg2) -> erlang:nif_error(undef). -tty_read_signal(_TTY, _Ref) -> - erlang:nif_error(undef). - diff --git a/lib/kernel/src/prim_tty_sighandler.erl b/lib/kernel/src/prim_tty_sighandler.erl new file mode 100644 index 000000000000..aabe387d04a0 --- /dev/null +++ b/lib/kernel/src/prim_tty_sighandler.erl @@ -0,0 +1,43 @@ +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(prim_tty_sighandler). +-moduledoc false. + +-behaviour(gen_event). + +-export([init/1, handle_event/2, handle_call/2, code_change/3]). + +init(#{parent := _, reader := _} = State) -> + ok = os:set_signal(sigcont, handle), + ok = os:set_signal(sigwinch, handle), + {ok, State}. + +handle_event(Signal, #{parent := Parent, reader := ReaderRef} = State) + when Signal =:= sigcont orelse Signal =:= sigwinch -> + Parent ! {ReaderRef, {signal, Signal}}, + {ok, State}; +handle_event(_Signal, State) -> + %% Other signals are ignored by `prim_tty'. + {ok, State}. + +handle_call(_Request, State) -> + {ok, ok, State}. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. diff --git a/lib/kernel/src/trace.erl b/lib/kernel/src/trace.erl index 087bf005e4f3..b4cb9468a4b1 100644 --- a/lib/kernel/src/trace.erl +++ b/lib/kernel/src/trace.erl @@ -132,6 +132,7 @@ on the same local node as the call is made. To trace remote nodes use `m:dbg` or port/4, info/3, delivered/2, + system/3, session_create/3, session_destroy/1, session_info/1]). @@ -195,8 +196,7 @@ being destroyed when the last strong handle is garbage collected. -type trace_pattern_flag() :: global | local | - meta | {meta, Pid :: pid()} | - {meta, TracerModule :: module(), TracerState :: term()} | + meta | call_count | call_time | call_memory. @@ -211,13 +211,37 @@ being destroyed when the last strong handle is garbage collected. {call_time | call_memory, [{pid(), non_neg_integer(), non_neg_integer(), non_neg_integer()}] | boolean() | undefined}. +-type trace_info_system_item() :: + 'busy_port' | + 'busy_dist_port' | + {'long_gc', non_neg_integer()} | + {'long_message_queue', {Disable :: non_neg_integer(), + Enable :: pos_integer()}} | + {'long_schedule', non_neg_integer()} | + {'large_heap', non_neg_integer()}. + -type trace_info_return() :: undefined | {flags, [trace_info_flag()]} | {tracer, pid() | port() | []} | {tracer, module(), term()} | trace_info_item_result() | - {all, [ trace_info_item_result() ] | false | undefined}. + {all, [ trace_info_item_result() ] | false | undefined} | + {system, [trace_info_system_item()]}. + + +-type system_event() :: + busy_port | + busy_dist_port | + long_gc | + long_message_queue | + long_schedule | + large_heap. + +-type system_value() :: + true | false | + non_neg_integer() | + {Disable :: non_neg_integer(), Enable :: pos_integer()}. %% process/4 @@ -771,7 +795,7 @@ Must be combined with `process/4` to set the `call` trace flag for one or more processes. Conceptually, call tracing works as follows. In each trace session, a -set of processes and a set of functions haven been marked for +set of processes and a set of functions have been marked for tracing. If a traced process calls a traced function, the trace action is taken. Otherwise, nothing happens. @@ -1196,6 +1220,14 @@ One valid `Item` for events exists: - **`match_spec`** - Returns the match specification for this event, if it has one, or `true` if no match specification has been set. +**To get information about monitored system events**, `PidPortFuncEvent` is to + be the atom `system`. + +Only valid `Item` for `system` is + +- **`all`** - Returns a list of all monitored system events enabled by + `system/3`. + The return value is `{Item, Value}`, where `Value` is the requested information as described earlier. If a pid for a dead process was specified, or the name of a non-existing function, `Value` is `undefined`. @@ -1204,7 +1236,7 @@ a non-existing function, `Value` is `undefined`. -spec info(Session, PidPortFuncEvent, Item) -> Res when Session :: session(), PidPortFuncEvent :: pid() | port() | new | new_processes | new_ports - | MFA | on_load | send | 'receive', + | MFA | on_load | send | 'receive' | system, MFA :: {module(), atom(), arity()}, Item :: flags | tracer | traced | match_spec | meta | meta_match_spec | call_count | call_time | call_memory @@ -1226,6 +1258,141 @@ delivered(_Session , Tracee) -> erlang:trace_delivered(Tracee). +%% system/3 +-doc """ +Enable/disable monitoring of system events. + +Argument `Session` is the trace session to operate on as returned by +`session_create/3`. + +Argument `Event` is an atom describing the kind of system event to +monitor. To enable monitoring argument `Value` is, depending on event, either a +limit of that event or the atom `true`. To disable monitoring pass `Value` as the +atom `false`. + +When a monitored system event happens, a message is sent to the session +tracer. The session tracer must be a process otherwise the function call will +fail. + +The following `Event`s with `Value`s can be monitored: + +- **`long_gc, Time`** - If a garbage collection in the system takes at least + `Time` wall clock milliseconds, a message `{monitor, GcPid, long_gc, Info}` is + sent. `GcPid` is the pid that was garbage collected. `Info` is a list of + two-element tuples describing the result of the garbage collection. + + One of the tuples is `{timeout, GcTime}`, where `GcTime` is the time for the + garbage collection in milliseconds. The other tuples are tagged with + `heap_size`, `heap_block_size`, `stack_size`, `mbuf_size`, `old_heap_size`, + and `old_heap_block_size`. These tuples are explained in the description of + trace message [`gc_minor_start`](`m:trace#gc_minor_start`) (see + `trace:process/4`). New tuples can be added, and the order of the tuples in + the `Info` list can be changed at any time without prior notice. + +- **`long_message_queue, {Disable, Enable}`** - If the number of messages in the + message queue of a process reach `Enable`, a message `{monitor, Pid, + long_message_queue, Long}` is sent. `Pid` is the process identifier of the + process that got a long message queue and `Long` will equal `true` indicating + that it is in a _long message queue_ state. No more `long_message_queue` + monitor messages will be sent due to the process identified by `Pid` until its + message queue length falls down to a length of `Disable` length. When this + happens, a `long_message_queue` monitor message with `Long` equal to `false` + will be sent indicating that the process is no longer in a _long message + queue_ state. As of this, if the message queue length should again reach + `Enable` length, a new `long_message_queue` monitor message with `Long` set to + `true` will again be sent. That is, a `long_message_queue` monitor message is + sent when a process enters or leaves a _long message queue_ state where these + state changes are defined by the `Enable` and `Disable` parameters. + + `Enable` must be an integer larger than zero. `Disable` must be an integer + larger than or equal to zero and smaller than `Enable`. If the above is not + satisfied the operation will fail with a `badarg` error exception. You are + recommended to use a much smaller value for `Disable` length than `Enable` + length in order not to be flooded with `long_message_queue` monitor messages. + +- **`long_schedule, Time`** - If a process or port in the system runs + uninterrupted for at least `Time` wall clock milliseconds, a message + `{monitor, PidOrPort, long_schedule, Info}` is sent. + `PidOrPort` is the process or port that was running. `Info` is a list of + two-element tuples describing the event. + + If a `t:pid/0`, the tuples `{timeout, Millis}`, `{in, Location}`, and + `{out, Location}` are present, where `Location` is either an MFA + (`{Module, Function, Arity}`) describing the function where the process was + scheduled in/out, or the atom `undefined`. + + If a `t:port/0`, the tuples `{timeout, Millis}` and `{port_op,Op}` are + present. `Op` is one of `proc_sig`, `timeout`, `input`, `output`, `event`, or + `dist_cmd`, depending on which driver callback was executing. + + `proc_sig` is an internal operation and is never to appear, while the others + represent the corresponding driver callbacks `timeout`, `ready_input`, + `ready_output`, `event`, and `outputv` (when the port is used by + distribution). Value `Millis` in tuple `timeout` informs about the + uninterrupted execution time of the process or port, which always is equal to + or higher than the `Time` value supplied when starting the trace. New tuples + can be added to the `Info` list in a future release. The order of the tuples + in the list can be changed at any time without prior notice. + + This can be used to detect problems with NIFs or drivers that take too long to + execute. 1 ms is considered a good maximum time for a driver callback or a + NIF. However, a time-sharing system is usually to consider everything < 100 ms + as "possible" and fairly "normal". However, longer schedule times can indicate + swapping or a misbehaving NIF/driver. Misbehaving NIFs and drivers can cause + bad resource utilization and bad overall system performance. + +- **`large_heap, Size`** - If a garbage collection in the system results in + the allocated size of a heap being at least `Size` words, a message + `{monitor, GcPid, large_heap, Info}` is sent. `GcPid` and `Info` are the same + as for `long_gc` described above, except that the tuple tagged with `timeout` + is not present. + + The monitor message is sent if the sum of the sizes of all memory blocks + allocated for all heap generations after a garbage collection is equal to or + higher than `Size`. + + When a process is killed by + [`max_heap_size`](`e:erts:erlang#process_flag_max_heap_size`), it is killed before + the garbage collection is complete and thus no large heap message is sent. + +- **`busy_port, true`** - If a process in the system gets suspended because it sends + to a busy port, a message `{monitor, SusPid, busy_port, Port}` is + sent. `SusPid` is the pid that got suspended when sending to `Port`. + +- **`busy_dist_port, true`[](){: #busy_dist_port } ** + If a process in the system gets suspended because it sends to a process on a remote + node whose inter-node communication was handled by a busy port, a message + `{monitor, SusPid, busy_dist_port, Port}` is sent. `SusPid` is the pid that + got suspended when sending through the inter-node communication port `Port`. + +To disable system monitoring of a event pass the value as `false`. There are no +other special values (like zero) to disable monitoring of an event. Some of the +events have an unspecified minimum value. Lower values will be adjusted to the +minimum value. For example, it is currently not possible to monitor all garbage +collections with `{long_gc, 0}`. + +> #### Note {: .info } +> +> If the session tracer process gets so large that it itself starts to cause +> system monitor messages when garbage collecting, the messages enlarge the +> process message queue and probably make the problem worse. +> +> Keep the tracer process neat and do not set the system monitor limits too +> tight. + +Failures: + +- **`badarg`** - If the session tracer is not a local process. +""". +-doc #{ since => <<"OTP @OTP-19271@">> }. +-spec system(Session :: session(), + Event :: system_event(), + Value :: system_value()) -> ok. +system(Session, Event, Value) -> + erts_internal:system_monitor(Session, session, [{Event,Value}]). + + + %% session_create/3 -doc """ Create a new trace session. diff --git a/lib/kernel/src/user_drv.erl b/lib/kernel/src/user_drv.erl index d7fd617aee14..e5c443511c91 100644 --- a/lib/kernel/src/user_drv.erl +++ b/lib/kernel/src/user_drv.erl @@ -52,6 +52,9 @@ %% Same as put_chars/3, but sends Reply to From when the characters are %% guaranteed to have been written to the terminal {put_chars_sync, unicode, binary(), {From :: pid(), Reply :: term()}} | + %% Output raw binary, should only be called if output mode is set to raw + %% and encoding set to latin1. + {put_chars_sync, latin1, binary(), {From :: pid(), Reply :: term()}} | %% Put text in expansion area {put_expand, unicode, binary(), integer()} | {move_expand, -32768..32767} | @@ -104,6 +107,7 @@ -record(state, { tty :: prim_tty:state() | undefined, write :: reference() | undefined, read :: reference() | undefined, + terminal_mode :: raw | cooked | disabled, shell_started = new :: new | old | false, editor :: #editor{} | undefined, user :: pid(), @@ -111,9 +115,10 @@ groups, queue }). -type shell() :: {module(), atom(), [term()]} | {node(), module(), atom(), [term()]}. --type arguments() :: #{ initial_shell => noshell | shell() | - {remote, unicode:charlist()} | {remote, unicode:charlist(), {module(), atom(), [term()]}}, - input => boolean() }. +-type arguments() :: + #{ initial_shell => noshell | shell() | + {remote, unicode:charlist()} | {remote, unicode:charlist(), {module(), atom(), [term()]}}, + input => cooked | raw | disabled }. %% Default line editing shell -spec start() -> pid(). @@ -162,20 +167,22 @@ init(Args) -> IsTTY = prim_tty:isatty(stdin) =:= true andalso prim_tty:isatty(stdout) =:= true, StartShell = maps:get(initial_shell, Args, undefined) =/= noshell, OldShell = maps:get(initial_shell, Args, undefined) =:= oldshell, + try if not IsTTY andalso StartShell; OldShell -> error(enotsup); IsTTY, StartShell -> - TTYState = prim_tty:init(#{}), + TTYState = prim_tty:init(#{ input => raw, + output => cooked }), init_standard_error(TTYState, true), - {ok, init, {Args, #state{ user = start_user() } }, + {ok, init, {Args, #state{ terminal_mode = raw, user = start_user() } }, {next_event, internal, TTYState}}; - true -> - TTYState = prim_tty:init(#{input => maps:get(input, Args, true), - tty => false}), + true -> + TTYState = prim_tty:init( + #{ input => maps:get(input, Args), output => raw }), init_standard_error(TTYState, false), - {ok, init, {Args,#state{ user = start_user() } }, + {ok, init, {Args,#state{ terminal_mode = maps:get(input, Args), user = start_user() } }, {next_event, internal, TTYState}} end catch error:enotsup -> @@ -186,9 +193,9 @@ init(Args) -> %% The oldshell mode is important as it is %% the mode used when running erlang in an %% emacs buffer. - CatchTTYState = prim_tty:init(#{tty => false}), + CatchTTYState = prim_tty:init(#{ input => cooked, output => raw }), init_standard_error(CatchTTYState, false), - {ok, init, {Args,#state{ shell_started = old, user = start_user() } }, + {ok, init, {Args,#state{ terminal_mode = cooked, shell_started = old, user = start_user() } }, {next_event, internal, CatchTTYState}} end. @@ -245,6 +252,7 @@ exit_on_remote_shell_error(_, _, Result) -> %% We have been started with -noshell. In this mode the current_group is %% the `user` group process. init_noshell(State) -> + State#state.user ! {self(), terminal_mode, State#state.terminal_mode}, init_shell(State#state{ shell_started = false }, ""). init_remote_shell(State, Node, {M, F, A}) -> @@ -305,7 +313,7 @@ init_remote_shell(State, Node, {M, F, A}) -> end, Group = group:start(self(), RShell, - [{echo,State#state.shell_started =:= new}] ++ + [{dumb, State#state.shell_started =/= new}] ++ group_opts(RemoteNode)), Gr = gr_add_cur(State#state.groups, Group, RShell), @@ -329,14 +337,18 @@ init_local_shell(State, InitialShell) -> Gr = gr_add_cur(State#state.groups, group:start(self(), InitialShell, - group_opts() ++ [{echo,State#state.shell_started =:= new}]), + group_opts() ++ [{dumb,State#state.shell_started =/= new}]), InitialShell), init_shell(State#state{ groups = Gr }, [Slogan,$\n]). init_shell(State, Slogan) -> - init_standard_error(State#state.tty, State#state.shell_started =:= new), + init_standard_error(State#state.tty, State#state.terminal_mode =:= raw), + + %% Tell the reader to read greedily if there is a shell + [prim_tty:read(State#state.tty) || State#state.shell_started =/= false], + Curr = gr_cur_pid(State#state.groups), put(current_group, Curr), {next_state, server, State#state{ current_group = gr_cur_pid(State#state.groups) }, @@ -351,10 +363,7 @@ init_shell(State, Slogan) -> start_user() -> case whereis(user) of undefined -> - User = group:start(self(), {}, [{echo,false}, - {noshell,true}]), - register(user, User), - User; + group:start(self(), noshell, [{name, user}]); User -> User end. @@ -370,16 +379,28 @@ server({call, From}, {start_shell, Args}, not IsTTY andalso StartShell; OldShell -> error(enotsup); IsTTY, StartShell -> - NewTTY = prim_tty:reinit(TTY, #{ }), - State#state{ tty = NewTTY, - shell_started = new }; - true -> - NewTTY = prim_tty:reinit(TTY, #{ tty => false }), - State#state{ tty = NewTTY, shell_started = false } + NewTTY = prim_tty:reinit(TTY, #{ input => raw, output => cooked }), + State#state{ tty = NewTTY, terminal_mode = raw, shell_started = new }; + not StartShell -> + Input = maps:get(input, Args), + if not IsTTY andalso Input =:= raw -> + error(enotsup); + true -> + State#state{ + terminal_mode = Input, + tty = prim_tty:reinit(TTY, #{ input => Input, + output => raw }), + shell_started = false } + end end catch error:enotsup -> - NewTTYState = prim_tty:reinit(TTY, #{ tty => false }), - State#state{ tty = NewTTYState, shell_started = old } + NewTTYState = prim_tty:reinit(TTY, #{ input => cooked, output => raw }), + Shell = if StartShell -> + old; + true -> + false + end, + State#state{ terminal_mode = cooked, tty = NewTTYState, shell_started = Shell } end, #{ read := ReadHandle, write := WriteHandle } = prim_tty:handles(NewState#state.tty), NewHandleState = NewState#state { @@ -389,7 +410,12 @@ server({call, From}, {start_shell, Args}, {Result, Reply} = case maps:get(initial_shell, Args, undefined) of noshell -> - {init_noshell(NewHandleState), ok}; + case maps:get(input, Args) =:= NewHandleState#state.terminal_mode of + true -> + {init_noshell(NewHandleState), ok}; + false -> + {init_noshell(NewHandleState), {error, enotsup}} + end; {remote, Node} -> case init_remote_shell(NewHandleState, Node, {shell, start, []}) of {error, _} = Error -> @@ -447,6 +473,17 @@ server(info, {ReadHandle,eof}, State = #state{ read = ReadHandle }) -> server(info,{ReadHandle,{signal,Signal}}, State = #state{ tty = TTYState, read = ReadHandle }) -> {keep_state, State#state{ tty = prim_tty:handle_signal(TTYState, Signal) }}; +server(info, {Requester, read, N}, State = #state{ tty = TTYState }) + when Requester =:= State#state.current_group -> + %% Only allowed when current_group == user + true = State#state.current_group =:= State#state.user, + ok = prim_tty:read(TTYState, N), + keep_state_and_data; + +server(info, {Requester, read, _N}, _State) -> + Requester ! {self(), {error, enotsup}}, + keep_state_and_data; + server(info, {Requester, tty_geometry}, #state{ tty = TTYState }) -> case prim_tty:window_size(TTYState) of {ok, Geometry} -> @@ -611,7 +648,7 @@ switch_loop(internal, init, State) -> groups = gr_add_cur(Gr1, NewGroup, {shell,start,[]})}}; jcl -> NewTTYState = - io_requests([{insert_chars,unicode,<<"\nUser switch command (type h for help)\n">>}], + io_requests([{insert_chars,unicode,<<"\nUser switch command (enter 'h' for help)\n">>}], State#state.tty), %% init edlin used by switch command and have it copy the %% text buffer from current group process @@ -625,7 +662,7 @@ switch_loop(internal, line, State) -> switch_loop(internal, {line, Line}, State) -> case erl_scan:string(Line) of {ok, Tokens, _} -> - case switch_cmd(Tokens, State#state.groups) of + case switch_cmd(Tokens, State#state.groups, State#state.shell_started =/= new) of {ok, Groups} -> Curr = gr_cur_pid(Groups), put(current_group, Curr), @@ -676,38 +713,51 @@ switch_loop(info, {Requester, get_terminal_state}, _State) -> stdout => prim_tty:isatty(stdout), stderr => prim_tty:isatty(stderr) } }, keep_state_and_data; +switch_loop(info, {Requester, tty_geometry}, {_Cont, #state{ tty = TTYState }}) -> + case prim_tty:window_size(TTYState) of + {ok, Geometry} -> + Requester ! {self(), tty_geometry, Geometry}, + ok; + Error -> + Requester ! {self(), tty_geometry, Error}, + ok + end, + keep_state_and_data; switch_loop(timeout, _, {_Cont, State}) -> {keep_state_and_data, {next_event, info, {State#state.read,{data,[]}}}}; switch_loop(info, _Unknown, _State) -> {keep_state_and_data, postpone}. -switch_cmd([{atom,_,Key},{Type,_,Value}], Gr) +switch_cmd([{atom,_,Key},{Type,_,Value}], Gr, Dumb) when Type =:= atom; Type =:= integer -> - switch_cmd({Key, Value}, Gr); -switch_cmd([{atom,_,Key},{atom,_,V1},{atom,_,V2}], Gr) -> - switch_cmd({Key, V1, V2}, Gr); -switch_cmd([{atom,_,Key}], Gr) -> - switch_cmd(Key, Gr); -switch_cmd([{'?',_}], Gr) -> - switch_cmd(h, Gr); - -switch_cmd(Cmd, Gr) when Cmd =:= c; Cmd =:= i; Cmd =:= k -> - switch_cmd({Cmd, gr_cur_index(Gr)}, Gr); -switch_cmd({c, I}, Gr0) -> + switch_cmd({Key, Value}, Gr, Dumb); +switch_cmd([{atom,_,Key},{atom,_,V1},{atom,_,V2}], Gr, Dumb) -> + switch_cmd({Key, V1, V2}, Gr, Dumb); +switch_cmd([{atom,_,Key}], Gr, Dumb) -> + switch_cmd(Key, Gr, Dumb); +switch_cmd([{'?',_}], Gr, Dumb) -> + switch_cmd(h, Gr, Dumb); + +switch_cmd(Cmd, Gr, Dumb) when Cmd =:= c; Cmd =:= i; Cmd =:= k -> + switch_cmd({Cmd, gr_cur_index(Gr)}, Gr, Dumb); +switch_cmd({c, I}, Gr0, _Dumb) -> case gr_set_cur(Gr0, I) of {ok,Gr} -> {ok, Gr}; undefined -> unknown_group() end; -switch_cmd({i, I}, Gr) -> +switch_cmd({i, I}, Gr, _Dumb) -> case gr_get_num(Gr, I) of - {pid,Pid} -> - exit(Pid, interrupt), - {retry, []}; - undefined -> - unknown_group() + {pid,Pid} -> + exit(Pid, interrupt), + + {retry, [{put_chars, unicode, + unicode:characters_to_binary( + io_lib:format("Interrupted job ~p, enter 'c' to resume.~n",[I]))}]}; + undefined -> + unknown_group() end; -switch_cmd({k, I}, Gr) -> +switch_cmd({k, I}, Gr, _Dumb) -> case gr_get_num(Gr, I) of {pid,Pid} -> exit(Pid, die), @@ -724,15 +774,15 @@ switch_cmd({k, I}, Gr) -> undefined -> unknown_group() end; -switch_cmd(j, Gr) -> +switch_cmd(j, Gr, _Dumb) -> {retry, gr_list(Gr)}; -switch_cmd({s, Shell}, Gr0) when is_atom(Shell) -> - Pid = group:start(self(), {Shell,start,[]}), +switch_cmd({s, Shell}, Gr0, Dumb) when is_atom(Shell) -> + Pid = group:start(self(), {Shell,start,[]}, [{dumb, Dumb} | group_opts()]), Gr = gr_add_cur(Gr0, Pid, {Shell,start,[]}), {retry, [], Gr}; -switch_cmd(s, Gr) -> - switch_cmd({s, shell}, Gr); -switch_cmd(r, Gr0) -> +switch_cmd(s, Gr, Dumb) -> + switch_cmd({s, shell}, Gr, Dumb); +switch_cmd(r, Gr0, _Dumb) -> case is_alive() of true -> Node = pool:get_node(), @@ -742,30 +792,35 @@ switch_cmd(r, Gr0) -> false -> {retry, [{put_chars,unicode,<<"Node is not alive\n">>}]} end; -switch_cmd({r, Node}, Gr) when is_atom(Node)-> - switch_cmd({r, Node, shell}, Gr); -switch_cmd({r,Node,Shell}, Gr0) when is_atom(Node), is_atom(Shell) -> +switch_cmd({r, Node}, Gr, Dumb) when is_atom(Node)-> + switch_cmd({r, Node, shell}, Gr, Dumb); +switch_cmd({r,Node,Shell}, Gr0, Dumb) when is_atom(Node), is_atom(Shell) -> case is_alive() of true -> - Pid = group:start(self(), {Node,Shell,start,[]}, group_opts(Node)), - Gr = gr_add_cur(Gr0, Pid, {Node,Shell,start,[]}), - {retry, [], Gr}; + case net_kernel:connect_node(Node) of + true -> + Pid = group:start(self(), {Node,Shell,start,[]}, [{dumb, Dumb} | group_opts(Node)]), + Gr = gr_add_cur(Gr0, Pid, {Node,Shell,start,[]}), + {retry, [], Gr}; + false -> + {retry, [{put_chars,unicode,<<"Could not connect to node\n">>}]} + end; false -> {retry, [{put_chars,unicode,"Node is not alive\n"}]} end; -switch_cmd(q, _Gr) -> +switch_cmd(q, _Gr, _Dumb) -> case erlang:system_info(break_ignored) of true -> % noop {retry, [{put_chars,unicode,<<"Unknown command\n">>}]}; false -> halt() end; -switch_cmd(h, _Gr) -> +switch_cmd(h, _Gr, _Dumb) -> {retry, list_commands()}; -switch_cmd([], _Gr) -> +switch_cmd([], _Gr, _Dumb) -> {retry,[]}; -switch_cmd(_Ts, _Gr) -> +switch_cmd(_Ts, _Gr, _Dumb) -> {retry, [{put_chars,unicode,<<"Unknown command\n">>}]}. unknown_group() -> @@ -800,7 +855,7 @@ group_opts() -> [{expand_below, application:get_env(stdlib, shell_expand_location, below) =:= below}]. -spec io_request(request(), prim_tty:state()) -> {noreply, prim_tty:state()} | - {term(), reference(), prim_tty:state()}. + {term(), reference(), prim_tty:state()} | {term(), {error, term()}}. io_request({requests,Rs}, TTY) -> {noreply, io_requests(Rs, TTY)}; io_request(redraw_prompt, TTY) -> @@ -815,6 +870,22 @@ io_request(delete_line, TTY) -> write(prim_tty:handle_request(TTY, delete_line)); io_request({put_chars, unicode, Chars}, TTY) -> write(prim_tty:handle_request(TTY, {putc, unicode:characters_to_binary(Chars)})); +io_request({put_chars_sync, latin1, Chars, Reply}, TTY) -> + try + case {prim_tty:unicode(TTY), prim_tty:output_mode(TTY)} of + {false, raw} -> + Bin = if is_binary(Chars) -> Chars; + true -> list_to_binary(Chars) + end, + {Output, NewTTY} = prim_tty:handle_request(TTY, {putc_raw, Bin}), + {ok, MonitorRef} = prim_tty:write(NewTTY, Output, self()), + {Reply, MonitorRef, NewTTY}; + _ -> + io_request({put_chars_sync, unicode, unicode:characters_to_binary(Chars,latin1), Reply}, TTY) + end + catch + _:_ -> {Reply, {error, {put_chars, latin1, Chars}}} + end; io_request({put_chars_sync, unicode, Chars, Reply}, TTY) -> {Output, NewTTY} = prim_tty:handle_request(TTY, {putc, unicode:characters_to_binary(Chars)}), {ok, MonitorRef} = prim_tty:write(NewTTY, Output, self()), @@ -906,13 +977,16 @@ mktemp() -> handle_req(next, TTYState, {false, IOQ} = IOQueue) -> case queue:out(IOQ) of {empty, _} -> - {TTYState, IOQueue}; + {TTYState, IOQueue}; {{value, {Origin, Req}}, ExecQ} -> case io_request(Req, TTYState) of {noreply, NewTTYState} -> - handle_req(next, NewTTYState, {false, ExecQ}); + handle_req(next, NewTTYState, {false, ExecQ}); {Reply, MonitorRef, NewTTYState} -> - {NewTTYState, {{Origin, MonitorRef, Reply}, ExecQ}} + {NewTTYState, {{Origin, MonitorRef, Reply}, ExecQ}}; + {Reply, {error, Reason}} -> + Origin ! {reply, Reply, {error, Reason}}, + handle_req(next, TTYState, {false, ExecQ}) end end; handle_req(Msg, TTYState, {false, IOQ} = IOQueue) -> @@ -920,9 +994,12 @@ handle_req(Msg, TTYState, {false, IOQ} = IOQueue) -> {Origin, Req} = Msg, case io_request(Req, TTYState) of {noreply, NewTTYState} -> - {NewTTYState, IOQueue}; + {NewTTYState, IOQueue}; {Reply, MonitorRef, NewTTYState} -> - {NewTTYState, {{Origin, MonitorRef, Reply}, IOQ}} + {NewTTYState, {{Origin, MonitorRef, Reply}, IOQ}}; + {Reply, {error, Reason}} -> + Origin ! {reply, Reply, {error, Reason}}, + {TTYState, IOQueue} end; handle_req(Msg,TTYState,{Resp, IOQ}) -> %% All requests are queued when we have outstanding sync put_chars diff --git a/lib/kernel/src/user_sup.erl b/lib/kernel/src/user_sup.erl index 96ee518ab5e5..7525077d450c 100644 --- a/lib/kernel/src/user_sup.erl +++ b/lib/kernel/src/user_sup.erl @@ -124,13 +124,13 @@ check_flags([{nouser, []} |T], Attached, _) -> check_flags(T, Attached, nouser); check_flags([{user, [User]} | T], Attached, _) -> check_flags(T, Attached, {list_to_atom(User), start, []}); check_flags([{noshell, []} | T], Attached, _) -> - check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell }]}); + check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => cooked }]}); check_flags([{oldshell, []} | T], false, _) -> %% When running in detached mode, we ignore any -oldshell flags as we do not %% want input => true to be set as they may halt the node (on bsd) check_flags(T, false, {user_drv, start, [#{ initial_shell => oldshell }]}); check_flags([{noinput, []} | T], Attached, _) -> - check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => false }]}); + check_flags(T, Attached, {user_drv, start, [#{ initial_shell => noshell, input => disabled }]}); check_flags([{master, [Node]} | T], Attached, _) -> check_flags(T, Attached, {master, list_to_atom(Node)}); check_flags([_H | T], Attached, User) -> check_flags(T, Attached, User); diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl index 17256ea30834..85ace27d536c 100644 --- a/lib/kernel/test/code_SUITE.erl +++ b/lib/kernel/test/code_SUITE.erl @@ -115,7 +115,7 @@ end_per_suite(Config) -> -define(TESTMODOBJ, ?TESTMODSTR ".beam"). init_per_testcase(big_boot_embedded, Config) -> - case catch crypto:start() of + case catch application:start(crypto) of ok -> init_per_testcase(do_big_boot_embedded, Config); _Else -> diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index dc6f9072a2f9..5e72b9a21245 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -54,7 +54,8 @@ erl_1424/1, net_kernel_start/1, differing_cookies/1, cmdline_setcookie_2/1, connection_cookie/1, dyn_differing_cookies/1, - xdg_cookie/1]). + xdg_cookie/1, + allowed/1]). %% Performs the test at another node. -export([get_socket_priorities/0, @@ -77,7 +78,8 @@ -export([pinger/1]). --export([start_uds_rpc_server/1]). +-export([start_uds_rpc_server/1, + wait_node_down/1]). -define(DUMMY_NODE,dummy@test01). -define(ALT_EPMD_PORT, "12321"). @@ -107,7 +109,9 @@ all() -> {group, monitor_nodes}, erl_uds_dist_smoke_test, erl_1424, net_kernel_start, - {group, differing_cookies}]. + {group, differing_cookies}, + allowed + ]. groups() -> [{monitor_nodes, [], @@ -137,6 +141,11 @@ end_per_suite(_Config) -> init_per_group(_GroupName, Config) -> Config. +end_per_group(monitor_nodes, Config) -> + %% we disconnect existing nodes because they interfere + %% with other tests where `nodes() == []` but it wasn't. + ok = kill_existing_nodes(), + Config; end_per_group(_GroupName, Config) -> Config. @@ -1582,13 +1591,23 @@ monitor_nodes_otp_6481(Config) when is_list(Config) -> monitor_nodes_otp_6481(DCfg, Config) -> io:format("Testing nodedown...~n"), - monitor_nodes_otp_6481_test(DCfg, Config, nodedown), + ok = monitor_nodes_otp_6481_test(DCfg, Config, nodedown), io:format("ok~n"), io:format("Testing nodeup...~n"), - monitor_nodes_otp_6481_test(DCfg, Config, nodeup), + ok = monitor_nodes_otp_6481_test(DCfg, Config, nodeup), io:format("ok~n"), ok. +kill_existing_nodes() -> + kill_existing_nodes(nodes()), + ok. + +kill_existing_nodes([]) -> ok; +kill_existing_nodes([Node | Nodes]) -> + catch erpc:call(Node, erlang, halt, []), + kill_existing_nodes(Nodes). + + monitor_nodes_otp_6481_test(DCfg, Config, TestType) when is_list(Config) -> MonNodeState = monitor_node_state(), NodeMsg = make_ref(), @@ -2719,7 +2738,120 @@ xdg_cookie(Config) when is_list(Config) -> ok. +allowed(_Config) -> + %% inspired by differing_cookies/1 + test_server:timetrap({minutes, 1}), + NodeT = node(), + true = NodeT =/= nonode@nohost, + [] = nodes(), + BaseName = atom_to_list(?FUNCTION_NAME), + + %% Use -hidden nodes to avoid global connecting all nodes + + %% Start node A + NodeAName = BaseName++"_nodeA", + NodeA = full_node_name(NodeAName), + { ok, NodeA } = + start_node( "-hidden", NodeAName), + + %% allow NodeT on NodeA so that other connections are dismissed + {ok,[]} = rpc:call(NodeA, net_kernel, allowed, []), + ok = rpc:call(NodeA, net_kernel, allow, [[NodeT]]), + {ok,[NodeT]} = rpc:call(NodeA, net_kernel, allowed, []), + try + + %% Verify the cluster + [ NodeA ] = nodes(hidden), + [ NodeT ] = rpc:call( NodeA, erlang, nodes, [hidden] ), + + %% Start node B + NodeBName = BaseName++"_nodeB", + NodeB = full_node_name(NodeBName), + { ok, NodeB } = + start_node( "-hidden", NodeBName), + + try + + %% Verify the cluster + equal_sets( [NodeA, NodeB], nodes(hidden) ), + [ NodeT ] = rpc:call( NodeA, erlang, nodes, [hidden] ), + [ NodeT ] = rpc:call( NodeB, erlang, nodes, [hidden] ), + + %% Verify that the nodes can not connect as A does not allow B. + pang = rpc:call( NodeA, net_adm, ping, [NodeB] ), + pang = rpc:call( NodeB, net_adm, ping, [NodeA] ), + + %% Allow node B on node A + ok = rpc:call(NodeA, net_kernel, allow, [[NodeB]]), + {ok,N_B} = rpc:call(NodeA, net_kernel, allowed, []), + equal_sets([NodeT,NodeB], N_B), + pong = rpc:call(NodeA, net_adm, ping, [NodeB]), + %% Verify the cluster + equal_sets( [NodeA, NodeB], nodes(hidden) ), + equal_sets( [NodeT, NodeB], + rpc:call( NodeA, erlang, nodes, [hidden] )), + equal_sets( [NodeT, NodeA], + rpc:call( NodeB, erlang, nodes, [hidden] )), + + %% Disconnect and connect the other way (B -> A) + true = rpc:call( NodeB, net_kernel, disconnect, [NodeA] ), + [NodeT] = rpc:call( NodeA, ?MODULE, wait_node_down, [NodeB] ), + [NodeT] = rpc:call( NodeB, ?MODULE, wait_node_down, [NodeA] ), + pong = rpc:call(NodeB, net_adm, ping, [NodeA]), + + %% Verify the cluster + equal_sets( [NodeA, NodeB], nodes(hidden) ), + equal_sets( [NodeT, NodeB], + rpc:call( NodeA, erlang, nodes, [hidden] )), + equal_sets( [NodeT, NodeA], + rpc:call( NodeB, erlang, nodes, [hidden] )), + + %% Disallow node A on node B (by allowing node T) + %% and verify it does not affect the existing connection + ok = rpc:call(NodeB, net_kernel, allow, [[NodeT]]), + {ok,[NodeT]} = rpc:call(NodeB, net_kernel, allowed, []), + equal_sets([NodeT, NodeA], + rpc:call( NodeB, erlang, nodes, [hidden] )), + + %% Disconnect and fail to reconnect + true = rpc:call( NodeB, net_kernel, disconnect, [NodeA] ), + [NodeT] = rpc:call( NodeA, ?MODULE, wait_node_down, [NodeB] ), + pang = rpc:call( NodeA, net_adm, ping, [NodeB] ), + pang = rpc:call( NodeB, net_adm, ping, [NodeA] ), + + %% Allow node T again and verify its only returned once. + ok = rpc:call(NodeB, net_kernel, allow, [[NodeT]]), + {ok,[NodeT]} = rpc:call(NodeB, net_kernel, allowed, []), + + %% Test non-registered process + %% 'net_kernel' is registered to a process + %% so we unregister it to test the output 'ignored' + ok = rpc:call(NodeA, erts_internal, dynamic_node_name, [false]), + true = rpc:call(NodeA, erlang, unregister, [net_kernel]), + ignored = rpc:call(NodeA, net_kernel, allow, [[NodeB]]) + after + _ = stop_node(NodeB) + end + after + _ = stop_node(NodeA) + end, + [] = nodes(hidden), + ok. + +wait_node_down(Node) -> + net_kernel:monitor_nodes(true, [all]), + Timeout = case lists:member(Node, nodes(connected)) of + true -> 10_000; + false -> 0 + end, + receive + {nodedown, Node} -> ok + after + Timeout -> ok + end, + net_kernel:monitor_nodes(false, [all]), + nodes(connected). %% Misc. functions diff --git a/lib/kernel/test/erpc_SUITE.erl b/lib/kernel/test/erpc_SUITE.erl index ea749b54e8b2..d67cf33cb80f 100644 --- a/lib/kernel/test/erpc_SUITE.erl +++ b/lib/kernel/test/erpc_SUITE.erl @@ -23,7 +23,8 @@ init_per_group/2,end_per_group/2]). -export([call/1, call_against_old_node/1, call_from_old_node/1, - call_reqtmo/1, call_against_ei_node/1, cast/1, + call_reqtmo/1, call_against_ei_node/1, + call_always_spawn/1, cast/1, send_request/1, send_request_fun/1, send_request_receive_reqtmo/1, send_request_wait_reqtmo/1, @@ -36,6 +37,7 @@ multicall_recv_opt/1, multicall_recv_opt2/1, multicall_recv_opt3/1, + multicall_always_spawn/1, multicast/1, timeout_limit/1]). -export([init_per_testcase/2, end_per_testcase/2]). @@ -65,6 +67,7 @@ all() -> call_from_old_node, call_reqtmo, call_against_ei_node, + call_always_spawn, cast, send_request, send_request_fun, @@ -80,6 +83,7 @@ all() -> multicall_recv_opt, multicall_recv_opt2, multicall_recv_opt3, + multicall_always_spawn, multicast, timeout_limit]. @@ -467,6 +471,19 @@ reqtmo_test(Test) -> "Timeout = " ++ integer_to_list(Timeout) ++ " Actual = " ++ integer_to_list(Time)}. +call_always_spawn(Config) when is_list(Config) -> + case self() =:= erpc:call(node(), erlang, self, [], + #{timeout => infinity, + always_spawn => false}) of + true -> + false = self() =:= erpc:call(node(), erlang, self, [], + #{timeout => infinity, + always_spawn => true}), + ok; + false -> + {skip, local_call_spawned} + end. + cast(Config) when is_list(Config) -> %% silently fail ok = erpc:cast(badnodename, erlang, send, [hej]), @@ -1732,6 +1749,21 @@ do_time_multicall(Expect, Nodes, Fun, Tmo, N) -> Expect = erpc:multicall(Nodes, Fun, Tmo), do_time_multicall(Expect, Nodes, Fun, Tmo, N-1). +multicall_always_spawn(Config) when is_list(Config) -> + Replies1 = erpc:multicall([node(), node()], erlang, self, [], + #{timeout => infinity, + always_spawn => false}), + case lists:any(fun({ok, Pid}) -> self() =:= Pid end, Replies1) of + true -> + Replies2 = erpc:multicall([node(), node()], erlang, self, [], + #{timeout => infinity, + always_spawn => true}), + false = lists:any(fun({ok, Pid}) -> self() =:= Pid end, Replies2), + ok; + false -> + {skip, all_local_calls_spawned} + end. + multicast(Config) when is_list(Config) -> {ok, _Peer, Node} = ?CT_PEER(), {OldRelName, OldRel} = old_release(), diff --git a/lib/kernel/test/global_SUITE.erl b/lib/kernel/test/global_SUITE.erl index e17122b8b0b0..6719e2152452 100644 --- a/lib/kernel/test/global_SUITE.erl +++ b/lib/kernel/test/global_SUITE.erl @@ -24,7 +24,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). % many_nodes() +-compile(r25). % many_nodes() -export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1, diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl index 3a4a7e31554e..981285a03033 100644 --- a/lib/kernel/test/interactive_shell_SUITE.erl +++ b/lib/kernel/test/interactive_shell_SUITE.erl @@ -40,16 +40,19 @@ init_per_testcase/2, end_per_testcase/2, get_columns_and_rows/1, exit_initial/1, job_control_local/1, job_control_remote/1,stop_during_init/1,wrap/1, + noshell_raw/1, shell_history/1, shell_history_resize/1, shell_history_eaccess/1, shell_history_repair/1, shell_history_repair_corrupt/1, shell_history_corrupt/1, shell_history_custom/1, shell_history_custom_errors/1, + shell_history_toggle/1, job_control_remote_noshell/1,ctrl_keys/1, get_columns_and_rows_escript/1, shell_get_password/1, - shell_navigation/1, shell_multiline_navigation/1, shell_multiline_prompt/1, + shell_navigation/1, shell_multiline_navigation/1, shell_multiline_prompt/1, shell_multiline_prompt_ssh/1, shell_xnfix/1, shell_delete/1, shell_transpose/1, shell_search/1, shell_insert/1, + shell_combining_unicode/1, shell_update_window/1, shell_small_window_multiline_navigation/1, shell_huge_input/1, shell_invalid_unicode/1, shell_support_ansi_input/1, shell_invalid_ansi/1, shell_suspend/1, shell_full_queue/1, @@ -66,19 +69,23 @@ external_editor/1, external_editor_visual/1, external_editor_unicode/1, shell_ignore_pager_commands/1]). +-export([get_until/2]). + -export([test_invalid_keymap/1, test_valid_keymap/1]). %% Exports for custom shell history module -export([load/0, add/1]). %% For custom prompt testing -export([prompt/1]). --record(tmux, {peer, node, name, orig_location }). +-export([output_to_stdout_slowly/1]). +-record(tmux, {peer, node, name, ssh_server_name, orig_location }). suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,3}}]. all() -> [{group, to_erl}, - {group, tty}]. + {group, tty}, + {group, ssh}]. groups() -> [{to_erl,[], @@ -88,6 +95,7 @@ groups() -> ctrl_keys, stop_during_init, wrap, shell_invalid_ansi, shell_get_password, + noshell_raw, {group, shell_history}, {group, remsh}]}, {shell_history, [], @@ -97,6 +105,7 @@ groups() -> shell_history_repair, shell_history_repair_corrupt, shell_history_corrupt, + shell_history_toggle, {group, sh_custom} ]}, {sh_custom, [], @@ -109,7 +118,28 @@ groups() -> remsh_no_epmd, remsh_expand_compatibility_25, remsh_expand_compatibility_later_version]}, - {tty,[], + {ssh, [], + [{group,ssh_unicode}, + {group,ssh_latin1}, + shell_ignore_pager_commands + ]}, + {ssh_unicode,[], + [{group,ssh_tests}]}, + {ssh_latin1,[],[{group,ssh_tests}]}, + {ssh_tests, [], + [shell_navigation, shell_multiline_navigation, + shell_multiline_prompt_ssh, + shell_xnfix, shell_delete, + shell_transpose, shell_search, shell_insert, + shell_update_window, + shell_small_window_multiline_navigation, + shell_huge_input, + shell_support_ansi_input, + shell_receive_standard_out, + shell_expand_location_above, + shell_expand_location_below, + shell_clear]}, + {tty, [], [{group,tty_unicode}, {group,tty_latin1}, test_invalid_keymap, test_valid_keymap, @@ -117,7 +147,8 @@ groups() -> shell_full_queue, external_editor, external_editor_visual, - shell_ignore_pager_commands + shell_ignore_pager_commands, + shell_help ]}, {tty_unicode,[parallel], [{group,tty_tests}, @@ -132,7 +163,8 @@ groups() -> {tty_latin1,[],[{group,tty_tests}]}, {tty_tests, [parallel], [shell_navigation, shell_multiline_navigation, shell_multiline_prompt, - shell_xnfix, shell_delete, shell_format, shell_help, + shell_xnfix, shell_delete, shell_format, + shell_combining_unicode, shell_transpose, shell_search, shell_insert, shell_update_window, shell_small_window_multiline_navigation, shell_huge_input, shell_support_ansi_input, @@ -171,7 +203,7 @@ init_per_group(shell_history, Config) -> old -> {skip, "Not supported in old shell"}; new -> Config end; -init_per_group(tty, Config) -> +init_per_group(Group, Config) when Group =:= tty; Group =:= ssh -> case string:split(tmux("-V")," ") of ["tmux",[Num,$.|_]] when Num >= $3, Num =< $9 -> tmux("kill-session"), @@ -184,8 +216,11 @@ init_per_group(tty, Config) -> Error -> {skip, "tmux not installed " ++ Error} end; + init_per_group(Group, Config) when Group =:= tty_unicode; - Group =:= tty_latin1 -> + Group =:= tty_latin1; + Group =:= ssh_unicode; + Group =:= ssh_latin1 -> [Lang,_] = string:split( os:getenv("LC_ALL", @@ -196,6 +231,10 @@ init_per_group(Group, Config) when Group =:= tty_unicode; [{encoding, unicode},{env,[{"LC_ALL",Lang++".UTF-8"}]}|Config]; tty_latin1 -> % [{encoding, latin1},{env,[{"LC_ALL",Lang++".ISO-8859-1"}]}|Config], + {skip, "latin1 tests not implemented yet"}; + ssh_unicode -> + [{encoding, unicode},{env,[{"LC_ALL",Lang++".UTF-8"}]}|Config]; + ssh_latin1 -> {skip, "latin1 tests not implemented yet"} end; init_per_group(sh_custom, Config) -> @@ -217,7 +256,7 @@ init_per_group(sh_custom, Config) -> init_per_group(_GroupName, Config) -> Config. -end_per_group(tty, _Config) -> +end_per_group(Group, _Config) when Group =:= tty; Group =:= ssh -> Windows = string:split(tmux("list-windows"), "\n", all), lists:foreach( fun(W) -> @@ -260,10 +299,15 @@ end_per_testcase(_Case, Config) -> -endif. string_to_term(Str) -> - {ok,Tokens,_EndLine} = erl_scan:string(Str ++ "."), - {ok,AbsForm} = erl_parse:parse_exprs(Tokens), - {value,Value,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()), - Value. + try + {ok,Tokens,_EndLine} = erl_scan:string(Str ++ "."), + {ok,AbsForm} = erl_parse:parse_exprs(Tokens), + {value,Value,_Bs} = erl_eval:exprs(AbsForm, erl_eval:new_bindings()), + Value + catch E:R:ST -> + ct:log("Could not parse: ~ts~n", [Str]), + erlang:raise(E,R,ST) + end. run_unbuffer_escript(Rows, Columns, EScript, NoTermStdIn, NoTermStdOut) -> DataDir = filename:join(filename:dirname(code:which(?MODULE)), "interactive_shell_SUITE_data"), @@ -492,9 +536,9 @@ shell_format(Config) -> send_tty(Term1, "Down"), tmux(["resize-window -t ",tty_name(Term1)," -x ",200]), timer:sleep(1000), - send_stdin(Term1, "shell:format_shell_func(\"emacs -batch \${file} -l \"\n"), - send_stdin(Term1, EmacsFormat), - send_stdin(Term1, "\" -f emacs-format-function\").\n"), + send_tty(Term1, "shell:format_shell_func(\"emacs -batch \${file} -l \"\n"), + send_tty(Term1, EmacsFormat), + send_tty(Term1, "\" -f emacs-format-function\").\n"), check_content(Term1, "{shell,erl_pp_format_func}"), send_tty(Term1, "Up"), send_tty(Term1, "Up"), @@ -505,7 +549,7 @@ shell_format(Config) -> check_content(Term1, "fun\\(X\\) ->\\s*.. X\\s*.. end."), send_tty(Term1, "Down"), check_content(Term1, ">$"), - send_stdin(Term1, "shell:format_shell_func({bad,format}).\n"), + send_tty(Term1, "shell:format_shell_func({bad,format}).\n"), send_tty(Term1, "Up"), send_tty(Term1, "Up"), send_tty(Term1, "\n"), @@ -518,12 +562,24 @@ shell_format(Config) -> after stop_tty(Term1) end. - +shell_multiline_prompt_ssh(Config) -> + Term1 = start_tty(Config), + try + send_tty(Term1, "shell:multiline_prompt_func({shell,inverted_space_prompt}).\n"), + check_location(Term1, {0, 0}), + send_tty(Term1,"\na"), + check_location(Term1, {0, 1}), + check_content(Term1, " a"), + ok + after + stop_tty(Term1) + end. shell_multiline_prompt(Config) -> Term1 = start_tty([{args,["-stdlib","shell_multiline_prompt","{shell,inverted_space_prompt}"]}|Config]), Term2 = start_tty([{args,["-stdlib","shell_multiline_prompt","\"...> \""]}|Config]), Term3 = start_tty([{args,["-stdlib","shell_multiline_prompt","edlin"]}|Config]), Term4 = start_tty(Config), + try check_location(Term1, {0, 0}), send_tty(Term1,"\na"), @@ -918,6 +974,40 @@ shell_search(C) -> ok end. +shell_combining_unicode(Config) -> + %% Tests that its possible to delete a combining unicode character as + %% the first character of the input line. + Term = start_tty(Config), + X = 0, + check_location(Term, {X,0}), + %% COMBINING DIAERESIS, ZWNJ, ZWJ + CombiningUnicode = [776, 8204, 8205], + try + [ + begin + send_tty(Term,[J]), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,[J,$a]), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,[$a,J]), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,"BSpace"), + check_location(Term, {X,0}), + send_tty(Term,[$",$a,J,$b,$",$.,10]), + check_location(Term, {X,0}) + end || J <- CombiningUnicode], + ok + after + stop_tty(Term) + end. + shell_insert(Config) -> Term = start_tty(Config), @@ -1039,11 +1129,18 @@ shell_huge_input(Config) -> after stop_tty(Term) end. +output_to_stdout_slowly(5) -> ok; +output_to_stdout_slowly(N) -> + receive + after 100 -> + io:format("~p~n", [N]), + output_to_stdout_slowly(N+1) + end. + shell_receive_standard_out(Config) -> Term = start_tty(Config), try - send_tty(Term,"my_fun(5) -> ok; my_fun(N) -> receive after 100 -> io:format(\"~p\\n\", [N]), my_fun(N+1) end.\n"), - send_tty(Term, "spawn(shell_default, my_fun, [0]). ABC\n"), + send_tty(Term, "spawn(interactive_shell_SUITE, output_to_stdout_slowly, [0]). ABC\n"), timer:sleep(1000), check_location(Term, {0, 0}), %% Check that we are at the same location relative to the start. check_content(Term, "3\\s+4\\s+.+>\\sABC"), @@ -1094,7 +1191,7 @@ shell_support_ansi_input(Config) -> ClearText = "\e[0m", try - send_stdin(Term,["{",BoldText,"a😀b",ClearText,"}"]), + send_tty(Term,["{",BoldText,"a😀b",ClearText,"}"]), timer:sleep(1000), try check_location(Term, {0, width("{1ma😀bm}")}) of _ -> @@ -1149,15 +1246,15 @@ shell_expand_location_below(Config) -> Cols = 80, %% First check that basic completion works - send_stdin(Term, "escript:"), - send_stdin(Term, "\t"), + send_tty(Term, "escript:"), + send_tty(Term, "\t"), %% Cursor at correct place check_location(Term, {-3, width("escript:")}), %% Nothing after the start( completion check_content(Term, "start\\($"), %% Check that completion is cleared when we type - send_stdin(Term, "s"), + send_tty(Term, "s"), check_location(Term, {-3, width("escript:s")}), check_content(Term, "escript:s$"), @@ -1167,7 +1264,7 @@ shell_expand_location_below(Config) -> send_tty(Term, "End"), send_tty(Term, ", test_after]"), [send_tty(Term, "Left") || _ <- ", test_after]"], - send_stdin(Term, "\t"), + send_tty(Term, "\t"), check_location(Term, {-3, width("[escript:s")}), check_content(Term, "script_name\\([ ]+start\\($"), send_tty(Term, "C-K"), @@ -1175,11 +1272,11 @@ shell_expand_location_below(Config) -> %% Check that completion works when in the middle of a long term send_tty(Term, ", "++ lists:duplicate(80*2, $a)++"]"), [send_tty(Term, "Left") || _ <- ", "++ lists:duplicate(80*2, $a)++"]"], - send_stdin(Term, "\t"), + send_tty(Term, "\t"), check_location(Term, {-4, width("[escript:s")}), check_content(Term, "script_name\\([ ]+start\\($"), send_tty(Term, "End"), - send_stdin(Term, ".\n"), + send_tty(Term, ".\n"), %% Check that we behave as we should with very long completions rpc(Term, fun() -> @@ -1190,14 +1287,14 @@ shell_expand_location_below(Config) -> timer:sleep(1000), %% Sleep to make sure window has resized Result = 61, Rows1 = 48, - send_stdin(Term, "long_module:" ++ FunctionName), - send_stdin(Term, "\t"), + send_tty(Term, "long_module:" ++ FunctionName), + send_tty(Term, "\t"), check_content(Term, "3> long_module:" ++ FunctionName ++ "\nfunctions(\n|.)*a_long_function_name0\\("), %% Check that correct text is printed below expansion check_content(Term, io_lib:format("rows ~w to ~w of ~w", [1, 7, Result])), - send_stdin(Term, "\t"), + send_tty(Term, "\t"), check_content(Term, io_lib:format("rows ~w to ~w of ~w", [1, Rows1, Result])), send_tty(Term, "Down"), @@ -1273,13 +1370,13 @@ shell_expand_location_above(Config) -> try tmux(["resize-window -t ",tty_name(Term)," -x 80"]), - send_stdin(Term, "escript:"), - send_stdin(Term, "\t"), + send_tty(Term, "escript:"), + send_tty(Term, "\t"), check_location(Term, {0, width("escript:")}), check_content(Term, "start\\(\n"), check_content(Term, "escript:$"), - send_stdin(Term, "s"), - send_stdin(Term, "\t"), + send_tty(Term, "s"), + send_tty(Term, "\t"), check_location(Term, {0, width("escript:s")}), check_content(Term, "\nscript_name\\([ ]+start\\(\n"), check_content(Term, "escript:s$"), @@ -1344,7 +1441,7 @@ shell_get_password(_Config) -> rtnode:run( [{putline,"io:get_password()."}, {putline,"secret\r"}, - {expect, "\r\n\r\n\"secret\""}]), + {expect, "\r\n\"secret\""}]), %% io:get_password only works when run in "newshell" rtnode:run( @@ -1374,10 +1471,7 @@ shell_ignore_pager_commands(Config) -> test_valid_keymap(Config) when is_list(Config) -> DataDir = proplists:get_value(data_dir,Config), Term = setup_tty([{args, ["-config", DataDir ++ "valid_keymap.config"]} | Config]), - Prompt = fun() -> ["\e[94m",54620,44397,50612,47,51312,49440,47568,"\e[0m"] end, - erpc:call(Term#tmux.node, application, set_env, - [stdlib, shell_prompt_func_test, - proplists:get_value(shell_prompt_func_test, Config, Prompt)]), + set_tty_prompt(Term, Config), try check_not_in_content(Term, "Invalid key"), check_not_in_content(Term, "Invalid function"), @@ -1396,6 +1490,7 @@ test_valid_keymap(Config) when is_list(Config) -> test_invalid_keymap(Config) when is_list(Config) -> DataDir = proplists:get_value(data_dir,Config), Term1 = setup_tty([{args, ["-config", DataDir ++ "invalid_keymap.config"]} | Config]), + set_tty_prompt(Term1, Config), try check_content(Term1, "Invalid key"), check_content(Term1, "Invalid function"), @@ -1555,7 +1650,7 @@ shell_suspend(Config) -> %% We test that suspending of `erl` and then resuming restores the shell shell_full_queue(Config) -> - [throw({skip,"Need unbuffered to run"}) || os:find_executable("unbuffered") =:= false], + [throw({skip,"Need unbuffer (apt install expect) to run"}) || os:find_executable("unbuffer") =:= false], %% In order to fill the read buffer of the terminal we need to get a %% bit creative. We first need to start erl in bash in order to be @@ -1578,17 +1673,16 @@ shell_full_queue(Config) -> Term = start_tty([{peer, Peer}|Config]), - UnbufferedPid = os:cmd("ps -o ppid= -p " ++ rpc(Term,os,getpid,[])), WriteUntilStopped = - fun F(Char) -> + fun F(Char, Term) -> rpc(Term,io,format,[user,[Char],[]]), put(bytes,get(bytes,0)+1), receive stop -> rpc(Term,io,format,[user,[Char+1],[]]) - after 0 -> F(Char) + after 0 -> F(Char, Term) end end, @@ -1617,37 +1711,53 @@ shell_full_queue(Config) -> %% First test that we can suspend and then resume os:cmd("kill -TSTP " ++ UnbufferedPid), check_content(Term,"\\Q[1]+\\E\\s*Stopped"), - {Pid, Ref} = spawn_monitor(fun() -> WriteUntilStopped($a) end), + {Pid, Ref} = spawn_monitor(fun() -> WriteUntilStopped($a, Term) end), WaitUntilBlocked(Pid, Ref), send_tty(Term, "fg"), send_tty(Term, "Enter"), Pid ! stop, - check_content(Term,"b$"), + check_content(Term,"b\\s+\\([^)]*\\)2>$") + after + stop_tty(Term), + ok + end, + Name2 = peer:random_name(proplists:get_value(tc_path,Config))++"_2", + os:cmd("tmux new-window -n " ++ Name2 ++ " -d -- bash --norc"), - send_tty(Term, "."), - send_tty(Term, "Enter"), + Peer2 = #{ name => Name2, + post_process_args => + fun(["new-window","-n",_,"-d","--"|CmdAndArgs]) -> + FlatCmdAndArgs = ["unbuffer -p "] ++ + lists:join( + " ",[[$',A,$'] || A <- CmdAndArgs]), + ["send","-t",Name2,lists:flatten(FlatCmdAndArgs),"Enter"] + end + }, + Term1 = setup_tty([{peer, Peer2},{args, ["-noshell"]}|Config]), + UnbufferedPid1 = os:cmd("ps -o ppid= -p " ++ rpc(Term1,os,getpid,[])), + try %% Then we test that all characters are written when system %% is terminated just after writing - {ok,Cols} = rpc(Term,io,columns,[user]), - send_tty(Term, "Enter"), - os:cmd("kill -TSTP " ++ UnbufferedPid), - check_content(Term,"\\Q[1]+\\E\\s*Stopped"), - {Pid2, Ref2} = spawn_monitor(fun() -> WriteUntilStopped($c) end), + {ok,Cols} = rpc(Term1,io,columns,[user]), + send_tty(Term1, "Enter"), + os:cmd("kill -TSTP " ++ UnbufferedPid1), + check_content(Term1,"\\Q[1]+\\E\\s*Stopped"), + {Pid2, Ref2} = spawn_monitor(fun() -> WriteUntilStopped($c, Term1) end), Bytes = WaitUntilBlocked(Pid2, Ref2) - 1, - stop_tty(Term), - send_tty(Term, "fg"), - send_tty(Term, "Enter"), + stop_tty(Term1), + send_tty(Term1, "fg"), + send_tty(Term1, "Enter"), check_content( fun() -> - tmux(["capture-pane -p -S - -E - -t ",tty_name(Term)]) + tmux(["capture-pane -p -S - -E - -t ",tty_name(Term1)]) end, lists:flatten([lists:duplicate(Cols,$c) ++ "\n" || _ <- lists:seq(1,(Bytes) div Cols)] ++ [lists:duplicate((Bytes) rem Cols,$c)])), ct:log("~ts",[tmux(["capture-pane -p -S - -E - -t ",tty_name(Term)])]), ok after - stop_tty(Term), + stop_tty(Term1), ok end. @@ -1744,11 +1854,17 @@ rpc(#tmux{ node = N }, Fun) -> rpc(#tmux{ node = N }, M, F, A) -> erpc:call(N, M, F, A). -%% Setup a TTY, but do not type anything in terminal +%% Setup a TTY, or a ssh server and client but do not type anything in terminal (except password) setup_tty(Config) -> - Name = maps:get(name,proplists:get_value(peer, Config, #{}), + ClientName = maps:get(name,proplists:get_value(peer, Config, #{}), peer:random_name(proplists:get_value(tc_path, Config))), + PG = get_top_parent_test_group(Config), + Name = if PG =:= ssh -> + ClientName ++ "_ssh"; + true -> + ClientName + end, Envs = lists:flatmap(fun({Key,Value}) -> ["-env",Key,Value] end, proplists:get_value(env,Config,[])), @@ -1827,18 +1943,63 @@ setup_tty(Config) -> monitor(process, Self), receive _ -> ok end end), + Tmux = #tmux{ peer = Peer, node = Node, name = ClientName }, + if PG =:= ssh -> + rpc(Tmux, fun() -> + ssh:start(), + PrivDir = filename:join(proplists:get_value(priv_dir, Config), "nopubkey"), + file:make_dir(PrivDir), + SysDir = proplists:get_value(data_dir, Config), + {ok, _Sshd} = ssh:daemon(8989, [{system_dir, SysDir}, + {user_dir, PrivDir}, + {password, "bar"}]) + end), + os:cmd(os:find_executable("tmux") ++ " new-window -n " ++ ClientName ++ " -d -- "++ + "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null localhost -p 8989 -l foo"), + "" = tmux(["set-option -t ",ClientName," remain-on-exit on"]), + + timer:sleep(2000), + check_content(Tmux,"Enter password for \"foo\""), + "" = tmux("send -t " ++ ClientName ++ " bar Enter"), + timer:sleep(1000), + check_content(Tmux,"\\d+\n?>"), + Tmux#tmux{ ssh_server_name = Name }; + true -> + Tmux + end. - #tmux{ peer = Peer, node = Node, name = Name }. +get_top_parent_test_group(Config) -> + maybe + GroupPath = proplists:get_value(tc_group_path,Config), + [_|_] ?= GroupPath, + [{name, Group2}] ?= lists:last(GroupPath), + Group2 + else + _ -> proplists:get_value(name, + proplists:get_value(tc_group_properties, + Config)) + end. + +set_tty_prompt(Term, Config) -> + PG = get_top_parent_test_group(Config), + + Prompt = fun() -> ["\e[94m",54620,44397,50612,47,51312,49440,47568,"\e[0m"] end, + Prompt1 = proplists:get_value(shell_prompt_func_test, Config, Prompt), + + if PG =:= ssh -> + erpc:call(Term#tmux.node, application, set_env, + [stdlib, shell_prompt_func_test, Prompt1]); + true -> + erpc:call(Term#tmux.node, application, set_env, + [stdlib, shell_prompt_func_test, Prompt1]) + end. %% Start a tty, setup custom prompt and set cursor at bottom start_tty(Config) -> Term = setup_tty(Config), - Prompt = fun() -> ["\e[94m",54620,44397,50612,47,51312,49440,47568,"\e[0m"] end, - erpc:call(Term#tmux.node, application, set_env, - [stdlib, shell_prompt_func_test, - proplists:get_value(shell_prompt_func_test, Config, Prompt)]), + set_tty_prompt(Term, Config), {Rows, _} = get_window_size(Term), @@ -1863,6 +2024,8 @@ prompt(L) -> stop_tty(Term) -> catch peer:stop(Term#tmux.peer), ct:log("~ts",[get_content(Term, "-e")]), + [ct:log("~ts",[get_content(Term#tmux{ name = Term#tmux.ssh_server_name }, "-e")]) + || Term#tmux.ssh_server_name =/= undefined], % "" = tmux("kill-window -t " ++ Term#tmux.name), ok. @@ -2070,6 +2233,143 @@ wrap(Config) when is_list(Config) -> end, ok. +noshell_raw(Config) -> + + case proplists:get_value(default_shell, Config) of + new -> + + TCGl = group_leader(), + TC = self(), + + TestcaseFun = fun() -> + link(TC), + group_leader(whereis(user), self()), + + try + %% Make sure we are in unicode encoding + unicode = proplists:get_value(encoding, io:getopts()), + + %% "\el" is an artifact from the attaching to_erl program + "\el" ++ "hello\n" = io:get_line("1> "), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ok = shell:start_interactive({noshell, raw}), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we can receive 1 char when N is 100 + [$\^p] = io:get_chars("2> ", 100), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we only receive 1 char when N is 1 + "a" = io:get_chars("3> ", 1), + "bc" = io:get_chars("", 2), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_chars counts characters not bytes + ok = io:setopts([binary]), + ~b"å" = io:get_chars("4> ", 1), + ~b"äö" = io:get_chars("", 2), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that echo works + ok = io:setopts([{echo, true}]), + ~b"åäö" = io:get_chars("5> ", 100), + ok = io:setopts([{echo, false}]), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_line works + ~b"a\n" = io:get_line("6> "), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that get_until works + ok = io:setopts([{echo, true}]), + ~b"a,b,c" = io:request({get_until, unicode, "7> ", ?MODULE, get_until, []}), + ok = io:setopts([{echo, false}]), + + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + + %% Test that we can go back to cooked mode + ok = shell:start_interactive({noshell, cooked}), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ~b"abc" = io:get_chars(user, "8> ", 3), + io:format(TCGl, "TC Line: ~p~n", [?LINE]), + ~b"\n" = io:get_chars(user, "", 1), + + io:format("exit") + catch E:R:ST -> + io:format(TCGl, "~p", [{E, R, ST}]) + end + end, + + rtnode:run( + [ + {eval, fun() -> spawn(TestcaseFun), ok end}, + + %% Test io:get_line in cookec mode + {expect, "1> $"}, + {putline, "hello"}, + + %% Test io:get_chars 100 in raw mode + {expect, "2> $"}, + {putdata, [$\^p]}, + + %% Test io:get_chars 1 in raw mode + {expect, "3> $"}, + {putdata, "abc"}, + + %% Test io:get_chars unicode + {expect, "4> $"}, + {putdata, ~b"åäö"}, + + %% Test that raw + echo works + {expect, "5> $"}, + {putdata, ~b"åäö"}, + {expect, "åäö$"}, + + %% Test io:get_line in raw mode + {expect, "6> $"}, + {putdata, "a\r"}, %% When in raw mode, \r is newline. + + %% Test io:get_until in raw mode + {expect, "7> $"}, + {putline, "a"}, + {expect, "a\n7> $"}, + {putline, "b"}, + {expect, "b\n7> $"}, + {putdata, "c."}, + {expect, "c.$"}, + + %% Test io:get_line in cooked mode + {expect, "8> $"}, + {putdata, "a"}, + {expect, "a"}, + {putdata, "b"}, + {expect, "b"}, + {putline, "c"}, + {expect, "c\r\n$"}, + + {expect, "exit$"} + ], [], [], + ["-noshell","-pz",filename:dirname(code:which(?MODULE))]); + _ -> ok + end, + ok. + +get_until(start, NewChars) -> + get_until([], NewChars); +get_until(State, NewChars) -> + Chars = State ++ NewChars, + case string:split(Chars, ".") of + [Chars] -> {more, Chars ++ ","}; + [Before, After] -> {done, [C || C <- Before, C =/= $\n], After} + end. + + %% This testcase tests that shell_history works as it should. %% We use Ctrl + P = Cp=[$\^p] in order to navigate up %% We use Ctrl + N = Cp=[$\^n] in order to navigate down @@ -2348,6 +2648,52 @@ shell_history_custom_errors(_Config) -> ok. +shell_history_toggle(_Config) -> + + %% Check that we can start with a node with an undefined + %% provider module. + rtnode:run( + [ + {putline, "io:setopts(user, [{line_history, true}])."}, + {expect, "{error,enotsup}\r\n"}, + + %% Test that io:get_line does not save into history buffer + {putline, ~s'io:get_line("").'}, + {putline, ~s'hello'}, + {expect, ~s'\\Q"hello\\n"\r\n\\E'}, + {putdata, [$\^p]}, %% Up key + {expect, ~s'\\Qio:get_line("").\\E'}, + {putdata, [$\^n]}, %% Down key + {expect, ~s'> $'}, + + %% Test that io:get_line does save into history buffer when enabled + {putline, "io:setopts([{line_history, true}])."}, + {expect, "ok\r\n"}, + {putline, ~s'io:get_line("> ").'}, + {putline, ~s'hello again'}, + {expect, ~s'\\Q"hello again\\n"\r\n\\E'}, + {putdata, [$\^p]}, %% Up key + {expect, ~s'hello again'}, + {putdata, [$\^p]}, %% Up key + {expect, ~s'\\Qio:get_line("> ").\\E'}, + {putdata, [$\^n]}, %% Down key + {expect, ~s'hello again'}, + {putdata, [$\^n]}, %% Down key + {expect, ~s'> $'}, + + %% Test that io:get_line does not save into history buffer when disabled + {putline, "io:setopts([{line_history, false}])."}, + {putline, ~s'io:get_line("| ").'}, + {putline, ~s'hello'}, + {expect, ~s'\\Q"hello\\n"\r\n\\E'}, + {putdata, [$\^p]}, %% Up key + {expect, ~s'\\Qio:get_line("| ").\\E'}, + {putdata, [$\^n]}, %% Down key + {expect, ~s'> $'} + ], [], [], ["-pz",filename:dirname(code:which(?MODULE))]), + + ok. + load() -> case application:get_env(kernel,provider_load) of {ok, crash} -> @@ -2394,6 +2740,8 @@ job_control_local(Config) when is_list(Config) -> {expect, "\r\n35\r\n"}, {expect, "2> $"}, {putline, "receive M -> M end.\r\n"}, + {sleep, 6000}, + {expect, "Command is taking a long time"}, {putline, "\^g"}, {expect, "--> $"}, {putline, "i 3"}, diff --git a/lib/kernel/test/interactive_shell_SUITE_data/ssh_host_rsa_key b/lib/kernel/test/interactive_shell_SUITE_data/ssh_host_rsa_key new file mode 100644 index 000000000000..6ae7ee023d90 --- /dev/null +++ b/lib/kernel/test/interactive_shell_SUITE_data/ssh_host_rsa_key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDCZX+4FBDwZIh9y/Uxee1VJnEXlowpz2yDKwj8semM4q843337 +zbNfxHmladB1lpz2NqyxI175xMIJuDxogyZdsOxGnFAzAnthR4dqL/RWRWzjaxSB +6IAO9SPYVVlrpZ+1hsjLW79fwXK/yc8VdhRuWTeQiRgYY2ek8+OKbOqz4QIDAQAB +AoGANmvJzJO5hkLuvyDZHKfAnGTtpifcR1wtSa9DjdKUyn8vhKF0mIimnbnYQEmW +NUUb3gXCZLi9PvkpRSVRrASDOZwcjoU/Kvww163vBUVb2cOZfFhyn6o2Sk88Tt++ +udH3hdjpf9i7jTtUkUe+QYPsia+wgvvrmn4QrahLAH86+kECQQDx5gFeXTME3cnW +WMpFz3PPumduzjqgqMMWEccX4FtQkMX/gyGa5UC7OHFyh0N/gSWvPbRHa8A6YgIt +n8DO+fh5AkEAzbqX4DOn8NY6xJIi42q7l/2jIA0RkB6P7YugW5NblhqBZ0XDnpA5 +sMt+rz+K07u9XZtxgh1xi7mNfwY6lEAMqQJBAJBEauCKmRj35Z6OyeQku59SPsnY ++SJEREVvSNw2lH9SOKQQ4wPsYlTGbvKtNVZgAcen91L5MmYfeckYE/fdIZECQQCt +64zxsTnM1I8iFxj/gP/OYlJBikrKt8udWmjaghzvLMEw+T2DExJyb9ZNeT53+UMB +m6O+B/4xzU/djvp+0hbhAkAemIt+rA5kTmYlFndhpvzkSSM8a2EXsO4XIPgGWCTT +tQKS/tTly0ADMjN/TVy11+9d6zcqadNVuHXHGtR4W0GR +-----END RSA PRIVATE KEY----- diff --git a/lib/kernel/test/interactive_shell_SUITE_data/valid_keymap.config b/lib/kernel/test/interactive_shell_SUITE_data/valid_keymap.config index 62e4cf38b726..357f6f5dabea 100644 --- a/lib/kernel/test/interactive_shell_SUITE_data/valid_keymap.config +++ b/lib/kernel/test/interactive_shell_SUITE_data/valid_keymap.config @@ -6,14 +6,14 @@ %% Enter "\n" => new_line_finish, "\r" => new_line_finish, -%%% Alt-Enter or Esc + Enter +%%% Alt+Enter or Esc + Enter "\^[\n" => new_line, "\^[\r" => new_line, %% Tab ^I "\t" => tab_expand, -%% Ctrl-alpha keys 0-31 +%% Ctrl+alpha keys 0-31 "\^A" => beginning_of_line, "\^B" => history_up, %"\^C" => sig_term_menu, %% cannot be changed, yet @@ -53,7 +53,7 @@ "\^[[15~" => clear, "\^[[15;5~" => clear, -%% Alt-alpha_key or Esc + alpha_key, can distinguish case +%% Alt+alpha_key or Esc + alpha_key, can distinguish case %"\^[A "\^[B" => backward_word, "\^[b" => backward_word, @@ -154,4 +154,4 @@ default => search_quit}, tab_expand => #{ "\t" => tab_expand_full, -default => tab_expand_quit}}}]}]. \ No newline at end of file +default => tab_expand_quit}}}]}]. diff --git a/lib/kernel/test/kernel_SUITE.erl b/lib/kernel/test/kernel_SUITE.erl index 829d10c6a006..2937ca833236 100644 --- a/lib/kernel/test/kernel_SUITE.erl +++ b/lib/kernel/test/kernel_SUITE.erl @@ -27,7 +27,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). -include_lib("common_test/include/ct.hrl"). diff --git a/lib/kernel/test/tty.cover b/lib/kernel/test/tty.cover index cf4d26ea8e1a..8190ba41ffa4 100644 --- a/lib/kernel/test/tty.cover +++ b/lib/kernel/test/tty.cover @@ -1,3 +1,3 @@ %% -*- erlang -*- -{incl_mods,[prim_tty, user_drv, group, shell, edlin, edlin_expand, io_lib]}. +{incl_mods,[prim_tty, prim_tty_sighandler, user_drv, group, shell, edlin, edlin_expand, io_lib]}. diff --git a/lib/megaco/configure b/lib/megaco/configure index 130e594d0492..fec557b6b09d 100755 --- a/lib/megaco/configure +++ b/lib/megaco/configure @@ -2779,6 +2779,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + @@ -2904,6 +2908,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -2918,6 +2929,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -2932,6 +2950,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -2943,18 +2968,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -2963,6 +2989,13 @@ fi +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi + + @@ -5949,6 +5982,11 @@ if test "$PERL" = no_perl; then as_fn_error $? "Perl is required to build the flex scanner!" "$LINENO" 5 fi + +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + ac_config_files="$ac_config_files examples/meas/Makefile:examples/meas/Makefile.in" cat >confcache <<\_ACEOF diff --git a/lib/megaco/configure.ac b/lib/megaco/configure.ac index 6f243be8d911..a5c3db9e1aae 100644 --- a/lib/megaco/configure.ac +++ b/lib/megaco/configure.ac @@ -33,6 +33,8 @@ AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf]) ERL_CANONICAL_SYSTEM_TYPE +ERL_PUSH_WERROR + dnl ---------------------------------------------------------------------- dnl Checks for programs. dnl ---------------------------------------------------------------------- @@ -169,6 +171,8 @@ if test "$PERL" = no_perl; then AC_MSG_ERROR([Perl is required to build the flex scanner!]) fi +ERL_POP_WERROR + AC_CONFIG_FILES([examples/meas/Makefile:examples/meas/Makefile.in]) AC_OUTPUT AC_CONFIG_FILES([src/flex/$host/Makefile:src/flex/Makefile.in]) diff --git a/lib/observer/src/observer_port_wx.erl b/lib/observer/src/observer_port_wx.erl index d39687fbac9e..18028f1c9274 100644 --- a/lib/observer/src/observer_port_wx.erl +++ b/lib/observer/src/observer_port_wx.erl @@ -374,9 +374,9 @@ create_menus(Parent) -> MenuEntries = [{"View", [#create_menu{id = ?ID_PORT_INFO_SELECTED, - text = "Port info for selected ports\tCtrl-I"}, + text = "Port info for selected ports\tCtrl+I"}, separator, - #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl-R"}, + #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl+R"}, #create_menu{id = ?ID_REFRESH_INTERVAL, text = "Refresh Interval..."} ]}, {"Trace", diff --git a/lib/observer/src/observer_pro_wx.erl b/lib/observer/src/observer_pro_wx.erl index 23c082e0253f..72ff278ba74c 100644 --- a/lib/observer/src/observer_pro_wx.erl +++ b/lib/observer/src/observer_pro_wx.erl @@ -133,7 +133,7 @@ create_pro_menu(Parent, Holder) -> type=check, check=call(Holder, {get_accum, self()})}, separator, - #create_menu{id=?ID_REFRESH, text="Refresh\tCtrl-R"}, + #create_menu{id=?ID_REFRESH, text="Refresh\tCtrl+R"}, #create_menu{id=?ID_REFRESH_INTERVAL, text="Refresh Interval"}]}, {"Trace", [#create_menu{id=?ID_TRACE_PIDS, text="Trace processes"}, diff --git a/lib/observer/src/observer_procinfo.erl b/lib/observer/src/observer_procinfo.erl index a558546f52fc..89cd8b1b2659 100644 --- a/lib/observer/src/observer_procinfo.erl +++ b/lib/observer/src/observer_procinfo.erl @@ -365,7 +365,7 @@ init_log_page(Parent, Pid, Table) -> create_menus(MenuBar) -> Menus = [{"File", [#create_menu{id=?wxID_CLOSE, text="Close"}]}, - {"View", [#create_menu{id=?REFRESH, text="Refresh\tCtrl-R"}]}], + {"View", [#create_menu{id=?REFRESH, text="Refresh\tCtrl+R"}]}], observer_lib:create_menus(Menus, MenuBar, new_window). process_info_fields(Pid, WSz) -> diff --git a/lib/observer/src/observer_sock_wx.erl b/lib/observer/src/observer_sock_wx.erl index 90591acac27e..031c1dd9f2d9 100644 --- a/lib/observer/src/observer_sock_wx.erl +++ b/lib/observer/src/observer_sock_wx.erl @@ -418,9 +418,9 @@ create_menus(Parent) -> MenuEntries = [{"View", [#create_menu{id = ?ID_SOCKET_INFO_SELECTED, - text = "Socket info for selected sockets\tCtrl-I"}, + text = "Socket info for selected sockets\tCtrl+I"}, separator, - #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl-R"}, + #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl+R"}, #create_menu{id = ?ID_REFRESH_INTERVAL, text = "Refresh Interval..."} ]}%% , %% {"Debug", diff --git a/lib/observer/src/observer_sys_wx.erl b/lib/observer/src/observer_sys_wx.erl index e6ec02f606d0..25152178b8c1 100644 --- a/lib/observer/src/observer_sys_wx.erl +++ b/lib/observer/src/observer_sys_wx.erl @@ -86,7 +86,7 @@ init([Notebook, Parent, Config]) -> create_sys_menu(Parent) -> - View = {"View", [#create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl-R"}, + View = {"View", [#create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl+R"}, #create_menu{id = ?ID_REFRESH_INTERVAL, text = "Refresh interval"}]}, observer_wx:create_menus(Parent, [View]). diff --git a/lib/observer/src/observer_trace_wx.erl b/lib/observer/src/observer_trace_wx.erl index 2b727d0a26f7..376f170a89cc 100644 --- a/lib/observer/src/observer_trace_wx.erl +++ b/lib/observer/src/observer_trace_wx.erl @@ -992,8 +992,8 @@ create_logwindow(Parent, true) -> LogWin = wxFrame:new(Parent, ?LOG_WIN, "Trace Log", [{size, {750*Scale, 800*Scale}}]), MB = wxMenuBar:new(), File = wxMenu:new(), - wxMenu:append(File, ?LOG_CLEAR, "Clear Log\tCtrl-C"), - wxMenu:append(File, ?LOG_SAVE, "Save Log\tCtrl-S"), + wxMenu:append(File, ?LOG_CLEAR, "Clear Log\tCtrl+C"), + wxMenu:append(File, ?LOG_SAVE, "Save Log\tCtrl+S"), wxMenu:append(File, ?wxID_CLOSE, "Close"), wxMenuBar:append(MB, File, "File"), wxFrame:setMenuBar(LogWin, MB), diff --git a/lib/observer/src/observer_tv_table.erl b/lib/observer/src/observer_tv_table.erl index 669ee82e3f6e..1831e5c10f78 100644 --- a/lib/observer/src/observer_tv_table.erl +++ b/lib/observer/src/observer_tv_table.erl @@ -177,16 +177,16 @@ add_columns(Grid, Start, ColumnNames) -> create_menus(MB) -> File = wxMenu:new(), - wxMenu:append(File, ?ID_TABLE_INFO, "Table Information\tCtrl-I"), + wxMenu:append(File, ?ID_TABLE_INFO, "Table Information\tCtrl+I"), wxMenu:append(File, ?wxID_CLOSE, "Close"), wxMenuBar:append(MB, File, "File"), Edit = wxMenu:new(), wxMenu:append(Edit, ?ID_EDIT, "Edit Object"), - wxMenu:append(Edit, ?ID_DELETE, "Delete Object\tCtrl-D"), + wxMenu:append(Edit, ?ID_DELETE, "Delete Object\tCtrl+D"), wxMenu:appendSeparator(Edit), - wxMenu:append(Edit, ?ID_SEARCH, "Search\tCtrl-S"), + wxMenu:append(Edit, ?ID_SEARCH, "Search\tCtrl+S"), wxMenu:appendSeparator(Edit), - wxMenu:append(Edit, ?ID_REFRESH, "Refresh\tCtrl-R"), + wxMenu:append(Edit, ?ID_REFRESH, "Refresh\tCtrl+R"), wxMenu:append(Edit, ?ID_REFRESH_INTERVAL, "Refresh interval..."), wxMenuBar:append(MB, Edit, "Edit"), Help = wxMenu:new(), diff --git a/lib/observer/src/observer_tv_wx.erl b/lib/observer/src/observer_tv_wx.erl index 9f9636797cd7..5649a8986d33 100644 --- a/lib/observer/src/observer_tv_wx.erl +++ b/lib/observer/src/observer_tv_wx.erl @@ -291,7 +291,7 @@ code_change(_, _, State) -> create_menus(Parent, #opts{sys_hidden=Sys, unread_hidden=UnR, type=Type}) -> MenuEntries = [{"View", - [#create_menu{id = ?ID_TABLE_INFO, text = "Table information\tCtrl-I"}, + [#create_menu{id = ?ID_TABLE_INFO, text = "Table information\tCtrl+I"}, separator, #create_menu{id = ?ID_ETS, text = "&Ets Tables", type=radio, check=Type==ets}, @@ -303,7 +303,7 @@ create_menus(Parent, #opts{sys_hidden=Sys, unread_hidden=UnR, type=Type}) -> #create_menu{id = ?ID_SYSTEM_TABLES, text = "View &System Tables", type=check, check=not Sys}, separator, - #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl-R"}, + #create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl+R"}, #create_menu{id = ?ID_REFRESH_INTERVAL, text = "Refresh Interval..."} ]}], observer_wx:create_menus(Parent, MenuEntries). diff --git a/lib/observer/test/crashdump_helper.erl b/lib/observer/test/crashdump_helper.erl index 2b6d15cf1b65..d4669dafa393 100644 --- a/lib/observer/test/crashdump_helper.erl +++ b/lib/observer/test/crashdump_helper.erl @@ -25,7 +25,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). -export([n1_proc/2,remote_proc/2, dump_maps/0,create_maps/0, diff --git a/lib/odbc/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c index e99f16624ea7..f415a7c083d3 100644 --- a/lib/odbc/c_src/odbcserver.c +++ b/lib/odbc/c_src/odbcserver.c @@ -645,8 +645,15 @@ static db_result_msg db_query(byte *sql, db_state *state) diagnos = get_diagnos(SQL_HANDLE_STMT, statement_handle(state), extended_errors(state)); if(strcmp((char *)diagnos.sqlState, INFO) == 0) { is_error[0] = 0; - strncat((char *)is_error, (char *)diagnos.error_msg, - 5); +#ifdef HAVE_GCC_DIAG_IGNORE_WSTRINGOP_TRUNCATION +_Pragma("GCC diagnostic push"); +_Pragma("GCC diagnostic ignored \"-Wstringop-truncation\""); +#endif + strncat((char *)is_error, (char *)diagnos.error_msg, + 5); +#ifdef HAVE_GCC_DIAG_IGNORE_WSTRINGOP_TRUNCATION +_Pragma("GCC diagnostic pop"); +#endif str_tolower((char *)&is_error, 5); /* The ODBC error handling could have been more predictable but alas ... we try to make the best of diff --git a/lib/odbc/configure b/lib/odbc/configure index 7d94938ad08b..aad3e087067c 100755 --- a/lib/odbc/configure +++ b/lib/odbc/configure @@ -2878,6 +2878,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi @@ -3002,6 +3013,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3016,6 +3034,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3030,6 +3055,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3041,18 +3073,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -6002,6 +6035,31 @@ fi ;; esac fi +saved_CFLAGS="$CFLAGS" +CFLAGS="-Werror $CFLAGS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +_Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wstringop-truncation\"") + _Pragma("GCC diagnostic pop") + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +printf "%s\n" "#define HAVE_GCC_DIAG_IGNORE_WSTRINGOP_TRUNCATION 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +CFLAGS="$saved_CFLAGS" + if test "x$GCC" = xyes then : @@ -6049,6 +6107,11 @@ fi fi + +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + ac_config_files="$ac_config_files c_src/$host/Makefile:c_src/Makefile.in" cat >confcache <<\_ACEOF diff --git a/lib/odbc/configure.ac b/lib/odbc/configure.ac index febdd044a573..75cd3b3148b4 100644 --- a/lib/odbc/configure.ac +++ b/lib/odbc/configure.ac @@ -31,6 +31,8 @@ m4_include([otp.m4]) AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf]) +ERL_PUSH_WERROR + ERL_CANONICAL_SYSTEM_TYPE AC_ARG_WITH(odbc, @@ -250,11 +252,25 @@ AC_SUBST(ODBC_INCLUDE) ]) dnl "$with_odbc" != "no" +dnl ---------------------------------------------------------------------- +dnl Check for GCC diagnostic ignored "-Wstringop-truncation" +dnl ---------------------------------------------------------------------- +saved_CFLAGS="$CFLAGS" +CFLAGS="-Werror $CFLAGS" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[_Pragma("GCC diagnostic push") + _Pragma("GCC diagnostic ignored \"-Wstringop-truncation\"") + _Pragma("GCC diagnostic pop") + ]])],[AC_DEFINE(HAVE_GCC_DIAG_IGNORE_WSTRINGOP_TRUNCATION,1, + define if compiler support _Pragma('GCC diagnostic ignored '-Wstringop-truncation''))],[]) +CFLAGS="$saved_CFLAGS" + AS_IF([test "x$GCC" = xyes], [ # Treat certain GCC warnings as errors LM_TRY_ENABLE_CFLAG([-Werror=return-type], [CFLAGS]) ]) +ERL_POP_WERROR + AC_CONFIG_FILES([c_src/$host/Makefile:c_src/Makefile.in]) AC_OUTPUT diff --git a/lib/os_mon/c_src/memsup.c b/lib/os_mon/c_src/memsup.c index ad4a193d99ba..9d08500e58f7 100644 --- a/lib/os_mon/c_src/memsup.c +++ b/lib/os_mon/c_src/memsup.c @@ -288,7 +288,6 @@ get_mem_procfs(memory_ext *me){ int fd, nread; char buffer[4097]; char *bp; - unsigned long value; me->flag = 0; @@ -494,7 +493,7 @@ get_extended_mem(memory_ext *me) { static void get_basic_mem(unsigned long *tot, unsigned long *used, unsigned long *pagesize){ #if defined(_SC_AVPHYS_PAGES) /* Does this exist on others than Solaris2? */ - unsigned long avPhys, phys, pgSz; + unsigned long avPhys, phys; phys = sysconf(_SC_PHYS_PAGES); avPhys = sysconf(_SC_AVPHYS_PAGES); diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl index 471b01d1b7ea..c541bee24b64 100644 --- a/lib/os_mon/src/disksup.erl +++ b/lib/os_mon/src/disksup.erl @@ -442,7 +442,7 @@ run_df(Path, {unix, linux}, Port) -> run_df(Path, {unix, posix}, Port) -> my_cmd("df -k -P " ++ Path, Port); run_df(Path, {unix, dragonfly}, Port) -> - my_cmd("/bin/df -k -t ufs,hammer " ++ Path, Port); + my_cmd("/bin/df -k -t ufs,hammer,hammer2 " ++ Path, Port); run_df(Path, {unix, freebsd}, Port) -> my_cmd("/bin/df -k -l " ++ Path, Port); run_df(Path, {unix, openbsd}, Port) -> diff --git a/lib/parsetools/src/yecc.erl b/lib/parsetools/src/yecc.erl index 59267f108b5d..2c08a5954a75 100644 --- a/lib/parsetools/src/yecc.erl +++ b/lib/parsetools/src/yecc.erl @@ -2339,9 +2339,10 @@ find_identical_shift_states(StateActions) -> %% states so that they can be used from other states. Some space is %% saved. find_partial_shift_states(StateActionsL, StateReprs) -> - L = [{State, Actions} || {{State,Actions}, {State,State}} <- - lists:zip(StateActionsL, StateReprs), - shift_actions_only(Actions)], + L = [{State, Actions} || + {State,Actions} <- StateActionsL && + {State,State} <- StateReprs, + shift_actions_only(Actions)], StateActions = sofs:family(L, [{state,[action]}]), StateAction = sofs:family_to_relation(StateActions), @@ -2366,10 +2367,9 @@ find_partial_shift_states(StateActionsL, StateReprs) -> PartDataL = [#part_data{name = Nm, eq_state = EqS, actions = P, n_actions = length(P), states = ordsets:from_list(S)} || - {{Nm,P}, {Nm,S}, {Nm,EqS}} <- - lists:zip3(PartNameL, - sofs:to_external(PartInStates), - sofs:to_external(PartStates))], + {Nm,P} <- PartNameL && + {Nm,S} <- sofs:to_external(PartInStates) && + {Nm,EqS} <- sofs:to_external(PartStates)], true = length(PartDataL) =:= length(PartNameL), Ps = select_parts(PartDataL), @@ -2392,9 +2392,9 @@ find_partial_shift_states(StateActionsL, StateReprs) -> R = [{S, {Actions,jump_none}} || {S,Actions} <- sofs:to_external(NJS)] ++ - [{S, {Actions--Part, {Tag,ToS,Part}}} || - {{S,Actions}, {S,Part,{Tag,ToS}}} <- - lists:zip(sofs:to_external(JS), J)], + [{S, {Actions--Part, {Tag,ToS,Part}}} || + {S,Actions} <- sofs:to_external(JS) && + {S,Part,{Tag,ToS}} <- J], true = length(StateActionsL) =:= length(R), lists:keysort(1, R). @@ -2450,8 +2450,8 @@ collect_some_state_info(StateActions, StateReprs) -> true <- [RO], Repr =/= State], #state_info{reduce_only = RO, state_repr = Repr, comment = C} end} || - {{State, LaActions}, {State, Repr}} <- - lists:zip(StateActions, StateReprs)], + {State, LaActions} <- StateActions && + {State, Repr} <- StateReprs], list_to_tuple(L). conflict_error(Conflict, St0) -> @@ -2731,9 +2731,9 @@ output_actions(St0, StateJumps, StateInfo) -> Sel = [{S,true} || S <- ordsets:to_list(Y2CS)] ++ [{S,false} || S <- ordsets:to_list(NY2CS)], - SelS = [{State,Called} || - {{State,_JActions}, {State,Called}} <- - lists:zip(StateJumps, lists:keysort(1, Sel))], + SelS = [{State,Called} || + {State,_JActions} <- StateJumps && + {State,Called} <- lists:keysort(1, Sel)], St05 = output_nowarn(St0, yeccpars2, '', 7), St10 = foldl(fun({State, Called}, St_0) -> {State, #state_info{state_repr = IState}} = diff --git a/lib/parsetools/test/yecc_SUITE.erl b/lib/parsetools/test/yecc_SUITE.erl index 0158eb686526..e64bff58c034 100644 --- a/lib/parsetools/test/yecc_SUITE.erl +++ b/lib/parsetools/test/yecc_SUITE.erl @@ -341,10 +341,10 @@ syntax(Config) when is_list(Config) -> %% Note: checking the line numbers. Changes when yeccpre.hrl changes. fun() -> {error,[{_,[{{5,25},_,["syntax error before: ","bad"]}]}, - {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{L2,_},_,{bad_inline,{yeccpars2_2_,1}}}, - {{_,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1}}}]}], + {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{L2,_},_,{bad_inline,{yeccpars2_2_,1},_}}, + {{_,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1},_}}]}], []} = compile:file(Parserfile1, [basic_validation,return]), ?assertEqual(L1, 38 + SzYeccPre), ?assertEqual(L2, 47 + SzYeccPre) @@ -361,10 +361,10 @@ syntax(Config) when is_list(Config) -> %% Note: checking the line numbers. Changes when yeccpre.hrl changes. fun() -> {error,[{_,[{{5,24},_,{undefined,'F',1}}]}, - {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{L2,_},_,{bad_inline,{yeccpars2_2_,1}}}, - {{_,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1}}}]}], + {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{L2,_},_,{bad_inline,{yeccpars2_2_,1},_}}, + {{_,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1},_}}]}], []} = compile:file(Parserfile1, [basic_validation,return]), ?assertEqual(L1, 38 + SzYeccPre), ?assertEqual(L2, 47 + SzYeccPre) @@ -1691,10 +1691,10 @@ otp_7292(Config) when is_list(Config) -> SzYeccPre = yeccpre_size(), {error, [{_,[{{5,32},_,["syntax error before: ","bad"]}]}, - {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{L2,_},_,{bad_inline,{yeccpars2_2_,1}}}, - {{_,_},_,{undefined_function,{yeccpars2_2_,1}}}, - {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1}}}]}], + {_,[{{L1,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{L2,_},_,{bad_inline,{yeccpars2_2_,1},_}}, + {{_,_},_,{undefined_function,{yeccpars2_2_,1},_}}, + {{_,_},_,{bad_nowarn_unused_function,{yeccpars2_2_,1},_}}]}], [{_,[{{16,20},_,{unused_function,{foo,0}}}]}]} = compile:file(Parserfile1, [basic_validation, return]), ?assertEqual(L1, 48 + SzYeccPre), diff --git a/lib/public_key/test/pbe_SUITE.erl b/lib/public_key/test/pbe_SUITE.erl index f314eea64f75..55e22724a0c3 100644 --- a/lib/public_key/test/pbe_SUITE.erl +++ b/lib/public_key/test/pbe_SUITE.erl @@ -66,7 +66,7 @@ groups() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> application:stop(crypto), - try crypto:start() of + try application:start(crypto) of ok -> Config catch _:_ -> diff --git a/lib/public_key/test/pkits_SUITE.erl b/lib/public_key/test/pkits_SUITE.erl index 29a5e13bda0f..ef7aaba0d3ab 100644 --- a/lib/public_key/test/pkits_SUITE.erl +++ b/lib/public_key/test/pkits_SUITE.erl @@ -431,7 +431,7 @@ groups() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> application:stop(crypto), - try crypto:start() of + try application:start(crypto) of ok -> application:start(asn1), crypto_support_check(Config) diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl index a85a5d4b017a..07c516f523f9 100644 --- a/lib/public_key/test/public_key_SUITE.erl +++ b/lib/public_key/test/public_key_SUITE.erl @@ -212,7 +212,7 @@ groups() -> %%------------------------------------------------------------------- init_per_suite(Config) -> application:stop(crypto), - try crypto:start() of + try application:start(crypto) of ok -> application:start(asn1), Config diff --git a/lib/reltool/test/reltool_manual_gui_SUITE.erl b/lib/reltool/test/reltool_manual_gui_SUITE.erl index 3a4b012d2e2f..4e4fc742f569 100644 --- a/lib/reltool/test/reltool_manual_gui_SUITE.erl +++ b/lib/reltool/test/reltool_manual_gui_SUITE.erl @@ -172,7 +172,7 @@ config(Config) -> {ok,ServerPid} = reltool:get_server(SysPid), unlink(SysPid), break("the system window is still alive", - "terminate reltool by hitting 'Ctrl-q' (linux) or clicking the " + "terminate reltool by hitting 'Ctrl+Q' (linux) or clicking the " "close box on the top fram when system window is active"), false = erlang:is_process_alive(SysPid), false = erlang:is_process_alive(ServerPid), diff --git a/lib/runtime_tools/c_src/trace_file_drv.c b/lib/runtime_tools/c_src/trace_file_drv.c index 37a814977719..ea4a3eefd51b 100644 --- a/lib/runtime_tools/c_src/trace_file_drv.c +++ b/lib/runtime_tools/c_src/trace_file_drv.c @@ -377,17 +377,15 @@ static void trace_file_outputv(ErlDrvData handle, ErlIOVec *ev) static void trace_file_output(ErlDrvData handle, char *buff, ErlDrvSizeT bufflen) { - int heavy = 0; TraceFileData *data = (TraceFileData *) handle; unsigned char b[5] = ""; put_be((unsigned) bufflen, b + 1); switch (my_write(data, (unsigned char *) b, sizeof(b))) { case 1: - heavy = !0; case 0: switch (my_write(data, (unsigned char *) buff, bufflen)) { case 1: - heavy = !0; + break; case 0: break; case -1: @@ -408,12 +406,8 @@ static void trace_file_output(ErlDrvData handle, char *buff, driver_failure_posix(data->port, errno); /* XXX */ return; } - heavy = !0; } } - if (heavy) { - set_port_control_flags(data->port, PORT_CONTROL_FLAG_HEAVY); - } } /* @@ -577,7 +571,6 @@ static int my_write(TraceFileData *data, unsigned char *buff, int siz) } memcpy(data->buff, buff + wrote, siz - wrote); data->buff_pos = siz - wrote; - set_port_control_flags(data->port, PORT_CONTROL_FLAG_HEAVY); return 1; } diff --git a/lib/runtime_tools/src/scheduler.erl b/lib/runtime_tools/src/scheduler.erl index 52905036de86..f8f62f6ebfe7 100644 --- a/lib/runtime_tools/src/scheduler.erl +++ b/lib/runtime_tools/src/scheduler.erl @@ -243,10 +243,8 @@ enabled during the entire interval between the two samples. Sample1 :: sched_sample(), Sample2 :: sched_sample(). utilization({Stats, Ts0}, {Stats, Ts1}) -> - Diffs = lists:map(fun({{Tag, I, A0, T0}, {Tag, I, A1, T1}}) -> - {Tag, I, (A1 - A0), (T1 - T0)} - end, - lists:zip(Ts0,Ts1)), + Diffs = [{Tag, I, (A1 - A0), (T1 - T0)} || + {Tag, I, A0, T0} <- Ts0 && {Tag, I, A1, T1} <- Ts1], {Lst0, {A, T, N}} = lists:foldl(fun({Tag, I, Adiff, Tdiff}, {Lst, Acc}) -> R = safe_div(Adiff, Tdiff), diff --git a/lib/sasl/src/release_handler.erl b/lib/sasl/src/release_handler.erl index d3c2757bdb4d..9cf3bab849c8 100644 --- a/lib/sasl/src/release_handler.erl +++ b/lib/sasl/src/release_handler.erl @@ -213,7 +213,7 @@ release_handler does. ## See Also [OTP Design Principles](`e:system:index.html`), -[`config)`](`e:kernel:config.md`), [`rel`](rel.md), [`relup`](relup.md), +[`config`](`e:kernel:config.md`), [`rel`](rel.md), [`relup`](relup.md), [`script`](script.md), `m:sys`, `m:systools` """. -moduledoc(#{titles => [{function,<<"Application Upgrade/Downgrade">>}]}). diff --git a/lib/sasl/src/systools.erl b/lib/sasl/src/systools.erl index a7f45be37aeb..5a7f9bab17ad 100644 --- a/lib/sasl/src/systools.erl +++ b/lib/sasl/src/systools.erl @@ -221,9 +221,7 @@ is specified, this path is appended to the current path. Wildcard `*` is expanded to all matching directories. Example: `"lib/*/ebin"`. If the `{extra_files, ExtraFiles}` option is given then the `ExtraFiles` are -added to the tarball after everything else to be included has been added. The -`ExtraFiles` list is a list of files or directories in the same format as the -`add_type()` tuple for [erl_tar:add/3,4](`erl_tar:add/3`) +added to the tarball after everything else to be included has been added. Option `variables` can be used to specify an installation directory other than `lib` for some of the applications. If variable `{VarName,Prefix}` is specified @@ -293,7 +291,7 @@ described for [`make_script`](`make_script/1`). App :: atom(), Result :: ok | error | {ok, Module :: module(), Warnings :: term()} | {error, Module :: module(), Error :: term()}, - ExtraFiles :: [{NameInArchive, file:filename_all()}], + ExtraFiles :: [{file:filename_all(), NameInArchive}], NameInArchive :: string(). make_tar(RelName, Opt) -> systools_make:make_tar(RelName, Opt). diff --git a/lib/sasl/test/release_handler_SUITE.erl b/lib/sasl/test/release_handler_SUITE.erl index 0c2b56f81024..2614b231f8d0 100644 --- a/lib/sasl/test/release_handler_SUITE.erl +++ b/lib/sasl/test/release_handler_SUITE.erl @@ -1661,7 +1661,7 @@ upgrade_supervisor(Conf) when is_list(Conf) -> %% Check that the restart strategy and child spec is updated {status, _, {module, _}, [_, _, _, _, [_,_,{data,[{"State",State}]}|_]]} = rpc:call(Node,sys,get_status,[a_sup]), - {state,_,RestartStrategy,{[a],Db},_,_,_,_,_,_,_,_} = State, + {state,_,RestartStrategy,{[a],Db},_,_,_,_,_,_,_,_,_} = State, one_for_all = RestartStrategy, % changed from one_for_one {child,_,_,_,_,_,brutal_kill,_,_} = maps:get(a,Db), % changed from timeout 2000 diff --git a/lib/sasl/test/sasl_SUITE.erl b/lib/sasl/test/sasl_SUITE.erl index 0ea38bcfe21e..0247c436a111 100644 --- a/lib/sasl/test/sasl_SUITE.erl +++ b/lib/sasl/test/sasl_SUITE.erl @@ -24,7 +24,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). -include_lib("common_test/include/ct.hrl"). diff --git a/lib/snmp/configure b/lib/snmp/configure index 3056d7ad7374..4d91509f6385 100755 --- a/lib/snmp/configure +++ b/lib/snmp/configure @@ -1912,6 +1912,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi @@ -2037,6 +2048,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -2051,6 +2069,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -2065,6 +2090,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -2076,18 +2108,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -2169,6 +2202,11 @@ fi +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + + ac_config_files="$ac_config_files mibs/Makefile:mibs/Makefile.in" ac_config_files="$ac_config_files src/agent/Makefile:src/agent/Makefile.in" diff --git a/lib/snmp/configure.ac b/lib/snmp/configure.ac index 8f4c1fd83390..4f7954d4fb81 100644 --- a/lib/snmp/configure.ac +++ b/lib/snmp/configure.ac @@ -31,6 +31,8 @@ m4_include([otp.m4]) AC_CONFIG_AUX_DIRS([${ERL_TOP}/make/autoconf]) +ERL_PUSH_WERROR + dnl ---------------------------------------------------------------------- dnl Checks for programs. dnl ---------------------------------------------------------------------- @@ -64,6 +66,8 @@ fi dnl ---------------------------------------------------------------------- +ERL_POP_WERROR + AC_SUBST(SNMP_EMPTY_PDU_SIZE_DEFAULT) AC_CONFIG_FILES([mibs/Makefile:mibs/Makefile.in]) AC_CONFIG_FILES([src/agent/Makefile:src/agent/Makefile.in]) diff --git a/lib/snmp/test/snmp_manager_config_SUITE.erl b/lib/snmp/test/snmp_manager_config_SUITE.erl index a6f1f1d5827d..03f680987cef 100644 --- a/lib/snmp/test/snmp_manager_config_SUITE.erl +++ b/lib/snmp/test/snmp_manager_config_SUITE.erl @@ -3081,7 +3081,7 @@ maybe_stop_crypto() -> case (catch crypto:version()) of {'EXIT', {undef, _}} -> %% This is the version of crypto before the NIFs... - crypto:stop(); + application:stop(crypto); _ -> %% There is nothing to stop in this version of crypto.. ok diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl index 6e354d551089..da589703213d 100644 --- a/lib/snmp/test/snmp_test_lib.erl +++ b/lib/snmp/test/snmp_test_lib.erl @@ -3175,7 +3175,7 @@ is_snmp_running() -> is_app_running(snmp). crypto_start() -> - try crypto:start() of + try application:start(crypto) of ok -> ok; {error, {already_started,crypto}} -> diff --git a/lib/ssh/examples/ssh_sample_cli.erl b/lib/ssh/examples/ssh_sample_cli.erl index f88aaf048a5f..5bfb8d4607bb 100644 --- a/lib/ssh/examples/ssh_sample_cli.erl +++ b/lib/ssh/examples/ssh_sample_cli.erl @@ -37,7 +37,7 @@ listen(Port) -> listen(Port, []). listen(Port, Options) -> - crypto:start(), + application:start(crypto), ssh:start(), ssh:daemon(any, Port, [{shell, fun(U, H) -> start_our_shell(U, H) end} | Options]). diff --git a/lib/ssh/internal_doc/ssh_notes.md b/lib/ssh/internal_doc/ssh_notes.md index 2d3b8c25ebd4..ef8705fa153d 100644 --- a/lib/ssh/internal_doc/ssh_notes.md +++ b/lib/ssh/internal_doc/ssh_notes.md @@ -1,34 +1,73 @@ -# SSH supervision tree (prototype) +# SSH supervision tree (server side update >= OTP-28) ```mermaid --- -title: SSH supervision tree (prototype) +title: SSH supervision tree --- flowchart RL - d_sup --> sup[["ssh_sup\n(ssh_app.erl)\n[o4o]"]] + d_sup --> sup[["ssh_sup
(ssh_app.erl)
[o4o]"]] c_sup --> sup subgraph client - connection_sup --> c_sup[["sshc_sup\n(ssh_app.erl)\n[o4o]\nauto_shutdown=never"]] + connection_sup --> c_sup[["sshc_sup
(ssh_app.erl)
[o4o]
auto_shutdown=never"]] subgraph connection_c - connection_handler["ssh_connection_handler\nSIGNIFICANT"] --> connection_sup[["ssh_connection_sup\n[o4a]\nauto_shutdown=any_significant"]] - channel_sup[["ssh_channel_sup\n[o4o]"]] --> connection_sup + connection_handler["ssh_connection_handler
SIGNIFICANT"] --> connection_sup[["ssh_connection_sup
[o4a]
auto_shutdown=any_significant"]] + channel_sup[["ssh_channel_sup
[o4o]"]] --> connection_sup sftp["ssh_sftp"] --> channel_sup - tcpip_forward_acceptor_sup[["ssh_tcpip_forward_acceptor_sup\n[o4o]"]] --> connection_sup + tcpip_forward_acceptor_sup[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> connection_sup + ssh_tcpip_forward_acceptor["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup + end + end + + subgraph server + lsocket_sup[["ssh_lsocket_sup
[simple_one_for_one]"]] --> d_sup + ssh_lsocket_provider --> lsocket_sup + system_sup_s --> d_sup[["sshd_sup
(ssh_app.erl)
[o4o]"]] + acceptor_sup --> system_sup_s[["ssh_system_sup
[o4o]
auto_shutdown=all_significant"]] + acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup
[o4o?]
SIGNIFICANT"]] + + connection_sup_s --> system_sup_s + + subgraph connection_s + connection_handler_s["ssh_connection_handler
SIGNIFICANT"] --> connection_sup_s[["ssh_connection_sup
[o4a]
auto_shutdown=any_significant
SIGNIFICANT"]] + channel_sup_s[["ssh_channel_sup
[o4o]"]] --> connection_sup_s + tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> connection_sup_s + ssh_tcpip_forward_acceptor_s["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup_s + sftd1["ssh_sftpd"] --> channel_sup_s + end + end +``` + +# SSH supervision tree (client side update since ssh-5.2.3, ssh-5.1.4.3, ssh-4.15.3.7) +```mermaid +--- +title: SSH supervision tree +--- +flowchart RL + d_sup --> sup[["ssh_sup
(ssh_app.erl)
[o4o]"]] + c_sup --> sup + + subgraph client + connection_sup --> c_sup[["sshc_sup
(ssh_app.erl)
[o4o]
auto_shutdown=never"]] + subgraph connection_c + connection_handler["ssh_connection_handler
SIGNIFICANT"] --> connection_sup[["ssh_connection_sup
[o4a]
auto_shutdown=any_significant"]] + channel_sup[["ssh_channel_sup
[o4o]"]] --> connection_sup + sftp["ssh_sftp"] --> channel_sup + tcpip_forward_acceptor_sup[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> connection_sup ssh_tcpip_forward_acceptor["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup end end subgraph server - system_sup_s --> d_sup[["sshd_sup\n(ssh_app.erl)\n[o4o]"]] - acceptor_sup --> system_sup_s[["ssh_system_sup\n[o4o]\nauto_shutdown=all_significant"]] - acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup\n[o4o]\nSIGNIFICANT"]] + system_sup_s --> d_sup[["sshd_sup
(ssh_app.erl)
[o4o]"]] + acceptor_sup --> system_sup_s[["ssh_system_sup
[o4o]
auto_shutdown=all_significant"]] + acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup
[o4o]
SIGNIFICANT"]] connection_sup_s --> system_sup_s subgraph connection_s - connection_handler_s["ssh_connection_handler\nSIGNIFICANT"] --> connection_sup_s[["ssh_connection_sup\n[o4a]\nauto_shutdown=any_significant\nSIGNIFICANT"]] - channel_sup_s[["ssh_channel_sup\n[o4o]"]] --> connection_sup_s - tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup\n[o4o]"]] --> connection_sup_s + connection_handler_s["ssh_connection_handler
SIGNIFICANT"] --> connection_sup_s[["ssh_connection_sup
[o4a]
auto_shutdown=any_significant
SIGNIFICANT"]] + channel_sup_s[["ssh_channel_sup
[o4o]"]] --> connection_sup_s + tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> connection_sup_s ssh_tcpip_forward_acceptor_s["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup_s sftd1["ssh_sftpd"] --> channel_sup_s end @@ -41,33 +80,32 @@ flowchart RL title: SSH supervision tree (OTP >= 24) --- flowchart RL - d_sup --> sup[["ssh_sup\n(ssh_app.erl)\n[o4o]"]] + d_sup --> sup[["ssh_sup
(ssh_app.erl)
[o4o]"]] c_sup --> sup subgraph client - system_sup --> c_sup[["sshc_sup\n(ssh_app.erl)\n[o4o]\nauto_shutdown=never"]] + system_sup --> c_sup[["sshc_sup
(ssh_app.erl)
[o4o]
auto_shutdown=never"]] subgraph connection_c - subsystem_sup --> system_sup[["ssh_system_sup\n[o4o]\nauto_shutdown=all_significant"]] - connection_handler["ssh_connection_handler\nSIGNIFICANT"] --> subsystem_sup[["ssh_subsystem_sup\n[o4a]\nauto_shutdown=any_significant\nSIGNIFICANT"]] - channel_sup[["ssh_channel_sup\n[o4o]"]] --> subsystem_sup + subsystem_sup --> system_sup[["ssh_system_sup
[o4o]
auto_shutdown=all_significant"]] + connection_handler["ssh_connection_handler
SIGNIFICANT"] --> subsystem_sup[["ssh_subsystem_sup
[o4a]
auto_shutdown=any_significant
SIGNIFICANT"]] + channel_sup[["ssh_channel_sup
[o4o]"]] --> subsystem_sup sftp["ssh_sftp"] --> channel_sup ssh_tcpip_forward_client --> channel_sup - tcpip_forward_acceptor_sup[["ssh_tcpip_forward_acceptor_sup\n[o4o]"]] --> subsystem_sup - ssh_tcpip_forward_acceptor["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup + tcpip_forward_acceptor_sup[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> subsystem_sup end end subgraph server - system_sup_s --> d_sup[["sshd_sup\n(ssh_app.erl)\n[o4o]"]] - acceptor_sup --> system_sup_s[["ssh_system_sup\n[o4o]\nauto_shutdown=all_significant"]] - acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup\n[o4o]\nSIGNIFICANT"]] - + system_sup_s --> d_sup[["sshd_sup
(ssh_app.erl)
[o4o]"]] + acceptor_sup --> system_sup_s[["ssh_system_sup
[o4o]
auto_shutdown=all_significant"]] + acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup
[o4o]
SIGNIFICANT"]] + acceptor_worker["acceptor
(parallel_login)"] o-. link .-o acceptor subsystem_sup_s --> system_sup_s subgraph connection_s - connection_handler_s["ssh_connection_handler\nSIGNIFICANT"] --> subsystem_sup_s[["ssh_subsystem_sup\n[o4a]\nauto_shutdown=any_significant\nSIGNIFICANT"]] - channel_sup_s[["ssh_channel_sup\n[o4o]"]] --> subsystem_sup_s - tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup\n[o4o]"]] --> subsystem_sup_s + connection_handler_s["ssh_connection_handler
SIGNIFICANT"] --> subsystem_sup_s[["ssh_subsystem_sup
[o4a]
auto_shutdown=any_significant
SIGNIFICANT"]] + channel_sup_s[["ssh_channel_sup
[o4o]"]] --> subsystem_sup_s + tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> subsystem_sup_s ssh_tcpip_forward_acceptor_s["ssh_tcpip_forward_acceptor"] --> tcpip_forward_acceptor_sup_s sftd1["ssh_sftpd"] --> channel_sup_s ssh_tcpip_forward_srv --> channel_sup_s @@ -83,24 +121,24 @@ flowchart RL title: SSH supervision tree (OTP-22) --- flowchart RL - d_sup --> sup[["ssh_sup\n(ssh_app.erl)\n[o4o]"]] + d_sup --> sup[["ssh_sup
(ssh_app.erl)
[o4o]"]] c_sup --> sup subgraph client - connection_handler["ssh_connection_handler\nSIGNIFICANT?"] --> c_sup + connection_handler["ssh_connection_handler
SIGNIFICANT?"] --> c_sup end subgraph server - system_sup_s --> d_sup[["sshd_sup\n(ssh_app.erl)\n[o4o]"]] - acceptor_sup --> system_sup_s[["ssh_system_sup\n[o4o]\nauto_shutdown=all_significant"]] - acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup\n[o4o]\nSIGNIFICANT"]] + system_sup_s --> d_sup[["sshd_sup
(ssh_app.erl)
[o4o]"]] + acceptor_sup --> system_sup_s[["ssh_system_sup
[o4o]
auto_shutdown=all_significant"]] + acceptor["ssh_acceptor"] --> acceptor_sup[["ssh_acceptor_sup
[o4o]
SIGNIFICANT"]] subsystem_sup_s --> system_sup_s subgraph connection_s - connection_handler_s["ssh_connection_handler\nSIGNIFICANT"] --> subsystem_sup_s[["ssh_subsystem_sup\n[o4a]\nauto_shutdown=any_significant\nSIGNIFICANT"]] - channel_sup_s[["ssh_channel_sup\n[o4o]"]] --> subsystem_sup_s - tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup\n[o4o]"]] --> subsystem_sup_s + connection_handler_s["ssh_connection_handler
SIGNIFICANT"] --> subsystem_sup_s[["ssh_subsystem_sup
[o4a]
auto_shutdown=any_significant
SIGNIFICANT"]] + channel_sup_s[["ssh_channel_sup
[o4o]"]] --> subsystem_sup_s + tcpip_forward_acceptor_sup_s[["ssh_tcpip_forward_acceptor_sup
[o4o]"]] --> subsystem_sup_s sftd1["ssh_sftpd"] --> channel_sup_s end end diff --git a/lib/ssh/src/Makefile b/lib/ssh/src/Makefile index a8a088eb7daf..f59c997a1684 100644 --- a/lib/ssh/src/Makefile +++ b/lib/ssh/src/Makefile @@ -73,6 +73,8 @@ MODULES= \ ssh_info \ ssh_io \ ssh_lib \ + ssh_lsocket \ + ssh_lsocket_sup \ ssh_message \ ssh_no_io \ ssh_options \ diff --git a/lib/ssh/src/ssh.app.src b/lib/ssh/src/ssh.app.src index 93f4c2b305bf..a59fd58ad956 100644 --- a/lib/ssh/src/ssh.app.src +++ b/lib/ssh/src/ssh.app.src @@ -25,6 +25,8 @@ ssh_daemon_channel, ssh_dbg, ssh_lib, + ssh_lsocket_sup, + ssh_lsocket, ssh_shell, ssh_io, ssh_info, @@ -60,7 +62,7 @@ {runtime_dependencies, [ "crypto-5.0", "erts-14.0", - "kernel-9.0", + "kernel-@OTP-19226@", "public_key-1.6.1", "stdlib-6.0","stdlib-5.0", "runtime_tools-1.15.1" diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl index 1914f11119f1..759fed0d3ef4 100644 --- a/lib/ssh/src/ssh.erl +++ b/lib/ssh/src/ssh.erl @@ -167,10 +167,11 @@ The directory could be changed with the option %%% Internal export --export([is_host/2]). +-export([is_host/2, update_lsocket/3]). -behaviour(ssh_dbg). --export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, ssh_dbg_format/2, ssh_dbg_format/3]). +-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, + ssh_dbg_format/2, ssh_dbg_format/3]). %%% "Deprecated" types export: -export_type([ssh_daemon_ref/0, ssh_connection_ref/0, ssh_channel_id/0]). @@ -550,13 +551,10 @@ daemon(Socket, UserOptions) -> {error,SockError} -> {error,SockError} end; - {error,OptionError} -> {error,OptionError} end. - - -doc """ daemon(HostAddress, Port, Options) @@ -587,74 +585,60 @@ The rules for handling the two address passing options are: is set to the value of the 'ip'-option """. -spec daemon(any | inet:ip_address(), inet:port_number(), daemon_options()) -> {ok,daemon_ref()} | {error,term()} - ;(socket, open_socket(), daemon_options()) -> {ok,daemon_ref()} | {error,term()} - . + ;(socket, open_socket(), daemon_options()) -> {ok,daemon_ref()} | {error,term()}. -daemon(Host0, Port0, UserOptions0) when 0 =< Port0, Port0 =< 65535, - Host0 == any ; Host0 == loopback ; is_tuple(Host0) -> - try - {Host1, UserOptions} = handle_daemon_args(Host0, UserOptions0), - #{} = Options0 = ssh_options:handle_options(server, UserOptions), - %% We need to open the listen socket here before start of the system supervisor. That - %% is because Port0 might be 0, or if an FD is provided in the Options0, in which case - %% the real listening port will be known only after the gen_tcp:listen call. - maybe_open_listen_socket(Host1, Port0, Options0) - of - {Host, Port, ListenSocket, Options1} -> - try - %% Now Host,Port is what to use for the supervisor to register its name, - %% and ListenSocket, if provided, is for listening on connections. But - %% it is still owned by self()... - - %% throws error:Error if no usable hostkey is found - ssh_connection_handler:available_hkey_algorithms(server, Options1), - ssh_system_sup:start_system(#address{address = Host, - port = Port, - profile = ?GET_OPT(profile,Options1)}, - Options1) - of - {ok,DaemonRef} when ListenSocket == undefined -> - {ok,DaemonRef}; - {ok,DaemonRef} -> - receive - {request_control, ListenSocket, ReqPid} -> - ok = controlling_process(ListenSocket, ReqPid, Options1), - ReqPid ! {its_yours,ListenSocket} - end, - {ok,DaemonRef}; - {error, {already_started, _}} -> - close_listen_socket(ListenSocket, Options1), - {error, eaddrinuse}; - {error, Error} -> - close_listen_socket(ListenSocket, Options1), - {error, Error} - catch - error:{shutdown,Err} -> - close_listen_socket(ListenSocket, Options1), - {error,Err}; - exit:{noproc, _} -> - close_listen_socket(ListenSocket, Options1), - {error, ssh_not_started}; - error:Error -> - close_listen_socket(ListenSocket, Options1), - error(Error); - exit:Exit -> - close_listen_socket(ListenSocket, Options1), - exit(Exit) - end - catch - throw:bad_fd -> - {error,bad_fd}; - throw:bad_socket -> - {error,bad_socket}; - error:{badmatch,{error,Error}} -> - {error,Error}; - error:Error -> - {error,Error}; - _C:_E -> - {error,{cannot_start_daemon,_C,_E}} - end; +daemon(Host0, Port0, UserOptions0) + when 0 =< Port0, Port0 =< 65535, Host0 == any ; + Host0 == loopback ; is_tuple(Host0) -> + {Host1, UserOptions} = handle_daemon_args(Host0, UserOptions0), + case ssh_options:handle_options(server, UserOptions) of + #{} = Options0 -> + case ssh_lsocket:get_lsocket(Host1, Port0, Options0) of + {ok, {LSocketProvider, LSocket}} -> + {Host, Port, Options1} = + update_lsocket(LSocket, LSocketProvider, Options0), + try + %% Host,Port is what to use for the system + %% supervisor to register its name (see + %% #address record); LSocket is owned by + %% LSocketProvider process. Ownership will be + %% transferred once ssh_acceptor_sup is + %% started. + %% throws error:Error if no usable hostkey is found + ssh_connection_handler:available_hkey_algorithms(server, Options1), + ssh_system_sup:start_system(#address{address = Host, + port = Port, + profile = ?GET_OPT(profile,Options1)}, + Options1) + of + {ok, DaemonRef} -> + {ok, DaemonRef}; + {error, {already_started, _}} -> % ssh_system_sup with #address already register + close_listen_socket(LSocket, Options1), + {error, eaddrinuse}; + {error, Error} -> + close_listen_socket(LSocket, Options1), + {error, Error} + catch + error:{shutdown, Err} -> % no suitable host key + close_listen_socket(LSocket, Options1), + {error, Err}; + exit:{noproc, _} -> % ssh application not started + close_listen_socket(LSocket, Options1), + {error, ssh_not_started}; + error:Error -> + close_listen_socket(LSocket, Options1), + {error, Error}; + _C:_E -> + {error,{cannot_start_daemon,_C,_E}} + end; + {error, {_, LSocketError}} -> + {error, LSocketError} + end; + OptionError = {error, _} -> + OptionError + end; daemon(_, _, _) -> {error, badarg}. @@ -680,9 +664,9 @@ chapters [Configuration in SSH](configurations.md) and NewUserOptions :: daemon_options(). daemon_replace_options(DaemonRef, NewUserOptions) -> - {ok,Os0} = ssh_system_sup:get_acceptor_options(DaemonRef), - Os1 = ssh_options:merge_options(server, NewUserOptions, Os0), - ssh_system_sup:replace_acceptor_options(DaemonRef, Os1). + {ok, Options0} = ssh_system_sup:get_acceptor_options(DaemonRef), + Options = ssh_options:merge_options(server, NewUserOptions, Options0), + ssh_system_sup:restart_acceptor(DaemonRef, Options). %%-------------------------------------------------------------------- -doc """ @@ -1235,13 +1219,11 @@ fp_fmt(b64, Bin) -> %%-------------------------------------------------------------------- %% The handle_daemon_args/2 function basically only sets the ip-option in Opts %% so that it is correctly set when opening the listening socket. - handle_daemon_args(any, Opts) -> case proplists:get_value(ip, Opts) of undefined -> {any, Opts}; IP -> {IP, Opts} end; - handle_daemon_args(IPaddr, Opts) when is_tuple(IPaddr) ; IPaddr == loopback -> case proplists:get_value(ip, Opts) of undefined -> {IPaddr, [{ip,IPaddr}|Opts]}; @@ -1249,7 +1231,6 @@ handle_daemon_args(IPaddr, Opts) when is_tuple(IPaddr) ; IPaddr == loopback -> IP -> {IPaddr, [{ip,IPaddr}|Opts--[{ip,IP}]]} %% Backward compatibility end. -%%%---------------------------------------------------------------- valid_socket_to_use(Socket, {tcp,_,_}) -> %% Is this tcp-socket a valid socket? try {is_tcp_socket(Socket), @@ -1273,29 +1254,6 @@ is_tcp_socket(Socket) -> _ -> false end. -%%%---------------------------------------------------------------- -maybe_open_listen_socket(Host, Port, Options) -> - Opened = - case ?GET_SOCKET_OPT(fd, Options) of - undefined when Port == 0 -> - ssh_acceptor:listen(0, Options); - Fd when is_integer(Fd) -> - %% Do gen_tcp:listen with the option {fd,Fd}: - ssh_acceptor:listen(0, Options); - undefined -> - open_later - end, - case Opened of - {ok,LSock} -> - {ok,{LHost,LPort}} = inet:sockname(LSock), - {LHost, LPort, LSock, ?PUT_INTERNAL_OPT({lsocket,{LSock,self()}}, Options)}; - open_later -> - {Host, Port, undefined, Options}; - Others -> - Others - end. - -%%%---------------------------------------------------------------- close_listen_socket(ListenSocket, Options) -> try {_, Callback, _} = ?GET_OPT(transport, Options), @@ -1304,22 +1262,16 @@ close_listen_socket(ListenSocket, Options) -> _C:_E -> ok end. -controlling_process(ListenSocket, ReqPid, Options) -> - {_, Callback, _} = ?GET_OPT(transport, Options), - Callback:controlling_process(ListenSocket, ReqPid). - transport_connect(Host, Port, SocketOpts, Options) -> {_, Callback, _} = ?GET_OPT(transport, Options), Callback:connect(Host, Port, SocketOpts, ?GET_OPT(connect_timeout,Options)). - -%%%---------------------------------------------------------------- + -doc false. is_host(X, Opts) -> try is_host1(mangle_connect_address(X, Opts)) catch _:_ -> false end. - is_host1(L) when is_list(L) -> true; %% "string()" is_host1(T) when tuple_size(T)==4 -> lists:all(fun(I) -> 0= lists:all(fun(I) -> 0= true. -%%%---------------------------------------------------------------- mangle_connect_address(A, #{socket_options := SockOpts}) -> mangle_connect_address(A, SockOpts); mangle_connect_address(A, SockOpts) -> @@ -1349,7 +1300,6 @@ mangle_connect_address1(A, _) -> _ -> A end. -%%%---------------------------------------------------------------- mangle_tunnel_address(any) -> <<"">>; mangle_tunnel_address(loopback) -> <<"localhost">>; mangle_tunnel_address({0,0,0,0}) -> <<"">>; @@ -1361,7 +1311,12 @@ mangle_tunnel_address(X) when is_list(X) -> case catch inet:parse_address(X) of {ok, {0,0,0,0,0,0,0,0}} -> <<"">>; _ -> list_to_binary(X) end. - +-doc false. +update_lsocket(LSocket, LSocketProvider, Options0) -> + {ok, {LHost, LPort}} = inet:sockname(LSocket), + Options = ?PUT_INTERNAL_OPT({lsocket, + {LSocket, LHost, LPort, LSocketProvider}}, Options0), + {LHost, LPort, Options}. %%%################################################################ %%%# @@ -1369,37 +1324,46 @@ mangle_tunnel_address(X) when is_list(X) -> case catch inet:parse_address(X) of %%%# -doc false. -ssh_dbg_trace_points() -> [tcp]. +ssh_dbg_trace_points() -> [tcp, connections]. -doc false. -ssh_dbg_flags(tcp) -> [c]. +ssh_dbg_flags(tcp) -> [c]; +ssh_dbg_flags(connections) -> [c]. -doc false. -ssh_dbg_on(tcp) -> dbg:tpl(?MODULE, controlling_process, 3, x), - dbg:tpl(?MODULE, transport_connect, 4, x), - dbg:tpl(?MODULE, close_listen_socket, 2, x). - --doc false. -ssh_dbg_off(tcp) ->dbg:ctpl(?MODULE, controlling_process, 3), - dbg:ctpl(?MODULE, transport_connect, 4), - dbg:ctpl(?MODULE, close_listen_socket, 2). +ssh_dbg_on(tcp) -> + dbg:tpl(?MODULE, transport_connect, 4, x), + dbg:tpl(?MODULE, close_listen_socket, 2, x); +ssh_dbg_on(connections) -> + dbg:tpl(?MODULE, update_lsocket, 3, x). -doc false. -ssh_dbg_format(tcp, {call, {?MODULE,controlling_process, [ListenSocket, ReqPid, _Opts]}}) -> - ["TCP socket transferred to\n", - io_lib:format("Sock: ~p~n" - "ToPid: ~p~n", [ListenSocket, ReqPid]) - ]; -ssh_dbg_format(tcp, {return_from, {?MODULE,controlling_process,3}, _Result}) -> - skip; +ssh_dbg_off(tcp) -> + dbg:ctpl(?MODULE, transport_connect, 4), + dbg:ctpl(?MODULE, close_listen_socket, 2); +ssh_dbg_off(connections) -> + dbg:ctpl(?MODULE, update_lsocket, 3). +-doc false. ssh_dbg_format(tcp, {call, {?MODULE,close_listen_socket, [ListenSocket, _Opts]}}) -> ["TCP socket listening closed\n", io_lib:format("Sock: ~p~n", [ListenSocket]) ]; ssh_dbg_format(tcp, {return_from, {?MODULE,close_listen_socket,2}, _Result}) -> - skip. - + skip; +ssh_dbg_format(Tracepoint , Event = {call, {?MODULE, Function, Args}}) -> + [io_lib:format("~w:~w/~w> ~s", [?MODULE, Function, length(Args)] ++ + ssh_dbg_comment(Tracepoint, Event))]; +ssh_dbg_format(Tracepoint, Event = {return_from, {?MODULE,Function,Arity}, Ret}) -> + [io_lib:format("~w:~w/~w returned ~W> ~s", [?MODULE, Function, Arity, Ret, 3] ++ + ssh_dbg_comment(Tracepoint, Event))]. + +ssh_dbg_comment(connections, {call, {?MODULE, update_lsocket, [LSocket, LSocketProvider, _]}}) -> + [io_lib:format("LSocket = ~p, LSocketProvider = ~p", [LSocket, LSocketProvider])]; +ssh_dbg_comment(connections, {return_from, {?MODULE, update_lsocket,3}, {LHost, LPort, _}}) -> + [io_lib:format("LHost = ~p, LPort = ~p", [LHost, LPort])]; +ssh_dbg_comment(_, _) -> + [""]. -doc false. ssh_dbg_format(tcp, {call, {?MODULE,transport_connect, [Host,Port,SockOpts,_Opts]}}, Stack) -> diff --git a/lib/ssh/src/ssh_acceptor.erl b/lib/ssh/src/ssh_acceptor.erl index a558a888d2c2..62528d2e710a 100644 --- a/lib/ssh/src/ssh_acceptor.erl +++ b/lib/ssh/src/ssh_acceptor.erl @@ -27,14 +27,14 @@ %% Internal application API -export([start_link/3, - number_of_connections/1, - listen/2]). + number_of_connections/1]). -%% spawn export +%% spawn export -export([acceptor_init/4, acceptor_loop/6]). -behaviour(ssh_dbg). --export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, ssh_dbg_format/2, ssh_dbg_format/3]). +-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, + ssh_dbg_format/2, ssh_dbg_format/3]). -define(SLEEP_TIME, 200). @@ -45,20 +45,6 @@ start_link(SystemSup, Address, Options) -> proc_lib:start_link(?MODULE, acceptor_init, [self(),SystemSup,Address,Options]). -%%%---------------------------------------------------------------- -listen(Port, Options) -> - {_, Callback, _} = ?GET_OPT(transport, Options), - SockOpts = ?GET_OPT(socket_options, Options) ++ [{active, false}, {reuseaddr,true}], - case Callback:listen(Port, SockOpts) of - {error, nxdomain} -> - Callback:listen(Port, lists:delete(inet6, SockOpts)); - {error, enetunreach} -> - Callback:listen(Port, lists:delete(inet6, SockOpts)); - {error, eafnosupport} -> - Callback:listen(Port, lists:delete(inet6, SockOpts)); - Other -> - Other - end. accept(ListenSocket, AcceptTimeout, Options) -> {_, Callback, _} = ?GET_OPT(transport, Options), @@ -67,7 +53,7 @@ accept(ListenSocket, AcceptTimeout, Options) -> close(Socket, Options) -> {_, Callback, _} = ?GET_OPT(transport, Options), Callback:close(Socket). - + %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- @@ -78,57 +64,12 @@ acceptor_init(Parent, SystemSup, {acceptor, list_to_binary(ssh_lib:format_address_port(Address, Port))}), AcceptTimeout = ?GET_INTERNAL_OPT(timeout, Opts, ?DEFAULT_TIMEOUT), - case ?GET_INTERNAL_OPT(lsocket, Opts, undefined) of - {LSock, SockOwner} -> - %% A listening socket (or fd option) was provided in the ssh:daemon call - case inet:sockname(LSock) of - {ok,{_,Port}} -> - %% A usable, open LSock - proc_lib:init_ack(Parent, {ok, self()}), - request_ownership(LSock, SockOwner), - acceptor_loop(Port, Address, Opts, LSock, AcceptTimeout, SystemSup); - {error,_Error} -> - %% Not open, a restart - %% Allow gen_tcp:listen to fail 4 times if eaddrinuse (It is a bug fix): - case try_listen(Port, Opts, 4) of - {ok,NewLSock} -> - proc_lib:init_ack(Parent, {ok, self()}), - Opts1 = ?DELETE_INTERNAL_OPT(lsocket, Opts), - acceptor_loop(Port, Address, Opts1, NewLSock, AcceptTimeout, SystemSup); - {error,Error} -> - proc_lib:init_fail(Parent, {error,Error}, {exit, normal}) - end - end; - undefined -> - %% No listening socket (nor fd option) was provided; open a listening socket: - case try_listen(Port, Opts, 4) of - {ok,LSock} -> - proc_lib:init_ack(Parent, {ok, self()}), - acceptor_loop(Port, Address, Opts, LSock, AcceptTimeout, SystemSup); - {error,Error} -> - proc_lib:init_fail(Parent, {error,Error}, {exit, normal}) - end - end. + {LSock, _LHost, _LPort, _SockOwner} = + ?GET_INTERNAL_OPT(lsocket, Opts, undefined), + proc_lib:init_ack(Parent, {ok, self()}), + acceptor_loop(Port, Address, Opts, LSock, AcceptTimeout, SystemSup). -try_listen(Port, Opts, NtriesLeft) -> - try_listen(Port, Opts, 1, NtriesLeft). - -try_listen(Port, Opts, N, Nmax) -> - case listen(Port, Opts) of - {error,eaddrinuse} when N - timer:sleep(10*N), % Sleep 10, 20, 30,... ms - try_listen(Port, Opts, N+1, Nmax); - Other -> - Other - end. - -request_ownership(LSock, SockOwner) -> - SockOwner ! {request_control,LSock,self()}, - receive - {its_yours,LSock} -> ok - end. - -%%%---------------------------------------------------------------- +%%%---------------------------------------------------------------- acceptor_loop(Port, Address, Opts, ListenSocket, AcceptTimeout, SystemSup) -> try case accept(ListenSocket, AcceptTimeout, Opts) of @@ -257,35 +198,18 @@ ssh_dbg_trace_points() -> [connections, tcp]. ssh_dbg_flags(tcp) -> [c]; ssh_dbg_flags(connections) -> [c]. -ssh_dbg_on(tcp) -> dbg:tp(?MODULE, listen, 2, x), - dbg:tpl(?MODULE, accept, 3, x), +ssh_dbg_on(tcp) -> dbg:tpl(?MODULE, accept, 3, x), dbg:tpl(?MODULE, close, 2, x); - + ssh_dbg_on(connections) -> dbg:tp(?MODULE, acceptor_init, 4, x), dbg:tpl(?MODULE, handle_connection, 4, x). -ssh_dbg_off(tcp) -> dbg:ctpg(?MODULE, listen, 2), - dbg:ctpl(?MODULE, accept, 3), +ssh_dbg_off(tcp) -> dbg:ctpl(?MODULE, accept, 3), dbg:ctpl(?MODULE, close, 2); ssh_dbg_off(connections) -> dbg:ctp(?MODULE, acceptor_init, 4), dbg:ctp(?MODULE, handle_connection, 4). -ssh_dbg_format(tcp, {call, {?MODULE,listen, [Port,_Opts]}}, Stack) -> - {skip, [{port,Port}|Stack]}; -ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, {ok,Sock}}, [{port,Port}|Stack]) -> - {["TCP listener started\n", - io_lib:format("Port: ~p~n" - "ListeningSocket: ~p~n", [Port,Sock]) - ], - Stack}; -ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, Result}, [{port,Port}|Stack]) -> - {["TCP listener start ERROR\n", - io_lib:format("Port: ~p~n" - "Return: ~p~n", [Port,Result]) - ], - Stack}; - ssh_dbg_format(tcp, {call, {?MODULE,accept, [ListenSocket, _AcceptTimeout, _Options]}}, Stack) -> {skip, [{lsock,ListenSocket}|Stack]}; ssh_dbg_format(tcp, {return_from, {?MODULE,accept,3}, {ok,Sock}}, [{lsock,ListenSocket}|Stack]) -> @@ -301,21 +225,22 @@ ssh_dbg_format(tcp, {return_from, {?MODULE,accept,3}, Return}, [{lsock,ListenSoc "Return: ~p~n", [ListenSocket,Return]) ], Stack}. -ssh_dbg_format(tcp, {call, {?MODULE,close, [Socket, _Options]}}) -> - ["TCP close listen socket\n", - io_lib:format("Socket: ~p~n", [Socket])]; ssh_dbg_format(tcp, {return_from, {?MODULE,close,2}, _Return}) -> skip; - -ssh_dbg_format(connections, {call, {?MODULE,acceptor_init, [_Parent, _SysSup, Address, _Opts]}}) -> - [io_lib:format("Starting LISTENER on ~s\n", [ssh_lib:format_address(Address)]) - ]; ssh_dbg_format(connections, {return_from, {?MODULE,acceptor_init,4}, _Ret}) -> skip; - ssh_dbg_format(connections, {call, {?MODULE,handle_connection,[_Address,_Port,_Options,_Sock]}}) -> skip; -ssh_dbg_format(connections, {return_from, {?MODULE,handle_connection,4}, {error,Error}}) -> - ["Starting connection to server failed:\n", - io_lib:format("Error = ~p", [Error]) - ]. +ssh_dbg_format(Tracepoint, Event = {call, {?MODULE, Function, Args}}) -> + [io_lib:format("~w:~w/~w> ~s", [?MODULE, Function, length(Args)] ++ + ssh_dbg_comment(Tracepoint, Event))]; +ssh_dbg_format(Tracepoint, Event = {return_from, {?MODULE,Function,Arity}, Ret}) -> + [io_lib:format("~w:~w/~w returned ~W> ~s", [?MODULE, Function, Arity, Ret, 2] ++ + ssh_dbg_comment(Tracepoint, Event))]. + +ssh_dbg_comment(tcp, {call, {?MODULE,close, [Socket, _Options]}}) -> + [io_lib:format("TCP close listen socket Socket: ~p~n", [Socket])]; +ssh_dbg_comment(connections, {call, {?MODULE,acceptor_init, [_Parent, _SysSup, Address, _Opts]}}) -> + [io_lib:format("Starting LISTENER on ~s", [ssh_lib:format_address(Address)])]; +ssh_dbg_comment(connections, {return_from, {?MODULE,handle_connection,4}, {error,Error}}) -> + [io_lib:format("Starting connection to server failed: Error = ~p", [Error])]. diff --git a/lib/ssh/src/ssh_acceptor_sup.erl b/lib/ssh/src/ssh_acceptor_sup.erl index 1661134285ec..9b710dc44c13 100644 --- a/lib/ssh/src/ssh_acceptor_sup.erl +++ b/lib/ssh/src/ssh_acceptor_sup.erl @@ -20,7 +20,7 @@ %% %%---------------------------------------------------------------------- -%% Purpose: The acceptor supervisor for ssh servers hangs under +%% Purpose: The acceptor supervisor for ssh servers hangs under %% ssh_system_sup. %%---------------------------------------------------------------------- @@ -37,6 +37,10 @@ %% Supervisor callback -export([init/1]). +-behaviour(ssh_dbg). +-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, + ssh_dbg_format/2]). + %%%========================================================================= %%% API %%%========================================================================= @@ -57,7 +61,10 @@ restart_child(AccSup, Address) -> init([SystemSup, Address, Options]) -> ssh_lib:set_label(server, acceptor_sup), %% Initial start of ssh_acceptor_sup for this port - SupFlags = #{strategy => one_for_one, + {LSocket, _LHost, _LPort, ProviderPid} = + ?GET_INTERNAL_OPT(lsocket, Options, undefined), + request_ownership(LSocket, ProviderPid), + SupFlags = #{strategy => one_for_one, intensity => 10, period => 3600 }, @@ -71,3 +78,47 @@ init([SystemSup, Address, Options]) -> %%%========================================================================= %%% Internal functions %%%========================================================================= +request_ownership(LSocket, SockProvider) -> + SockProvider ! {request_control,LSocket,self()}, + receive + {its_yours,LSocket} -> + ok + after ?DEFAULT_TIMEOUT -> + no_response_from_socket_provider + end. + +%%%################################################################ +%%%# +%%%# Tracing +%%%# + +ssh_dbg_trace_points() -> [connections]. + +ssh_dbg_flags(connections) -> [c]. + +ssh_dbg_on(connections) -> + dbg:tpl(?MODULE, start_link, 3, x), + dbg:tpl(?MODULE, restart_child, 2, x), + dbg:tpl(?MODULE, request_ownership, 2, x), + dbg:tpl(?MODULE, init, 1, x). + +ssh_dbg_off(connections) -> + dbg:ctpl(?MODULE, start_link, 3), + dbg:ctpl(?MODULE, restart_child, 2), + dbg:ctpl(?MODULE, request_ownership, 2), + dbg:ctpl(?MODULE, init, 1). + +ssh_dbg_format(Tracepoint, Event = {call, {?MODULE, Function, Args}}) -> + [io_lib:format("~w:~w/~w> ~s", [?MODULE, Function, length(Args)] ++ + ssh_dbg_comment(Tracepoint, Event))]; +ssh_dbg_format(Tracepoint, Event = {return_from, {?MODULE,Function,Arity}, Ret}) -> + [io_lib:format("~w:~w/~w returned ~W> ~s", [?MODULE, Function, Arity, Ret, 2] ++ + ssh_dbg_comment(Tracepoint, Event))]. + +ssh_dbg_comment(connections, {call, {?MODULE, init, [[LSocket | _]]}}) -> + [io_lib:format("LSocket ~p", [LSocket])]; +ssh_dbg_comment(connections, {call, {?MODULE, request_ownership, [LSocket, SockProvider]}}) -> + [io_lib:format("LSocket ~p SockProvider ~p", [LSocket, SockProvider])]; +ssh_dbg_comment(_, _) -> + [""]. + diff --git a/lib/ssh/src/ssh_app.erl b/lib/ssh/src/ssh_app.erl index 5f0c01e7b815..91c688f64d7c 100644 --- a/lib/ssh/src/ssh_app.erl +++ b/lib/ssh/src/ssh_app.erl @@ -29,7 +29,7 @@ %%% | : %%% | +--> "connection sup" (etc) %%% | -%%% +-----> sshc_sup --+--> "system sup" (etc) +%%% +-----> sshd_sup --+--> "lsocket sup" (etc) %%% | %%% +--> "system sup" (etc) %%% : @@ -64,21 +64,26 @@ init([ssh_sup]) -> add_logger_filter(), SupFlags = #{strategy => one_for_one, intensity => 10, - period => 3600 - }, + period => 3600}, ChildSpecs = [#{id => SupName, start => {supervisor, start_link, - [{local,SupName}, ?MODULE, [sshX_sup]]}, + [{local,SupName}, ?MODULE, [SupName]]}, type => supervisor} - || SupName <- [sshd_sup, sshc_sup] - ], + || SupName <- [sshd_sup, sshc_sup]], {ok, {SupFlags,ChildSpecs}}; -init([sshX_sup]) -> +init([sshd_sup]) -> SupFlags = #{strategy => one_for_one, intensity => 10, - period => 3600 - }, + period => 3600}, + ChildSpecs = [#{id => ssh_lsocket_sup, + start => {ssh_lsocket_sup, start_link, []}, + type => supervisor}], + {ok, {SupFlags,ChildSpecs}}; +init([sshc_sup]) -> + SupFlags = #{strategy => one_for_one, + intensity => 10, + period => 3600}, ChildSpecs = [], {ok, {SupFlags,ChildSpecs}}. diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl index 5eb3e4198064..3af18e287973 100644 --- a/lib/ssh/src/ssh_cli.erl +++ b/lib/ssh/src/ssh_cli.erl @@ -49,9 +49,10 @@ % It there arrives characters encoded in latin1 it is so. Otherwise % assume utf8 until otherwise is proved. group, - buf, shell, - exec + exec, + tty + }). -define(EXEC_ERROR_STATUS, 255). @@ -66,9 +67,11 @@ %% Description: Initiates the CLI %%-------------------------------------------------------------------- init([Shell, Exec]) -> - {ok, #state{shell = Shell, exec = Exec}}; + TTY = prim_tty:init_ssh(#{input => false}, {80, 24}, utf8), + {ok, #state{shell = Shell, exec = Exec, tty = TTY}}; init([Shell]) -> - {ok, #state{shell = Shell}}. + TTY = prim_tty:init_ssh(#{input => false}, {80, 24}, utf8), + {ok, #state{shell = Shell, tty = TTY}}. %%-------------------------------------------------------------------- %% Function: handle_ssh_msg(Args) -> {ok, State} | {stop, ChannelId, State} @@ -93,12 +96,12 @@ handle_ssh_msg({ssh_cm, ConnectionHandler, height = not_zero(Height, 24), pixel_width = PixWidth, pixel_height = PixHeight, - modes = Modes}, - buf = empty_buf()}, + modes = Modes}}, + TTY = prim_tty:init_ssh(#{input => false}, {not_zero(Width, 80), not_zero(Height, 24)}, utf8), set_echo(State), ssh_connection:reply_request(ConnectionHandler, WantReply, success, ChannelId), - {ok, State}; + {ok, State#state{tty = TTY}}; handle_ssh_msg({ssh_cm, ConnectionHandler, {env, ChannelId, WantReply, Var, Value}}, State = #state{encoding=Enc0}) -> @@ -163,17 +166,19 @@ handle_ssh_msg({ssh_cm, ConnectionHandler, _ -> Enc0 end, - {ok, State#state{encoding=Enc}}; + NewTTY = prim_tty:unicode(State#state.tty, Enc =:= utf8), + {ok, State#state{encoding=Enc, tty = NewTTY}}; handle_ssh_msg({ssh_cm, ConnectionHandler, {window_change, ChannelId, Width, Height, PixWidth, PixHeight}}, - #state{buf = Buf, pty = Pty0} = State) -> + #state{pty = Pty0, tty = TTY} = State) -> Pty = Pty0#ssh_pty{width = Width, height = Height, pixel_width = PixWidth, pixel_height = PixHeight}, - {Chars, NewBuf} = io_request({window_change, Pty0}, Buf, Pty, undefined), + NewTTY = prim_tty:update_geometry(TTY, Width, Height), + {Chars, NewTTY1} = io_request(redraw_prompt, NewTTY, State), write_chars(ConnectionHandler, ChannelId, Chars), - {ok, State#state{pty = Pty, buf = NewBuf}}; + {ok, State#state{pty = Pty, tty = NewTTY1}}; handle_ssh_msg({ssh_cm, ConnectionHandler, {shell, ChannelId, WantReply}}, #state{shell=disabled} = State) -> write_chars(ConnectionHandler, ChannelId, 1, "Prohibited."), @@ -279,7 +284,7 @@ handle_msg({Group, set_unicode_state, _Arg}, State) -> {ok, State}; handle_msg({Group, get_unicode_state}, State) -> - Group ! {self(), get_unicode_state, false}, + Group ! {self(), get_unicode_state, State#state.encoding =:= utf8}, {ok, State}; handle_msg({Group, get_terminal_state}, State) -> @@ -301,14 +306,16 @@ handle_msg({Group, tty_geometry}, #state{group = Group, Group ! {self(),tty_geometry,{0,0}} end, {ok,State}; - -handle_msg({Group, Req}, #state{group = Group, buf = Buf, pty = Pty, - cm = ConnectionHandler, - channel = ChannelId} = State) -> - {Chars0, NewBuf} = io_request(Req, Buf, Pty, Group), +handle_msg({Group, {open_editor, _}}, State) -> + %% Opening an external editor in ssh is not supported. + Group ! {self(), not_supported}, + {ok,State}; +handle_msg({Group, Req}, #state{group = Group,cm = ConnectionHandler, + channel = ChannelId, tty = TTY} = State) -> + {Chars0, NewTTY} = io_request(Req, TTY, State), Chars = unicode:characters_to_binary(Chars0, utf8, out_enc(State)), write_chars(ConnectionHandler, ChannelId, Chars), - {ok, State#state{buf = NewBuf}}; + {ok, State#state{tty = NewTTY}}; handle_msg({'EXIT', Group, Reason}, #state{group = Group, cm = ConnectionHandler, @@ -426,254 +433,63 @@ replace_escapes(Data) -> %%% displaying device... %%% We are *not* really unicode aware yet, we just filter away characters %%% beyond the latin1 range. We however handle the unicode binaries... -io_request({window_change, OldTty}, Buf, Tty, _Group) -> - window_change(Tty, OldTty, Buf); -io_request({put_chars, Cs}, Buf, Tty, _Group) -> - put_chars(bin_to_list(Cs), Buf, Tty); -io_request({put_chars, unicode, Cs}, Buf, Tty, _Group) -> - put_chars(unicode:characters_to_list(Cs,unicode), Buf, Tty); -io_request({put_expand, unicode, Expand, _N}, Buf, Tty, _Group) -> - insert_chars(unicode:characters_to_list("\n"++Expand, unicode), Buf, Tty); -io_request({insert_chars, Cs}, Buf, Tty, _Group) -> - insert_chars(bin_to_list(Cs), Buf, Tty); -io_request({insert_chars, unicode, Cs}, Buf, Tty, _Group) -> - insert_chars(unicode:characters_to_list(Cs,unicode), Buf, Tty); -io_request({move_rel, N}, Buf, Tty, _Group) -> - move_rel(N, Buf, Tty); -io_request({move_line, N}, Buf, Tty, _Group) -> - move_line(N, Buf, Tty); -io_request({move_combo, L, V, R}, Buf, Tty, _Group) -> - {ML, Buf1} = move_rel(L, Buf, Tty), - {MV, Buf2} = move_line(V, Buf1, Tty), - {MR, Buf3} = move_rel(R, Buf2, Tty), - {[ML,MV,MR], Buf3}; -io_request(new_prompt, _Buf, _Tty, _Group) -> - {[], {[], {[],[]}, [], 0 }}; -io_request(delete_line, {_, {_, _}, _, Col}, Tty, _Group) -> - MoveToBeg = move_cursor(Col, 0, Tty), - {[MoveToBeg, "\e[J"], - {[],{[],[]},[],0}}; -io_request({redraw_prompt, Pbs, Pbs2, {LB, {Bef, Aft}, LA}}, Buf, Tty, _Group) -> - {ClearLine, Cleared} = io_request(delete_line, Buf, Tty, _Group), - CL = lists:reverse(Bef,Aft), - Text = Pbs ++ lists:flatten(lists:join("\n"++Pbs2, lists:reverse(LB)++[CL|LA])), - Moves = if LA /= [] -> - [Last|_] = lists:reverse(LA), - {move_combo, -length(Last), -length(LA), length(Bef)}; - true -> - {move_rel, -length(Aft)} - end, - {T, InsertedText} = io_request({insert_chars, unicode:characters_to_binary(Text)}, Cleared, Tty, _Group), - {M, Moved} = io_request(Moves, InsertedText, Tty, _Group), - {[ClearLine, T, M], Moved}; -io_request({delete_chars,N}, Buf, Tty, _Group) -> - delete_chars(N, Buf, Tty); -io_request(clear, Buf, _Tty, _Group) -> - {"\e[H\e[2J", Buf}; -io_request(beep, Buf, _Tty, _Group) -> - {[7], Buf}; - -%% New in R12 -io_request({get_geometry,columns},Buf,Tty, _Group) -> - {ok, Tty#ssh_pty.width, Buf}; -io_request({get_geometry,rows},Buf,Tty, _Group) -> - {ok, Tty#ssh_pty.height, Buf}; -io_request({requests,Rs}, Buf, Tty, Group) -> - io_requests(Rs, Buf, Tty, [], Group); -io_request(tty_geometry, Buf, Tty, Group) -> - io_requests([{move_rel, 0}, {put_chars, unicode, [10]}], - Buf, Tty, [], Group); - -%% New in 18 -io_request({put_chars_sync, Class, Cs, Reply}, Buf, Tty, Group) -> - %% We handle these asynchronous for now, if we need output guarantees - %% we have to handle these synchronously - Group ! {reply, Reply, ok}, - io_request({put_chars, Class, Cs}, Buf, Tty, Group); - -io_request(_R, Buf, _Tty, _Group) -> - {[], Buf}. - -io_requests([R|Rs], Buf, Tty, Acc, Group) -> - {Chars, NewBuf} = io_request(R, Buf, Tty, Group), - io_requests(Rs, NewBuf, Tty, [Acc|Chars], Group); -io_requests([], Buf, _Tty, Acc, _Group) -> - {Acc, Buf}. - -%%% return commands for cursor navigation, assume everything is ansi -%%% (vt100), add clauses for other terminal types if needed -ansi_tty(N, L) -> - ["\e[", integer_to_list(N), L]. - -get_tty_command(up, N, _TerminalType) -> - ansi_tty(N, $A); -get_tty_command(down, N, _TerminalType) -> - ansi_tty(N, $B); -get_tty_command(right, N, _TerminalType) -> - ansi_tty(N, $C); -get_tty_command(left, N, _TerminalType) -> - ansi_tty(N, $D). - - --define(PAD, 10). --define(TABWIDTH, 8). - -%% convert input characters to buffer and to writeout -%% Note that Bef is reversed but Aft is not -%% (this is handy; the head is always next to the cursor) -conv_buf([], {LB, {Bef, Aft}, LA, Col}, AccWrite, _Tty) -> - {{LB, {Bef, Aft}, LA, Col}, lists:reverse(AccWrite)}; -conv_buf([13, 10 | Rest], {LB, {Bef, Aft}, LA, Col}, AccWrite, Tty = #ssh_pty{width = W}) -> - conv_buf(Rest, {[lists:reverse(Bef)|LB], {[], tl2(Aft)}, LA, Col+(W-(Col rem W))}, [10, 13 | AccWrite], Tty); -conv_buf([13 | Rest], {LB, {Bef, Aft}, LA, Col}, AccWrite, Tty = #ssh_pty{width = W}) -> - conv_buf(Rest, {[lists:reverse(Bef)|LB], {[], tl1(Aft)}, LA, Col+(W-(Col rem W))}, [13 | AccWrite], Tty); -conv_buf([10 | Rest],{LB, {Bef, Aft}, LA, Col}, AccWrite0, Tty = #ssh_pty{width = W}) -> - AccWrite = - case pty_opt(onlcr,Tty) of - 0 -> [10 | AccWrite0]; - 1 -> [10,13 | AccWrite0]; - undefined -> [10 | AccWrite0] - end, - conv_buf(Rest, {[lists:reverse(Bef)|LB], {[], tl1(Aft)}, LA, Col+(W - (Col rem W))}, AccWrite, Tty); -conv_buf([C | Rest], {LB, {Bef, Aft}, LA, Col}, AccWrite, Tty) -> - conv_buf(Rest, {LB, {[C|Bef], tl1(Aft)}, LA, Col+1}, [C | AccWrite], Tty). - -%%% put characters before the prompt -put_chars(Chars, Buf, Tty) -> - Dumb = get_dumb(Tty), - case Buf of - {[],{[],[]},[],_} -> {_, WriteBuf} = conv_buf(Chars, Buf, [], Tty), - {WriteBuf, Buf}; - _ when Dumb =:= false -> - {Delete, DeletedState} = io_request(delete_line, Buf, Tty, []), - {_, PutBuffer} = conv_buf(Chars, DeletedState, [], Tty), - {Redraw, _} = io_request(redraw_prompt_pre_deleted, Buf, Tty, []), - {[Delete, PutBuffer, Redraw], Buf}; - _ -> - %% When we have a dumb terminal, we get messages via put_chars requests - %% so state should be empty {[],{[],[]},[],_}, - %% but if we end up here its not, so keep the state - {_, WriteBuf} = conv_buf(Chars, Buf, [], Tty), - {WriteBuf, Buf} - end. - -%%% insert character at current position -insert_chars([], Buf, _Tty) -> - {[], Buf}; -insert_chars(Chars, {_LB,{_Bef, Aft},LA, _Col}=Buf, Tty) -> - {{NewLB, {NewBef, _NewAft}, _NewLA, NewCol}, WriteBuf} = conv_buf(Chars, Buf, [], Tty), - M = move_cursor(special_at_width(NewCol+length(Aft), Tty), NewCol, Tty), - {[WriteBuf, Aft | M], {NewLB,{NewBef, Aft},LA, NewCol}}. - -%%% delete characters at current position, (backwards if negative argument) -delete_chars(0, {LB,{Bef, Aft},LA, Col}, _Tty) -> - {[], {LB,{Bef, Aft},LA, Col}}; -delete_chars(N, {LB,{Bef, Aft},LA, Col}, Tty) when N > 0 -> - NewAft = nthtail(N, Aft), - M = move_cursor(Col + length(NewAft) + N, Col, Tty), - {[NewAft, lists:duplicate(N, $ ) | M], - {LB,{Bef, NewAft},LA, Col}}; -delete_chars(N, {LB,{Bef, Aft},LA, Col}, Tty) -> % N < 0 - NewBef = nthtail(-N, Bef), - NewCol = case Col + N of V when V >= 0 -> V; _ -> 0 end, - M1 = move_cursor(Col, NewCol, Tty), - M2 = move_cursor(special_at_width(NewCol+length(Aft)-N, Tty), NewCol, Tty), - {[M1, Aft, lists:duplicate(-N, $ ) | M2], - {LB,{NewBef, Aft},LA, NewCol}}. - -%%% Window change, redraw the current line (and clear out after it -%%% if current window is wider than previous) -window_change(Tty, OldTty, Buf) - when OldTty#ssh_pty.width == Tty#ssh_pty.width -> - %% No line width change - {[], Buf}; -window_change(Tty, OldTty, {LB, {Bef, Aft}, LA, Col}) -> - case OldTty#ssh_pty.width - Tty#ssh_pty.width of - 0 -> - %% No line width change - {[], {LB, {Bef, Aft}, LA, Col}}; - - DeltaW0 when DeltaW0 < 0, - Aft == [] -> - % Line width is decreased, cursor is at end of input - {[], {LB, {Bef, Aft}, LA, Col}}; - - DeltaW0 when DeltaW0 < 0, - Aft =/= [] -> - % Line width is decreased, cursor is not at end of input - {[], {LB, {Bef, Aft}, LA, Col}}; - - DeltaW0 when DeltaW0 > 0 -> - % Line width is increased - {[], {LB, {Bef, Aft}, LA, Col}} - end. - -%% move around in buffer, respecting pad characters -step_over(0, {LB, {Bef, [?PAD |Aft]}, LA, Col}) -> - {LB, {[?PAD | Bef], Aft}, LA, Col+1}; -step_over(0, {LB, {Bef, Aft}, LA, Col}) -> - {LB, {Bef, Aft}, LA, Col}; -step_over(N, {LB, {[C | Bef], Aft}, LA, Col}) when N < 0 -> - N1 = ifelse(C == ?PAD, N, N+1), - step_over(N1, {LB, {Bef, [C | Aft]}, LA, Col-1}); -step_over(N, {LB, {Bef, [C | Aft]}, LA, Col}) when N > 0 -> - N1 = ifelse(C == ?PAD, N, N-1), - step_over(N1, {LB, {[C | Bef], Aft}, LA, Col+1}). - -%%% an empty line buffer -empty_buf() -> {[], {[], []}, [], 0}. - -%%% col and row from position with given width -col(N, W) -> N rem W. -row(N, W) -> N div W. - -%%% move relative N characters -move_rel(N, {_LB, {_Bef, _Aft}, _LA, Col}=Buf, Tty) -> - {NewLB, {NewBef, NewAft}, NewLA, NewCol} = step_over(N, Buf), - M = move_cursor(Col, NewCol, Tty), - {M, {NewLB, {NewBef, NewAft}, NewLA, NewCol}}. - -move_line(V, {_LB, {_Bef, _Aft}, _LA, Col}, Tty = #ssh_pty{width=W}) - when V < 0, length(_LB) >= -V -> - {LinesJumped, [B|NewLB]} = lists:split(-V -1, _LB), - CL = lists:reverse(_Bef,_Aft), - NewLA = lists:reverse([CL|LinesJumped], _LA), - {NewBB, NewAft} = lists:split(min(length(_Bef),length(B)), B), - NewBef = lists:reverse(NewBB), - NewCol = Col - length(_Bef) - lists:sum([((length(L)-1) div W)*W + W || L <- [B|LinesJumped]]) + length(NewBB), - M = move_cursor(Col, NewCol, Tty), - {M, {NewLB, {NewBef, NewAft}, NewLA, NewCol}}; -move_line(V, {_LB, {_Bef, _Aft}, _LA, Col}, Tty = #ssh_pty{width=W}) - when V > 0, length(_LA) >= V -> - {LinesJumped, [A|NewLA]} = lists:split(V -1, _LA), - CL = lists:reverse(_Bef,_Aft), - NewLB = lists:reverse([CL|LinesJumped],_LB), - {NewBB, NewAft} = lists:split(min(length(_Bef),length(A)), A), - NewBef = lists:reverse(NewBB), - NewCol = Col - length(_Bef) + lists:sum([((length(L)-1) div W)*W + W || L <- [CL|LinesJumped]]) + length(NewBB), - M = move_cursor(Col, NewCol, Tty), - {M, {NewLB, {NewBef, NewAft}, NewLA, NewCol}}; -move_line(_, Buf, _) -> - {"", Buf}. -%%% give move command for tty -move_cursor(A, A, _Tty) -> - []; -move_cursor(From, To, #ssh_pty{width=Width, term=Type}) -> - Tcol = case col(To, Width) - col(From, Width) of - 0 -> ""; - I when I < 0 -> get_tty_command(left, -I, Type); - I -> get_tty_command(right, I, Type) - end, - Trow = case row(To, Width) - row(From, Width) of - 0 -> ""; - J when J < 0 -> get_tty_command(up, -J, Type); - J -> get_tty_command(down, J, Type) - end, - [Tcol | Trow]. - -%%% Caution for line "breaks" -special_at_width(From0, #ssh_pty{width=Width}) when (From0 rem Width) == 0 -> From0 - 1; -special_at_width(From0, _) -> From0. +%%% +%%-spec io_request(term(), prim_tty:state(), state()) -> {list(), prim_tty:state()}. +io_request({requests,Rs}, TTY, State) -> + io_requests(Rs, TTY, State, []); +io_request(redraw_prompt, TTY, _State) -> + prim_tty:handle_request(TTY, redraw_prompt); +io_request({redraw_prompt, Pbs, Pbs2, LineState}, TTY, _State) -> + prim_tty:handle_request(TTY, {redraw_prompt, Pbs, Pbs2, LineState}); +io_request(new_prompt, TTY, _State) -> + prim_tty:handle_request(TTY, new_prompt); +io_request(delete_after_cursor, TTY, _State) -> + prim_tty:handle_request(TTY, delete_after_cursor); +io_request(delete_line, TTY, _State) -> + prim_tty:handle_request(TTY, delete_line); +io_request({put_chars, unicode, Chars}, TTY, _State) -> + prim_tty:handle_request(TTY, {putc, unicode:characters_to_binary(Chars)}); +io_request({put_chars_sync, unicode, Chars, Reply}, TTY, State) -> + State#state.group ! {reply, Reply, ok}, + prim_tty:handle_request(TTY, {putc, unicode:characters_to_binary(Chars)}); +io_request({put_expand, unicode, Chars, N}, TTY, _State) -> + prim_tty:handle_request(TTY, {expand, unicode:characters_to_binary(Chars), N}); +io_request({move_expand, N}, TTY, _State) -> + prim_tty:handle_request(TTY, {move_expand, N}); +io_request({move_rel, N}, TTY, _State) -> + prim_tty:handle_request(TTY, {move, N}); +io_request({move_line, R}, TTY, _State) -> + prim_tty:handle_request(TTY, {move_line, R}); +io_request({move_combo, V1, R, V2}, TTY, _State) -> + prim_tty:handle_request(TTY, {move_combo, V1, R, V2}); +io_request({insert_chars, unicode, Chars}, TTY, _State) -> + prim_tty:handle_request(TTY, {insert, unicode:characters_to_binary(Chars)}); +io_request({insert_chars_over, unicode, Chars}, TTY, _State) -> + prim_tty:handle_request(TTY, {insert_over, unicode:characters_to_binary(Chars)}); +io_request({delete_chars, N}, TTY, _State) -> + prim_tty:handle_request(TTY, {delete, N}); +io_request(clear, TTY, _State) -> + prim_tty:handle_request(TTY, clear); +io_request(beep, TTY, _State) -> + prim_tty:handle_request(TTY, beep); +io_request(Req, TTY, _State) -> + erlang:display({unhandled_request, Req}), + {[], TTY}. +io_requests([{insert_chars, unicode, C1},{insert_chars, unicode, C2}|Rs], TTY, State, Acc) -> + io_requests([{insert_chars, unicode, [C1,C2]}|Rs], TTY, State, Acc); +io_requests([{put_chars, unicode, C1},{put_chars, unicode, C2}|Rs], TTY, State, Acc) -> + io_requests([{put_chars, unicode, [C1,C2]}|Rs], TTY, State, Acc); +io_requests([{move_rel, N}, {move_line, R}, {move_rel, M}|Rs], TTY, State, Acc) -> + io_requests([{move_combo, N, R, M}|Rs], TTY, State, Acc); +io_requests([{move_rel, N}, {move_line, R}|Rs], TTY, State, Acc) -> + io_requests([{move_combo, N, R, 0}|Rs], TTY, State, Acc); +io_requests([{move_line, R}, {move_rel, M}|Rs], TTY, State, Acc) -> + io_requests([{move_combo, 0, R, M}|Rs], TTY, State, Acc); +io_requests([R|Rs], TTY, State, Acc) -> + {Chars, NewTTY} = io_request(R, TTY, State), + io_requests(Rs, NewTTY, State, [Chars|Acc]); +io_requests([], TTY, _State, Acc) -> + {lists:reverse(Acc), TTY}. %% %%% write out characters %% %%% make sure that there is data to send @@ -694,34 +510,6 @@ has_chars([C|_]) when is_integer(C) -> true; has_chars([H|T]) when is_list(H) ; is_binary(H) -> has_chars(H) orelse has_chars(T); has_chars(<<_:8,_/binary>>) -> true; has_chars(_) -> false. - - -%%% tail, works with empty lists -tl1([_|A]) -> A; -tl1(_) -> []. - -%%% second tail -tl2([_,_|A]) -> A; -tl2(_) -> []. - -%%% nthtail as in lists, but no badarg if n > the length of list -nthtail(0, A) -> A; -nthtail(N, [_ | A]) when N > 0 -> nthtail(N-1, A); -nthtail(_, _) -> []. - -ifelse(Cond, A, B) -> - case Cond of - true -> A; - _ -> B - end. - -bin_to_list(B) when is_binary(B) -> - binary_to_list(B); -bin_to_list(L) when is_list(L) -> - lists:flatten([bin_to_list(A) || A <- L]); -bin_to_list(I) when is_integer(I) -> - I. - %%-------------------------------------------------------------------- start_shell(ConnectionHandler, State) -> @@ -740,9 +528,9 @@ start_shell(ConnectionHandler, State) -> Shell end, State#state{group = group:start(self(), ShellSpawner, - [{dumb, get_dumb(State#state.pty)},{expand_below, false}, - {echo, get_echo(State#state.pty)}]), - buf = empty_buf()}. + [{dumb, get_dumb(State#state.pty)}, + {expand_below, application:get_env(stdlib, shell_expand_location, below) =:= below}, + {echo, get_echo(State#state.pty)}])}. %%-------------------------------------------------------------------- start_exec_shell(ConnectionHandler, Cmd, State) -> @@ -763,8 +551,7 @@ start_exec_shell(ConnectionHandler, Cmd, State) -> {M, F, A++[Cmd]} end, State#state{group = group:start(self(), ExecShellSpawner, [{expand_below, false}, - {echo,false}]), - buf = empty_buf()}. + {dumb, true}])}. %%-------------------------------------------------------------------- exec_in_erlang_default_shell(ConnectionHandler, ChannelId, Cmd, WantReply, State) -> @@ -848,8 +635,7 @@ exec_in_self_group(ConnectionHandler, ChannelId, WantReply, State, Fun) -> end) end, {ok, State#state{group = group:start(self(), Exec, [{expand_below, false}, - {echo,false}]), - buf = empty_buf()}}. + {dumb, true}])}}. t2str(T) -> try io_lib:format("~s",[T]) diff --git a/lib/ssh/src/ssh_connect.hrl b/lib/ssh/src/ssh_connect.hrl index 07bbf6005f68..eaba5acb7923 100644 --- a/lib/ssh/src/ssh_connect.hrl +++ b/lib/ssh/src/ssh_connect.hrl @@ -180,8 +180,8 @@ -define(VEOL,6). %% End-of-line character in addition to carriage return %% or,and). linefeed. -define(VEOL2,7). %% Additional end-of-line character. --define(VSTART,8). %% Continues paused output (normally control-Q). --define(VSTOP,9). %% Pauses output (normally control-S). +-define(VSTART,8). %% Continues paused output (normally Ctrl+Q). +-define(VSTOP,9). %% Pauses output (normally Ctrl+S). -define(VSUSP,10). %% Suspends the current program. -define(VDSUSP,11). %% Another suspend character. -define(VREPRINT,12). %% Reprints the current input line. diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 6502fed79849..8746c2bbd4e8 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -2154,16 +2154,20 @@ ssh_dbg_format(connections, {call, {?MODULE,init, [[Role, Sock, Opts]]}}) -> end end, Opts), - {ok, {IPp,Portp}} = inet:peername(Sock), - {ok, {IPs,Ports}} = inet:sockname(Sock), + Addresses = + case {inet:peername(Sock), inet:sockname(Sock)} of + {{ok, {IPp,Portp}}, {ok, {IPs,Ports}}} -> + io_lib:format("Socket = ~p, Peer = ~s, Local = ~s,~n" + "Non-default options:~n~p", + [Sock, ssh_lib:format_address_port(IPp,Portp), + ssh_lib:format_address_port(IPs,Ports), NonDefaultOpts]); + {E1, E2} -> + io_lib:format("Socket = ~p, Peer = ~p, Local = ~p,~n" + "Non-default options:~n~p", + [Sock, E1, E2, NonDefaultOpts]) + end, [io_lib:format("Starting ~p connection:\n",[Role]), - io_lib:format("Socket = ~p, Peer = ~s, Local = ~s,~n" - "Non-default options:~n~p", - [Sock, - ssh_lib:format_address_port(IPp,Portp), - ssh_lib:format_address_port(IPs,Ports), - NonDefaultOpts]) - ]; + Addresses]; ssh_dbg_format(connections, F) -> ssh_dbg_format(terminate, F); diff --git a/lib/ssh/src/ssh_lsocket.erl b/lib/ssh/src/ssh_lsocket.erl new file mode 100644 index 000000000000..e92d88bac157 --- /dev/null +++ b/lib/ssh/src/ssh_lsocket.erl @@ -0,0 +1,175 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%% +%%---------------------------------------------------------------------- +%% Purpose: Produce listen sockets. +%%---------------------------------------------------------------------- +-module(ssh_lsocket). +-moduledoc false. + +-include("ssh.hrl"). +-export([start_link/4, provide_lsocket/4, get_lsocket/3]). + +-behaviour(ssh_dbg). +-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, + ssh_dbg_format/2, ssh_dbg_format/3]). + +get_lsocket(Host, Port, Options) -> + try + supervisor:start_child(ssh_lsocket_sup, [self(), Host, Port, Options]) + of + {ok, LSocketProvider} -> + receive + Result = {_, {LSocketProvider, _}} -> + Result + after + ?DEFAULT_TIMEOUT -> + {error, LSocketProvider, no_response_from_lsocket_provider} + end + catch + exit:{noproc, _} -> + {error, {no_provider_pid, ssh_not_started}} + end. + +start_link(Caller, Host, Port, Options) -> + {ok, proc_lib:spawn_link(?MODULE, provide_lsocket, + [Caller, Host, Port, Options])}. + +provide_lsocket(Caller, _Host1, Port0, Options) -> + ListenResult = + try + try_listen(Port0, Options, 4) + of + {ok, LSocket} -> + {ok, {self(), LSocket}}; + {error, Details} -> + {error, {self(), Details}} + catch + _Class:Exception -> + {error, {self(), Exception}} + end, + case ListenResult of + {ok, {_, LSocket1}} -> + Caller ! ListenResult, + wait_for_acceptor_sup(LSocket1, Options), + ok; + {error, {_, _}} -> + Caller ! ListenResult + end. + +wait_for_acceptor_sup(ListenSocket, Options) -> + receive + {request_control, ListenSocket, AcceptorSup} -> + ok = controlling_process(ListenSocket, AcceptorSup, Options), + AcceptorSup ! {its_yours,ListenSocket}, + ok + end. + +controlling_process(ListenSocket, ReqPid, Options) -> + {_, Callback, _} = ?GET_OPT(transport, Options), + Callback:controlling_process(ListenSocket, ReqPid). + +try_listen(Port, Opts, NtriesLeft) -> + try_listen(Port, Opts, 1, NtriesLeft). + +try_listen(Port, Opts, N, Nmax) -> + case listen(Port, Opts) of + {error,eaddrinuse} when N + timer:sleep(10*N), % Sleep 10, 20, 30,... ms + try_listen(Port, Opts, N+1, Nmax); + Other -> + Other + end. + +listen(Port, Options) -> + {_, Callback, _} = ?GET_OPT(transport, Options), + SockOpts = ?GET_OPT(socket_options, Options) ++ [{active, false}, {reuseaddr,true}], + case Callback:listen(Port, SockOpts) of + {error, nxdomain} -> + Callback:listen(Port, lists:delete(inet6, SockOpts)); + {error, enetunreach} -> + Callback:listen(Port, lists:delete(inet6, SockOpts)); + {error, eafnosupport} -> + Callback:listen(Port, lists:delete(inet6, SockOpts)); + Other -> + Other + end. + + +%%%################################################################ +%%%# +%%%# Tracing +%%%# + +ssh_dbg_trace_points() -> [connections]. + +ssh_dbg_flags(connections) -> [c]. + +ssh_dbg_on(connections) -> + dbg:tpl(?MODULE, provide_lsocket, 4, x), + dbg:tpl(?MODULE, controlling_process, 3, x), + dbg:tpl(?MODULE, try_listen, 4, x), + dbg:tpl(?MODULE, wait_for_acceptor_sup, 2, x); +ssh_dbg_on(tcp) -> dbg:tpl(?MODULE, accept, 3, x). + +ssh_dbg_off(connections) -> + dbg:ctpl(?MODULE, provide_lsocket, 4), + dbg:ctpl(?MODULE, controlling_process, 3), + dbg:ctpl(?MODULE, try_listen, 4), + dbg:ctpl(?MODULE, wait_for_acceptor_sup, 2); +ssh_dbg_off(tcp) -> dbg:ctpl(?MODULE, accept, 3). + +ssh_dbg_format(Tracepoint, Event = {call, {?MODULE, Function, Args}}) -> + [io_lib:format("~w:~w/~w> ~s", [?MODULE, Function, length(Args)] ++ + ssh_dbg_comment(Tracepoint, Event))]; +ssh_dbg_format(Tracepoint, Event = {return_from, {?MODULE,Function,Arity}, Ret}) -> + [io_lib:format("~w:~w/~w returned ~W> ~s", [?MODULE, Function, Arity, Ret, 3] ++ + ssh_dbg_comment(Tracepoint, Event))]. + +ssh_dbg_comment(connections, {call, {?MODULE, try_listen, [Port, _, N, Nmax]}}) -> + [io_lib:format("listen retry on Port:~p [~p/~p]", [Port, N, Nmax])]; +ssh_dbg_comment(connections, {call, {?MODULE, provide_lsocket, [_Parent, _Caller, _Ref, Host, Port, _UserOptions]}}) -> + [io_lib:format("providing LSocket for Host: ~p Port: ~p", [Host, Port])]; +ssh_dbg_comment(connections, {call, {?MODULE,controlling_process,[ListenSocket, ReqPid, _Options]}}) -> + [io_lib:format("changing owner for ~p to ~p", [ListenSocket, ReqPid])]; +ssh_dbg_comment(connections, {return_from, {?MODULE,controlling_process,3}, _Ret}) -> + [io_lib:format("ownership changed", [])]; +ssh_dbg_comment(connections, {call, {?MODULE, wait_for_acceptor_sup, [LSocket, _Options]}}) -> + [io_lib:format("waiting for acceptor sup to pickup LSocket ~p", [LSocket])]; +ssh_dbg_comment(connections, {return_from, {?MODULE,wait_for_acceptor_sup,2}, ok}) -> + [io_lib:format("LSocket provided. Bye.", [])]; +ssh_dbg_comment(_, _) -> + [""]. + +ssh_dbg_format(tcp, {call, {?MODULE,listen, [Port,_Opts]}}, Stack) -> + {skip, [{port,Port}|Stack]}; +ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, {ok,Sock}}, [{port,Port}|Stack]) -> + {["TCP listener started\n", + io_lib:format("Port: ~p~n" + "ListeningSocket: ~p~n", [Port,Sock]) + ], + Stack}; +ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, Result}, [{port,Port}|Stack]) -> + {["TCP listener start ERROR\n", + io_lib:format("Port: ~p~n" + "Return: ~p~n", [Port,Result]) + ], + Stack}. diff --git a/lib/ssh/src/ssh_lsocket_sup.erl b/lib/ssh/src/ssh_lsocket_sup.erl new file mode 100644 index 000000000000..1922268c3734 --- /dev/null +++ b/lib/ssh/src/ssh_lsocket_sup.erl @@ -0,0 +1,86 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% + +%% +%%---------------------------------------------------------------------- +%% Purpose: The ssh_lsocket supervisor, hangs under +%% sshd_sup. +%%---------------------------------------------------------------------- + +-module(ssh_lsocket_sup). +-moduledoc false. + +-behaviour(supervisor). + +%% API +-export([start_link/0]). + +%% Supervisor callbacks +-export([init/1]). +-define(SERVER, ?MODULE). + +%%%=================================================================== +%%% API functions +%%%=================================================================== + +%%-------------------------------------------------------------------- +%% @doc +%% Starts the supervisor +%% @end +%%-------------------------------------------------------------------- +-spec start_link() -> {ok, Pid :: pid()} | + {error, {already_started, Pid :: pid()}} | + {error, {shutdown, term()}} | + {error, term()} | + ignore. +start_link() -> + supervisor:start_link({local, ?SERVER}, ?MODULE, []). + +%%%=================================================================== +%%% Supervisor callbacks +%%%=================================================================== + +%%-------------------------------------------------------------------- +%% @private +%% @doc +%% Whenever a supervisor is started using supervisor:start_link/[2,3], +%% this function is called by the new process to find out about +%% restart strategy, maximum restart intensity, and child +%% specifications. +%% @end +%%-------------------------------------------------------------------- +-spec init(Args :: term()) -> + {ok, {SupFlags :: supervisor:sup_flags(), + [ChildSpec :: supervisor:child_spec()]}} | + ignore. +init([]) -> + ssh_lib:set_label(server, lsocket_sup), + SupFlags = #{strategy => simple_one_for_one, + intensity => 1, + period => 5}, + + AChild = #{id => ssh_lsocket, + start => {ssh_lsocket, start_link, []}, + restart => temporary, + shutdown => 5000, + type => worker, + modules => [ssh_lsocket]}, + + {ok, {SupFlags, [AChild]}}. diff --git a/lib/ssh/src/ssh_options.erl b/lib/ssh/src/ssh_options.erl index 7aaeb4603dee..6a55954bd0ac 100644 --- a/lib/ssh/src/ssh_options.erl +++ b/lib/ssh/src/ssh_options.erl @@ -229,7 +229,6 @@ handle_options(Role, OptsList0, Opts0) when is_map(Opts0), %% Enter the user's values into the map; unknown keys are %% treated as socket options check_and_save(OptsList2, OptionDefinitions, InitialMap) - catch error:{EO, KV, Reason} when EO == eoptions ; EO == eerl_env -> if diff --git a/lib/ssh/src/ssh_system_sup.erl b/lib/ssh/src/ssh_system_sup.erl index bc1d79d0f49a..f6b78d4e738f 100644 --- a/lib/ssh/src/ssh_system_sup.erl +++ b/lib/ssh/src/ssh_system_sup.erl @@ -41,12 +41,16 @@ addresses/1, get_options/2, get_acceptor_options/1, - replace_acceptor_options/2 + restart_acceptor/2 ]). %% Supervisor callback -export([init/1]). +-behaviour(ssh_dbg). +-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, + ssh_dbg_format/2]). + %%%========================================================================= %%% API %%%========================================================================= @@ -54,7 +58,7 @@ start_system(Address0, Options) -> case find_system_sup(Address0) of {ok,{SysPid,Address}} -> - restart_acceptor(SysPid, Address, Options); + start_acceptor(SysPid, Address, Options); {error,not_found} -> supervisor:start_child(sshd_sup, #{id => {?MODULE,Address0}, @@ -164,16 +168,19 @@ get_acceptor_options(SysPid) -> {error,Error} end. -replace_acceptor_options(SysPid, NewOpts) -> +restart_acceptor(SysPid, Options0) -> case get_daemon_listen_address(SysPid) of {ok,Address} -> - try stop_listener(SysPid) + try + stop_listener(SysPid) of ok -> - restart_acceptor(SysPid, Address, NewOpts) + Options = refresh_lsocket(Options0), + start_acceptor(SysPid, Address, Options) catch - error:_ -> - restart_acceptor(SysPid, Address, NewOpts) + error:_Error -> + Options = refresh_lsocket(Options0), + start_acceptor(SysPid, Address, Options) end; {error,Error} -> {error,Error} @@ -258,7 +265,7 @@ sup(server) -> sshd_sup. is_socket_server(Options) -> undefined =/= ?GET_INTERNAL_OPT(connected_socket,Options,undefined). -restart_acceptor(SysPid, Address, Options) -> +start_acceptor(SysPid, Address, Options) -> case lookup(ssh_acceptor_sup, SysPid) of {_,_,supervisor,_} -> {error, eaddrinuse}; @@ -273,3 +280,42 @@ restart_acceptor(SysPid, Address, Options) -> {error,Error} end end. + +refresh_lsocket(Options0) -> + {_OldLSock, LHost, LPort, _SockOwner} = + ?GET_INTERNAL_OPT(lsocket, Options0, lsocket_undefined), + case ssh_lsocket:get_lsocket(LHost, LPort, Options0) of + {ok, {LSocketProvider, LSocket}} -> + {_Host, _Port, Options} = + ssh:update_lsocket(LSocket, LSocketProvider, Options0), + Options; + Error = {error, _} -> + Error + end. + +%%%################################################################ +%%%# +%%%# Tracing +%%%# + +ssh_dbg_trace_points() -> [connections]. + +ssh_dbg_flags(connections) -> [c]. + +ssh_dbg_on(connections) -> + dbg:tpl(?MODULE, stop_listener, 1, x), + dbg:tpl(?MODULE, start_acceptor, 3, x). + +ssh_dbg_off(connections) -> + dbg:ctpl(?MODULE, stop_listener, 1), + dbg:ctpl(?MODULE, start_acceptor, 3). + +ssh_dbg_format(Tracepoint, Event = {call, {?MODULE, Function, Args}}) -> + [io_lib:format("~w:~w/~w> ~s", [?MODULE, Function, length(Args)] ++ + ssh_dbg_comment(Tracepoint, Event))]; +ssh_dbg_format(Tracepoint, Event = {return_from, {?MODULE,Function,Arity}, Ret}) -> + [io_lib:format("~w:~w/~w returned ~W> ~s", [?MODULE, Function, Arity, Ret, 3] ++ + ssh_dbg_comment(Tracepoint, Event))]. + +ssh_dbg_comment(_, _) -> + [""]. diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl index bcf4c7f859e1..c41a200f3087 100644 --- a/lib/ssh/test/ssh_basic_SUITE.erl +++ b/lib/ssh/test/ssh_basic_SUITE.erl @@ -82,6 +82,7 @@ pass_phrase/1, peername_sockname/1, send/1, + parallel_login/1, setopts_getopts/1, shell/1, shell_exit_status/1, @@ -113,7 +114,6 @@ all() -> [{group, all_tests} ]. -%%%-define(PARALLEL, ). -define(PARALLEL, parallel). groups() -> @@ -121,9 +121,7 @@ groups() -> {group, p_basic}, {group, internal_error}, {group, login_bad_pwd_no_retry}, - {group, key_cb} - ]}, - + {group, key_cb}]}, {sequential, [], [app_test, appup_test, daemon_already_started, @@ -138,32 +136,25 @@ groups() -> known_hosts, ssh_file_is_host_key, ssh_file_is_host_key_misc, - ssh_file_is_auth_key - ]}, - + ssh_file_is_auth_key]}, {key_cb, [?PARALLEL], [key_callback, key_callback_options]}, - {internal_error, [?PARALLEL], [internal_error]}, - {login_bad_pwd_no_retry, [?PARALLEL], [login_bad_pwd_no_retry1, login_bad_pwd_no_retry2, login_bad_pwd_no_retry3, login_bad_pwd_no_retry4, - login_bad_pwd_no_retry5 - ]}, - - {p_basic, [?PARALLEL], [send, peername_sockname, - exec, exec_compressed, + login_bad_pwd_no_retry5]}, + {p_basic, [?PARALLEL], [send, parallel_login, peername_sockname, + exec, exec_compressed, exec_with_io_out, exec_with_io_in, cli, cli_exit_normal, cli_exit_status, idle_time_client, idle_time_server, max_initial_idle_time, openssh_zlib_basic_test, misc_ssh_options, inet_option, inet6_option, - shell, shell_socket, shell_ssh_conn, shell_no_unicode, shell_unicode_string, - close - ]} - ]. + shell, shell_socket, shell_ssh_conn, + shell_no_unicode, shell_unicode_string, + close]}]. %%-------------------------------------------------------------------- init_per_suite(Config) -> @@ -1038,6 +1029,29 @@ send(Config) when is_list(Config) -> ok = ssh_connection:send(ConnectionRef, ChannelId, << >>), ssh:stop_daemon(Pid). +%%-------------------------------------------------------------------- +%%% Test parallel_login +parallel_login(Config) when is_list(Config) -> + process_flag(trap_exit, true), + SystemDir = filename:join(proplists:get_value(priv_dir, Config), system), + UserDir = proplists:get_value(priv_dir, Config), + {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SystemDir}, + {preferred_algorithms, ssh_transport:supported_algorithms()}, + {user_dir, UserDir}, + {parallel_login, true}, + {failfun, fun ssh_test_lib:failfun/2}]), + ConnectionRef = + ssh_test_lib:connect(Host, Port, [{preferred_algorithms, ssh_transport:supported_algorithms()}, + {silently_accept_hosts, true}, + {user_dir, UserDir}, + {user_interaction, false}]), + {ok, ChannelId} = ssh_connection:session_channel(ConnectionRef, infinity), + ok = ssh_connection:send(ConnectionRef, ChannelId, <<"Data">>), + ok = ssh_connection:send(ConnectionRef, ChannelId, << >>), + ssh_info:print(fun(Fmt, Args) -> io:fwrite(user, Fmt, Args) end), + {Parents, Conns, Handshakers} = + ssh_test_lib:find_handshake_parent(Port), + ssh:stop_daemon(Pid). %%-------------------------------------------------------------------- %%% Test ssh:connection_info([peername, sockname]) @@ -1502,7 +1516,6 @@ check_error(Error) -> ct:fail(Error). basic_test(Config) -> ClientOpts = proplists:get_value(client_opts, Config), ServerOpts = proplists:get_value(server_opts, Config), - {Pid, Host, Port} = ssh_test_lib:daemon(ServerOpts), CM = ssh_test_lib:connect(Host, Port, ClientOpts), ok = ssh:close(CM), diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl index a6919ae3df3f..793d50952f91 100644 --- a/lib/ssh/test/ssh_connection_SUITE.erl +++ b/lib/ssh/test/ssh_connection_SUITE.erl @@ -924,12 +924,11 @@ new_shell_xterm_term(Config) when is_list(Config) -> exp_output => [<<"Enter command\r\n">>, <<"1> ">>, - <<"one_atom_please.\r\n\e[1022D\e[1B">>, + <<"one_atom_please.\r\n">>, <<"{simple_eval,one_atom_please}\r\n">>, <<"2> ">>, - <<"\e[3D\e[J">>, <<"\e[;1;4msearch:\e[0m ">>, - <<"\r\n one_atom_please.">>]}, + <<"\b\b\b\b\b\b\b\b\e[J\e[;1;4msearch:\e[0m \r\n one_atom_please.\e[A\b\b\b\b\b\b\b\b\b\b">>]}, Config). new_shell_helper(#{term := Term, cmds := Cmds, @@ -1000,7 +999,7 @@ start_shell_exec(Config) when is_list(Config) -> {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir}, {user_dir, UserDir}, {password, "morot"}, - {exec, {?MODULE,ssh_exec_echo,[]}} ]), + {exec, {?MODULE,ssh_exec_echo,["foo"]}} ]), ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, {user, "foo"}, @@ -1104,7 +1103,7 @@ start_shell_exec_fun(Config) -> io:format("echo ~s\n", [Cmd]) end) end, - "testing", <<"echo testing\n">>, 0, + "testing", <<"echo testing\r\n">>, 0, Config). start_shell_exec_fun2(Config) -> @@ -1113,7 +1112,7 @@ start_shell_exec_fun2(Config) -> io:format("echo ~s ~s\n",[User,Cmd]) end) end, - "testing", <<"echo foo testing\n">>, 0, + "testing", <<"echo foo testing\r\n">>, 0, Config). start_shell_exec_fun3(Config) -> @@ -1122,7 +1121,7 @@ start_shell_exec_fun3(Config) -> io:format("echo ~s ~s\n",[User,Cmd]) end) end, - "testing", <<"echo foo testing\n">>, 0, + "testing", <<"echo foo testing\r\n">>, 0, Config). start_shell_exec_direct_fun(Config) -> @@ -1187,11 +1186,11 @@ start_exec_direct_fun1_read_write(Config) -> {ok, Ch} = ssh_connection:session_channel(C, infinity), success = ssh_connection:exec(C, Ch, "> ", infinity), - ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\n">>}}), + ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\r\n">>}}), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"1> ">>}}), ok = ssh_connection:send(C, Ch, "hej.\n", 5000), - ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\n">>}}), + ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\r\n">>}}), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"2> ">>}}), ok = ssh_connection:send(C, Ch, "quit.\n", 5000), @@ -1235,18 +1234,18 @@ start_exec_direct_fun1_read_write_advanced(Config) -> {ok, Ch} = ssh_connection:session_channel(C, infinity), success = ssh_connection:exec(C, Ch, "> ", infinity), - ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\n">>}}), + ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"Tiny read/write test\r\n">>}}), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"1> ">>}}), ok = ssh_connection:send(C, Ch, "hej.\n", 5000), - ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\n">>}}), + ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,hej}\r\n">>}}), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"2> ">>}}), ok = ssh_connection:send(C, Ch, "'Hi ", 5000), ok = ssh_connection:send(C, Ch, "there", 5000), ok = ssh_connection:send(C, Ch, "'", 5000), ok = ssh_connection:send(C, Ch, ".\n", 5000), - ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,'Hi there'}\n">>}}), + ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"{simple_eval,'Hi there'}\r\n">>}}), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,0,<<"3> ">>}}), ok = ssh_connection:send(C, Ch, "bad_input.\n", 5000), ssh_test_lib:receive_exec_result_or_fail({ssh_cm,C,{data,Ch,1,<<"**Error** {bad_input,3}">>}}), @@ -1263,8 +1262,8 @@ start_exec_direct_fun1_read_write_advanced(Config) -> after 5000 -> go_on end, receive - X -> ct:fail("remaining messages"), - ct:log("remaining message: ~p",[X]) + X -> ct:log("remaining message: ~p",[X]), + ct:fail("remaining messages") after 0 -> go_on end, ssh:stop_daemon(Pid). @@ -1414,7 +1413,7 @@ start_shell_sock_exec_fun(Config) when is_list(Config) -> "testing", infinity), receive - {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\n">>}} -> + {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\r\n">>}} -> ok after 5000 -> ct:fail("Exec Timeout") @@ -1459,7 +1458,7 @@ start_shell_sock_daemon_exec(Config) -> "testing", infinity), receive - {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\n">>}} -> + {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\r\n">>}} -> ok after 5000 -> ct:fail("Exec Timeout") @@ -1519,7 +1518,7 @@ start_shell_sock_daemon_exec_multi(Config) -> success = ssh_connection:exec(ConnectionRef, ChannelId0, "testing", infinity), ct:log("~p:~p: exec on connection ~p", [?MODULE,?LINE,ConnectionRef]), receive - {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\n">>}} -> + {ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\r\n">>}} -> Parent ! {answer_received,self()}, ct:log("~p:~p: received result on connection ~p", [?MODULE,?LINE,ConnectionRef]) after 5000 -> @@ -1728,7 +1727,7 @@ stop_listener(Config) when is_list(Config) -> "testing", infinity), receive {ssh_cm, ConnectionRef0, - {data, ChannelId0, 0, <<"echo testing\n">>}} -> + {data, ChannelId0, 0, <<"echo testing\r\n">>}} -> ok after 5000 -> ct:fail("Exec Timeout") diff --git a/lib/ssh/test/ssh_dbg_SUITE.erl b/lib/ssh/test/ssh_dbg_SUITE.erl index adeeb07b7d18..fd55c4211c37 100644 --- a/lib/ssh/test/ssh_dbg_SUITE.erl +++ b/lib/ssh/test/ssh_dbg_SUITE.erl @@ -192,7 +192,7 @@ dbg_connections(Config) -> end}, {failfun, fun ssh_test_lib:failfun/2}]), - ?DBG_RECEIVE("Starting LISTENER on ", Ref, _, Pid), + ?DBG_RECEIVE("ssh_acceptor:acceptor_init/4> Starting LISTENER on ", Ref, _, Pid), C = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, {user_dir, UserDir}, @@ -435,7 +435,7 @@ dbg_channels(Config) -> }, {failfun, fun ssh_test_lib:failfun/2}]), - ?DBG_RECEIVE("Starting LISTENER on ", Ref, _, Pid), + ?DBG_RECEIVE("ssh_acceptor:acceptor_init/4> Starting LISTENER on ", Ref, _, Pid), C = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true}, {user_dir, UserDir}, diff --git a/lib/ssh/test/ssh_protocol_SUITE.erl b/lib/ssh/test/ssh_protocol_SUITE.erl index 7b8d4e9767be..58d1b7c310bf 100644 --- a/lib/ssh/test/ssh_protocol_SUITE.erl +++ b/lib/ssh/test/ssh_protocol_SUITE.erl @@ -94,16 +94,9 @@ [{client2server,Ciphs}, {server2client,Ciphs}] end)() ). - - --define(v(Key, Config), proplists:get_value(Key, Config)). --define(v(Key, Config, Default), proplists:get_value(Key, Config, Default)). - - %%-------------------------------------------------------------------- %% Common Test interface functions ----------------------------------- %%-------------------------------------------------------------------- - suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{seconds,40}}]. @@ -365,7 +358,7 @@ no_common_alg_server_disconnects(Config) -> ssh_trpt_test_lib:exec( [{set_options, [print_ops, {print_messages,detail}]}, {connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{silently_accept_hosts, true}, {user_dir, user_dir(Config)}, {user_interaction, false}, @@ -473,7 +466,7 @@ do_gex_client_init(Config, {Min,N,Max}, {G,P}) -> ssh_trpt_test_lib:exec( [{set_options, [print_ops, print_seqnums, print_messages]}, {connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{silently_accept_hosts, true}, {user_dir, user_dir(Config)}, {user_interaction, false}, @@ -508,7 +501,7 @@ do_gex_client_init_old(Config, N, {G,P}) -> ssh_trpt_test_lib:exec( [{set_options, [print_ops, print_seqnums, print_messages]}, {connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{silently_accept_hosts, true}, {user_dir, user_dir(Config)}, {user_interaction, false}, @@ -874,7 +867,7 @@ kex_strict_helper(Config, TestMessages, ExpectedReason) -> {ok, _AfterKexState} = ssh_trpt_test_lib:exec( [{connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{preferred_algorithms,[{kex,[?DEFAULT_KEX]}, {cipher,?DEFAULT_CIPHERS} ]}, @@ -992,13 +985,12 @@ client_close_after_hello(Config0) -> {max_sessions,MaxSessions}, {negotiation_timeout,SleepSec*1000} ]), - - {_Parents0, Conns0, []} = find_handshake_parent(server_port(Config)), - + {_Parents0, Conns0, []} = + ssh_test_lib:find_handshake_parent(ssh_test_lib:server_port(Config)), Cs = [ssh_trpt_test_lib:exec( [{connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{preferred_algorithms,[{kex,[?DEFAULT_KEX]}, {cipher,?DEFAULT_CIPHERS} ]}, @@ -1010,16 +1002,15 @@ client_close_after_hello(Config0) -> ]}, {send, hello} ]) || _ <- lists:seq(1,MaxSessions+100)], - ct:log("=== Tried to start ~p sessions.", [length(Cs)]), - ssh_info:print(fun ct:log/2), - {Parents, Conns, Handshakers} = find_handshake_parent(server_port(Config)), + {Parents, Conns, Handshakers} = + ssh_test_lib:find_handshake_parent(ssh_test_lib:server_port(Config)), ct:log("Found (Port=~p):~n" " Connections (length ~p): ~p~n" " Handshakers (length ~p): ~p~n" " with parents (length ~p): ~p", - [server_port(Config), + [ssh_test_lib:server_port(Config), length(Conns), Conns, length(Handshakers), Handshakers, length(Parents), Parents]), @@ -1030,12 +1021,13 @@ client_close_after_hello(Config0) -> timer:sleep((SleepSec+15)*1000), ct:log("After sleeping", []), ssh_info:print(fun ct:log/2), - {Parents2, Conns2, Handshakers2} = find_handshake_parent(server_port(Config)), + {Parents2, Conns2, Handshakers2} = + ssh_test_lib:find_handshake_parent(ssh_test_lib:server_port(Config)), ct:log("Found (Port=~p):~n" " Connections (length ~p): ~p~n" " Handshakers (length ~p): ~p~n" " with parents (length ~p): ~p", - [server_port(Config), + [ssh_test_lib:server_port(Config), length(Conns2), Conns2, length(Handshakers2), Handshakers2, length(Parents2), Parents2]), @@ -1143,8 +1135,10 @@ start_std_daemon(Config, ExtraOpts) -> stop_std_daemon(Config) -> - ssh:stop_daemon(server_pid(Config)), - ct:log("Std server ~p at ~p:~p stopped", [server_pid(Config), server_host(Config), server_port(Config)]), + ssh:stop_daemon(ssh_test_lib:server_pid(Config)), + ct:log("Std server ~p at ~p:~p stopped", + [ssh_test_lib:server_pid(Config), ssh_test_lib:server_host(Config), + ssh_test_lib:server_port(Config)]), lists:keydelete(server, 1, Config). @@ -1152,28 +1146,24 @@ check_std_daemon_works(Config, Line) -> case std_connect(Config) of {ok,C} -> ct:log("Server ~p:~p ~p is ok at line ~p", - [server_host(Config), server_port(Config), - server_pid(Config), Line]), + [ssh_test_lib:server_host(Config), ssh_test_lib:server_port(Config), + ssh_test_lib:server_pid(Config), Line]), ok = ssh:close(C), Config; Error = {error,_} -> ct:fail("Standard server ~p:~p ~p is ill at line ~p: ~p", - [server_host(Config), server_port(Config), - server_pid(Config), Line, Error]) + [ssh_test_lib:server_host(Config), ssh_test_lib:server_port(Config), + ssh_test_lib:server_pid(Config), Line, Error]) end. -server_pid(Config) -> element(1,?v(server,Config)). -server_host(Config) -> element(2,?v(server,Config)). -server_port(Config) -> element(3,?v(server,Config)). - server_user_password(Config) -> server_user_password(1, Config). server_user_password(N, Config) -> lists:nth(N, ?v(user_passwords,Config)). - -std_connect(Config) -> - std_connect({server_host(Config), server_port(Config)}, Config). - +std_connect(Config) -> + std_connect({ssh_test_lib:server_host(Config), + ssh_test_lib:server_port(Config)}, Config). + std_connect({Host,Port}, Config) -> std_connect({Host,Port}, Config, []). @@ -1200,7 +1190,7 @@ connect_and_kex(Config) -> connect_and_kex(Config, InitialState) -> ssh_trpt_test_lib:exec( [{connect, - server_host(Config),server_port(Config), + ssh_test_lib:server_host(Config),ssh_test_lib:server_port(Config), [{preferred_algorithms,[{kex,[?DEFAULT_KEX]}, {cipher,?DEFAULT_CIPHERS} ]}, @@ -1233,44 +1223,3 @@ disconnect(Code) -> tcp_closed, {tcp_error,econnaborted} ]}. - -%%%---------------------------------------------------------------- -find_handshake_parent(Port) -> - Acc = {_Parents=[], _Connections=[], _Handshakers=[]}, - find_handshake_parent(supervisor:which_children(sshd_sup), Port, Acc). - - -find_handshake_parent([{{ssh_system_sup,{address,_,Port,_}}, - Pid,supervisor, [ssh_system_sup]}|_], - Port, Acc) -> - find_handshake_parent(supervisor:which_children(Pid), Port, Acc); - -find_handshake_parent([{{ssh_acceptor_sup,{address,_,Port,_}}, - PidS,supervisor,[ssh_acceptor_sup]}|T], - Port, {AccP,AccC,AccH}) -> - ParentHandshakers = - [{PidW,PidH} || - {{ssh_acceptor_sup,{address,_,Port1,_}}, PidW, worker, - [ssh_acceptor]} <- supervisor:which_children(PidS), - Port1 == Port, - PidH <- element(2, process_info(PidW,links)), - is_pid(PidH), - process_info(PidH,current_function) == - {current_function, - {ssh_connection_handler,handshake,4}}], - {Parents,Handshakers} = lists:unzip(ParentHandshakers), - find_handshake_parent(T, Port, {AccP++Parents, AccC, AccH++Handshakers}); - -find_handshake_parent([{_Ref,PidS,supervisor,[ssh_connection_sup]}|T], - Port, {AccP,AccC,AccH}) -> - Connections = - [Pid || - {connection,Pid,worker,[ssh_connection_handler]} <- - supervisor:which_children(PidS)], - find_handshake_parent(T, Port, {AccP, AccC++Connections, AccH}); - -find_handshake_parent([_|T], Port, Acc) -> - find_handshake_parent(T, Port, Acc); - -find_handshake_parent(_, _, {AccP,AccC,AccH}) -> - {lists:usort(AccP), lists:usort(AccC), lists:usort(AccH)}. diff --git a/lib/ssh/test/ssh_sup_SUITE.erl b/lib/ssh/test/ssh_sup_SUITE.erl index e6245d65f1ad..3c2541aca4b5 100644 --- a/lib/ssh/test/ssh_sup_SUITE.erl +++ b/lib/ssh/test/ssh_sup_SUITE.erl @@ -48,6 +48,7 @@ -define(SSHC_SUP(Pid), {sshc_sup, Pid, supervisor, [supervisor]}). -define(SSHD_SUP(Pid), {sshd_sup, Pid, supervisor, [supervisor]}). +-define(LSOCKET_SUP(Pid), {ssh_lsocket_sup, Pid, supervisor, [ssh_lsocket_sup]}). -define(SYSTEM_SUP(Pid,Address), {{ssh_system_sup, Address}, Pid, supervisor,[ssh_system_sup]}). -define(CONNECTION_SUP(Pid), {_,Pid, supervisor,[ssh_connection_sup]}). @@ -116,7 +117,8 @@ default_tree(Config) when is_list(Config) -> {value, ?SSHC_SUP(_)} = lists:keysearch(sshc_sup, 1, TopSupChildren), {value, ?SSHD_SUP(_)} = lists:keysearch(sshd_sup, 1, TopSupChildren), ?wait_match([], supervisor:which_children(sshc_sup)), - ?wait_match([], supervisor:which_children(sshd_sup)). + ?wait_match([?LSOCKET_SUP(_)], + supervisor:which_children(sshd_sup)). %%------------------------------------------------------------------------- sshc_subtree(Config) when is_list(Config) -> @@ -160,14 +162,15 @@ sshd_subtree(Config) when is_list(Config) -> ct:log("Expect HostIP=~p, Port=~p, Daemon=~p",[HostIP,Port,Daemon]), ?wait_match([?SYSTEM_SUP(Daemon, #address{address=ListenIP, port=Port, - profile=?DEFAULT_PROFILE})], + profile=?DEFAULT_PROFILE}), + ?LSOCKET_SUP(_)], supervisor:which_children(sshd_sup), [ListenIP,Daemon]), true = ssh_test_lib:match_ip(HostIP, ListenIP), check_sshd_system_tree(Daemon, HostIP, Port, Config), ssh:stop_daemon(HostIP, Port), ct:sleep(?WAIT_FOR_SHUTDOWN), - ?wait_match([], supervisor:which_children(sshd_sup)). + ?wait_match([?LSOCKET_SUP(_)], supervisor:which_children(sshd_sup)). %%------------------------------------------------------------------------- sshd_subtree_profile(Config) when is_list(Config) -> @@ -181,14 +184,15 @@ sshd_subtree_profile(Config) when is_list(Config) -> ct:log("Expect HostIP=~p, Port=~p, Profile=~p, Daemon=~p",[HostIP,Port,Profile,Daemon]), ?wait_match([?SYSTEM_SUP(Daemon, #address{address=ListenIP, port=Port, - profile=Profile})], + profile=Profile}), + ?LSOCKET_SUP(_)], supervisor:which_children(sshd_sup), [ListenIP,Daemon]), true = ssh_test_lib:match_ip(HostIP, ListenIP), check_sshd_system_tree(Daemon, HostIP, Port, Config), ssh:stop_daemon(HostIP, Port, Profile), ct:sleep(?WAIT_FOR_SHUTDOWN), - ?wait_match([], supervisor:which_children(sshd_sup)). + ?wait_match([?LSOCKET_SUP(_)], supervisor:which_children(sshd_sup)). %%------------------------------------------------------------------------- killed_acceptor_restarts(Config) -> diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl index 53e916df8081..5f9fe2f5405f 100644 --- a/lib/ssh/test/ssh_test_lib.erl +++ b/lib/ssh/test/ssh_test_lib.erl @@ -124,7 +124,11 @@ setup_known_host/3, get_addr_str/0, file_base_name/2, kex_strict_negotiated/2, -event_logged/3 +event_logged/3, +server_host/1, +server_port/1, +server_pid/1, +find_handshake_parent/1 ]). %% logger callbacks and related helpers -export([log/2, @@ -1372,3 +1376,43 @@ log(LogEvent = #{level:=_Level,msg:=_Msg,meta:=_Meta}, #{test_ref := TestRef, recipient := Recipient}) -> Recipient ! {TestRef, LogEvent}, ok. + +server_pid(Config) -> element(1,?v(server,Config)). +server_host(Config) -> element(2,?v(server,Config)). +server_port(Config) -> element(3,?v(server,Config)). + +%%%---------------------------------------------------------------- +find_handshake_parent(Port) -> + Acc = {_Parents=[], _Connections=[], _Handshakers=[]}, + find_handshake_parent(supervisor:which_children(sshd_sup), Port, Acc). + +find_handshake_parent([{{ssh_system_sup,{address,_,Port,_}}, + Pid,supervisor, [ssh_system_sup]}|_], + Port, Acc) -> + find_handshake_parent(supervisor:which_children(Pid), Port, Acc); +find_handshake_parent([{{ssh_acceptor_sup,{address,_,Port,_}}, + PidS,supervisor,[ssh_acceptor_sup]}|T], + Port, {AccP,AccC,AccH}) -> + ParentHandshakers = + [{PidW,PidH} || + {{ssh_acceptor_sup,{address,_,Port1,_}}, PidW, worker, + [ssh_acceptor]} <- supervisor:which_children(PidS), + Port1 == Port, + PidH <- element(2, process_info(PidW,links)), + is_pid(PidH), + process_info(PidH,current_function) == + {current_function, + {ssh_connection_handler,handshake,4}}], + {Parents,Handshakers} = lists:unzip(ParentHandshakers), + find_handshake_parent(T, Port, {AccP++Parents, AccC, AccH++Handshakers}); +find_handshake_parent([{_Ref,PidS,supervisor,[ssh_connection_sup]}|T], + Port, {AccP,AccC,AccH}) -> + Connections = + [Pid || + {connection,Pid,worker,[ssh_connection_handler]} <- + supervisor:which_children(PidS)], + find_handshake_parent(T, Port, {AccP, AccC++Connections, AccH}); +find_handshake_parent([_|T], Port, Acc) -> + find_handshake_parent(T, Port, Acc); +find_handshake_parent(_, _, {AccP,AccC,AccH}) -> + {lists:usort(AccP), lists:usort(AccC), lists:usort(AccH)}. diff --git a/lib/ssh/test/ssh_test_lib.hrl b/lib/ssh/test/ssh_test_lib.hrl index ade4174a7141..05ba19a1a647 100644 --- a/lib/ssh/test/ssh_test_lib.hrl +++ b/lib/ssh/test/ssh_test_lib.hrl @@ -10,13 +10,15 @@ %% Timeout time in ms %%------------------------------------------------------------------------- -define(TIMEOUT, 27000). +-define(v(Key, Config), proplists:get_value(Key, Config)). +-define(v(Key, Config, Default), proplists:get_value(Key, Config, Default)). %%------------------------------------------------------------------------- %% Check for usable crypto %%------------------------------------------------------------------------- -define(CHECK_CRYPTO(UsersInitCode), try - crypto:start(), + application:start(crypto), ssh_test_lib:try_enable_fips_mode() of ok -> UsersInitCode; diff --git a/lib/ssl/doc/guides/using_ssl.md b/lib/ssl/doc/guides/using_ssl.md index 4ea9f7fa0c3c..1f14dd28b229 100644 --- a/lib/ssl/doc/guides/using_ssl.md +++ b/lib/ssl/doc/guides/using_ssl.md @@ -22,12 +22,12 @@ limitations under the License. To see relevant version information for ssl, call `ssl:versions/0` . To see all supported cipher suites, call -[`ssl:cipher_suites(all, 'tlsv1.3')` ](`ssl:cipher_suites/2`). The available +[`ssl:cipher_suites(all, 'tlsv1.3')`](`ssl:cipher_suites/2`). The available cipher suites for a connection depend on the TLS version and prior to TLS-1.3 also on the certificate. To see the default cipher suite list change `all` to `default`. Note that TLS 1.3 and previous versions do not have any cipher suites in common, for listing cipher suites for a specific version use -[`ssl:cipher_suites(exclusive, 'tlsv1.3')` ](`ssl:cipher_suites/2`). Specific +[`ssl:cipher_suites(exclusive, 'tlsv1.3')`](`ssl:cipher_suites/2`). Specific cipher suites that you want your connection to use can also be specified. Default is to use the strongest available. @@ -92,8 +92,8 @@ _Step 3:_ Do a transport accept on the TLS listen socket: > #### Note {: .info } > -> ssl:transport_accept/1 and ssl:handshake/2 are separate functions so that the -> handshake part can be called in a new erlang process dedicated to handling the +> `ssl:transport_accept/1` and `ssl:handshake/2` are separate functions so that the +> handshake part can be called in a new Erlang process dedicated to handling the > connection _Step 4:_ Start the client side: @@ -122,8 +122,8 @@ _Step 5:_ Do the TLS handshake: > #### Note {: .info } > -> A real server should use ssl:handshake/2 that has a timeout to avoid DoS -> attacks. In the example the timeout defaults to infinty. +> A real server should use `ssl:handshake/2`, which accepts a timeout, to avoid DoS +> attacks. In the example the timeout defaults to `infinity`. _Step 6:_ Send a message over TLS: diff --git a/lib/ssl/src/dtls_client_connection.erl b/lib/ssl/src/dtls_client_connection.erl index 0d2ac57b0a4e..ebff84a9ddc2 100644 --- a/lib/ssl/src/dtls_client_connection.erl +++ b/lib/ssl/src/dtls_client_connection.erl @@ -156,10 +156,12 @@ %%==================================================================== %% Setup %%==================================================================== -init([Role, Host, Port, Socket, Options, User, CbInfo]) -> +init([Role, Tab, Host, Port, Socket, Options, User, CbInfo]) -> process_flag(trap_exit, true), - State0 = dtls_gen_connection:initial_state(Role, Host, Port, Socket, + State0 = dtls_gen_connection:initial_state(Role, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options, Role, State0), diff --git a/lib/ssl/src/dtls_gen_connection.erl b/lib/ssl/src/dtls_gen_connection.erl index 958e53ec9341..90763477e508 100644 --- a/lib/ssl/src/dtls_gen_connection.erl +++ b/lib/ssl/src/dtls_gen_connection.erl @@ -24,20 +24,16 @@ -module(dtls_gen_connection). -moduledoc false. --include_lib("public_key/include/public_key.hrl"). --include_lib("kernel/include/logger.hrl"). - -include("dtls_connection.hrl"). -include("dtls_handshake.hrl"). -include("ssl_alert.hrl"). -include("dtls_record.hrl"). -include("ssl_cipher.hrl"). --include("ssl_api.hrl"). -include("ssl_internal.hrl"). %% Setup -export([start_fsm/8, - initial_state/7, + initial_state/8, pids/1]). %% Handshake handling @@ -67,7 +63,6 @@ %% Data handling -export([send/3, - socket/4, setopts/3, getopts/3, handle_info/3, @@ -91,7 +86,7 @@ %%==================================================================== %% Setup %%==================================================================== -initial_state(Role, Host, Port, Socket, +initial_state(Role, Tab, Host, Port, Socket, {SSLOptions, SocketOptions, Trackers}, User, {CbModule, DataTag, CloseTag, ErrorTag, PassiveTag}) -> put(log_level, maps:get(log_level, SSLOptions)), @@ -100,7 +95,11 @@ initial_state(Role, Host, Port, Socket, #{session_cb := SessionCacheCb} = ssl_config:pre_1_3_session_opts(Role), InternalActiveN = ssl_config:get_internal_active_n(), Monitor = erlang:monitor(process, User), + + SslSocket = dtls_socket:socket([self()], CbModule, Socket, ?MODULE, Tab), + InitStatEnv = #static_env{ + user_socket = SslSocket, role = Role, transport_cb = CbModule, protocol_cb = dtls_gen_connection, @@ -115,7 +114,9 @@ initial_state(Role, Host, Port, Socket, trackers = Trackers }, - #state{static_env = InitStatEnv, + + #state{tab = Tab, + static_env = InitStatEnv, handshake_env = #handshake_env{ tls_handshake_history = ssl_handshake:init_handshake_history(), renegotiation = {false, first}, @@ -138,14 +139,14 @@ initial_state(Role, Host, Port, Socket, } }. -start_fsm(Role, Host, Port, Socket, {_,_, Tracker} = Opts, - User, {CbModule, _, _, _, _} = CbInfo, - Timeout) -> +start_fsm(Role, Host, Port, Socket, Opts, User, CbInfo, Timeout) -> try - {ok, Pid} = dtls_connection_sup:start_child([Role, Host, Port, Socket, - Opts, User, CbInfo]), - {ok, SslSocket} = ssl_gen_statem:socket_control(?MODULE, Socket, [Pid], CbModule, Tracker), - ssl_gen_statem:handshake(SslSocket, Timeout) + {ok, Pid} = dtls_connection_sup:start_child([Role, Host, Port, Socket, + Opts, User, CbInfo]), + receive {Pid, user_socket, SslSocket} -> + {ok, SslSocket} = ssl_gen_statem:socket_control(SslSocket), + ssl_gen_statem:handshake(SslSocket, Timeout) + end catch error:{badmatch, {error, _} = Error} -> Error @@ -744,9 +745,6 @@ pack_packets([P|Rest]=Packets, SoFar, Max, Acc) -> pack_packets([], _, _, Acc) -> {lists:reverse(Acc), []}. -socket(Pid, Transport, Socket, _Tracker) -> - dtls_socket:socket(Pid, Transport, Socket, ?MODULE). - setopts(Transport, Socket, Other) -> dtls_socket:setopts(Transport, Socket, Other). diff --git a/lib/ssl/src/dtls_packet_demux.erl b/lib/ssl/src/dtls_packet_demux.erl index 97ba511f4c18..d0fb24fd3bfb 100644 --- a/lib/ssl/src/dtls_packet_demux.erl +++ b/lib/ssl/src/dtls_packet_demux.erl @@ -173,8 +173,9 @@ handle_call({new_connection, Old, _Pid}, _, end; handle_call({get_sock_opts, {SocketOptNames, EmOptNames}}, _, #state{listener = Socket, + transport = TransportInfo, emulated_options = EmOpts} = State) -> - case get_socket_opts(Socket, SocketOptNames) of + case get_socket_opts(Socket, SocketOptNames, element(1, TransportInfo)) of {ok, Opts} -> {reply, {ok, emulated_opts_list(EmOpts, EmOptNames, []) ++ Opts}, State}; {error, Reason} -> @@ -183,15 +184,17 @@ handle_call({get_sock_opts, {SocketOptNames, EmOptNames}}, _, #state{listener = handle_call(get_all_opts, _, #state{dtls_options = DTLSOptions, emulated_options = EmOpts} = State) -> {reply, {ok, EmOpts, DTLSOptions}, State}; -handle_call({set_sock_opts, {SocketOpts, NewEmOpts}}, _, #state{listener = Socket, emulated_options = EmOpts0} = State) -> - set_socket_opts(Socket, SocketOpts), +handle_call({set_sock_opts, {SocketOpts, NewEmOpts}}, _, #state{listener = Socket, emulated_options = EmOpts0, + transport = TransportInfo} = State) -> + set_socket_opts(Socket, SocketOpts, element(1, TransportInfo)), EmOpts = do_set_emulated_opts(NewEmOpts, EmOpts0), {reply, ok, State#state{emulated_options = EmOpts}}; -handle_call({set_all_opts, {SocketOpts, NewEmOpts, SslOpts}}, _, #state{listener = Socket} = State) -> - set_socket_opts(Socket, SocketOpts), +handle_call({set_all_opts, {SocketOpts, NewEmOpts, SslOpts}}, _, #state{listener = Socket, + transport = TransportInfo} = State) -> + set_socket_opts(Socket, SocketOpts, element(1, TransportInfo)), {reply, ok, State#state{emulated_options = NewEmOpts, dtls_options = SslOpts}}; -handle_call({getstat, Options}, _, #state{listener = Socket, transport = {TransportCb, _,_,_,_}} = State) -> - Stats = dtls_socket:getstat(TransportCb, Socket, Options), +handle_call({getstat, Options}, _, #state{listener = Socket, transport = TransportInfo} = State) -> + Stats = dtls_socket:getstat(element(1, TransportInfo), Socket, Options), {reply, Stats, State}. handle_cast({active_once, Client, Pid}, State0) -> @@ -350,7 +353,7 @@ setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes, case dtls_connection_sup:start_child(ConnArgs) of {ok, Pid} -> erlang:monitor(process, Pid), - gen_server:reply(From, {ok, Pid, {Client, Socket}}), + gen_server:reply(From, {ok, Pid}), Pid ! Msg, State#state{dtls_msq_queues = kv_insert(Client, {Pid, queue:new()}, MsgQueues), dtls_processes = kv_insert(Pid, Client, Processes)}; @@ -386,15 +389,19 @@ call(Server, Msg) -> {error, closed} end. -set_socket_opts(_, []) -> +set_socket_opts(_, [], _) -> ok; -set_socket_opts(Socket, SocketOpts) -> - inet:setopts(Socket, SocketOpts). +set_socket_opts(Socket, SocketOpts, gen_udp) -> + inet:setopts(Socket, SocketOpts); +set_socket_opts(Socket, SocketOpts, Cb) -> + Cb:setopts(Socket, SocketOpts). -get_socket_opts(_, []) -> +get_socket_opts(_, [], _) -> {ok, []}; -get_socket_opts(Socket, SocketOpts) -> - inet:getopts(Socket, SocketOpts). +get_socket_opts(Socket, SocketOpts, gen_udp) -> + inet:getopts(Socket, SocketOpts); +get_socket_opts(Socket, SocketOpts, Cb) -> + Cb:getopts(Socket, SocketOpts). do_set_emulated_opts([], Opts) -> Opts; diff --git a/lib/ssl/src/dtls_server_connection.erl b/lib/ssl/src/dtls_server_connection.erl index acbd1107c8b7..b3224c537374 100644 --- a/lib/ssl/src/dtls_server_connection.erl +++ b/lib/ssl/src/dtls_server_connection.erl @@ -156,13 +156,15 @@ %%==================================================================== %% Setup %%==================================================================== -init([Role, Host, Port, Socket, Options, User, CbInfo]) -> +init([Role, Tab, Host, Port, Socket, Options, User, CbInfo]) -> process_flag(trap_exit, true), - State0 = dtls_gen_connection:initial_state(Role, Host, Port, Socket, + State0 = dtls_gen_connection:initial_state(Role, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options, - Role, State0), + Role, State0), gen_statem:enter_loop(?MODULE, [], initial_hello, State) catch throw:Error -> diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl index 2f8f7ed5d238..02ef6cea3c08 100644 --- a/lib/ssl/src/dtls_socket.erl +++ b/lib/ssl/src/dtls_socket.erl @@ -27,7 +27,7 @@ listen/2, accept/3, connect/4, - socket/4, + socket/5, setopts/3, getopts/3, getstat/3, @@ -69,21 +69,24 @@ listen(Port, #config{inet_ssl = SockOpts, Error end. -accept(dtls, #config{transport_info = {Transport,_,_,_,_}, - connection_cb = ConnectionCb, - dtls_handler = {Listener, _}}, _Timeout) -> +accept({Listener,_}, #config{}, _Timeout) -> case dtls_packet_demux:accept(Listener, self()) of - {ok, Pid, Socket} -> - {ok, socket([Pid], Transport, {Listener, Socket}, ConnectionCb)}; + {ok, Pid} -> + receive + {Pid, user_socket, UserSocket} -> + {ok, UserSocket} + end; {error, Reason} -> {error, Reason} end. connect(Address, Port, #config{transport_info = {Transport, _, _, _, _} = CbInfo, - connection_cb = ConnectionCb, - ssl = SslOpts, - emulated = EmOpts, - inet_ssl = SocketOpts}, Timeout) -> + connection_cb = ConnectionCb, + ssl = SslOpts, + emulated = EmOpts, + inet_ssl = SocketOpts, + tab = _Tab + }, Timeout) -> case Transport:open(0, SocketOpts ++ internal_inet_values()) of {ok, Socket} -> ssl_gen_statem:connect(ConnectionCb, Address, Port, {{Address, Port},Socket}, @@ -94,8 +97,8 @@ connect(Address, Port, #config{transport_info = {Transport, _, _, _, _} = CbInfo Error end. -close_listen(#sslsocket{pid = {dtls, #config{dtls_handler = {Pid, Port0}, - inet_ssl = SockOpts}}}, Timeout) -> +close_listen(#sslsocket{socket_handle = {Pid, Port0}, + listener_config = #config{inet_ssl = SockOpts}}, Timeout) -> IP = proplists:get_value(ip, SockOpts, default_ip(SockOpts)), Port = get_real_port(Pid, Port0), dtls_listener_sup:register_listener({undefined, Pid}, IP, Port), @@ -124,16 +127,29 @@ close(gen_udp, {_Client, _Socket}) -> close(Transport, {_Client, Socket}) -> Transport:close(Socket). -socket(Pids, gen_udp = Transport, - PeerAndSock = {{_Host, _Port}, _Socket}, ConnectionCb) -> - #sslsocket{pid = Pids, - %% "The name "fd" is kept for backwards compatibility - fd = {Transport, PeerAndSock, ConnectionCb}}; -socket(Pids, Transport, Socket, ConnectionCb) -> - #sslsocket{pid = Pids, - %% "The name "fd" is kept for backwards compatibility - fd = {Transport, Socket, ConnectionCb}}. -setopts(_, Socket = #sslsocket{pid = {dtls, #config{dtls_handler = {ListenPid, _}}}}, Options) -> + +%% Note that gen_udp:send is not blocking as gen_tcp:send is. +%% So normal DTLS can safely have the same connection handler +%% as payload sender + +socket([Pid], gen_udp = Transport, + PeerAndSock = {{_Host, _Port}, _Socket}, ConnectionCb, Tab) when Tab =/= undefined -> + #sslsocket{socket_handle = PeerAndSock, + connection_handler = Pid, + payload_sender = Pid, + transport_cb = Transport, + connection_cb = ConnectionCb, + tab = Tab}; +socket([Pid], Transport, Socket, ConnectionCb, Tab) when Tab =/= undefined -> + #sslsocket{socket_handle = Socket, + connection_handler = Pid, + payload_sender = Pid, + transport_cb = Transport, + connection_cb = ConnectionCb, + tab = Tab}. + +setopts(_, Socket = #sslsocket{socket_handle = {ListenPid, _}, + listener_config = #config{}}, Options) -> SplitOpts = {_, EmOpts} = tls_socket:split_options(Options), check_active_n(EmOpts, Socket), dtls_packet_demux:set_sock_opts(ListenPid, SplitOpts); @@ -143,7 +159,8 @@ setopts(gen_udp, Socket, Options) -> setopts(Transport, Socket, Options) -> Transport:setopts(Socket, Options). -check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {dtls, #config{dtls_handler = {ListenPid, _}}}}) -> +check_active_n(EmulatedOpts, Socket = #sslsocket{socket_handle = {ListenPid, _}, + listener_config = #config{}}) -> %% We check the resulting options to send an ssl_passive message if necessary. case proplists:lookup(active, EmulatedOpts) of %% The provided value is out of bound. @@ -169,19 +186,9 @@ check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {dtls, #config{dtls_handl ok end. -getopts(_, #sslsocket{pid = {dtls, #config{dtls_handler = {ListenPid, _}}}}, Options) -> +getopts(_, #sslsocket{socket_handle = {ListenPid, _}, listener_config =#config{}}, Options) -> SplitOpts = tls_socket:split_options(Options), dtls_packet_demux:get_sock_opts(ListenPid, SplitOpts); -getopts(gen_udp, #sslsocket{pid = {Socket, #config{emulated = EmOpts}}}, Options) -> - {SockOptNames, EmulatedOptNames} = tls_socket:split_options(Options), - EmulatedOpts = get_emulated_opts(EmOpts, EmulatedOptNames), - SocketOpts = tls_socket:get_socket_opts(Socket, SockOptNames, inet), - {ok, EmulatedOpts ++ SocketOpts}; -getopts(_Transport, #sslsocket{pid = {Socket, #config{emulated = EmOpts}}}, Options) -> - {SockOptNames, EmulatedOptNames} = tls_socket:split_options(Options), - EmulatedOpts = get_emulated_opts(EmOpts, EmulatedOptNames), - SocketOpts = tls_socket:get_socket_opts(Socket, SockOptNames, inet), - {ok, EmulatedOpts ++ SocketOpts}; %%% Following clauses will not be called for emulated options, they are handled in the connection process getopts(gen_udp, {_,{{_, _},Socket}}, Options) -> inet:getopts(Socket, Options); @@ -235,11 +242,6 @@ default_inet_values() -> default_cb_info() -> {gen_udp, udp, udp_closed, udp_error, udp_passive}. -get_emulated_opts(EmOpts, EmOptNames) -> - lists:map(fun(Name) -> {value, Value} = lists:keysearch(Name, 1, EmOpts), - Value end, - EmOptNames). - emulated_socket_options(InetValues, #socket_options{ mode = Mode, packet = Packet, @@ -340,7 +342,8 @@ start_dtls_packet_demux(#config{ create_dtls_socket(#config{emulated = EmOpts} = Config, Listener, Port) -> Socket = #sslsocket{ - pid = {dtls, Config#config{dtls_handler = {Listener, Port}}}}, + socket_handle = {Listener, Port}, + listener_config = Config, + tab = dtls_listen}, check_active_n(EmOpts, Socket), Socket. - diff --git a/lib/ssl/src/inet_tls_dist.erl b/lib/ssl/src/inet_tls_dist.erl index c3f1e02c278e..f1c35f4d9cdd 100644 --- a/lib/ssl/src/inet_tls_dist.erl +++ b/lib/ssl/src/inet_tls_dist.erl @@ -100,7 +100,7 @@ hs_data_inet_tcp(Driver, Socket) -> } end}. -hs_data_ssl(Family, #sslsocket{pid = [_, DistCtrl|_]} = SslSocket) -> +hs_data_ssl(Family, #sslsocket{payload_sender = DistCtrl} = SslSocket) -> {ok, Address} = maybe {error, einval} ?= ssl:peername(SslSocket), @@ -347,7 +347,7 @@ accept_one(Family, Socket, NetKernel) -> net_kernel:connecttime()) of {ok, SslSocket} -> - Receiver = hd(SslSocket#sslsocket.pid), + Receiver = SslSocket#sslsocket.connection_handler, case KTLS of true -> {ok, KtlsInfo} = ssl_gen_statem:ktls_handover(Receiver), @@ -512,7 +512,7 @@ do_accept( Timer = dist_util:start_timer(SetupTime), {HSData0, NewAllowed} = case DistSocket of - SslSocket = #sslsocket{pid = [_Receiver, Sender| _]} -> + SslSocket = #sslsocket{payload_sender = Sender} -> link(Sender), {hs_data_ssl(Family, SslSocket), allowed_nodes(SslSocket, Allowed)}; @@ -647,7 +647,7 @@ do_setup( KTLS = proplists:get_value(ktls, Opts, false), dist_util:reset_timer(Timer), maybe - {ok, #sslsocket{pid = [Receiver, Sender| _]} = SslSocket} ?= + {ok, #sslsocket{connection_handler = Receiver, payload_sender = Sender} = SslSocket} ?= ssl:connect(Ip, PortNum, Opts, net_kernel:connecttime()), HSData = case KTLS of diff --git a/lib/ssl/src/ssl.appup.src b/lib/ssl/src/ssl.appup.src index 6c8cb7ae9907..82790f563321 100644 --- a/lib/ssl/src/ssl.appup.src +++ b/lib/ssl/src/ssl.appup.src @@ -1,25 +1,13 @@ %% -*- erlang -*- {"%VSN%", -[ + [ {<<"11\\..*">>, [{restart_application, ssl}]}, {<<"10\\..*">>, [{restart_application, ssl}]}, - {<<"9\\..*">>, [{restart_application, ssl}]}, - {<<"8\\..*">>, [{restart_application, ssl}]}, - {<<"7\\..*">>, [{restart_application, ssl}]}, - {<<"6\\..*">>, [{restart_application, ssl}]}, - {<<"5\\..*">>, [{restart_application, ssl}]}, - {<<"4\\..*">>, [{restart_application, ssl}]}, - {<<"3\\..*">>, [{restart_application, ssl}]} + {<<"9\\..*">>, [{restart_application, ssl}]} ], [ {<<"11\\..*">>, [{restart_application, ssl}]}, {<<"10\\..*">>, [{restart_application, ssl}]}, - {<<"9\\..*">>, [{restart_application, ssl}]}, - {<<"8\\..*">>, [{restart_application, ssl}]}, - {<<"7\\..*">>, [{restart_application, ssl}]}, - {<<"6\\..*">>, [{restart_application, ssl}]}, - {<<"5\\..*">>, [{restart_application, ssl}]}, - {<<"4\\..*">>, [{restart_application, ssl}]}, - {<<"3\\..*">>, [{restart_application, ssl}]} + {<<"9\\..*">>, [{restart_application, ssl}]} ] }. diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl index 7ed5cccb7a78..f78d6af9ad01 100644 --- a/lib/ssl/src/ssl.erl +++ b/lib/ssl/src/ssl.erl @@ -205,7 +205,6 @@ Special Erlang node configuration for the application can be found in -doc(#{title => <<"Socket">>}). -doc """ - A socket that can be used to perform a so-called "START-TLS", which means using an already connected socket previously used for plain TCP traffic and upgrading it to use TLS. @@ -1174,7 +1173,7 @@ There are two implementations available: automatically fetched through HTTP if the following argument is specified: - - **`{http, timeout()}`** +- **`{http, timeout()}`** Enables fetching of CRLs specified as http URIs in [X.509 certificate extensions](`e:public_key:public_key_records.md`). Requires the @@ -2091,7 +2090,10 @@ start(Type) -> Other end. %%-------------------------------------------------------------------- --doc "Stops the SSL application.". +-doc """ +Stops the SSL application. +""". + -doc(#{title => <<"Utility Functions">>, since => <<"OTP R14B">>}). -spec stop() -> ok. @@ -2197,6 +2199,7 @@ If the `active` option is set to `once`, `true`, or an integer value, the proces owning the SSL socket will receive messages of type [`active_msgs()`](`t:active_msgs/0`). """. + -spec connect(Host, Port, TLSOptions, Timeout) -> {ok, sslsocket()} | {ok, sslsocket(),Ext :: protocol_extensions()} | @@ -2284,8 +2287,8 @@ connection is accepted within the given time, `{error, timeout}` is returned. SslSocket :: sslsocket(), Reason :: reason(). -transport_accept(#sslsocket{pid = {ListenSocket, - #config{connection_cb = ConnectionCb} = Config}}, Timeout) +transport_accept(#sslsocket{socket_handle = ListenSocket, + listener_config = #config{connection_cb = ConnectionCb} = Config}, Timeout) when ?IS_TIMEOUT(Timeout) -> case ConnectionCb of tls_gen_connection -> @@ -2344,8 +2347,8 @@ handshake(HsSocket, Options, infinity). Ext :: protocol_extensions(), Reason :: closed | timeout | error_alert(). -handshake(#sslsocket{} = Socket, Timeout) - when ?IS_TIMEOUT(Timeout) -> +handshake(#sslsocket{connection_handler = Controller} = Socket, Timeout) + when ?IS_TIMEOUT(Timeout), is_pid(Controller) -> ssl_gen_statem:handshake(Socket, Timeout); handshake(ListenSocket, SslOptions) -> @@ -2400,8 +2403,9 @@ owning the [`sslsocket()`](`t:sslsocket/0`) will receive messages of type handshake(#sslsocket{} = Socket, [], Timeout) when ?IS_TIMEOUT(Timeout) -> handshake(Socket, Timeout); -handshake(#sslsocket{fd = {_, _, _, Trackers}} = Socket, SslOpts, Timeout) - when is_list(SslOpts), ?IS_TIMEOUT(Timeout) -> +handshake(#sslsocket{connection_cb = tls_gen_connection, + listener_config = Trackers} = Socket, SslOpts, Timeout) + when is_list(SslOpts), is_list(Trackers), ?IS_TIMEOUT(Timeout) -> try Tracker = proplists:get_value(option_tracker, Trackers), {ok, EmOpts, _} = tls_socket:get_all_opts(Tracker), @@ -2410,10 +2414,10 @@ handshake(#sslsocket{fd = {_, _, _, Trackers}} = Socket, SslOpts, Timeout) catch Error = {error, _Reason} -> Error end; -handshake(#sslsocket{pid = [Pid|_], fd = {_, _, _}} = Socket, SslOpts, Timeout) +handshake(#sslsocket{socket_handle = {Controller,_}, connection_cb = dtls_gen_connection} = Socket, SslOpts, Timeout) when is_list(SslOpts), ?IS_TIMEOUT(Timeout) -> try - {ok, EmOpts, _} = dtls_packet_demux:get_all_opts(Pid), + {ok, EmOpts, _} = dtls_packet_demux:get_all_opts(Controller), ssl_gen_statem:handshake(Socket, {SslOpts, tls_socket:emulated_socket_options(EmOpts, #socket_options{})}, Timeout) catch @@ -2485,12 +2489,15 @@ handshake_cancel(Socket) -> SslSocket :: sslsocket(), Reason :: any(). %%-------------------------------------------------------------------- -close(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) -> - ssl_gen_statem:close(Pid, {close, ?DEFAULT_TIMEOUT}); -close(#sslsocket{pid = {dtls, #config{dtls_handler = {_, _}}}} = DTLSListen) -> +close(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection}} = DTLSListen) -> dtls_socket:close_listen(DTLSListen, ?DEFAULT_TIMEOUT); -close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_,_,_,_}}}}) -> - Transport:close(ListenSocket). +close(#sslsocket{socket_handle = ListenSocket, + listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}}) -> + Transport = element(1, Info), + Transport:close(ListenSocket); +close(#sslsocket{connection_handler = Controller}) when is_pid(Controller) -> + ssl_gen_statem:close(Controller, {close, ?DEFAULT_TIMEOUT}). %%-------------------------------------------------------------------- -doc """ @@ -2514,22 +2521,25 @@ connection. Reason :: any(). %%-------------------------------------------------------------------- -close(#sslsocket{pid = [TLSPid|_]}, {Pid, Timeout} = DownGrade) - when is_pid(TLSPid), is_pid(Pid), ?IS_TIMEOUT(Timeout) -> - case ssl_gen_statem:close(TLSPid, {close, DownGrade}) of +close(#sslsocket{connection_handler = Controller}, {Pid, Timeout} = DownGrade) + when is_pid(Controller), is_pid(Pid), ?IS_TIMEOUT(Timeout) -> + case ssl_gen_statem:close(Controller, {close, DownGrade}) of ok -> %% In normal close {error, closed} is regarded as ok, as it is not interesting which side %% that got to do the actual close. But in the downgrade case only {ok, Port} is a success. {error, closed}; Other -> Other end; -close(#sslsocket{pid = [TLSPid|_]}, Timeout) - when is_pid(TLSPid), ?IS_TIMEOUT(Timeout) -> - ssl_gen_statem:close(TLSPid, {close, Timeout}); -close(#sslsocket{pid = {dtls, #config{dtls_handler = {_, _}}}} = DTLSListen, Timeout) +close(#sslsocket{connection_handler = Controller}, Timeout) + when is_pid(Controller), ?IS_TIMEOUT(Timeout) -> + ssl_gen_statem:close(Controller, {close, Timeout}); +close(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection}} = DTLSListen, Timeout) when ?IS_TIMEOUT(Timeout) -> dtls_socket:close_listen(DTLSListen, Timeout); -close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_,_,_,_}}}}, _) -> +close(#sslsocket{socket_handle = ListenSocket, + listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}}, _) -> + Transport = element(1, Info), tls_socket:close(Transport, ListenSocket). %%-------------------------------------------------------------------- @@ -2544,15 +2554,26 @@ A notable return value is `{error, closed}` indicating that the socket is closed. """. %%-------------------------------------------------------------------- -send(#sslsocket{pid = [Pid]}, Data) when is_pid(Pid) -> - ssl_gen_statem:send(Pid, Data); -send(#sslsocket{pid = [_, Pid]}, Data) when is_pid(Pid) -> - tls_sender:send_data(Pid, erlang:iolist_to_iovec(Data)); -send(#sslsocket{pid = {_, #config{transport_info={_, udp, _, _}}}}, _) -> +send(#sslsocket{payload_sender = Sender, + connection_cb = dtls_gen_connection}, Data) when is_pid(Sender) -> + ssl_gen_statem:send(Sender, Data); +send(#sslsocket{payload_sender = Sender, tab = Tab, + connection_cb = tls_gen_connection}, Data0) when is_pid(Sender) -> + try + Packet = ets:lookup_element(Tab, {socket_options, packet}, 2), + case encode_packet(Packet, Data0) of + {error, _} = Error -> + Error; + Data -> + tls_sender:send_data(Sender, erlang:iolist_to_iovec(Data)) + end + catch error:badarg -> + {error, closed} + end; +send(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection}}, _) -> {error,enotconn}; %% Emulate connection behaviour -send(#sslsocket{pid = {dtls,_}}, _) -> - {error,enotconn}; %% Emulate connection behaviour -send(#sslsocket{pid = {ListenSocket, #config{transport_info = Info}}}, Data) -> +send(#sslsocket{socket_handle = ListenSocket, + listener_config = #config{transport_info = Info}}, Data) -> Transport = element(1, Info), tls_socket:send(Transport, ListenSocket, Data). %% {error,enotconn} @@ -2591,13 +2612,13 @@ Optional argument `Timeout` specifies a time-out in milliseconds. The default value is `infinity`. """. -recv(#sslsocket{pid = [Pid|_]}, Length, Timeout) - when is_pid(Pid), (is_integer(Length) andalso Length >= 0), ?IS_TIMEOUT(Timeout) -> - ssl_gen_statem:recv(Pid, Length, Timeout); -recv(#sslsocket{pid = {dtls,_}}, _, _) -> +recv(#sslsocket{connection_handler = Controller}, Length, Timeout) + when is_pid(Controller), (is_integer(Length) andalso Length >= 0), ?IS_TIMEOUT(Timeout) -> + ssl_gen_statem:recv(Controller, Length, Timeout); +recv(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection}}, _, _) -> {error,enotconn}; -recv(#sslsocket{pid = {Listen, - #config{transport_info = Info}}},_,_) -> +recv(#sslsocket{socket_handle = Listen, + listener_config = #config{transport_info = Info}},_,_) -> Transport = element(1, Info), Transport:recv(Listen, 0). %% {error,enotconn} @@ -2609,26 +2630,27 @@ Assigns a new controlling process to the SSL socket. A controlling process is the owner of an SSL socket and receives all messages from the socket. """. --spec controlling_process(SslSocket, NewOwner) -> ok | {error, Reason} when +-spec controlling_process(SslSocket, NewController) -> ok | {error, Reason} when SslSocket :: sslsocket(), - NewOwner :: pid(), + NewController :: pid(), Reason :: any(). %% %% Description: Changes process that receives the messages when active = true %% or once. %%-------------------------------------------------------------------- -controlling_process(#sslsocket{pid = [Pid|_]}, NewOwner) - when is_pid(Pid), is_pid(NewOwner) -> - ssl_gen_statem:new_user(Pid, NewOwner); -controlling_process(#sslsocket{pid = {dtls, _}}, NewOwner) - when is_pid(NewOwner) -> +controlling_process(#sslsocket{connection_handler = Controller}, NewController) + when is_pid(Controller), is_pid(NewController) -> + ssl_gen_statem:new_user(Controller, NewController); +controlling_process(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection}}, NewController) + when is_pid(NewController) -> ok; %% Meaningless but let it be allowed to conform with TLS -controlling_process(#sslsocket{pid = {Listen, - #config{transport_info = {Transport,_,_,_,_}}}}, - NewOwner) - when is_pid(NewOwner) -> +controlling_process(#sslsocket{socket_handle = Listen, + listener_config = #config{transport_info = Info}}, + NewController) + when is_pid(NewController) -> + Transport = element(1, Info), %% Meaningless but let it be allowed to conform with normal sockets - Transport:controlling_process(Listen, NewOwner). + Transport:controlling_process(Listen, NewController). %%-------------------------------------------------------------------- -doc(#{title => <<"Utility Functions">>}). @@ -2651,14 +2673,14 @@ that affect the security of the connection will be returned. %% %% Description: Return SSL information for the connection %%-------------------------------------------------------------------- -connection_information(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) -> - case ssl_gen_statem:connection_information(Pid, false) of +connection_information(#sslsocket{connection_handler = Controller}) when is_pid(Controller) -> + case ssl_gen_statem:connection_information(Controller, false) of {ok, Info} -> {ok, [Item || Item = {_Key, Value} <- Info, Value =/= undefined]}; Error -> Error end; -connection_information(#sslsocket{pid = {_Listen, #config{}}}) -> +connection_information(#sslsocket{listener_config = #config{}}) -> {error, enotconn}. %%-------------------------------------------------------------------- -doc """ @@ -2685,9 +2707,9 @@ set to `true`. %% %% Description: Return SSL information for the connection %%-------------------------------------------------------------------- -connection_information(#sslsocket{pid = [Pid|_]}, Items) - when is_pid(Pid), is_list(Items) -> - case ssl_gen_statem:connection_information(Pid, include_security_info(Items)) of +connection_information(#sslsocket{connection_handler = Controller}, Items) + when is_pid(Controller), is_list(Items) -> + case ssl_gen_statem:connection_information(Controller, include_security_info(Items)) of {ok, Info} -> {ok, [Item || Item = {Key, Value} <- Info, lists:member(Key, Items), Value =/= undefined]}; @@ -2706,16 +2728,23 @@ connection_information(#sslsocket{pid = [Pid|_]}, Items) %% %% Description: same as inet:peername/1. %%-------------------------------------------------------------------- -peername(#sslsocket{pid = [Pid|_], fd = {Transport, Socket,_}}) when is_pid(Pid)-> +peername(#sslsocket{connection_handler = Controller, connection_cb = dtls_gen_connection, + transport_cb = Transport, + socket_handle = Socket}) when is_pid(Controller)-> dtls_socket:peername(Transport, Socket); -peername(#sslsocket{pid = [Pid|_], fd = {Transport, Socket,_,_}}) when is_pid(Pid)-> +peername(#sslsocket{connection_handler = Controller, connection_cb = tls_gen_connection, + transport_cb = Transport, + socket_handle = Socket}) when is_pid(Controller)-> tls_socket:peername(Transport, Socket); -peername(#sslsocket{pid = {dtls, #config{dtls_handler = {_Pid,_}}}}) -> - dtls_socket:peername(dtls, undefined); -peername(#sslsocket{pid = {ListenSocket, #config{transport_info = {Transport,_,_,_,_}}}}) -> - tls_socket:peername(Transport, ListenSocket); %% Will return {error, enotconn} -peername(#sslsocket{pid = {dtls,_}}) -> - {error,enotconn}. +peername(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection, + transport_info = Info}}) -> + Transport = element(1, Info), + dtls_socket:peername(Transport, undefined); %% Will return {error, enotconn} +peername(#sslsocket{socket_handle = ListenSocket, + listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}}) -> + Transport = element(1, Info), + tls_socket:peername(Transport, ListenSocket). %% Will return {error, enotconn} %%-------------------------------------------------------------------- -doc(#{title => <<"Utility Functions">>}). @@ -2733,16 +2762,14 @@ and [SSL User's Guide](standards_compliance.md). %% %% Description: Returns the peercert. %%-------------------------------------------------------------------- -peercert(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) -> - case ssl_gen_statem:peer_certificate(Pid) of +peercert(#sslsocket{connection_handler = Controller}) when is_pid(Controller) -> + case ssl_gen_statem:peer_certificate(Controller) of {ok, undefined} -> {error, no_peercert}; Result -> Result end; -peercert(#sslsocket{pid = {dtls, _}}) -> - {error, enotconn}; -peercert(#sslsocket{pid = {_Listen, #config{}}}) -> +peercert(#sslsocket{listener_config = #config{}}) -> {error, enotconn}. %%-------------------------------------------------------------------- @@ -2757,8 +2784,8 @@ peercert(#sslsocket{pid = {_Listen, #config{}}}) -> %% Description: Returns the protocol that has been negotiated. If no %% protocol has been negotiated will return {error, protocol_not_negotiated} %%-------------------------------------------------------------------- -negotiated_protocol(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) -> - ssl_gen_statem:negotiated_protocol(Pid). +negotiated_protocol(#sslsocket{connection_handler = Controller}) when is_pid(Controller) -> + ssl_gen_statem:negotiated_protocol(Controller). %%-------------------------------------------------------------------- -doc(#{title => <<"Utility Functions">>, @@ -3072,17 +3099,21 @@ groups(default) -> %%-------------------------------------------------------------------- -doc(#{title => <<"Utility Functions">>}). --doc "Gets the values of the specified socket options.". +-doc """ +Gets the values of the specified socket options. +""". -spec getopts(SslSocket, OptionNames) -> {ok, [gen_tcp:option()]} | {error, reason()} when SslSocket :: sslsocket(), OptionNames :: [gen_tcp:option_name()]. %%-------------------------------------------------------------------- -getopts(#sslsocket{pid = [Pid|_]}, OptionTags) when is_pid(Pid), is_list(OptionTags) -> - ssl_gen_statem:get_opts(Pid, OptionTags); -getopts(#sslsocket{pid = {dtls, #config{transport_info = {Transport,_,_,_,_}}}} = ListenSocket, +getopts(#sslsocket{connection_handler = Controller}, OptionTags) when is_pid(Controller), is_list(OptionTags) -> + ssl_gen_statem:get_opts(Controller, OptionTags); +getopts(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection, + transport_info = Info}} = ListenSocket, OptionTags) when is_list(OptionTags) -> + Transport = element(1, Info), try dtls_socket:getopts(Transport, ListenSocket, OptionTags) of {ok, _} = Result -> Result; @@ -3092,8 +3123,10 @@ getopts(#sslsocket{pid = {dtls, #config{transport_info = {Transport,_,_,_,_}}}} _:Error -> {error, {options, {socket_options, OptionTags, Error}}} end; -getopts(#sslsocket{pid = {_, #config{transport_info = {Transport,_,_,_,_}}}} = ListenSocket, +getopts(#sslsocket{listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}} = ListenSocket, OptionTags) when is_list(OptionTags) -> + Transport = element(1, Info), try tls_socket:getopts(Transport, ListenSocket, OptionTags) of {ok, _} = Result -> Result; @@ -3113,39 +3146,32 @@ getopts(#sslsocket{}, OptionTags) -> SslSocket :: sslsocket(), Options :: [gen_tcp:option()]. %%-------------------------------------------------------------------- -setopts(#sslsocket{pid = [Pid|_]}, [{active, _}] = Active) when is_pid(Pid) -> - ssl_gen_statem:set_opts(Pid, Active); -setopts(#sslsocket{pid = [Pid, Sender]}, Options0) when is_pid(Pid), is_list(Options0) -> - try proplists:expand([{binary, [{mode, binary}]}, - {list, [{mode, list}]}], Options0) of +setopts(#sslsocket{connection_handler = Controller}, [{active, _}] = Active) + when is_pid(Controller) -> + ssl_gen_statem:set_opts(Controller, Active); +setopts(#sslsocket{connection_handler = Controller, connection_cb = tls_gen_connection}, Options0) + when is_pid(Controller), is_list(Options0) -> + try proplists:expand([{binary, [{mode, binary}]}, {list, [{mode, list}]}], Options0) of Options -> - case proplists:get_value(packet, Options, undefined) of - undefined -> - ssl_gen_statem:set_opts(Pid, Options); - PacketOpt -> - case tls_sender:setopts(Sender, [{packet, PacketOpt}]) of - ok -> - ssl_gen_statem:set_opts(Pid, Options); - Error -> - Error - end - end + ssl_gen_statem:set_opts(Controller, Options) catch _:_ -> {error, {options, {not_a_proplist, Options0}}} end; -setopts(#sslsocket{pid = [Pid|_]}, Options0) when is_pid(Pid), is_list(Options0) -> - try proplists:expand([{binary, [{mode, binary}]}, - {list, [{mode, list}]}], Options0) of +setopts(#sslsocket{connection_handler = Controller}, Options0) + when is_pid(Controller), is_list(Options0) -> + try proplists:expand([{binary, [{mode, binary}]}, {list, [{mode, list}]}], Options0) of Options -> - ssl_gen_statem:set_opts(Pid, Options) + ssl_gen_statem:set_opts(Controller, Options) catch _:_ -> {error, {options, {not_a_proplist, Options0}}} end; -setopts(#sslsocket{pid = {dtls, #config{transport_info = {Transport,_,_,_,_}}}} = ListenSocket, +setopts(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection, + transport_info = Info}} = ListenSocket, Options) when is_list(Options) -> + Transport = element(1, Info), try dtls_socket:setopts(Transport, ListenSocket, Options) of ok -> ok; @@ -3155,8 +3181,10 @@ setopts(#sslsocket{pid = {dtls, #config{transport_info = {Transport,_,_,_,_}}}} _:Error -> {error, {options, {socket_options, Options, Error}}} end; -setopts(#sslsocket{pid = {_, #config{transport_info = {Transport,_,_,_,_}}}} = ListenSocket, Options) +setopts(#sslsocket{listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}} = ListenSocket, Options) when is_list(Options) -> + Transport = element(1, Info), try tls_socket:setopts(Transport, ListenSocket, Options) of ok -> ok; @@ -3197,20 +3225,27 @@ See `inet:getstat/2` for further details. Options :: [inet:stat_option()], OptionValues :: [{inet:stat_option(), integer()}]. %%-------------------------------------------------------------------- -getstat(#sslsocket{pid = {dtls, #config{transport_info = Info, - dtls_handler = {Listener, _}}}}, +getstat(#sslsocket{socket_handle = {Listener, _}, + listener_config = #config{transport_info = Info}}, Options) when is_list(Options) -> Transport = element(1, Info), dtls_socket:getstat(Transport, Listener, Options); -getstat(#sslsocket{pid = {Listen, #config{transport_info = Info}}}, +getstat(#sslsocket{socket_handle = Listen, + listener_config = #config{transport_info = Info}}, Options) when is_list(Options) -> Transport = element(1, Info), tls_socket:getstat(Transport, Listen, Options); -getstat(#sslsocket{pid = [Pid|_], fd = {Transport, Socket, _, _}}, - Options) when is_pid(Pid), is_list(Options) -> +getstat(#sslsocket{connection_handler = Controller, + connection_cb = tls_gen_connection, + socket_handle = Socket, + transport_cb = Transport}, + Options) when is_pid(Controller), is_list(Options) -> tls_socket:getstat(Transport, Socket, Options); -getstat(#sslsocket{pid = [Pid|_], fd = {Transport, Socket, _}}, - Options) when is_pid(Pid), is_list(Options) -> +getstat(#sslsocket{connection_handler = Controller, + connection_cb = dtls_gen_connection, + socket_handle = Socket, + transport_cb = Transport}, + Options) when is_pid(Controller), is_list(Options) -> dtls_socket:getstat(Transport, Socket, Options). %%--------------------------------------------------------------- @@ -3229,7 +3264,8 @@ To handle siutations where the peer has performed a shutdown on the write side, option `{exit_on_close, false}` is useful. """. %%-------------------------------------------------------------------- -shutdown(#sslsocket{pid = {dtls, #config{transport_info = Info}}}, _) -> +shutdown(#sslsocket{listener_config = #config{connection_cb = dtls_gen_connection, + transport_info = Info}}, _) -> Transport = element(1, Info), %% enotconn is what gen_tcp:shutdown on a listen socket will result with. %% shutdown really is handling TCP functionality not present @@ -3244,11 +3280,13 @@ shutdown(#sslsocket{pid = {dtls, #config{transport_info = Info}}}, _) -> _ -> {error, enotconn} end; -shutdown(#sslsocket{pid = {Listen, #config{transport_info = Info}}}, How) -> +shutdown(#sslsocket{socket_handle = Listen, + listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}}, How) -> Transport = element(1, Info), Transport:shutdown(Listen, How); -shutdown(#sslsocket{pid = [Pid|_]}, How) when is_pid(Pid) -> - ssl_gen_statem:shutdown(Pid, How). +shutdown(#sslsocket{connection_handler = Controller}, How) when is_pid(Controller) -> + ssl_gen_statem:shutdown(Controller, How). %%-------------------------------------------------------------------- -doc(#{title => <<"Utility Functions">>}). @@ -3259,14 +3297,23 @@ shutdown(#sslsocket{pid = [Pid|_]}, How) when is_pid(Pid) -> Address :: inet:ip_address(), Port :: inet:port_number(). %%-------------------------------------------------------------------- -sockname(#sslsocket{pid = {dtls, #config{dtls_handler = {Pid, _}}}}) -> - dtls_packet_demux:sockname(Pid); -sockname(#sslsocket{pid = {Listen, #config{transport_info = Info}}}) -> +sockname(#sslsocket{socket_handle = {Controller, _}, + listener_config = #config{connection_cb = dtls_gen_connection}}) -> + dtls_packet_demux:sockname(Controller); +sockname(#sslsocket{socket_handle = Listen, + listener_config = #config{connection_cb = tls_gen_connection, + transport_info = Info}}) -> Transport = element(1, Info), tls_socket:sockname(Transport, Listen); -sockname(#sslsocket{pid = [Pid|_], fd = {Transport, Socket,_}}) when is_pid(Pid) -> +sockname(#sslsocket{connection_handler = Controller, + connection_cb = dtls_gen_connection, + transport_cb = Transport, + socket_handle = Socket}) when is_pid(Controller) -> dtls_socket:sockname(Transport, Socket); -sockname(#sslsocket{pid = [Pid| _], fd = {Transport, Socket,_,_}}) when is_pid(Pid) -> +sockname(#sslsocket{connection_handler = Controller, + connection_cb = tls_gen_connection, + transport_cb = Transport, + socket_handle = Socket}) when is_pid(Controller) -> tls_socket:sockname(Transport, Socket). %%--------------------------------------------------------------- @@ -3354,24 +3401,25 @@ plaintext limit and can be configured using the `key_update_at` option in `t:common_option_tls13/0`. """. %%-------------------------------------------------------------------- -renegotiate(#sslsocket{pid = [Pid, Sender |_]} = Socket) when is_pid(Pid), - is_pid(Sender) -> +renegotiate(#sslsocket{connection_handler = Controller, + payload_sender = Sender, + connection_cb = tls_gen_connection} = Socket) when is_pid(Controller), + is_pid(Sender) -> case ssl:connection_information(Socket, [protocol]) of {ok, [{protocol, 'tlsv1.3'}]} -> {error, notsup}; _ -> case tls_sender:renegotiate(Sender) of {ok, Write} -> - tls_dtls_gen_connection:renegotiation(Pid, Write); + tls_dtls_gen_connection:renegotiation(Controller, Write); Error -> Error end end; -renegotiate(#sslsocket{pid = [Pid |_]}) when is_pid(Pid) -> - tls_dtls_gen_connection:renegotiation(Pid); -renegotiate(#sslsocket{pid = {dtls,_}}) -> - {error, enotconn}; -renegotiate(#sslsocket{pid = {_Listen, #config{}}}) -> +renegotiate(#sslsocket{connection_handler = Controller, + connection_cb = dtls_gen_connection}) when is_pid(Controller) -> + tls_dtls_gen_connection:renegotiation(Controller); +renegotiate(#sslsocket{listener_config = #config{}}) -> {error, enotconn}. %%--------------------------------------------------------------- @@ -3396,10 +3444,12 @@ reading and writing keys are updated. %% %% Description: Initiate a key update. %%-------------------------------------------------------------------- -update_keys(#sslsocket{pid = [Pid, Sender |_]}, Type0) when is_pid(Pid) andalso - is_pid(Sender) andalso - (Type0 =:= write orelse - Type0 =:= read_write) -> +update_keys(#sslsocket{connection_handler = Controller, + payload_sender = Sender, + connection_cb = tls_gen_connection}, Type0) when is_pid(Controller) andalso + is_pid(Sender) andalso + (Type0 =:= write orelse + Type0 =:= read_write) -> Type = case Type0 of write -> update_not_requested; @@ -3423,9 +3473,9 @@ update_keys(_, Type) -> WantedLengths :: [non_neg_integer()], ExportKeyMaterials :: [binary()]. %%-------------------------------------------------------------------- -export_key_materials(#sslsocket{pid = [Pid|_]}, Labels, Contexts, WantedLengths) when is_pid(Pid) -> - ssl_gen_statem:call(Pid, {export_key_materials, Labels, Contexts, WantedLengths, true}); -export_key_materials(#sslsocket{pid = {_Listen, #config{}}}, _,_,_) -> +export_key_materials(#sslsocket{connection_handler = Controller}, Labels, Contexts, WantedLengths) when is_pid(Controller) -> + ssl_gen_statem:call(Controller, {export_key_materials, Labels, Contexts, WantedLengths, true}); +export_key_materials(#sslsocket{listener_config = #config{}}, _,_,_) -> {error, enotconn}. %%-------------------------------------------------------------------- @@ -3439,7 +3489,8 @@ export_key_materials(#sslsocket{pid = {_Listen, #config{}}}, _,_,_) -> WantedLengths :: [non_neg_integer()], ConsumeSecret :: boolean(), ExportKeyMaterials :: [binary()]. --doc """ +-doc +""" Uses a Pseudo-Random Function (PRF prior to TLS-1.3) or a Key Derivation Function (HKDF in TLS-1.3) for a TLS connection to generate and export keying materials. @@ -3453,11 +3504,12 @@ TLS-1.3 `exporter_master_secret` to be consumed, thereby making it unavailable and increasing security. Further attempts to call this function will fail. """. + %%-------------------------------------------------------------------- -export_key_materials(#sslsocket{pid = [Pid|_]}, Labels, Contexts, WantedLengths, ConsumeSecret) - when is_pid(Pid) -> - ssl_gen_statem:call(Pid, {export_key_materials, Labels, Contexts, WantedLengths, ConsumeSecret}); -export_key_materials(#sslsocket{pid = {_Listen, #config{}}}, _,_,_, _) -> +export_key_materials(#sslsocket{connection_handler = Controller}, Labels, Contexts, WantedLengths, ConsumeSecret) + when is_pid(Controller) -> + ssl_gen_statem:call(Controller, {export_key_materials, Labels, Contexts, WantedLengths, ConsumeSecret}); +export_key_materials(#sslsocket{socket_handle ={_Listen, #config{}}}, _,_,_, _) -> {error, enotconn}. %%-------------------------------------------------------------------- @@ -3471,7 +3523,8 @@ export_key_materials(#sslsocket{pid = {_Listen, #config{}}}, _,_,_, _) -> Seed :: [binary() | prf_random()], WantedLength :: non_neg_integer(). %% --doc """ +-doc +""" Uses the Pseudo-Random Function (PRF) of a TLS session to generate extra key material. @@ -3492,16 +3545,16 @@ called in a TLS-1.3 context it will now behave as """. %%-------------------------------------------------------------------- -prf(#sslsocket{pid = [Pid|_]} = Socket, - master_secret, Label, [client_random, server_random], WantedLength) when is_pid(Pid) -> +prf(#sslsocket{connection_handler = Controller} = Socket, + master_secret, Label, [client_random, server_random], WantedLength) when is_pid(Controller) -> case export_key_materials(Socket, [Label], [no_context], [WantedLength], true) of {ok, [KeyMaterial]} -> {ok, KeyMaterial}; Error -> Error end; -prf(#sslsocket{pid = [Pid|_]} = Socket, - master_secret, Label, [client_random, server_random, Context], WantedLength) when is_pid(Pid), +prf(#sslsocket{connection_handler = Controller} = Socket, + master_secret, Label, [client_random, server_random, Context], WantedLength) when is_pid(Controller), is_binary(Context) -> case export_key_materials(Socket, [Label], [Context], [WantedLength], true) of {ok, [KeyMaterial]} -> @@ -3509,7 +3562,7 @@ prf(#sslsocket{pid = [Pid|_]} = Socket, Error -> Error end; -prf(#sslsocket{pid = {_Listen, #config{}}}, _,_,_,_) -> +prf(#sslsocket{listener_config = #config{}}, _,_,_,_) -> {error, enotconn}; %% Legacy backwards compatible clause. This makes no sense, was probably added for %% testing purposes by contributor, but these tests does not really test the correct thing. @@ -3642,7 +3695,8 @@ supported_suites(exclusive_anonymous, Version) when ?TLS_1_X(Version) -> supported_suites(exclusive_anonymous, Version) when ?DTLS_1_X(Version) -> dtls_v1:exclusive_anonymous_suites(Version). -do_listen(Port, #config{transport_info = {Transport, _, _, _,_}} = Config, tls_gen_connection) -> +do_listen(Port, #config{transport_info = Info} = Config, tls_gen_connection) -> + Transport = element(1, Info), tls_socket:listen(Transport, Port, Config); do_listen(Port, Config, dtls_gen_connection) -> @@ -4857,10 +4911,10 @@ validate_certs_or_anon_ciphers(CertsKeys, Ciphers, Versions) -> validate_anon_ciphers(Ciphers, Versions) -> MakeSet = fun(Version, Acc) -> - Set = sets:from_list(ssl_cipher:anonymous_suites(Version), [{version, 2}]), + Set = sets:from_list(ssl_cipher:anonymous_suites(Version)), sets:union(Set, Acc) end, - Anonymous = lists:foldl(MakeSet, sets:new([{version, 2}]), Versions), + Anonymous = lists:foldl(MakeSet, sets:new(), Versions), CiphersSet = sets:from_list(Ciphers, [{version,2}]), case sets:is_disjoint(Anonymous, CiphersSet) of false -> ok; @@ -5181,6 +5235,20 @@ unambiguous_path(Value) -> end, validate_filename(UP, cacertfile). +-compile({inline, encode_packet/2}). +encode_packet(Packet, Data) -> + Len = iolist_size(Data), + case Packet of + 1 when Len < (1 bsl 8) -> [<>|Data]; + 2 when Len < (1 bsl 16) -> [<>|Data]; + 4 when Len < (1 bsl 32) -> [<>|Data]; + N when N =:= 1; N =:= 2; N =:= 4 -> + {error, + {badarg, {packet_to_large, Len, (1 bsl (Packet bsl 3)) - 1}}}; + _ -> + Data + end. + %%%################################################################ %%%# %%%# Tracing diff --git a/lib/ssl/src/ssl_api.hrl b/lib/ssl/src/ssl_api.hrl index f4594912bd52..ded6dcea1be4 100644 --- a/lib/ssl/src/ssl_api.hrl +++ b/lib/ssl/src/ssl_api.hrl @@ -21,7 +21,15 @@ -ifndef(ssl_api). -define(ssl_api, true). -%% Looks like it does for backwards compatibility reasons --record(sslsocket, {fd = nil, pid = nil}). +%% Opaque to the user of ssl application, but +%% is allowed to be matched for equality +-record(sslsocket, {socket_handle, %% Depends on transport module + connection_handler,%% pid() + payload_sender, %% pid() + transport_cb, %% ssl:transport_option() + connection_cb, %% :: tls_gen_connection | dtls_gen_connection + tab, %% ets table + listener_config %% :: #config{} (listen socket) | [pid()] list of trackers + }). -endif. % -ifdef(ssl_api). diff --git a/lib/ssl/src/ssl_connection.hrl b/lib/ssl/src/ssl_connection.hrl index 3e431dcc6043..52ee227657c0 100644 --- a/lib/ssl/src/ssl_connection.hrl +++ b/lib/ssl/src/ssl_connection.hrl @@ -31,11 +31,13 @@ -include("ssl_handshake.hrl"). -include("ssl_srp.hrl"). -include("ssl_cipher.hrl"). +-include("ssl_api.hrl"). -include("ssl_alert.hrl"). -include_lib("public_key/include/public_key.hrl"). -record(static_env, { role :: client | server, + user_socket :: #sslsocket{}, transport_cb :: atom(), % callback module protocol_cb :: tls_gen_connection | dtls_gen_connection, data_tag :: atom(), % ex tcp. @@ -126,6 +128,7 @@ }). -record(state, { + tab :: ets:table(), static_env :: #static_env{}, connection_env :: #connection_env{} | ssl_gen_statem:secret_printout(), ssl_options :: ssl_options(), diff --git a/lib/ssl/src/ssl_gen_statem.erl b/lib/ssl/src/ssl_gen_statem.erl index cd6ba4fdc28f..060b202092bf 100644 --- a/lib/ssl/src/ssl_gen_statem.erl +++ b/lib/ssl/src/ssl_gen_statem.erl @@ -49,8 +49,7 @@ handshake_continue/3, handshake_cancel/1, handle_sni_extension/2, - socket_control/4, - socket_control/5, + socket_control/1, prepare_connection/2]). %% User Events @@ -141,7 +140,7 @@ start_link(Role, Host, Port, Socket, {SslOpts, _, _} = Options, User, CbInfo) -> -spec init(list()) -> no_return(). %% Description: Initialization %%-------------------------------------------------------------------- -init([Role, _Sender, Host, Port, _Socket, {TLSOpts, _, _}, _User, _CbInfo] = InitArgs) -> +init([Role, Sender |[Host, Port, _Socket, {TLSOpts, _, _}, _User, _CbInfo] = InitArgs]) -> process_flag(trap_exit, true), case maps:get(erl_dist, TLSOpts, false) of @@ -149,36 +148,38 @@ init([Role, _Sender, Host, Port, _Socket, {TLSOpts, _, _}, _User, _CbInfo] = In process_flag(priority, max); _ -> ok - end, - + end, + init_label(Role, Host, Port, TLSOpts), + Tab = ets:new(tls_socket, []), - case Role of + case Role of ?CLIENT_ROLE -> case TLSOpts of #{versions := [?TLS_1_3]} -> - tls_client_connection_1_3:init(InitArgs); + tls_client_connection_1_3:init([Role, Sender, Tab|InitArgs]); _ -> - tls_client_connection:init(InitArgs) - end; + tls_client_connection:init([Role, Sender, Tab | InitArgs]) + end; ?SERVER_ROLE -> case TLSOpts of #{versions := [?TLS_1_3]} -> - tls_server_connection_1_3:init(InitArgs); + tls_server_connection_1_3:init([Role, Sender, Tab|InitArgs]); _ -> - tls_server_connection:init(InitArgs) - end + tls_server_connection:init([Role, Sender, Tab|InitArgs]) + end end; -init([Role, Host, Port, _Socket, {DTLSOpts,_,_}, _User, _CbInfo] = InitArgs) -> +init([Role | [Host, Port, _Socket, {DTLSOpts,_,_}, _User, _CbInfo] = InitArgs]) -> process_flag(trap_exit, true), init_label(Role, Host, Port, DTLSOpts), + Tab = ets:new(tls_socket, []), case Role of ?CLIENT_ROLE -> - dtls_client_connection:init(InitArgs); + dtls_client_connection:init([Role, Tab|InitArgs]); ?SERVER_ROLE -> - dtls_server_connection:init(InitArgs) + dtls_server_connection:init([Role, Tab|InitArgs]) end. init_label(?CLIENT_ROLE = Role, Host, _, Options) -> @@ -311,7 +312,7 @@ handshake(Connection, Port, Socket, Opts, User, CbInfo, Timeout) -> %% %% Description: Starts ssl handshake. %%-------------------------------------------------------------------- -handshake(#sslsocket{pid = [Pid|_]} = Socket, Timeout) -> +handshake(#sslsocket{connection_handler = Pid} = Socket, Timeout) -> case call(Pid, {start, Timeout}) of connected -> {ok, Socket}; @@ -327,7 +328,7 @@ handshake(#sslsocket{pid = [Pid|_]} = Socket, Timeout) -> %% %% Description: Starts ssl handshake with some new options %%-------------------------------------------------------------------- -handshake(#sslsocket{pid = [Pid|_]} = Socket, SslOptions, Timeout) -> +handshake(#sslsocket{connection_handler = Pid} = Socket, SslOptions, Timeout) -> case call(Pid, {start, SslOptions, Timeout}) of connected -> {ok, Socket}; @@ -341,7 +342,7 @@ handshake(#sslsocket{pid = [Pid|_]} = Socket, SslOptions, Timeout) -> %% %% Description: Continues handshake with new options %%-------------------------------------------------------------------- -handshake_continue(#sslsocket{pid = [Pid|_]} = Socket, SslOptions, Timeout) -> +handshake_continue(#sslsocket{connection_handler = Pid} = Socket, SslOptions, Timeout) -> case call(Pid, {handshake_continue, SslOptions, Timeout}) of connected -> {ok, Socket}; @@ -353,7 +354,7 @@ handshake_continue(#sslsocket{pid = [Pid|_]} = Socket, SslOptions, Timeout) -> %% %% Description: Cancels connection %%-------------------------------------------------------------------- -handshake_cancel(#sslsocket{pid = [Pid|_]}) -> +handshake_cancel(#sslsocket{connection_handler = Pid}) -> case call(Pid, cancel) of closed -> ok; @@ -361,37 +362,33 @@ handshake_cancel(#sslsocket{pid = [Pid|_]}) -> Error end. %-------------------------------------------------------------------- --spec socket_control(tls_gen_connection | dtls_gen_connection, port(), [pid()], atom()) -> - {ok, #sslsocket{}} | {error, ssl:reason()}. -%% -%% Description: Set the ssl process to own the accept socket -%%-------------------------------------------------------------------- -socket_control(Connection, Socket, Pid, Transport) -> - socket_control(Connection, Socket, Pid, Transport, undefined). -%-------------------------------------------------------------------- --spec socket_control(tls_gen_connection | dtls_gen_connection, port(), [pid()], atom(), [pid()] | atom()) -> - {ok, #sslsocket{}} | {error, ssl:reason()}. -%%-------------------------------------------------------------------- -socket_control(dtls_gen_connection, Socket, Pids, Transport, udp_listener) -> - %% dtls listener process must have the socket control - {ok, dtls_gen_connection:socket(Pids, Transport, Socket, undefined)}; +-spec socket_control(#sslsocket{}) -> + {ok, #sslsocket{}} | {error, ssl:reason()}. -socket_control(tls_gen_connection, Socket, [Pid|_] = Pids, Transport, Trackers) -> +socket_control(#sslsocket{connection_cb = dtls_gen_connection, + listener_config = Config} = SslSocket) + when Config =/= undefined -> + %% dtls listener process must have the socket control + {ok, SslSocket}; +socket_control(#sslsocket{connection_cb = dtls_gen_connection, + transport_cb = Transport, + socket_handle = {_, Socket}, + connection_handler = Pid} = SslSocket) -> case Transport:controlling_process(Socket, Pid) of - ok -> - {ok, tls_gen_connection:socket(Pids, Transport, Socket, Trackers)}; - {error, Reason} -> - {error, Reason} + ok -> + {ok, SslSocket}; + {error, Reason} -> + {error, Reason} end; -socket_control(dtls_gen_connection, {PeerAddrPort, Socket}, - [Pid|_] = Pids, Transport, Trackers) -> +socket_control(#sslsocket{transport_cb = Transport, + socket_handle = Socket, + connection_handler = Pid} = SslSocket) -> case Transport:controlling_process(Socket, Pid) of - ok -> - {ok, dtls_gen_connection:socket(Pids, Transport, {PeerAddrPort, Socket}, - Trackers)}; - {error, Reason} -> - {error, Reason} + ok -> + {ok, SslSocket}; + {error, Reason} -> + {error, Reason} end. prepare_connection(#state{handshake_env = #handshake_env{renegotiation = Renegotiate}, @@ -598,14 +595,11 @@ connection({call, From}, negotiated_protocol, connection({call, From}, {close,{_NewController, _Timeout}}, #state{static_env = #static_env{role = Role, - socket = Socket, - trackers = Trackers, - transport_cb = Transport, + user_socket = UserSocket, protocol_cb = Connection}, connection_env = #connection_env{socket_tls_closed = #alert{} = Alert} } = State) -> - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, From, Alert, Role, ?STATE(connection), Connection), + alert_user(UserSocket, From, Alert, Role, ?STATE(connection), Connection), {stop, {shutdown, normal}, State}; connection({call, From}, {close,{NewController, Timeout}}, @@ -842,21 +836,19 @@ handle_call({get_opts, OptTags}, From, _, OptsReply = get_socket_opts(Connection, Transport, Socket, OptTags, SockOpts, []), {keep_state_and_data, [{reply, From, OptsReply}]}; handle_call({set_opts, Opts0}, From, StateName, - #state{static_env = #static_env{protocol_cb = Connection, + #state{static_env = #static_env{user_socket = UserSocket, + protocol_cb = Connection, socket = Socket, - transport_cb = Transport, - trackers = Trackers}, + transport_cb = Transport}, connection_env = #connection_env{user_application = {_Mon, Pid}}, - socket_options = Opts1 + socket_options = Opts1, + tab = Tab } = State0) -> - {Reply, Opts} = set_socket_opts(Connection, Transport, Socket, Opts0, Opts1, []), + {Reply, Opts} = set_socket_opts(Connection, Transport, Socket, Tab, Opts0, Opts1, []), case {proplists:lookup(active, Opts0), Opts} of {{_, N}, #socket_options{active=false}} when is_integer(N) -> - send_user( - Pid, - format_passive( - Connection:pids(State0), Transport, Socket, Trackers, Connection)); + send_user(Pid,{ssl_passive,UserSocket}); _ -> ok end, @@ -874,9 +866,8 @@ handle_info({ErrorTag, Socket, econnaborted}, StateName, host = Host, port = Port, socket = Socket, - transport_cb = Transport, + user_socket = UserSocket, error_tag = ErrorTag, - trackers = Trackers, protocol_cb = Connection}, handshake_env = #handshake_env{renegotiation = Type}, connection_env = #connection_env{negotiated_version = Version}, @@ -884,9 +875,7 @@ handle_info({ErrorTag, Socket, econnaborted}, StateName, recv = #recv{from = StartFrom} } = State) when StateName =/= connection -> maybe_invalidate_session(Version, Type, Role, Host, Port, Session), - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, - StartFrom, ?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), Role, StateName, Connection), + alert_user(UserSocket, StartFrom, ?ALERT_REC(?FATAL, ?CLOSE_NOTIFY), Role, StateName, Connection), {stop, {shutdown, normal}, State}; handle_info({ErrorTag, Socket, Reason}, StateName, #state{static_env = #static_env{ @@ -968,15 +957,12 @@ read_application_data(Data, end. passive_receive(#state{static_env = #static_env{role = Role, - socket = Socket, - trackers = Trackers, - transport_cb = Transport, + user_socket = UserSocket, protocol_cb = Connection}, recv = #recv{from = RecvFrom}, connection_env = #connection_env{socket_tls_closed = #alert{} = Alert}} = State, StateName, _) -> - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, RecvFrom, Alert, Role, StateName, Connection), + alert_user(UserSocket, RecvFrom, Alert, Role, StateName, Connection), {stop, {shutdown, normal}, State}; passive_receive(#state{user_data_buffer = {Front,BufferSize,Rear}, %% Assert! Erl distribution uses active sockets @@ -1038,29 +1024,25 @@ handle_own_alert(Alert0, StateName, end, {stop, {shutdown, own_alert}, State}. -handle_normal_shutdown(Alert, StateName, #state{static_env = #static_env{role = Role, - socket = Socket, - transport_cb = Transport, - protocol_cb = Connection, - trackers = Trackers}, - handshake_env = #handshake_env{renegotiation = {false, first}}, - recv = #recv{from = StartFrom} - } = State) -> - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, StartFrom, Alert, Role, StateName, Connection); - -handle_normal_shutdown(Alert, StateName, #state{static_env = #static_env{role = Role, - socket = Socket, - transport_cb = Transport, - protocol_cb = Connection, - trackers = Trackers}, - connection_env = #connection_env{user_application = {_Mon, Pid}}, - handshake_env = #handshake_env{renegotiation = Type}, - socket_options = Opts, - recv = #recv{from = RecvFrom} - } = State) -> - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, Type, Opts, Pid, RecvFrom, Alert, Role, StateName, Connection). +handle_normal_shutdown(Alert, StateName, + #state{static_env = #static_env{role = Role, + user_socket = UserSocket, + protocol_cb = Connection}, + handshake_env = #handshake_env{renegotiation = {false, first}}, + recv = #recv{from = StartFrom} + }) -> + alert_user(UserSocket, StartFrom, Alert, Role, StateName, Connection); + +handle_normal_shutdown(Alert, StateName, + #state{static_env = #static_env{role = Role, + user_socket = UserSocket, + protocol_cb = Connection}, + connection_env = #connection_env{user_application = {_Mon, Pid}}, + handshake_env = #handshake_env{renegotiation = Type}, + socket_options = Opts, + recv = #recv{from = RecvFrom} + }) -> + alert_user(UserSocket, Type, Opts, Pid, RecvFrom, Alert, Role, StateName, Connection). handle_alert(#alert{level = ?FATAL} = Alert, StateName, State) -> handle_fatal_alert(Alert, StateName, State); @@ -1159,11 +1141,9 @@ handle_alert(Alert, StateName, State) -> handle_fatal_alert(Alert0, StateName, #state{static_env = #static_env{role = Role, - socket = Socket, + user_socket = UserSocket, host = Host, port = Port, - trackers = Trackers, - transport_cb = Transport, protocol_cb = Connection}, connection_env = #connection_env{user_application = {_Mon, Pid}}, ssl_options = #{log_level := LogLevel}, @@ -1174,8 +1154,7 @@ handle_fatal_alert(Alert0, StateName, Alert = Alert0#alert{role = opposite_role(Role)}, log_alert(LogLevel, Role, Connection:protocol_name(), StateName, Alert), - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, StateName, Opts, Pid, From, Alert, Role, StateName, Connection), + alert_user(UserSocket, StateName, Opts, Pid, From, Alert, Role, StateName, Connection), {stop, {shutdown, normal}, State}. handle_trusted_certs_db(#state{ssl_options =#{cacerts := []} = Opts}) @@ -1419,15 +1398,12 @@ handle_active_option(_, connection = StateName, To, Reply, {stop_and_reply,{shutdown, peer_close}, [{reply, To, Reply}]}; handle_active_option(_, connection = StateName, To, _Reply, #state{static_env = #static_env{role = Role, - socket = Socket, - trackers = Trackers, - transport_cb = Transport, + user_socket = UserSocket, protocol_cb = Connection}, connection_env = #connection_env{socket_tls_closed = Alert = #alert{}}, user_data_buffer = {_,0,_}} = State) -> - Pids = Connection:pids(State), - alert_user(Pids, Transport, Trackers, Socket, To, Alert, Role, StateName, Connection), + alert_user(UserSocket, To, Alert, Role, StateName, Connection), {stop, {shutdown, normal}, State}; handle_active_option(_, connection = StateName0, To, Reply, #state{static_env = #static_env{protocol_cb = Connection}, @@ -1532,18 +1508,10 @@ read_application_data_bin(State, Front0, BufferSize0, Rear0, SocketOpts0, RecvFr {error,_Reason} -> %% Invalid packet in packet mode #state{ - static_env = - #static_env{ - socket = Socket, - protocol_cb = Connection, - transport_cb = Transport, - trackers = Trackers}, - connection_env = - #connection_env{user_application = {_Mon, Pid}}} = State, + static_env = #static_env{user_socket = UserSocket}, + connection_env = #connection_env{user_application = {_Mon, Pid}}} = State, Buffer = iolist_to_binary([Bin0,Front0|lists:reverse(Rear0)]), - deliver_packet_error( - Connection:pids(State), Transport, Socket, SocketOpts0, - Buffer, Pid, RecvFrom, Trackers, Connection), + deliver_packet_error(UserSocket, SocketOpts0, Buffer, Pid, RecvFrom), {stop, {shutdown, normal}, State#state{socket_options = SocketOpts0, recv = State#state.recv#recv{from = RecvFrom, @@ -1553,17 +1521,9 @@ read_application_data_bin(State, Front0, BufferSize0, Rear0, SocketOpts0, RecvFr read_application_data_deliver(State, Front, BufferSize, Rear, SocketOpts0, RecvFrom, Data) -> #state{ - static_env = - #static_env{ - socket = Socket, - protocol_cb = Connection, - transport_cb = Transport, - trackers = Trackers}, - connection_env = - #connection_env{user_application = {_Mon, Pid}}} = State, - SocketOpts = - deliver_app_data( - Connection:pids(State), Transport, Socket, SocketOpts0, Data, Pid, RecvFrom, Trackers, Connection), + static_env = #static_env{user_socket = UserSocket}, + connection_env = #connection_env{user_application = {_Mon, Pid}}} = State, + SocketOpts = deliver_app_data(UserSocket, SocketOpts0, Data, Pid, RecvFrom), if SocketOpts#socket_options.active =:= false -> %% Passive mode, wait for active once or recv @@ -1751,12 +1711,10 @@ decode_packet(Type, Buffer, PacketOpts) -> %% Note that if the user has explicitly configured the socket to expect %% HTTP headers using the {packet, httph} option, we don't do any automatic %% switching of states. -deliver_app_data(CPids, Transport, Socket, - #socket_options{active=Active, packet=Type} = SOpts, - Data, Pid, From, Trackers, Connection) -> +deliver_app_data(UserSocket, #socket_options{active=Active, packet=Type} = SOpts, + Data, Pid, From) -> send_or_reply(Active, Pid, From, - format_reply(CPids, Transport, Socket, - SOpts, Data, Trackers, Connection)), + format_reply(UserSocket, SOpts, Data)), SO = case Data of {P, _, _, _} @@ -1774,9 +1732,7 @@ deliver_app_data(CPids, Transport, Socket, once -> SO#socket_options{active=false}; 1 -> - send_user(Pid, - format_passive(CPids, Transport, - Socket, Trackers, Connection)), + send_user(Pid, {ssl_passive, UserSocket}), SO#socket_options{active=false}; N when is_integer(N) -> SO#socket_options{active=N - 1}; @@ -1784,24 +1740,20 @@ deliver_app_data(CPids, Transport, Socket, SO end. -format_reply(_, _, _,#socket_options{active = false, mode = Mode, packet = Packet, - header = Header}, Data, _, _) -> +format_reply(_UserSocket, #socket_options{active = false, mode = Mode, packet = Packet, + header = Header}, Data) -> {ok, do_format_reply(Mode, Packet, Header, Data)}; -format_reply(CPids, Transport, Socket, #socket_options{active = _, mode = Mode, packet = Packet, - header = Header}, Data, Trackers, Connection) -> - {ssl, Connection:socket(CPids, Transport, Socket, Trackers), - do_format_reply(Mode, Packet, Header, Data)}. +format_reply(UserSocket, #socket_options{active = _, mode = Mode, packet = Packet, header = Header}, + Data) -> + {ssl, UserSocket, do_format_reply(Mode, Packet, Header, Data)}. -deliver_packet_error(CPids, Transport, Socket, - SO= #socket_options{active = Active}, Data, Pid, From, Trackers, Connection) -> - send_or_reply(Active, Pid, From, format_packet_error(CPids, - Transport, Socket, SO, Data, Trackers, Connection)). +deliver_packet_error(UserSocket, SO= #socket_options{active = Active}, Data, Pid, From) -> + send_or_reply(Active, Pid, From, format_packet_error(UserSocket, SO, Data)). -format_packet_error(_, _, _,#socket_options{active = false, mode = Mode}, Data, _, _) -> +format_packet_error(_, #socket_options{active = false, mode = Mode}, Data) -> {error, {invalid_packet, do_format_reply(Mode, raw, 0, Data)}}; -format_packet_error(CPids, Transport, Socket, #socket_options{active = _, mode = Mode}, - Data, Trackers, Connection) -> - {ssl_error, Connection:socket(CPids, Transport, Socket, Trackers), +format_packet_error(UserSocket, #socket_options{active = _, mode = Mode}, Data) -> + {ssl_error, UserSocket, {invalid_packet, do_format_reply(Mode, raw, 0, Data)}}. do_format_reply(binary, _, N, Data) when N > 0 -> % Header mode @@ -1816,9 +1768,6 @@ do_format_reply(list, Packet, _, Data) do_format_reply(list, _,_, Data) -> binary_to_list(Data). -format_passive(CPids, Transport, Socket, Trackers, Connection) -> - {ssl_passive, Connection:socket(CPids, Transport, Socket, Trackers)}. - header(0, <<>>) -> <<>>; header(_, <<>>) -> @@ -1842,30 +1791,29 @@ send_user(Pid, Msg) -> Pid ! Msg, ok. -alert_user(Pids, Transport, Trackers, Socket, _, Opts, Pid, From, Alert, Role, connection = StateName, Connection) -> - alert_user(Pids, Transport, Trackers, Socket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection); -alert_user(Pids, Transport, Trackers, Socket, {true, internal}, Opts, Pid, From, Alert, Role, StateName, Connection) -> - alert_user(Pids, Transport, Trackers, Socket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection); -alert_user(Pids, Transport, Trackers, Socket, _, _, _, From, Alert, Role, StateName, Connection) -> - alert_user(Pids, Transport, Trackers, Socket, From, Alert, Role, StateName, Connection). +alert_user(UserSocket, _, Opts, Pid, From, Alert, Role, connection = StateName, Connection) -> + alert_user(UserSocket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection); +alert_user(UserSocket, {true, internal}, Opts, Pid, From, Alert, Role, StateName, Connection) -> + alert_user(UserSocket, Opts#socket_options.active, Pid, From, Alert, Role, StateName, Connection); +alert_user(UserSocket, _, _, _, From, Alert, Role, StateName, Connection) -> + alert_user(UserSocket, From, Alert, Role, StateName, Connection). -alert_user(Pids, Transport, Trackers, Socket, From, Alert, Role, StateName, Connection) -> - alert_user(Pids, Transport, Trackers, Socket, false, no_pid, From, Alert, Role, StateName, Connection). +alert_user(UserSocket, From, Alert, Role, StateName, Connection) -> + alert_user(UserSocket, false, no_pid, From, Alert, Role, StateName, Connection). -alert_user(_, _, _, _, false = Active, Pid, From, Alert, Role, StateName, Connection) when From =/= undefined -> +alert_user(_UserSocket, false = Active, Pid, From, Alert, Role, StateName, Connection) + when From =/= undefined -> %% If there is an outstanding handshake | recv %% From will be defined and send_or_reply will %% send the appropriate error message. ReasonCode = ssl_alert:reason_code(Alert, Role, Connection:protocol_name(), StateName), send_or_reply(Active, Pid, From, {error, ReasonCode}); -alert_user(Pids, Transport, Trackers, Socket, Active, Pid, From, Alert, Role, StateName, Connection) -> +alert_user(UserSocket, Active, Pid, From, Alert, Role, StateName, Connection) -> case ssl_alert:reason_code(Alert, Role, Connection:protocol_name(), StateName) of closed -> - send_or_reply(Active, Pid, From, - {ssl_closed, Connection:socket(Pids, Transport, Socket, Trackers)}); + send_or_reply(Active, Pid, From, {ssl_closed, UserSocket}); ReasonCode -> - send_or_reply(Active, Pid, From, - {ssl_error, Connection:socket(Pids, Transport, Socket, Trackers), ReasonCode}) + send_or_reply(Active, Pid, From, {ssl_error, UserSocket, ReasonCode}) end. log_alert(Level, Role, ProtocolName, StateName, #alert{role = Role} = Alert) -> @@ -1976,7 +1924,7 @@ security_info(#state{connection_states = ConnectionStates, server_handshake_traffic_secret := ServerHSTrafficSecret} -> [{client_handshake_traffic_secret, ClientHSTrafficSecret}, {server_handshake_traffic_secret, ServerHSTrafficSecret}]; - _ -> + _ -> [] end ++ BaseSecurityInfo end. @@ -2019,9 +1967,9 @@ get_socket_opts(Connection, Transport, Socket, [Tag | Tags], SockOpts, Acc) -> get_socket_opts(_,_, _,Opts, _,_) -> {error, {options, {socket_options, Opts, function_clause}}}. -set_socket_opts(_,_,_, [], SockOpts, []) -> +set_socket_opts(_,_,_, _Tab, [], SockOpts, []) -> {ok, SockOpts}; -set_socket_opts(ConnectionCb, Transport, Socket, [], SockOpts, Other) -> +set_socket_opts(ConnectionCb, Transport, Socket, _Tab, [], SockOpts, Other) -> %% Set non emulated options try ConnectionCb:setopts(Transport, Socket, Other) of ok -> @@ -2034,11 +1982,11 @@ set_socket_opts(ConnectionCb, Transport, Socket, [], SockOpts, Other) -> {{error, {options, {socket_options, Other, Error}}}, SockOpts} end; -set_socket_opts(ConnectionCb, Transport, Socket, [{active, Active}| Opts], SockOpts, Other) +set_socket_opts(ConnectionCb, Transport, Socket, Tab, [{active, Active}| Opts], SockOpts, Other) when Active == once; Active == true; Active == false -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, + set_socket_opts(ConnectionCb, Transport, Socket, Tab, Opts, SockOpts#socket_options{active = Active}, Other); -set_socket_opts(ConnectionCb, Transport, Socket, [{active, Active1} = Opt| Opts], +set_socket_opts(ConnectionCb, Transport, Socket, Tab, [{active, Active1} = Opt| Opts], SockOpts=#socket_options{active = Active0}, Other) when Active1 >= -32768, Active1 =< 32767 -> Active = if @@ -2059,19 +2007,19 @@ set_socket_opts(ConnectionCb, Transport, Socket, [{active, Active1} = Opt| Opts] error -> {{error, {options, {socket_options, Opt}} }, SockOpts}; _ -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, + set_socket_opts(ConnectionCb, Transport, Socket, Tab, Opts, SockOpts#socket_options{active = Active}, Other) end; -set_socket_opts(_,_, _, [{active, _} = Opt| _], SockOpts, _) -> +set_socket_opts(_,_, _, _Tab, [{active, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}} }, SockOpts}; -set_socket_opts(ConnectionCb, Transport,Socket, [{mode, Mode}| Opts], SockOpts, Other) +set_socket_opts(ConnectionCb, Transport, Socket, Tab, [{mode, Mode}| Opts], SockOpts, Other) when Mode == list; Mode == binary -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, + set_socket_opts(ConnectionCb, Transport, Socket, Tab, Opts, SockOpts#socket_options{mode = Mode}, Other); -set_socket_opts(_, _, _, [{mode, _} = Opt| _], SockOpts, _) -> +set_socket_opts(_, _, _, _Tab, [{mode, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(ConnectionCb, Transport,Socket, [{packet, Packet}| Opts], SockOpts, Other) +set_socket_opts(tls_gen_connection, Transport, Socket, Tab, [{packet, Packet}| Opts], SockOpts, Other) when Packet == raw; Packet == 0; Packet == 1; @@ -2087,30 +2035,30 @@ set_socket_opts(ConnectionCb, Transport,Socket, [{packet, Packet}| Opts], SockOp Packet == httph; Packet == http_bin; Packet == httph_bin -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, + true = ets:insert(Tab, {{socket_options, packet}, Packet}), + set_socket_opts(tls_gen_connection, Transport, Socket, Tab, Opts, SockOpts#socket_options{packet = Packet}, Other); -set_socket_opts(_, _, _, [{packet, _} = Opt| _], SockOpts, _) -> +set_socket_opts(_, _, _, _Tab, [{packet, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(ConnectionCb, Transport, Socket, [{header, Header}| Opts], SockOpts, Other) +set_socket_opts(tls_gen_connection, Transport, Socket, Tab, [{header, Header}| Opts], SockOpts, Other) when is_integer(Header) -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, + set_socket_opts(tls_gen_connection, Transport, Socket, Tab, Opts, SockOpts#socket_options{header = Header}, Other); -set_socket_opts(_, _, _, [{header, _} = Opt| _], SockOpts, _) -> +set_socket_opts(_, _, _, _Tab, [{header, _} = Opt| _], SockOpts, _) -> {{error,{options, {socket_options, Opt}}}, SockOpts}; -set_socket_opts(ConnectionCb, Transport,Socket, [{packet_size, Size}| Opts], SockOpts, Other) when is_integer(Size) -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, - SockOpts#socket_options{packet_size = Size}, Other); -set_socket_opts(_,_, _, [{packet_size, _} = Opt| _], SockOpts, _) -> +set_socket_opts(tls_gen_connection, Transport,Socket, Tab, [{packet_size, Size}| Opts], SockOpts, Other) + when is_integer(Size) -> + set_socket_opts(tls_gen_connection, Transport, Socket, Tab, Opts, + SockOpts#socket_options{packet_size = Size}, Other); +set_socket_opts(_,_, _, _Tab, [{packet_size, _} = Opt| _], SockOpts, _) -> {{error, {options, {socket_options, Opt}} }, SockOpts}; -set_socket_opts(ConnectionCb, Transport, Socket, [Opt | Opts], SockOpts, Other) -> - set_socket_opts(ConnectionCb, Transport, Socket, Opts, SockOpts, [Opt | Other]). +set_socket_opts(ConnectionCb, Transport, Socket, Tab, [Opt | Opts], SockOpts, Other) -> + set_socket_opts(ConnectionCb, Transport, Socket, Tab, Opts, SockOpts, [Opt | Other]). ssl_options_list(SslOptions) -> L = maps:to_list(SslOptions), ssl_options_list(L, []). - - ssl_options_list([], Acc) -> lists:reverse(Acc); %% Skip internal options, only return user options @@ -2124,14 +2072,14 @@ ssl_options_list([{max_fragment_length, _}|T], Acc) -> %% skip max_fragment_length from options since it is taken above from connection_states ssl_options_list(T, Acc); ssl_options_list([{ciphers = Key, Value}|T], Acc) -> - ssl_options_list(T, - [{Key, lists:map( - fun(Suite) -> - ssl_cipher_format:suite_bin_to_map(Suite) - end, Value)} + ssl_options_list(T, + [{Key, lists:map( + fun(Suite) -> + ssl_cipher_format:suite_bin_to_map(Suite) + end, Value)} | Acc]); ssl_options_list([{Key, Value}|T], Acc) -> - ssl_options_list(T, [{Key, Value} | Acc]). + ssl_options_list(T, [{Key, Value} | Acc]). %% Maybe add NSS keylog info according to %% https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format @@ -2176,7 +2124,7 @@ maybe_add_keylog({_, 'tlsv1.3'}, Info) -> {client_early_data_secret, EarlySecret} -> ClientEarlySecret = keylog_secret(EarlySecret, Prf), [io_lib:format("CLIENT_EARLY_TRAFFIC_SECRET ~64.16.0B ", [ClientRandom]) ++ ClientEarlySecret - | Keylog0]; + | Keylog0]; _ -> Keylog0 end, @@ -2213,10 +2161,10 @@ keylog_secret(SecretBin, sha512) -> %%%# Tracing %%%# handle_trace(api, - {call, {?MODULE, connect, [Connection | _]}}, Stack0) -> + {call, {?MODULE, connect, [Connection | _]}}, Stack0) -> {io_lib:format("Connection = ~w", [Connection]), Stack0}; handle_trace(rle, - {call, {?MODULE, init, Args = [[Role | _]]}}, Stack0) -> + {call, {?MODULE, init, Args = [[Role | _]]}}, Stack0) -> {io_lib:format("(*~w) Args = ~W", [Role, Args, 3]), [{role, Role} | Stack0]}; handle_trace(hbn, {call, {?MODULE, hibernate_after, diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl index 538e272d9bae..f75f78289dd2 100644 --- a/lib/ssl/src/ssl_internal.hrl +++ b/lib/ssl/src/ssl_internal.hrl @@ -148,12 +148,12 @@ -record(config, {ssl, %% SSL parameters inet_user, %% User set inet options - emulated, %% Emulated option list or - trackers, - dtls_handler, + emulated, %% Emulated option list or + trackers, inet_ssl, %% inet options for internal ssl socket - transport_info, %% Callback info - connection_cb + transport_info, %% Callback info + connection_cb, + tab }). -type state_name() :: hello | abbreviated | certify | cipher | connection. diff --git a/lib/ssl/src/ssl_logger.erl b/lib/ssl/src/ssl_logger.erl index e65037012c9d..ab1bf27b2c38 100644 --- a/lib/ssl/src/ssl_logger.erl +++ b/lib/ssl/src/ssl_logger.erl @@ -47,11 +47,11 @@ log(Level, LogLevel, ReportMap, Meta) -> case logger:compare_levels(LogLevel, Level) of lt -> - logger:log(Level, ReportMap, Meta#{depth => ?DEPTH, - report_cb => fun ?MODULE:format/1}); + logger:log(Level, maps:merge(ReportMap, Meta), + Meta#{depth => ?DEPTH, report_cb => fun ?MODULE:format/1}); eq -> - logger:log(Level, ReportMap, Meta#{depth => ?DEPTH, - report_cb => fun ?MODULE:format/1}); + logger:log(Level, maps:merge(ReportMap, Meta), + Meta#{depth => ?DEPTH, report_cb => fun ?MODULE:format/1}); _ -> ok end. @@ -99,11 +99,15 @@ format(#{alert := Alert, alerter := ignored} = Report) -> %% Happens in DTLS {Fmt, Args} = ssl_alert:own_alert_format(ProtocolName, Role, StateName, Alert), {"~s " ++ Fmt, ["Ignored alert to mitigate DoS attacks", Args]}; +format(#{description := Desc, reason := Reason, file := Mod, line := Line}) -> + {"~12s ~p~n" + "~12s ~p~n" + "~12s ~s:~w~n", + ["Description:", Desc, "Reason:", Reason, "Location:", Mod, Line] + }; format(#{description := Desc, reason := Reason}) -> - {"~12s ~p" - "~n" - "~12s ~p" - "~n", + {"~12s ~p~n" + "~12s ~p~n", ["Description:", Desc, "Reason:", Reason] }. diff --git a/lib/ssl/src/ssl_trace.erl b/lib/ssl/src/ssl_trace.erl index 7d5d951c98dc..38650092b17b 100644 --- a/lib/ssl/src/ssl_trace.erl +++ b/lib/ssl/src/ssl_trace.erl @@ -432,7 +432,7 @@ trace_profiles() -> {dtls_server_connection, [{initial_hello, 3}]}, {tls_gen_connection, - [{start_connection_tree, 5}, {socket_control, 6}]} + [{start_connection_tree, 5}, {socket_control, 2}]} ]}, {csp, %% OCSP fun(M, F, A) -> dbg:tpl(M, F, A, x) end, diff --git a/lib/ssl/src/tls_client_connection.erl b/lib/ssl/src/tls_client_connection.erl index c99226f78e09..4e3f2172c155 100644 --- a/lib/ssl/src/tls_client_connection.erl +++ b/lib/ssl/src/tls_client_connection.erl @@ -137,9 +137,11 @@ %% Internal application API %%==================================================================== -init([Role, Sender, Host, Port, Socket, Options, User, CbInfo]) -> - State0 = tls_dtls_gen_connection:initial_state(Role, Sender, Host, Port, +init([Role, Sender, Tab, Host, Port, Socket, Options, User, CbInfo]) -> + State0 = tls_dtls_gen_connection:initial_state(Role, Sender, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State1 = #state{static_env = #static_env{session_cache = Cache, session_cache_cb = CacheCb diff --git a/lib/ssl/src/tls_client_connection_1_3.erl b/lib/ssl/src/tls_client_connection_1_3.erl index f2d1b9e36235..15aaf155a819 100644 --- a/lib/ssl/src/tls_client_connection_1_3.erl +++ b/lib/ssl/src/tls_client_connection_1_3.erl @@ -113,11 +113,13 @@ callback_mode() -> [state_functions, state_enter]. -init([?CLIENT_ROLE, Sender, Host, Port, Socket, Options, User, CbInfo]) -> +init([?CLIENT_ROLE, Sender, Tab, Host, Port, Socket, Options, User, CbInfo]) -> State0 = #state{protocol_specific = Map} = - tls_gen_connection_1_3:initial_state(?CLIENT_ROLE, Sender, + tls_gen_connection_1_3:initial_state(?CLIENT_ROLE, Sender, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options, ?CLIENT_ROLE, State0), @@ -901,19 +903,10 @@ maybe_check_early_data_indication(_, State) -> ssl_record:step_encryption_state_write(State). signal_user_early_data(#state{ - connection_env = - #connection_env{ - user_application = {_, User}}, - static_env = - #static_env{ - socket = Socket, - protocol_cb = Connection, - transport_cb = Transport, - trackers = Trackers}} = State, + connection_env = #connection_env{user_application = {_, User}}, + static_env = #static_env{user_socket = UserSocket}}, Result) -> - CPids = Connection:pids(State), - SslSocket = Connection:socket(CPids, Transport, Socket, Trackers), - User ! {ssl, SslSocket, {early_data, Result}}. + User ! {ssl, UserSocket, {early_data, Result}}. maybe_max_fragment_length(Extensions, State) -> ServerMaxFragEnum = maps:get(max_frag_enum, Extensions, undefined), diff --git a/lib/ssl/src/tls_dtls_gen_connection.erl b/lib/ssl/src/tls_dtls_gen_connection.erl index 879544d076f6..0db2638ae8fb 100644 --- a/lib/ssl/src/tls_dtls_gen_connection.erl +++ b/lib/ssl/src/tls_dtls_gen_connection.erl @@ -46,7 +46,7 @@ is_anonymous/1]). %% Help functions for tls|dtls*_connection.erl --export([initial_state/8, +-export([initial_state/9, negotiated_hashsign/4, finalize_handshake/3, make_premaster_secret/2, @@ -135,7 +135,9 @@ handle_peer_cert_key(_, _, _, State) -> %% Help functions for tls|dtls_connection.erl %%==================================================================== -initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Trackers}, User, + +%% Only called by TLS tls_gen_server and tls_gen_client (no dtls) +initial_state(Role, Sender, Tab, Host, Port, Socket, {SSLOptions, SocketOptions, Trackers}, User, {CbModule, DataTag, CloseTag, ErrorTag, PassiveTag}) -> put(log_level, maps:get(log_level, SSLOptions)), %% Use highest supported version for client/server random nonce generation @@ -146,8 +148,14 @@ initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Trac BeastMitigation), #{session_cb := SessionCacheCb} = ssl_config:pre_1_3_session_opts(Role), UserMonitor = erlang:monitor(process, User), + + SslSocket = tls_socket:socket([self(),Sender], CbModule, Socket, tls_gen_connection, Tab, Trackers), + + true = ets:insert(Tab, {{socket_options, packet}, SocketOptions#socket_options.packet}), + InitStatEnv = #static_env{ role = Role, + user_socket = SslSocket, transport_cb = CbModule, protocol_cb = tls_gen_connection, data_tag = DataTag, @@ -161,6 +169,7 @@ initial_state(Role, Sender, Host, Port, Socket, {SSLOptions, SocketOptions, Trac trackers = Trackers }, #state{ + tab = Tab, static_env = InitStatEnv, handshake_env = #handshake_env{ tls_handshake_history = ssl_handshake:init_handshake_history(), diff --git a/lib/ssl/src/tls_gen_connection.erl b/lib/ssl/src/tls_gen_connection.erl index 5d95d09816dd..ea9760e82dbf 100644 --- a/lib/ssl/src/tls_gen_connection.erl +++ b/lib/ssl/src/tls_gen_connection.erl @@ -25,14 +25,10 @@ -module(tls_gen_connection). -moduledoc false. --include_lib("public_key/include/public_key.hrl"). --include_lib("kernel/include/logger.hrl"). - -include("tls_connection.hrl"). -include("tls_handshake.hrl"). -include("tls_record.hrl"). -include("ssl_alert.hrl"). --include("ssl_api.hrl"). -include("ssl_internal.hrl"). -include("tls_record_1_3.hrl"). @@ -58,8 +54,7 @@ handle_protocol_record/3]). %% Data handling --export([socket/4, - setopts/3, +-export([setopts/3, getopts/3, handle_info/3, gen_info/3]). @@ -77,18 +72,18 @@ %%==================================================================== %% Setup %%==================================================================== -start_fsm(Role, Host, Port, Socket, - {SSLOpts, _, Trackers} = Opts, - User, {CbModule, _, _, _, _} = CbInfo, - Timeout) -> +start_fsm(Role, Host, Port, Socket, {SSLOpts, _, _Trackers} = Opts, + User, CbInfo, Timeout) -> ErlDist = maps:get(erl_dist, SSLOpts, false), SenderSpawnOpts = maps:get(sender_spawn_opts, SSLOpts, []), SenderOptions = handle_sender_options(ErlDist, SenderSpawnOpts), Starter = start_connection_tree(User, ErlDist, SenderOptions, Role, [Host, Port, Socket, Opts, User, CbInfo]), receive - {Starter, SockReceiver, SockSender} -> - socket_control(Socket, SockReceiver, SockSender, CbModule, Trackers, Timeout); + {Starter, {ok, SockReceiver}} -> + receive {SockReceiver, user_socket, UserSocket} -> + socket_control(UserSocket, Timeout) + end; {Starter, Error} -> Error end. @@ -108,20 +103,19 @@ start_connection_tree(User, IsErlDist, SenderOpts, Role, ReceiverOpts) -> {ok, DynSup} -> case tls_dyn_connection_sup:start_child(DynSup, sender, SenderOpts) of {ok, Sender} -> - case tls_dyn_connection_sup:start_child(DynSup, receiver, - [Role, Sender | - ReceiverOpts]) of + Args = [Role, Sender | ReceiverOpts], + case tls_dyn_connection_sup:start_child(DynSup, receiver, Args) of {ok, Receiver} -> - User ! {self(), Receiver, Sender}; - {error, Error} -> + User ! {self(), {ok, Receiver}}; + {error, _} = Error -> User ! {self(), Error}, exit(DynSup, shutdown) end; - {error, Error} -> + {error, _} = Error -> User ! {self(), Error}, exit(DynSup, shutdown) end; - {error, Error} -> + {error, _Error} = Error -> User ! {self(), Error} catch exit:{noproc, _} -> User ! {self(), {error, ssl_not_started}}; @@ -137,9 +131,8 @@ start_dyn_connection_sup(true) -> start_dyn_connection_sup(false) -> tls_connection_sup:start_child([]). -socket_control(Socket, SockReceiver, SockSender, CbModule, Trackers, Timeout) -> - case ssl_gen_statem:socket_control(?MODULE, Socket, [SockReceiver, SockSender], - CbModule, Trackers) of +socket_control(SslSocket, Timeout) -> + case ssl_gen_statem:socket_control(SslSocket) of {ok, SslSocket} -> ssl_gen_statem:handshake(SslSocket, Timeout); Error -> @@ -253,9 +246,6 @@ empty_connection_state(ConnectionEnd) -> %% Data handling %%==================================================================== -socket(Pids, Transport, Socket, Trackers) -> - tls_socket:socket(Pids, Transport, Socket, tls_connection, Trackers). - setopts(Transport, Socket, Other) -> tls_socket:setopts(Transport, Socket, Other). diff --git a/lib/ssl/src/tls_gen_connection_1_3.erl b/lib/ssl/src/tls_gen_connection_1_3.erl index e6e680ab8cfa..d787240ebe69 100644 --- a/lib/ssl/src/tls_gen_connection_1_3.erl +++ b/lib/ssl/src/tls_gen_connection_1_3.erl @@ -31,7 +31,7 @@ % gen_statem state help functions --export([initial_state/8, +-export([initial_state/9, user_hello/3, wait_cert/3, wait_cv/3, @@ -52,7 +52,7 @@ %%-------------------------------------------------------------------- %% Internal API %%-------------------------------------------------------------------- -initial_state(Role, Sender, Host, Port, Socket, +initial_state(Role, Sender, Tab, Host, Port, Socket, {SSLOptions, SocketOptions, Trackers}, User, {CbModule, DataTag, CloseTag, ErrorTag, PassiveTag}) -> put(log_level, maps:get(log_level, SSLOptions)), @@ -64,8 +64,13 @@ initial_state(Role, Sender, Host, Port, Socket, disabled, MaxEarlyDataSize), UserMonitor = erlang:monitor(process, User), + SslSocket = tls_socket:socket([self(),Sender], CbModule, Socket, tls_gen_connection, Tab, Trackers), + + true = ets:insert(Tab, {{socket_options, packet}, SocketOptions#socket_options.packet}), + InitStatEnv = #static_env{ role = Role, + user_socket = SslSocket, transport_cb = CbModule, protocol_cb = tls_gen_connection, data_tag = DataTag, @@ -78,6 +83,7 @@ initial_state(Role, Sender, Host, Port, Socket, trackers = Trackers }, #state{ + tab = Tab, static_env = InitStatEnv, handshake_env = #handshake_env{ tls_handshake_history = diff --git a/lib/ssl/src/tls_sender.erl b/lib/ssl/src/tls_sender.erl index e9fcc6dbcd02..ed0c5215dc92 100644 --- a/lib/ssl/src/tls_sender.erl +++ b/lib/ssl/src/tls_sender.erl @@ -43,7 +43,6 @@ peer_renegotiate/1, downgrade/2, update_connection_state/3, - dist_tls_socket/1, dist_handshake_complete/3]). %% gen_statem callbacks @@ -192,11 +191,7 @@ downgrade(Pid, Timeout) -> dist_handshake_complete(ConnectionPid, Node, DHandle) -> gen_statem:call(ConnectionPid, {dist_handshake_complete, Node, DHandle}). %%-------------------------------------------------------------------- --spec dist_tls_socket(pid()) -> {ok, #sslsocket{}}. -%% Description: To enable distribution startup to get a proper "#sslsocket{}" -%%-------------------------------------------------------------------- -dist_tls_socket(Pid) -> - gen_statem:call(Pid, dist_get_tls_socket). + %%%=================================================================== %%% gen_statem callbacks @@ -275,15 +270,8 @@ init(_, _, _) -> StateData :: term()) -> gen_statem:event_handler_result(atom()). %%-------------------------------------------------------------------- -connection({call, From}, {application_data, AppData}, - #data{static = #static{socket_options = #socket_options{packet = Packet}}} = - StateData) -> - case encode_packet(Packet, AppData) of - {error, _} = Error -> - {next_state, connection, StateData, [{reply, From, Error}]}; - Data -> - send_application_data(Data, From, connection, StateData) - end; +connection({call, From}, {application_data, Data}, StateData) -> + send_application_data(Data, From, connection, StateData); connection({call, From}, {post_handshake_data, HSData}, StateData) -> send_post_handshake_data(HSData, From, connection, StateData); connection({call, From}, {ack_alert, #alert{} = Alert}, StateData0) -> @@ -298,13 +286,6 @@ connection({call, From}, downgrade, #data{connection_states = {next_state, death_row, StateData, [{reply,From, {ok, Write}}]}; connection({call, From}, {set_opts, Opts}, StateData) -> handle_set_opts(connection, From, Opts, StateData); -connection({call, From}, dist_get_tls_socket, - #data{static = #static{transport_cb = Transport, - socket = Socket, - connection_pid = Pid, - trackers = Trackers}} = StateData) -> - TLSSocket = tls_gen_connection:socket([Pid, self()], Transport, Socket, Trackers), - hibernate_after(connection, StateData, [{reply, From, {ok, TLSSocket}}]); connection({call, From}, {dist_handshake_complete, _Node, DHandle}, #data{static = #static{connection_pid = Pid} = Static} = StateData) -> false = erlang:dist_ctrl_set_opt(DHandle, get_size, true), @@ -611,20 +592,6 @@ key_update_at(?TLS_1_3, _, KeyUpdateAt) -> key_update_at(_, _, KeyUpdateAt) -> KeyUpdateAt. --compile({inline, encode_packet/2}). -encode_packet(Packet, Data) -> - Len = iolist_size(Data), - case Packet of - 1 when Len < (1 bsl 8) -> [<>|Data]; - 2 when Len < (1 bsl 16) -> [<>|Data]; - 4 when Len < (1 bsl 32) -> [<>|Data]; - N when N =:= 1; N =:= 2; N =:= 4 -> - {error, - {badarg, {packet_to_large, Len, (1 bsl (Packet bsl 3)) - 1}}}; - _ -> - Data - end. - set_opts(SocketOptions, [{packet, N}]) -> SocketOptions#socket_options{packet = N}. diff --git a/lib/ssl/src/tls_server_connection.erl b/lib/ssl/src/tls_server_connection.erl index 2572824a0790..5f3d80081af2 100644 --- a/lib/ssl/src/tls_server_connection.erl +++ b/lib/ssl/src/tls_server_connection.erl @@ -136,9 +136,11 @@ %% Internal application API %%==================================================================== -init([Role, Sender, Host, Port, Socket, Options, User, CbInfo]) -> - State0 = tls_dtls_gen_connection:initial_state(Role, Sender, Host, Port, Socket, +init([Role, Sender, Tab, Host, Port, Socket, Options, User, CbInfo]) -> + State0 = tls_dtls_gen_connection:initial_state(Role, Sender, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options, Role, State0), tls_gen_connection:initialize_tls_sender(State), diff --git a/lib/ssl/src/tls_server_connection_1_3.erl b/lib/ssl/src/tls_server_connection_1_3.erl index 8801f00b6787..0acc97e2dd7e 100644 --- a/lib/ssl/src/tls_server_connection_1_3.erl +++ b/lib/ssl/src/tls_server_connection_1_3.erl @@ -105,10 +105,12 @@ callback_mode() -> [state_functions, state_enter]. -init([?SERVER_ROLE, Sender, Host, Port, Socket, Options, User, CbInfo]) -> +init([?SERVER_ROLE, Sender, Tab, Host, Port, Socket, Options, User, CbInfo]) -> State0 = #state{protocol_specific = Map} = - tls_gen_connection_1_3:initial_state(?SERVER_ROLE, Sender, + tls_gen_connection_1_3:initial_state(?SERVER_ROLE, Sender, Tab, Host, Port, Socket, Options, User, CbInfo), + #state{static_env = #static_env{user_socket = UserSocket}} = State0, + User ! {self(), user_socket, UserSocket}, try State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options, ?SERVER_ROLE, State0), tls_gen_connection:initialize_tls_sender(State), diff --git a/lib/ssl/src/tls_socket.erl b/lib/ssl/src/tls_socket.erl index ddc911633e11..18f4ea288189 100644 --- a/lib/ssl/src/tls_socket.erl +++ b/lib/ssl/src/tls_socket.erl @@ -29,7 +29,7 @@ -export([send/3, listen/3, accept/3, - socket/5, + socket/6, connect/4, upgrade/3, setopts/3, @@ -91,7 +91,8 @@ listen(Transport, Port, #config{transport_info = {Transport, _, _, _, _}, {ok, SessionIdHandle} = session_id_tracker(ListenSocket, SslOpts), Trackers = [{option_tracker, Tracker}, {session_tickets_tracker, SessionHandler}, {session_id_tracker, SessionIdHandle}], - Socket = #sslsocket{pid = {ListenSocket, Config#config{trackers = Trackers}}}, + Socket = #sslsocket{socket_handle = ListenSocket, + listener_config = Config#config{trackers = Trackers}}, check_active_n(EmOpts, Socket), {ok, Socket}; Err = {error, _} -> @@ -99,7 +100,6 @@ listen(Transport, Port, #config{transport_info = {Transport, _, _, _, _}, end. accept(ListenSocket, #config{transport_info = {Transport,_,_,_,_} = CbInfo, - connection_cb = ConnectionCb, ssl = SslOpts, trackers = Trackers}, Timeout) -> case Transport:accept(ListenSocket, Timeout) of @@ -107,7 +107,7 @@ accept(ListenSocket, #config{transport_info = {Transport,_,_,_,_} = CbInfo, Tracker = proplists:get_value(option_tracker, Trackers), {ok, EmOpts} = get_emulated_opts(Tracker), {ok, Port} = tls_socket:port(Transport, Socket), - start_tls_server_connection(SslOpts, ConnectionCb, Transport, Port, Socket, EmOpts, Trackers, CbInfo); + start_tls_server_connection(SslOpts, Port, Socket, EmOpts, Trackers, CbInfo); {error, Reason} -> {error, Reason} end. @@ -148,18 +148,26 @@ connect(Address, Port, {error, {options, {socket_options, UserOpts}}} end. -socket(Pids, Transport, Socket, ConnectionCb, Trackers) -> - #sslsocket{pid = Pids, - %% "The name "fd" is kept for backwards compatibility - fd = {Transport, Socket, ConnectionCb, Trackers}}. -setopts(gen_tcp, Socket = #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) -> +socket([Receiver, Sender], Transport, Socket, ConnectionCb, Tab, Trackers) -> + #sslsocket{socket_handle = Socket, + connection_handler = Receiver, + payload_sender = Sender, + transport_cb = Transport, + connection_cb = ConnectionCb, + tab = Tab, + listener_config = Trackers}. + +setopts(gen_tcp, Socket = #sslsocket{socket_handle = ListenSocket, + listener_config = #config{trackers = Trackers}}, Options) -> Tracker = proplists:get_value(option_tracker, Trackers), {SockOpts, EmulatedOpts} = split_options(Options), ok = set_emulated_opts(Tracker, EmulatedOpts), check_active_n(EmulatedOpts, Socket), inet:setopts(ListenSocket, SockOpts); -setopts(_, Socket = #sslsocket{pid = {ListenSocket, #config{transport_info = {Transport,_,_,_,_}, - trackers = Trackers}}}, Options) -> +setopts(_, Socket = #sslsocket{socket_handle = ListenSocket, + listener_config = #config{transport_info = Info, + trackers = Trackers}}, Options) -> + Transport = element(1, Info), Tracker = proplists:get_value(option_tracker, Trackers), {SockOpts, EmulatedOpts} = split_options(Options), ok = set_emulated_opts(Tracker, EmulatedOpts), @@ -171,7 +179,7 @@ setopts(gen_tcp, Socket, Options) -> setopts(Transport, Socket, Options) -> Transport:setopts(Socket, Options). -check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {_, #config{trackers = Trackers}}}) -> +check_active_n(EmulatedOpts, Socket = #sslsocket{listener_config = #config{trackers = Trackers}}) -> Tracker = proplists:get_value(option_tracker, Trackers), %% We check the resulting options to send an ssl_passive message if necessary. case proplists:lookup(active, EmulatedOpts) of @@ -197,13 +205,15 @@ check_active_n(EmulatedOpts, Socket = #sslsocket{pid = {_, #config{trackers = Tr ok end. -getopts(gen_tcp, #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) -> +getopts(gen_tcp, #sslsocket{socket_handle = ListenSocket, + listener_config = #config{trackers = Trackers}}, Options) -> Tracker = proplists:get_value(option_tracker, Trackers), {SockOptNames, EmulatedOptNames} = split_options(Options), EmulatedOpts = get_emulated_opts(Tracker, EmulatedOptNames), SocketOpts = get_socket_opts(ListenSocket, SockOptNames, inet), {ok, EmulatedOpts ++ SocketOpts}; -getopts(Transport, #sslsocket{pid = {ListenSocket, #config{trackers = Trackers}}}, Options) -> +getopts(Transport, #sslsocket{socket_handle = ListenSocket, + listener_config = #config{trackers = Trackers}}, Options) -> Tracker = proplists:get_value(option_tracker, Trackers), {SockOptNames, EmulatedOptNames} = split_options(Options), EmulatedOpts = get_emulated_opts(Tracker, EmulatedOptNames), @@ -397,7 +407,7 @@ code_change(_OldVsn, State, _Extra) -> call(Pid, Msg) -> gen_server:call(Pid, Msg, infinity). -start_tls_server_connection(SslOpts, ConnectionCb, Transport, Port, Socket, EmOpts, Trackers, CbInfo) -> +start_tls_server_connection(SslOpts, Port, Socket, EmOpts, Trackers, CbInfo) -> try {ok, DynSup} = tls_connection_sup:start_child([]), SenderOpts = maps:get(sender_spawn_opts, SslOpts, []), @@ -405,7 +415,9 @@ start_tls_server_connection(SslOpts, ConnectionCb, Transport, Port, Socket, EmOp ConnArgs = [server, Sender, "localhost", Port, Socket, {SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Trackers}, self(), CbInfo], {ok, Pid} = tls_dyn_connection_sup:start_child(DynSup, receiver, ConnArgs), - ssl_gen_statem:socket_control(ConnectionCb, Socket, [Pid, Sender], Transport, Trackers) + receive {Pid, user_socket, UserSocket} -> + ssl_gen_statem:socket_control(UserSocket) + end catch error:{badmatch, {error, _} = Error} -> Error diff --git a/lib/ssl/test/dtls_api_SUITE.erl b/lib/ssl/test/dtls_api_SUITE.erl index 5f05eb5f56ca..aecea455c82b 100644 --- a/lib/ssl/test/dtls_api_SUITE.erl +++ b/lib/ssl/test/dtls_api_SUITE.erl @@ -60,6 +60,7 @@ -include("ssl_test_lib.hrl"). -include_lib("ssl/src/ssl_internal.hrl"). +-include_lib("ssl/src/ssl_api.hrl"). %%-------------------------------------------------------------------- %% Common Test interface functions ----------------------------------- @@ -94,8 +95,8 @@ api_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) @@ -169,6 +170,10 @@ dtls_listen_owner_dies(Config) when is_list(Config) -> {ssl, Socket, "from client"} -> ssl:send(Socket, "from server"), ssl:close(Socket) + after 2000 -> + ct:log("GOT WRONG MSG ~p~n", [flush()]), + ct:log("Expected ~p~n", [ {ssl, Socket, "from client"}]), + ct:fail(wrong_msg) end end), {ok, Client} = ssl:connect(Hostname, Port, ClientOpts), @@ -177,6 +182,9 @@ dtls_listen_owner_dies(Config) when is_list(Config) -> receive {ssl, Client, "from server"} -> ssl:close(Client) + after 5000 -> + ct:log("GOT WRONG MSG ~p~n", [flush()]), + ct:fail(wrong_msg) end. dtls_listen_close() -> @@ -430,7 +438,8 @@ client_restarts(Config) -> Msgs = lists:sort(flush()), ReConnect = %% Whitebox re-connect test - fun({sslsocket, {gen_udp,_,dtls_gen_connection}, [Pid]} = Socket, ssl) -> + fun(#sslsocket{connection_cb = dtls_gen_connection, + connection_handler = Pid} = Socket, ssl) -> ?CT_LOG("Client Socket: ~p ~n", [Socket]), {ok, IntSocket} = gen_statem:call(Pid, {downgrade, self()}), {{Address,CPort},UDPSocket}=IntSocket, @@ -478,7 +487,7 @@ flush() -> client_restarts_multiple_acceptors(Config) -> %% Can also be tested with openssl by connecting a client and hit - %% Ctrl-C to kill openssl process, so that the connection is not + %% Ctrl+C to kill openssl process, so that the connection is not %% closed. %% Then do a new openssl connect with the same client port. @@ -514,24 +523,23 @@ client_restarts_multiple_acceptors(Config) -> Msgs = lists:sort(flush()), ReConnect = %% Whitebox re-connect test - fun({sslsocket, {gen_udp,_,dtls_gen_connection}, [Pid]} = Socket, ssl) -> + fun(#sslsocket{connection_cb = dtls_gen_connection, + connection_handler = Pid} = Socket, ssl) -> ?CT_LOG("Client Socket: ~p ~n", [Socket]), {ok, IntSocket} = gen_statem:call(Pid, {downgrade, self()}), {{Address,CPort},UDPSocket}=IntSocket, ?CT_LOG("Info: ~p~n", [inet:info(UDPSocket)]), - {ok, #config{transport_info = CbInfo, connection_cb = ConnectionCb, ssl = SslOpts0}} = ssl:handle_options(ClientOpts, client, Address), SslOpts = {SslOpts0, #socket_options{}, undefined}, - ct:sleep(250), ?CT_LOG("Client second connect: ~p ~p~n", [Socket, CbInfo]), {ok, NewSocket} = ssl_gen_statem:connect(ConnectionCb, Address, CPort, IntSocket, SslOpts, self(), CbInfo, infinity), {replace, NewSocket} end, - + Client0 ! {apply, self(), ReConnect}, receive {apply_res, {replace, Res}} -> diff --git a/lib/ssl/test/openssl_alpn_SUITE.erl b/lib/ssl/test/openssl_alpn_SUITE.erl index 1d0bc82c4e95..838ee8d5a747 100644 --- a/lib/ssl/test/openssl_alpn_SUITE.erl +++ b/lib/ssl/test/openssl_alpn_SUITE.erl @@ -165,8 +165,8 @@ end_per_testcase(_, Config) -> %%-------------------------------------------------------------------- erlang_client_alpn_openssl_server_alpn(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), - ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), AlpnProtocol = <<"spdy/2">>, {Server, OpenSSLPort} = @@ -193,7 +193,7 @@ erlang_client_alpn_openssl_server_alpn(Config) when is_list(Config) -> %%-------------------------------------------------------------------- erlang_server_alpn_openssl_client_alpn(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), Protocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(erlang, [{from, self()}], @@ -222,7 +222,7 @@ erlang_server_alpn_openssl_client_alpn(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_client_alpn_openssl_server(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), Protocol = <<"spdy/2">>, @@ -248,7 +248,7 @@ erlang_client_alpn_openssl_server(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_client_openssl_server_alpn(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), {Server, OpenSSLPort} = ssl_test_lib:start_server(openssl, [{alpn,"spdy/2"}, return_port], @@ -269,7 +269,7 @@ erlang_client_openssl_server_alpn(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_server_alpn_openssl_client(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), Server = ssl_test_lib:start_server(erlang, [{from, self()}], [{server_opts, [{alpn_preferred_protocols, @@ -296,7 +296,7 @@ erlang_server_alpn_openssl_client(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_server_openssl_client_alpn(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), Server = ssl_test_lib:start_server(erlang, [{from, self()}], [{server_opts, [ServerOpts]} | Config]), @@ -324,7 +324,7 @@ erlang_server_openssl_client_alpn(Config) when is_list(Config) -> erlang_client_alpn_openssl_server_alpn_renegotiate(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), AlpnProtocol = <<"spdy/2">>, @@ -361,7 +361,7 @@ erlang_client_alpn_openssl_server_alpn_renegotiate(Config) when is_list(Config) %%-------------------------------------------------------------------- erlang_server_alpn_openssl_client_alpn_renegotiate(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), AlpnProtocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(erlang, [{from, self()}], @@ -398,7 +398,7 @@ erlang_server_alpn_openssl_client_alpn_renegotiate(Config) when is_list(Config) %%-------------------------------------------------------------------- erlang_client_alpn_npn_openssl_server_alpn_npn(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), AlpnProtocol = <<"spdy/2">>, @@ -426,7 +426,7 @@ erlang_client_alpn_npn_openssl_server_alpn_npn(Config) when is_list(Config) -> %%-------------------------------------------------------------------- erlang_server_alpn_npn_openssl_client_alpn_npn(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), AlpnProtocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(erlang, diff --git a/lib/ssl/test/openssl_client_cert_SUITE.erl b/lib/ssl/test/openssl_client_cert_SUITE.erl index 0b60e5d58a77..9a692067aa2a 100644 --- a/lib/ssl/test/openssl_client_cert_SUITE.erl +++ b/lib/ssl/test/openssl_client_cert_SUITE.erl @@ -164,8 +164,8 @@ init_per_group(openssl_client, Config) -> init_per_group(Group, Config0) when Group == rsa; Group == rsa_1_3 -> Config = ssl_test_lib:make_rsa_cert(Config0), - COpts = proplists:get_value(client_rsa_opts, Config), - SOpts = proplists:get_value(server_rsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), %% Make sure _rsa* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(dhe_rsa) -> @@ -179,8 +179,8 @@ init_per_group(Group, Config0) when Group == rsa; [_|_] -> [{cert_key_alg, rsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; [] -> @@ -205,8 +205,8 @@ init_per_group(Alg, Config) when server_config := SOpts} = ssl_test_lib:make_rsa_pss_pem(rsa_alg(Alg), [], Config, ""), [{cert_key_alg, rsa_alg(Alg)} | lists:delete(cert_key_alg, - [{client_cert_opts, openssl_sig_algs(rsa_alg(Alg)) ++ COpts}, - {server_cert_opts, ssl_test_lib:sig_algs(Alg, Version) ++ SOpts} | + [{client_cert_opts, fun() -> openssl_sig_algs(rsa_alg(Alg)) ++ COpts end}, + {server_cert_opts, fun() -> ssl_test_lib:sig_algs(Alg, Version) ++ SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; false -> @@ -221,8 +221,8 @@ init_per_group(Group, Config0) when Group == ecdsa; of true -> Config = ssl_test_lib:make_ecdsa_cert(Config0), - COpts = proplists:get_value(client_ecdsa_opts, Config), - SOpts = proplists:get_value(server_ecdsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_ecdsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_ecdsa_opts, Config), %% Make sure ecdh* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(ecdh_ecdsa) -> @@ -236,8 +236,8 @@ init_per_group(Group, Config0) when Group == ecdsa; [_|_] -> [{cert_key_alg, ecdsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))] )]; @@ -268,8 +268,8 @@ init_per_group(eddsa_1_3, Config0) -> [{cert_key_alg, eddsa} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config0))] )]; @@ -286,8 +286,8 @@ init_per_group(Group, Config0) when Group == dsa -> of true -> Config = ssl_test_lib:make_dsa_cert(Config0), - COpts = SigAlgs ++ proplists:get_value(client_dsa_opts, Config), - SOpts = SigAlgs ++ proplists:get_value(server_dsa_opts, Config), + COpts = SigAlgs ++ ssl_test_lib:ssl_options(client_dsa_opts, Config), + SOpts = SigAlgs ++ ssl_test_lib:ssl_options(server_dsa_opts, Config), %% Make sure dhe_dss* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(dh_dss) -> @@ -301,8 +301,8 @@ init_per_group(Group, Config0) when Group == dsa -> [_|_] -> [{cert_key_alg, dsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, [{ciphers, Ciphers} | SOpts]} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> [{ciphers, Ciphers} | SOpts] end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; [] -> diff --git a/lib/ssl/test/openssl_mfl_SUITE.erl b/lib/ssl/test/openssl_mfl_SUITE.erl index 1acd18e422d1..7fabffa15934 100644 --- a/lib/ssl/test/openssl_mfl_SUITE.erl +++ b/lib/ssl/test/openssl_mfl_SUITE.erl @@ -111,7 +111,7 @@ openssl_client(Config) when is_list(Config) -> %-------------------------------------------------------------------------------- reuse_session_erlang_server(Config) when is_list(Config) -> ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), Protocol = proplists:get_value(protocol, ServerOpts, tls), {_, ServerNode, _} = ssl_test_lib:run_where(Config), MFL = 512, @@ -136,7 +136,7 @@ reuse_session_erlang_server(Config) when is_list(Config) -> reuse_session_erlang_client(Config) when is_list(Config) -> process_flag(trap_exit, true), ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), - ServerOpts = proplists:get_value(server_rsa_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), Protocol = proplists:get_value(protocol, ClientOpts0, tls), MFL = 512, @@ -180,7 +180,7 @@ reuse_session_erlang_client(Config) when is_list(Config) -> openssl_client(MFL, Config) -> ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), Protocol = proplists:get_value(protocol, ServerOpts, tls), {_, ServerNode, _} = ssl_test_lib:run_where(Config), @@ -205,7 +205,7 @@ openssl_client(MFL, Config) -> openssl_server(MFL, Config) -> ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), - ServerOpts = proplists:get_value(server_rsa_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), Protocol = proplists:get_value(protocol, ClientOpts, tls), {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), diff --git a/lib/ssl/test/openssl_npn_SUITE.erl b/lib/ssl/test/openssl_npn_SUITE.erl index fb8aee6ef749..2348080f66c0 100644 --- a/lib/ssl/test/openssl_npn_SUITE.erl +++ b/lib/ssl/test/openssl_npn_SUITE.erl @@ -129,8 +129,8 @@ erlang_client_openssl_server_npn() -> [{doc,"Test erlang client with openssl server doing npn negotiation"}]. erlang_client_openssl_server_npn(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), - ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), NpnProtocol = <<"spdy/2">>, {Server, OpenSSLPort} = @@ -161,8 +161,8 @@ erlang_client_openssl_server_npn_renegotiate() -> erlang_client_openssl_server_npn_renegotiate(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), - ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), NpnProtocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(openssl, [{np,"http/1.1,spdy/2"}], @@ -197,8 +197,8 @@ erlang_server_openssl_client_npn() -> [{doc,"Test erlang server with openssl client and npn negotiation"}]. erlang_server_openssl_client_npn(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_opts, Config), - ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), Protocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(erlang, [{from, self()}], [{server_opts, [{next_protocols_advertised, @@ -230,8 +230,8 @@ erlang_server_openssl_client_npn(Config) when is_list(Config) -> %% [{doc,"Test erlang server with openssl client and npn negotiation with renegotiation"}]. erlang_server_openssl_client_npn_renegotiate(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), - ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), NpnProtocol = <<"spdy/2">>, Server = ssl_test_lib:start_server(erlang, [{from, self()}], @@ -266,8 +266,8 @@ erlang_server_openssl_client_npn_renegotiate(Config) when is_list(Config) -> ssl:close(SSocket). %%-------------------------------------------------------------------------- erlang_client_openssl_server_npn_only_client(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), - ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), {Server, OpenSSLPort} = ssl_test_lib:start_server(openssl, [{np,"spdy/2"}, return_port], @@ -290,8 +290,8 @@ erlang_client_openssl_server_npn_only_client(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_client_openssl_server_npn_only_server(Config) when is_list(Config) -> - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), - ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), {Server, OpenSSLPort} = ssl_test_lib:start_server(openssl, [{np,"spdy/2"}, return_port], @@ -314,7 +314,7 @@ erlang_client_openssl_server_npn_only_server(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_server_openssl_client_npn_only_server(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), Server = ssl_test_lib:start_server(erlang, [{from, self()}], @@ -344,8 +344,8 @@ erlang_server_openssl_client_npn_only_server(Config) when is_list(Config) -> %%-------------------------------------------------------------------------- erlang_server_openssl_client_npn_only_client(Config) when is_list(Config) -> - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), - ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), Server = ssl_test_lib:start_server(erlang, [{from, self()}], [{server_opts, [ServerOpts]} | Config]), Port = ssl_test_lib:inet_port(Server), diff --git a/lib/ssl/test/openssl_server_cert_SUITE.erl b/lib/ssl/test/openssl_server_cert_SUITE.erl index 057d80b6f327..53bc990e4bc5 100644 --- a/lib/ssl/test/openssl_server_cert_SUITE.erl +++ b/lib/ssl/test/openssl_server_cert_SUITE.erl @@ -159,8 +159,8 @@ init_per_group(openssl_server, Config0) -> [{client_type, erlang}, {server_type, openssl} | Config]; init_per_group(rsa = Group, Config0) -> Config = ssl_test_lib:make_rsa_cert(Config0), - COpts = proplists:get_value(client_rsa_opts, Config), - SOpts = proplists:get_value(server_rsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), %% Make sure _rsa* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(dhe_rsa) -> @@ -174,8 +174,8 @@ init_per_group(rsa = Group, Config0) -> [_|_] -> [{cert_key_alg, rsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; [] -> @@ -183,8 +183,8 @@ init_per_group(rsa = Group, Config0) -> end; init_per_group(rsa_1_3 = Group, Config0) -> Config = ssl_test_lib:make_rsa_cert(Config0), - COpts = proplists:get_value(client_rsa_opts, Config), - SOpts = proplists:get_value(server_rsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), %% Make sure _rsa* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(undefined, Version), @@ -192,8 +192,8 @@ init_per_group(rsa_1_3 = Group, Config0) -> [_|_] -> [{cert_key_alg, rsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; [] -> @@ -202,7 +202,7 @@ init_per_group(rsa_1_3 = Group, Config0) -> init_per_group(Alg, Config) when Alg == rsa_pss_rsae; Alg == rsa_pss_pss -> Supports = crypto:supports(), - RSAOpts = proplists:get_value(rsa_opts, Supports), + RSAOpts = ssl_test_lib:ssl_options(rsa_opts, Supports), case lists:member(rsa_pkcs1_pss_padding, RSAOpts) andalso lists:member(rsa_pss_saltlen, RSAOpts) @@ -214,8 +214,8 @@ init_per_group(Alg, Config) when Alg == rsa_pss_rsae; server_config := SOpts} = ssl_test_lib:make_rsa_pss_pem(Alg, [], Config, ""), [{cert_key_alg, Alg} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; false -> @@ -229,8 +229,8 @@ init_per_group(ecdsa = Group, Config0) -> of true -> Config = ssl_test_lib:make_ecdsa_cert(Config0), - COpts = proplists:get_value(client_ecdsa_opts, Config), - SOpts = proplists:get_value(server_ecdsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_ecdsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_ecdsa_opts, Config), %% Make sure ecdh* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(ecdh_ecdsa) -> @@ -244,8 +244,8 @@ init_per_group(ecdsa = Group, Config0) -> [_|_] -> [{cert_key_alg, ecdsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))] )]; @@ -263,8 +263,8 @@ init_per_group(ecdsa_1_3 = Group, Config0) -> of true -> Config = ssl_test_lib:make_ecdsa_cert(Config0), - COpts = proplists:get_value(client_ecdsa_opts, Config), - SOpts = proplists:get_value(server_ecdsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_ecdsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_ecdsa_opts, Config), %% Make sure ecdh* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(undefined, Version), @@ -272,8 +272,8 @@ init_per_group(ecdsa_1_3 = Group, Config0) -> [_|_] -> [{cert_key_alg, ecdsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts]}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))] )]; @@ -301,8 +301,8 @@ init_per_group(eddsa_1_3, Config0) -> [{cert_key_alg, eddsa} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config0))] )]; @@ -317,8 +317,8 @@ init_per_group(dsa = Group, Config0) -> of true -> Config = ssl_test_lib:make_dsa_cert(Config0), - COpts = proplists:get_value(client_dsa_opts, Config), - SOpts = proplists:get_value(server_dsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_dsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_dsa_opts, Config), %% Make sure dhe_dss* suite is chosen by ssl_test_lib:start_server Version = ssl_test_lib:protocol_version(Config), Ciphers = ssl_cert_tests:test_ciphers(fun(dh_dss) -> @@ -332,8 +332,10 @@ init_per_group(dsa = Group, Config0) -> [_|_] -> [{cert_key_alg, dsa} | lists:delete(cert_key_alg, - [{client_cert_opts, [{ciphers, Ciphers} | COpts] ++ ssl_test_lib:sig_algs(dsa, Version)}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> [{ciphers, Ciphers} | COpts] ++ + ssl_test_lib:sig_algs(dsa, Version) + end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; [] -> diff --git a/lib/ssl/test/openssl_session_ticket_SUITE.erl b/lib/ssl/test/openssl_session_ticket_SUITE.erl index 991f290dc781..e0732257c9a3 100644 --- a/lib/ssl/test/openssl_session_ticket_SUITE.erl +++ b/lib/ssl/test/openssl_session_ticket_SUITE.erl @@ -168,7 +168,7 @@ openssl_client_basic() -> [{doc,"Test session resumption with session tickets (openssl client - erlang server)"}]. openssl_client_basic(Config) when is_list(Config) -> ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), - ClientOpts = proplists:get_value(client_rsa_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), {_, ServerNode, _Hostname} = ssl_test_lib:run_where(Config), TicketFile0 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket0"]), @@ -264,7 +264,7 @@ openssl_client_hrr() -> [{doc,"Test session resumption with session tickets and hello_retry_request (openssl client - erlang server)"}]. openssl_client_hrr(Config) when is_list(Config) -> ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), - ClientOpts = proplists:get_value(client_rsa_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), {_, ServerNode, _Hostname} = ssl_test_lib:run_where(Config), TicketFile0 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket0"]), TicketFile1 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket1"]), @@ -650,7 +650,7 @@ openssl_client_early_data_basic() -> [{doc,"Test early data (openssl client - erlang server)"}]. openssl_client_early_data_basic(Config) when is_list(Config) -> ServerOpts0 = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), - ClientOpts = proplists:get_value(client_rsa_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), {_, ServerNode, _Hostname} = ssl_test_lib:run_where(Config), TicketFile0 = filename:join([proplists:get_value(priv_dir, Config), "session_ticket0"]), diff --git a/lib/ssl/test/ssl_ECC_SUITE.erl b/lib/ssl/test/ssl_ECC_SUITE.erl index 42e200869ee2..c7832a4f32cc 100644 --- a/lib/ssl/test/ssl_ECC_SUITE.erl +++ b/lib/ssl/test/ssl_ECC_SUITE.erl @@ -112,7 +112,7 @@ ecc_negotiation() -> %%-------------------------------------------------------------------- init_per_suite(Config0) -> end_per_suite(Config0), - try crypto:start() of + try application:start(crypto) of ok -> case ssl_test_lib:sufficient_crypto_support(cipher_ec) of true -> diff --git a/lib/ssl/test/ssl_alert_SUITE.erl b/lib/ssl/test/ssl_alert_SUITE.erl index 9c45b7098226..d8279d6828e7 100644 --- a/lib/ssl/test/ssl_alert_SUITE.erl +++ b/lib/ssl/test/ssl_alert_SUITE.erl @@ -58,8 +58,8 @@ all() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config0 diff --git a/lib/ssl/test/ssl_alpn_SUITE.erl b/lib/ssl/test/ssl_alpn_SUITE.erl index eb850c5d830b..2954ef78e30d 100644 --- a/lib/ssl/test/ssl_alpn_SUITE.erl +++ b/lib/ssl/test/ssl_alpn_SUITE.erl @@ -113,8 +113,8 @@ alpn_npn_coexist() -> init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl index 9a5e1bd2fa87..09cc27b96db3 100644 --- a/lib/ssl/test/ssl_api_SUITE.erl +++ b/lib/ssl/test/ssl_api_SUITE.erl @@ -384,8 +384,8 @@ tls13_group() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) @@ -1384,12 +1384,14 @@ hibernate_helper(Version, CheckServer, StartServerOpts, StartClientOpts, AllClientOpts = StartClientOpts ++ [{port, Port}, {options, [{hibernate_after, ClientHibernateAfter} | ClientOpts0]}], - {Client, #sslsocket{pid = [ClientReceiverPid | ClientPotentialSenderPid]}} = + {Client, #sslsocket{connection_handler = ClientReceiverPid, + payload_sender = ClientPotentialSenderPid}} = ssl_test_lib:start_client(AllClientOpts), Results = ssl_test_lib:get_result([Client, Server]), {ok, ServerAcceptSocket} = proplists:get_value(Server, Results), ok = proplists:get_value(Client, Results), - #sslsocket{pid = [ServerReceiverPid | ServerPotentialSenderPid]} = + #sslsocket{connection_handler = ServerReceiverPid, + payload_sender = ServerPotentialSenderPid} = ServerAcceptSocket, {ReceiverPid, PotentialSenderPid, HibernateAfter} = case CheckServer of @@ -1402,11 +1404,11 @@ hibernate_helper(Version, CheckServer, StartServerOpts, StartClientOpts, ?CT_LOG("HibernateAfter = ~w SleepAmount = ~w", [HibernateAfter, SleepAmount]), ct:sleep(SleepAmount), %% Schedule out {current_function, {erlang, hibernate, 3}} = - process_info(ReceiverPid, current_function), + process_info(ReceiverPid, current_function), IsTls = ssl_test_lib:is_tls_version(Version), case IsTls of true -> - [SenderPid] = PotentialSenderPid, + SenderPid = PotentialSenderPid, {current_function, {erlang, hibernate, 3}} = process_info(SenderPid, current_function); _ -> %% DTLS (no sender process) @@ -3855,8 +3857,8 @@ export_key_materials(Config) when is_list(Config) -> {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Version = ssl_test_lib:protocol_version(Config, atom), BaseOpts = [{active, true}, {versions, [Version]}, {protocol, tls_or_dtls(Version)}], - ServerOpts = BaseOpts ++ proplists:get_value(server_rsa_opts, Config, []), - ClientOpts = BaseOpts ++ proplists:get_value(client_rsa_opts, Config, []), + ServerOpts = BaseOpts ++ ssl_test_lib:ssl_options(server_rsa_opts, Config), + ClientOpts = BaseOpts ++ ssl_test_lib:ssl_options(client_rsa_opts, Config), Label = <<"EXPERIMENTAL-otp">>, @@ -3892,8 +3894,8 @@ exporter_master_secret_consumed(Config) when is_list(Config) -> {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Version = ssl_test_lib:protocol_version(Config, atom), BaseOpts = [{active, true}, {versions, [Version]}, {protocol, tls_or_dtls(Version)}], - ServerOpts = BaseOpts ++ proplists:get_value(server_rsa_opts, Config, []), - ClientOpts = BaseOpts ++ proplists:get_value(client_rsa_opts, Config, []), + ServerOpts = BaseOpts ++ ssl_test_lib:ssl_options(server_rsa_opts, Config), + ClientOpts = BaseOpts ++ ssl_test_lib:ssl_options(client_rsa_opts, Config), Label1 = <<"EXPERIMENTAL-otp1">>, Label2 = <<"EXPERIMENTAL-otp2">>, @@ -3925,14 +3927,14 @@ legacy_prf(Config) when is_list(Config) -> {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Version = ssl_test_lib:protocol_version(Config, atom), BaseOpts = [{active, true}, {versions, [Version]}, {protocol, tls_or_dtls(Version)}], - ServerOpts = BaseOpts ++ proplists:get_value(server_rsa_opts, Config, []), - ClientOpts = BaseOpts ++ proplists:get_value(client_rsa_opts, Config, []), + ServerOpts = BaseOpts ++ ssl_test_lib:ssl_options(server_rsa_opts, Config), + ClientOpts = BaseOpts ++ ssl_test_lib:ssl_options(client_rsa_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Version = ssl_test_lib:protocol_version(Config, atom), BaseOpts = [{active, true}, {versions, [Version]}, {protocol, tls_or_dtls(Version)}], - ServerOpts = BaseOpts ++ proplists:get_value(server_rsa_opts, Config, []), - ClientOpts = BaseOpts ++ proplists:get_value(client_rsa_opts, Config, []), + ServerOpts = BaseOpts ++ ssl_test_lib:ssl_options(server_rsa_opts, Config), + ClientOpts = BaseOpts ++ ssl_test_lib:ssl_options(client_rsa_opts, Config), Label = <<"EXPERIMENTAL-otp">>, @@ -4155,7 +4157,7 @@ active_n_common(S, N) -> {ssl_passive, S} -> ok after 1000 -> - error({error,ssl_passive_failure}) + error({error,ssl_passive_failure, flush()}) end, [{active,false}] = ok(ssl:getopts(S, [active])), ok = ssl:setopts(S, [{active,0}]), @@ -4163,7 +4165,7 @@ active_n_common(S, N) -> {ssl_passive, S} -> ok after 1000 -> - error({error,ssl_passive_failure}) + error({error,ssl_passive_failure, flush()}) end, ok = ssl:setopts(S, [{active,32767}]), {error,{options,_}} = ssl:setopts(S, [{active,1}]), @@ -4173,25 +4175,25 @@ active_n_common(S, N) -> {ssl_passive, S} -> ok after 1000 -> - error({error,ssl_passive_failure}) + error({error,ssl_passive_failure, flush()}) end, [{active,false}] = ok(ssl:getopts(S, [active])), ok = ssl:setopts(S, [{active,N}]), ok = ssl:setopts(S, [{active,true}]), [{active,true}] = ok(ssl:getopts(S, [active])), receive - _ -> error({error,active_n}) + _Msg -> error({error,active_n, _Msg}) after - 0 -> + 100 -> ok end, ok = ssl:setopts(S, [{active,N}]), ok = ssl:setopts(S, [{active,once}]), [{active,once}] = ok(ssl:getopts(S, [active])), receive - _ -> error({error,active_n}) + _Msg2 -> error({error,active_n, _Msg2}) after - 0 -> + 100 -> ok end, {error,{options,_}} = ssl:setopts(S, [{active,32768}]), @@ -4199,6 +4201,14 @@ active_n_common(S, N) -> [{active,false}] = ok(ssl:getopts(S, [active])), ok. +flush() -> + receive Msg -> + [Msg|flush()] + after 0 -> + [] + end. + + ok({ok,V}) -> V. repeat(N, Fun) -> @@ -4560,12 +4570,12 @@ test_config('dtlsv1.2', Config) -> ]; test_config(_, Config) -> RSAConf1 = ssl_test_lib:make_rsa_cert(Config), - SRSA1Opts = proplists:get_value(server_rsa_opts, RSAConf1), - CRSA1Opts = proplists:get_value(client_rsa_opts, RSAConf1), + SRSA1Opts = ssl_test_lib:ssl_options(server_rsa_opts, RSAConf1), + CRSA1Opts = ssl_test_lib:ssl_options(client_rsa_opts, RSAConf1), RSAConf2 = ssl_test_lib:make_rsa_1024_cert(Config), - SRSA2Opts = proplists:get_value(server_rsa_1024_opts, RSAConf2), - CRSA2Opts = proplists:get_value(client_rsa_1024_opts, RSAConf2), + SRSA2Opts = ssl_test_lib:ssl_options(server_rsa_1024_opts, RSAConf2), + CRSA2Opts = ssl_test_lib:ssl_options(client_rsa_1024_opts, RSAConf2), {SRSA1Cert, SRSA1Key, _SRSA1CACerts} = get_single_options(certfile, keyfile, cacertfile, SRSA1Opts), {CRSA1Cert, CRSA1Key, _CRSA1CACerts} = get_single_options(certfile, keyfile, cacertfile, CRSA1Opts), diff --git a/lib/ssl/test/ssl_app_env_SUITE.erl b/lib/ssl/test/ssl_app_env_SUITE.erl index 0004e4341026..89819071189c 100644 --- a/lib/ssl/test/ssl_app_env_SUITE.erl +++ b/lib/ssl/test/ssl_app_env_SUITE.erl @@ -81,8 +81,8 @@ tests() -> init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl index 052108baa41e..8e7fbd584fc7 100644 --- a/lib/ssl/test/ssl_basic_SUITE.erl +++ b/lib/ssl/test/ssl_basic_SUITE.erl @@ -145,8 +145,8 @@ options_tests() -> unordered_protocol_versions_client]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) @@ -891,7 +891,8 @@ version_info_result(Socket) -> {ok, [{version, Version}]} = ssl:connection_information(Socket, [version]), {ok, Version}. -min_heap_size_info(#sslsocket{pid = [Receiver, Sender]}) -> +min_heap_size_info(#sslsocket{connection_handler = Receiver, + payload_sender = Sender}) -> {garbage_collection, ReceiverGc} = process_info(Receiver, garbage_collection), {garbage_collection, SenderGc} = process_info(Sender, garbage_collection), {ok, proplists:get_value(min_heap_size, ReceiverGc), proplists:get_value(min_heap_size, SenderGc)}. diff --git a/lib/ssl/test/ssl_cert_SUITE.erl b/lib/ssl/test/ssl_cert_SUITE.erl index bd37e0831a57..9be561e5e75d 100644 --- a/lib/ssl/test/ssl_cert_SUITE.erl +++ b/lib/ssl/test/ssl_cert_SUITE.erl @@ -265,8 +265,8 @@ all_version_tests() -> ]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> Config catch _:_ -> @@ -295,15 +295,15 @@ do_init_per_group(Group, Config0) when Group == rsa; Group == rsa_1_3 -> Config1 = ssl_test_lib:make_rsa_cert(Config0), Config = ssl_test_lib:make_rsa_1024_cert(Config1), - COpts = proplists:get_value(client_rsa_verify_opts, Config), - SOpts = proplists:get_value(server_rsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), Version = proplists:get_value(version, Config), [{cert_key_alg, rsa}, {extra_client, ssl_test_lib:sig_algs(rsa, Version)}, {extra_server, ssl_test_lib:sig_algs(rsa, Version)} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; do_init_per_group(Alg, Config) when Alg == rsa_pss_rsae; @@ -322,8 +322,8 @@ do_init_per_group(Alg, Config) when Alg == rsa_pss_rsae; {extra_client, ssl_test_lib:sig_algs(Alg, Version)}, {extra_server, ssl_test_lib:sig_algs(Alg, Version)} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; false -> @@ -343,8 +343,8 @@ do_init_per_group(Alg, Config) when Alg == rsa_pss_rsae_1_3; server_config := SOpts} = ssl_test_lib:make_rsa_pss_pem(rsa_alg(Alg), [], Config, ""), [{cert_key_alg, rsa_alg(Alg)} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; false -> @@ -357,12 +357,12 @@ do_init_per_group(Group, Config0) when Group == ecdsa; case lists:member(ecdsa, PKAlg) andalso (lists:member(ecdh, PKAlg) orelse lists:member(dh, PKAlg)) of true -> Config = ssl_test_lib:make_ecdsa_cert(Config0), - COpts = proplists:get_value(client_ecdsa_verify_opts, Config), - SOpts = proplists:get_value(server_ecdsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_ecdsa_verify_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_ecdsa_opts, Config), [{cert_key_alg, ecdsa} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))] )]; @@ -386,8 +386,8 @@ do_init_per_group(eddsa_1_3, Config0) -> [{cert_key_alg, eddsa} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config0))] )]; @@ -400,8 +400,8 @@ do_init_per_group(dsa = Alg, Config0) -> case lists:member(dss, PKAlg) andalso lists:member(dh, PKAlg) of true -> Config = ssl_test_lib:make_dsa_cert(Config0), - COpts = proplists:get_value(client_dsa_opts, Config), - SOpts = proplists:get_value(server_dsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_dsa_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_dsa_opts, Config), ShaDSA = case Version of {3, 3} -> [{signature_algs, [{sha, dsa}]}]; @@ -414,8 +414,8 @@ do_init_per_group(dsa = Alg, Config0) -> {extra_server, ssl_test_lib:sig_algs(Alg, Version) ++ [{ciphers, ssl_test_lib:dsa_suites(Version)}] ++ ShaDSA} | lists:delete(cert_key_alg, - [{client_cert_opts, COpts}, - {server_cert_opts, SOpts} | + [{client_cert_opts, fun() -> COpts end}, + {server_cert_opts, fun() -> SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))])]; false -> @@ -447,12 +447,12 @@ init_ecdsa_opts(Config0, Curve) -> case lists:member(ecdsa, PKAlg) andalso (lists:member(ecdh, PKAlg) orelse lists:member(dh, PKAlg)) of true -> Config = ssl_test_lib:make_rsa_ecdsa_cert(Config0, Curve), - COpts = proplists:get_value(client_ecdsa_verify_opts, Config), - SOpts = proplists:get_value(server_ecdsa_opts, Config), + COpts = ssl_test_lib:ssl_options(client_ecdsa_verify_opts, Config), + SOpts = ssl_test_lib:ssl_options(server_ecdsa_opts, Config), [{cert_key_alg, ecdsa} | lists:delete(cert_key_alg, - [{client_cert_opts, ssl_test_lib:sig_algs(ecdsa, Version) ++ COpts}, - {server_cert_opts, ssl_test_lib:sig_algs(ecdsa, Version) ++ SOpts} | + [{client_cert_opts, fun() -> ssl_test_lib:sig_algs(ecdsa, Version) ++ COpts end}, + {server_cert_opts, fun() -> ssl_test_lib:sig_algs(ecdsa, Version) ++ SOpts end} | lists:delete(server_cert_opts, lists:delete(client_cert_opts, Config))] )]; diff --git a/lib/ssl/test/ssl_cipher_SUITE.erl b/lib/ssl/test/ssl_cipher_SUITE.erl index 687bbd6f58fe..063a039fb36a 100644 --- a/lib/ssl/test/ssl_cipher_SUITE.erl +++ b/lib/ssl/test/ssl_cipher_SUITE.erl @@ -57,7 +57,7 @@ groups() -> []. init_per_suite(Config) -> - try crypto:start() of + try application:start(crypto) of ok -> Config catch _:_ -> diff --git a/lib/ssl/test/ssl_cipher_suite_SUITE.erl b/lib/ssl/test/ssl_cipher_suite_SUITE.erl index e2a57cb14a09..d65733e250aa 100644 --- a/lib/ssl/test/ssl_cipher_suite_SUITE.erl +++ b/lib/ssl/test/ssl_cipher_suite_SUITE.erl @@ -286,8 +286,8 @@ anonymous() -> ]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config diff --git a/lib/ssl/test/ssl_crl_SUITE.erl b/lib/ssl/test/ssl_crl_SUITE.erl index 6f4485d4387e..ae0305c73ad7 100644 --- a/lib/ssl/test/ssl_crl_SUITE.erl +++ b/lib/ssl/test/ssl_crl_SUITE.erl @@ -112,7 +112,7 @@ init_per_suite(Config) -> {skip, io_lib:format("Bad openssl version: ~p",[OpenSSL_version])}; _ -> end_per_suite(Config), - try crypto:start() of + try application:start(crypto) of ok -> {ok, Hostname0} = inet:gethostname(), IPfamily = diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl index c2c721c8b9f7..f057f74bf2d7 100644 --- a/lib/ssl/test/ssl_dist_SUITE.erl +++ b/lib/ssl/test/ssl_dist_SUITE.erl @@ -135,7 +135,7 @@ all() -> init_per_suite(Config0) -> _ = end_per_suite(Config0), - try crypto:start() of + try application:start(crypto) of ok -> %% Currently no ct function available for is_cover! case test_server:is_cover() of diff --git a/lib/ssl/test/ssl_dist_bench_SUITE.erl b/lib/ssl/test/ssl_dist_bench_SUITE.erl index b516b6988abb..ef7eb6b9e5c7 100644 --- a/lib/ssl/test/ssl_dist_bench_SUITE.erl +++ b/lib/ssl/test/ssl_dist_bench_SUITE.erl @@ -211,6 +211,8 @@ init_per_suite(Config) -> catch throw : {Skip, Reason} -> {skip, Reason}; + throw : {skipped, Reason} -> + {skip, Reason}; Class : Reason : Stacktrace -> {fail, {Class, Reason, Stacktrace}} end. diff --git a/lib/ssl/test/ssl_engine_SUITE.erl b/lib/ssl/test/ssl_engine_SUITE.erl index 5ae1452544d9..42bc327e10f1 100644 --- a/lib/ssl/test/ssl_engine_SUITE.erl +++ b/lib/ssl/test/ssl_engine_SUITE.erl @@ -47,8 +47,8 @@ all() -> ]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> case crypto:info_lib() of [{_,_, <<"OpenSSL 1.0.1s-freebsd 1 Mar 2016">>}] -> diff --git a/lib/ssl/test/ssl_eqc_SUITE.erl b/lib/ssl/test/ssl_eqc_SUITE.erl index bbf28d47f497..a9428b1f95e0 100644 --- a/lib/ssl/test/ssl_eqc_SUITE.erl +++ b/lib/ssl/test/ssl_eqc_SUITE.erl @@ -69,8 +69,8 @@ all() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> ct:timetrap({seconds, 20}), - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ct_property_test:init_per_suite(Config) diff --git a/lib/ssl/test/ssl_handshake_SUITE.erl b/lib/ssl/test/ssl_handshake_SUITE.erl index 27c80c49a95e..bc16a2779a68 100644 --- a/lib/ssl/test/ssl_handshake_SUITE.erl +++ b/lib/ssl/test/ssl_handshake_SUITE.erl @@ -83,8 +83,8 @@ end_per_group(_,Config) -> init_per_testcase(TC, Config0) when TC =:= ignore_hassign_extension_pre_tls_1_2 orelse TC =:= signature_algorithms -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> case is_supported(sha512) of true -> @@ -105,7 +105,7 @@ init_per_testcase(_, Config0) -> Config0. end_per_testcase(ignore_hassign_extension_pre_tls_1_2, _) -> - crypto:stop(); + application:stop(crypto); end_per_testcase(_TestCase, Config) -> Config. diff --git a/lib/ssl/test/ssl_key_update_SUITE.erl b/lib/ssl/test/ssl_key_update_SUITE.erl index 61d2c1066ccc..0da60169f874 100644 --- a/lib/ssl/test/ssl_key_update_SUITE.erl +++ b/lib/ssl/test/ssl_key_update_SUITE.erl @@ -55,8 +55,8 @@ tls_1_3_tests() -> explicit_key_update]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), case proplists:get_bool(ecdh, proplists:get_value(public_keys, crypto:supports())) of diff --git a/lib/ssl/test/ssl_npn_SUITE.erl b/lib/ssl/test/ssl_npn_SUITE.erl index 75154af652a2..a35f989bb847 100644 --- a/lib/ssl/test/ssl_npn_SUITE.erl +++ b/lib/ssl/test/ssl_npn_SUITE.erl @@ -99,8 +99,8 @@ next_protocol_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl:clear_pem_cache(), diff --git a/lib/ssl/test/ssl_npn_hello_SUITE.erl b/lib/ssl/test/ssl_npn_hello_SUITE.erl index 227f7d104f26..02e65ad49f28 100644 --- a/lib/ssl/test/ssl_npn_hello_SUITE.erl +++ b/lib/ssl/test/ssl_npn_hello_SUITE.erl @@ -60,8 +60,8 @@ all() -> create_server_hello_with_no_advertised_protocols_test]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> Config catch _:_ -> diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl index 5477626e514d..ca9235038993 100644 --- a/lib/ssl/test/ssl_packet_SUITE.erl +++ b/lib/ssl/test/ssl_packet_SUITE.erl @@ -353,8 +353,8 @@ protocol_active_packet_tests() -> ]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config) @@ -2546,18 +2546,25 @@ client_reject_packet_opt(Config, PacketOpt) -> Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0}, {from, self()}, - {mfa, {ssl_test_lib, no_result_msg ,[]}}, + {mfa, {ssl_test_lib, no_result, []}}, {options, ServerOpts}]), Port = ssl_test_lib:inet_port(Server), Client = ssl_test_lib:start_client_error([{node, ServerNode}, {port, Port}, {host, Hostname}, {from, self()}, - {mfa, {ssl_test_lib, no_result_msg, []}}, - {options, [PacketOpt | - ClientOpts]}]), - - ssl_test_lib:check_result(Client, {error, {options, {not_supported, PacketOpt}}}). + {mfa, {ssl_test_lib, no_result, []}}, + {options, [PacketOpt | ClientOpts]}]), + + ok = ssl_test_lib:check_result(Client, {error, {options, {not_supported, PacketOpt}}}), + Client2 = ssl_test_lib:start_client([{node, ServerNode}, {port, Port}, + {host, Hostname}, + {from, self()}, + {mfa, {ssl, setopts, [[PacketOpt]]}}, + {options, ClientOpts}]), + ssl_test_lib:check_result(Client2, {error, {options, {socket_options, PacketOpt}}}), + ssl_test_lib:close(Server), + ssl_test_lib:close(Client2). send_switch_packet(SslSocket, Data, NextPacket) -> spawn(fun() -> ssl:send(SslSocket, Data) end), diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl index 158578152171..152b325df0b5 100644 --- a/lib/ssl/test/ssl_payload_SUITE.erl +++ b/lib/ssl/test/ssl_payload_SUITE.erl @@ -152,8 +152,8 @@ payload_tests() -> client_active_once_server_close]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config) diff --git a/lib/ssl/test/ssl_pem_cache_SUITE.erl b/lib/ssl/test/ssl_pem_cache_SUITE.erl index 9054d9d94a7f..865ef7957be1 100644 --- a/lib/ssl/test/ssl_pem_cache_SUITE.erl +++ b/lib/ssl/test/ssl_pem_cache_SUITE.erl @@ -96,8 +96,8 @@ all() -> groups() -> []. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), %% make rsa certs @@ -243,8 +243,8 @@ invalid_insert() -> invalid_insert(Config) when is_list(Config) -> process_flag(trap_exit, true), [0, 0, 0, 0] = get_table_sizes(), %% Initialy all tables are empty - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), BadClientOpts = [{cacertfile, "tmp/does_not_exist.pem"} | proplists:delete(cacertfile, ClientOpts)], @@ -614,8 +614,8 @@ alternative_path_helper(Config, GetAlternative, %% Init - represents initial state %% ConnectedN - state after establishing Nth connection %% Disconnected - state after closing connections - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), - CACertFilePath0 = proplists:get_value(cacertfile, ClientOpts), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + CACertFilePath0 = ssl_test_lib:ssl_options(cacertfile, ClientOpts), {ok, CACertFilename} = strip_path(CACertFilePath0), {ok, Cwd} = file:get_cwd(), @@ -705,8 +705,8 @@ create_initial_config(Config) -> ClientBase = filename:join(PrivDir, "client_test"), ServerBase = filename:join(PrivDir, "server_test"), PemConfig = x509_test:gen_pem_config_files(DerConfig, ClientBase, ServerBase), - ClientConf = proplists:get_value(client_config, PemConfig), - ServerConf = proplists:get_value(server_config, PemConfig), + ClientConf = ssl_test_lib:ssl_options(client_config, PemConfig), + ServerConf = ssl_test_lib:ssl_options(server_config, PemConfig), {proplists:get_value(cacertfile, ServerConf), ClientConf, ServerConf, ServerRootCert0, ClientBase, ServerBase}. @@ -752,7 +752,7 @@ pem_periodical_cleanup(Config, FileIds, ct:sleep(4 * ?SLEEP_AMOUNT), Init = get_table_sizes(), - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), {Server, Client} = basic_verify_test_no_close(Config), diff --git a/lib/ssl/test/ssl_reject_SUITE.erl b/lib/ssl/test/ssl_reject_SUITE.erl index 6222ba039993..0931be214552 100644 --- a/lib/ssl/test/ssl_reject_SUITE.erl +++ b/lib/ssl/test/ssl_reject_SUITE.erl @@ -87,8 +87,8 @@ all_tls_version_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) diff --git a/lib/ssl/test/ssl_renegotiate_SUITE.erl b/lib/ssl/test/ssl_renegotiate_SUITE.erl index 61e3c36a1b0c..6f197741014b 100644 --- a/lib/ssl/test/ssl_renegotiate_SUITE.erl +++ b/lib/ssl/test/ssl_renegotiate_SUITE.erl @@ -112,8 +112,8 @@ renegotiate_tests() -> active_error_disallowed_client_renegotiate]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config) diff --git a/lib/ssl/test/ssl_rfc_5869_SUITE.erl b/lib/ssl/test/ssl_rfc_5869_SUITE.erl index d77298ebec67..5fe5604189a1 100644 --- a/lib/ssl/test/ssl_rfc_5869_SUITE.erl +++ b/lib/ssl/test/ssl_rfc_5869_SUITE.erl @@ -65,8 +65,8 @@ all() -> %%-------------------------------------------------------------------- init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> Config catch _:_ -> diff --git a/lib/ssl/test/ssl_session_SUITE.erl b/lib/ssl/test/ssl_session_SUITE.erl index 29248be7bd15..de20dd931ca8 100644 --- a/lib/ssl/test/ssl_session_SUITE.erl +++ b/lib/ssl/test/ssl_session_SUITE.erl @@ -105,8 +105,8 @@ tls_session_tests() -> [session_table_stable_size_on_tcp_close]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config = ssl_test_lib:make_rsa_cert(Config0), diff --git a/lib/ssl/test/ssl_session_cache_SUITE.erl b/lib/ssl/test/ssl_session_cache_SUITE.erl index f40b868e07ce..bc0250318cc6 100644 --- a/lib/ssl/test/ssl_session_cache_SUITE.erl +++ b/lib/ssl/test/ssl_session_cache_SUITE.erl @@ -99,8 +99,8 @@ session_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), %% make rsa certs using @@ -360,8 +360,8 @@ max_table_size() -> [{doc,"Test max limit on session table"}]. max_table_size(Config) when is_list(Config) -> process_flag(trap_exit, true), - ClientOpts = proplists:get_value(client_rsa_verify_opts, Config), - ServerOpts = proplists:get_value(server_rsa_verify_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, diff --git a/lib/ssl/test/ssl_session_cache_api_SUITE.erl b/lib/ssl/test/ssl_session_cache_api_SUITE.erl index 0f775ea7ba6b..8b8a1939201a 100644 --- a/lib/ssl/test/ssl_session_cache_api_SUITE.erl +++ b/lib/ssl/test/ssl_session_cache_api_SUITE.erl @@ -47,8 +47,8 @@ all() -> client_cb]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config0 diff --git a/lib/ssl/test/ssl_session_ticket_SUITE.erl b/lib/ssl/test/ssl_session_ticket_SUITE.erl index dcebd5f0c335..0480911fc4c8 100644 --- a/lib/ssl/test/ssl_session_ticket_SUITE.erl +++ b/lib/ssl/test/ssl_session_ticket_SUITE.erl @@ -144,8 +144,8 @@ mixed_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) diff --git a/lib/ssl/test/ssl_sni_SUITE.erl b/lib/ssl/test/ssl_sni_SUITE.erl index 8489c59a82c1..db2e18a44b5b 100644 --- a/lib/ssl/test/ssl_sni_SUITE.erl +++ b/lib/ssl/test/ssl_sni_SUITE.erl @@ -103,8 +103,8 @@ sni_tests() -> hostname_trailing_dot]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Hostname = net_adm:localhost(), diff --git a/lib/ssl/test/ssl_socket_SUITE.erl b/lib/ssl/test/ssl_socket_SUITE.erl index 781f9b6e796f..5dd1e097897a 100644 --- a/lib/ssl/test/ssl_socket_SUITE.erl +++ b/lib/ssl/test/ssl_socket_SUITE.erl @@ -103,8 +103,8 @@ raw_inet_opt() -> init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config0) @@ -151,8 +151,8 @@ getstat() -> [{doc,"Test API function getstat/2"}]. getstat(Config) when is_list(Config) -> - ClientOpts = ?config(client_rsa_opts, Config), - ServerOpts = ?config(server_rsa_opts, Config), + ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config), + ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Server1 = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl index a1346381307d..67970b537d1c 100644 --- a/lib/ssl/test/ssl_test_lib.erl +++ b/lib/ssl/test/ssl_test_lib.erl @@ -28,6 +28,7 @@ -include_lib("ssl/src/ssl_cipher.hrl"). -include_lib("ssl/src/ssl_internal.hrl"). -include_lib("ssl/src/ssl_record.hrl"). +-include_lib("ssl/src/ssl_api.hrl"). -export([clean_start/0, clean_start/1, @@ -234,7 +235,6 @@ ktls_set_ulp/2, ktls_set_cipher/4]). --record(sslsocket, { fd = nil, pid = nil}). -define(SLEEP, 1000). -define(DEFAULT_CURVE, secp256r1). -define(PRINT_DEPTH, 100). @@ -322,7 +322,7 @@ get_client_opts(Config) -> init_per_suite(Config0, Type) -> end_per_suite(Config0), - try crypto:start() of + try application:start(crypto) of ok -> clean_start(), ssl:clear_pem_cache(), @@ -706,7 +706,7 @@ do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid) -> end. %%% To enable to test with s_client -reconnect -connect(#sslsocket{} = ListenSocket, Opts) -> +connect(ListenSocket, Opts) when element(1, ListenSocket) == sslsocket-> Node = proplists:get_value(node, Opts), ReconnectTimes = proplists:get_value(reconnect_times, Opts, 0), Timeout = proplists:get_value(timeout, Opts, infinity), @@ -730,7 +730,7 @@ connect(_, _, 0, AcceptSocket, _, _, _) -> connect(ListenSocket, Node, _N, _, Timeout, SslOpts, cancel) -> ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?CT_LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, format_options(SslOpts),Timeout]), + ?CT_LOG("~nssl:handshake(~p,~0.p,~0.p)~n", [AcceptSocket, format_options(SslOpts),Timeout]), case ssl:handshake(AcceptSocket, SslOpts, Timeout) of {ok, Socket0, Ext} -> @@ -742,9 +742,9 @@ connect(ListenSocket, Node, _N, _, Timeout, SslOpts, cancel) -> Result end; connect(ListenSocket, Node, N, _, Timeout, SslOpts, [_|_] =ContOpts0) -> - ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~0.P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?CT_LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, SslOpts,Timeout]), + ?CT_LOG("~nssl:handshake(~p,~0.p,~0.p)~n", [AcceptSocket, SslOpts,Timeout]), case ssl:handshake(AcceptSocket, SslOpts, Timeout) of {ok, Socket0, Ext} -> @@ -761,7 +761,7 @@ connect(ListenSocket, Node, N, _, Timeout, SslOpts, [_|_] =ContOpts0) -> _ -> ContOpts0 end, - ?CT_LOG("~nssl:handshake_continue(~p,~p,~p)~n", [Socket0, ContOpts,Timeout]), + ?CT_LOG("~nssl:handshake_continue(~p,~0.p,~0.p)~n", [Socket0, ContOpts,Timeout]), case ssl:handshake_continue(Socket0, ContOpts, Timeout) of {ok, Socket} -> connect(ListenSocket, Node, N-1, Socket, Timeout, SslOpts, ContOpts0); @@ -774,7 +774,7 @@ connect(ListenSocket, Node, N, _, Timeout, SslOpts, [_|_] =ContOpts0) -> Result end; connect(ListenSocket, Node, N, _, Timeout, [], ContOpts) -> - ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~0.P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), ?CT_LOG("~nssl:handshake(~p, ~p)~n", [AcceptSocket, Timeout]), @@ -786,9 +786,9 @@ connect(ListenSocket, Node, N, _, Timeout, [], ContOpts) -> Result end; connect(ListenSocket, _Node, _, _, Timeout, Opts, _) -> - ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), - {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?CT_LOG("ssl:handshake(~p,~p, ~p)~n", [AcceptSocket, Opts, Timeout]), + ?CT_LOG("ssl:transport_accept(~0.P)~n", [ListenSocket, ?PRINT_DEPTH]), + {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), + ?CT_LOG("ssl:handshake(~p,~0.p, ~0.p)~n", [AcceptSocket, Opts, Timeout]), ssl:handshake(AcceptSocket, Opts, Timeout), AcceptSocket. @@ -1891,12 +1891,11 @@ make_ecdsa_cert(Config) -> [{server_config, ServerConf}, {client_config, ClientConf}] = x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), - [{server_ecdsa_opts, [{reuseaddr, true} | ServerConf]}, - - {server_ecdsa_verify_opts, [{reuseaddr, true}, - {verify, verify_peer} | ServerConf]}, - {client_ecdsa_opts, [{verify, verify_none} | ClientConf]}, - {client_ecdsa_verify_opts, [{verify, verify_peer} | ClientConf]} + [{server_ecdsa_opts, fun() -> [{reuseaddr, true} | ServerConf] end}, + {server_ecdsa_verify_opts, + fun() -> [{reuseaddr, true}, {verify, verify_peer} | ServerConf] end}, + {client_ecdsa_opts, fun() -> [{verify, verify_none} | ClientConf] end}, + {client_ecdsa_verify_opts, fun() -> [{verify, verify_peer} | ClientConf] end} | Config]; false -> Config @@ -1913,17 +1912,18 @@ make_rsa_cert(Config) -> GenCertData = public_key:pkix_test_data(CertChainConf), #{client_config := ClientDerConf, server_config := ServerDerConf} = GenCertData, - [{server_config, ServerConf}, - {client_config, ClientConf}] = - x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), - [{server_rsa_opts, [{reuseaddr, true} | ServerConf]}, - {server_rsa_verify_opts, [{reuseaddr, true}, {verify, verify_peer} | ServerConf]}, - {client_rsa_opts, [{verify, verify_none} | ClientConf]}, - {client_rsa_verify_opts, [{verify, verify_peer} | ClientConf]}, - {server_rsa_der_opts, [{reuseaddr, true}, {verify, verify_none} | ServerDerConf]}, - {server_rsa_der_verify_opts, [{reuseaddr, true}, {verify, verify_peer} | ServerDerConf]}, - {client_rsa_der_opts, [{verify, verify_none} | ClientDerConf]}, - {client_rsa_der_verify_opts, [{verify, verify_peer} |ClientDerConf]} + [{server_config, ServerConf}, + {client_config, ClientConf}] = + x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), + + [{server_rsa_opts, fun() -> [{reuseaddr, true} | ServerConf] end}, + {server_rsa_verify_opts, fun() -> [{reuseaddr, true}, {verify, verify_peer} | ServerConf] end}, + {client_rsa_opts, fun() -> [{verify, verify_none} | ClientConf] end}, + {client_rsa_verify_opts, fun() -> [{verify, verify_peer} | ClientConf] end}, + {server_rsa_der_opts, fun() -> [{reuseaddr, true}, {verify, verify_none} | ServerDerConf] end}, + {server_rsa_der_verify_opts, fun() -> [{reuseaddr, true}, {verify, verify_peer} | ServerDerConf] end}, + {client_rsa_der_opts, fun() -> [{verify, verify_none} | ClientDerConf] end}, + {client_rsa_der_verify_opts, fun() -> [{verify, verify_peer} |ClientDerConf] end} | Config]; false -> Config @@ -1955,7 +1955,8 @@ make_rsa_cert_with_protected_keyfile(Config0, Password) -> "tls_password_client.pem"), der_to_pem(ProtectedClientKeyFile, [ProtectedPemEntry]), ProtectedClientOpts = [{keyfile,ProtectedClientKeyFile} | proplists:delete(keyfile, ClientOpts)], - [{client_protected_rsa_opts, ProtectedClientOpts} | Config1]. + [{client_protected_rsa_opts, fun() -> ProtectedClientOpts end} + | Config1]. make_rsa_1024_cert(Config) -> CryptoSupport = crypto:supports(), @@ -1971,14 +1972,14 @@ make_rsa_1024_cert(Config) -> [{server_config, ServerConf}, {client_config, ClientConf}] = x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), - [{server_rsa_1024_opts, [{ssl_imp, new},{reuseaddr, true} | ServerConf]}, - {server_rsa_1024_verify_opts, [{reuseaddr, true}, {verify, verify_peer} | ServerConf]}, - {client_rsa_1024_opts, [{verify, verify_none} | ClientConf]}, - {client_rsa_1024_verify_opts, [{verify, verify_peer} |ClientConf]}, - {server_rsa_1024_der_opts, [{reuseaddr, true} | ServerDerConf]}, - {server_rsa_1024_der_verify_opts, [{reuseaddr, true}, {verify, verify_peer} | ServerDerConf]}, - {client_rsa_1024_der_opts, [{verify, verify_none} | ClientDerConf]}, - {client_rsa_1024_der_verify_opts, [{verify, verify_peer} |ClientDerConf]} + [{server_rsa_1024_opts, fun() -> [{ssl_imp, new},{reuseaddr, true} | ServerConf] end}, + {server_rsa_1024_verify_opts, fun() -> [{reuseaddr, true}, {verify, verify_peer} | ServerConf] end}, + {client_rsa_1024_opts, fun() -> [{verify, verify_none} | ClientConf] end}, + {client_rsa_1024_verify_opts, fun() -> [{verify, verify_peer} |ClientConf] end}, + {server_rsa_1024_der_opts, fun() -> [{reuseaddr, true} | ServerDerConf] end}, + {server_rsa_1024_der_verify_opts, fun() -> [{reuseaddr, true}, {verify, verify_peer} | ServerDerConf] end}, + {client_rsa_1024_der_opts, fun() -> [{verify, verify_none} | ClientDerConf] end}, + {client_rsa_1024_der_verify_opts, fun() -> [{verify, verify_peer} |ClientDerConf] end} | Config]; false -> Config @@ -2016,13 +2017,10 @@ make_ecdh_rsa_cert(Config) -> {client_config, ClientConf}] = x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), - [{server_ecdh_rsa_opts, [{ssl_imp, new},{reuseaddr, true} | ServerConf]}, - - {server_ecdh_rsa_verify_opts, [{ssl_imp, new},{reuseaddr, true}, - {verify, verify_peer} | ServerConf]}, - - {client_ecdh_rsa_opts, ClientConf} - + [{server_ecdh_rsa_opts, fun() -> [{ssl_imp, new},{reuseaddr, true} | ServerConf] end}, + {server_ecdh_rsa_verify_opts, + fun() ->[{ssl_imp, new},{reuseaddr, true}, {verify, verify_peer} | ServerConf] end}, + {client_ecdh_rsa_opts, fun() -> ClientConf end} | Config]; _ -> Config @@ -2044,10 +2042,11 @@ make_rsa_ecdsa_cert(Config, Curve) -> {client_config, ClientConf}] = x509_test:gen_pem_config_files(GenCertData, ClientFileBase, ServerFileBase), - [{server_rsa_ecdsa_opts, [{reuseaddr, true} | ServerConf]}, - {server_rsa_ecdsa_verify_opts, [{ssl_imp, new},{reuseaddr, true}, - {verify, verify_peer} | ServerConf]}, - {client_rsa_ecdsa_opts, [{verify, verify_none} | ClientConf]} | Config]; + [{server_rsa_ecdsa_opts, fun() -> [{reuseaddr, true} | ServerConf] end}, + {server_rsa_ecdsa_verify_opts, + fun() -> [{ssl_imp, new},{reuseaddr, true},{verify, verify_peer} | ServerConf] end}, + {client_rsa_ecdsa_opts, fun() -> [{verify, verify_none} | ClientConf] end} + | Config]; _ -> Config end. @@ -2696,7 +2695,9 @@ trigger_renegotiate(Socket, ErlData, N, Id) -> ssl:send(Socket, ErlData), trigger_renegotiate(Socket, ErlData, N-1, Id). - +send_selected_port(Pid, 0, {sslsocket, nil, {Socket, _}}) -> %% Suport downgrade test + {ok, {_, NewPort}} = inet:sockname(Socket), + Pid ! {self(), {port, NewPort}}; send_selected_port(Pid, 0, #sslsocket{} = Socket) -> {ok, {_, NewPort}} = ssl:sockname(Socket), Pid ! {self(), {port, NewPort}}; @@ -2831,7 +2832,7 @@ is_dtls_version(_) -> openssl_tls_version_support(Version, Config0) -> Config = make_rsa_cert(Config0), - ServerOpts = proplists:get_value(server_rsa_opts, Config), + ServerOpts = ssl_options(server_rsa_opts, Config), Port = inet_port(node()), CaCertFile = proplists:get_value(cacertfile, ServerOpts), CertFile = proplists:get_value(certfile, ServerOpts), @@ -3665,16 +3666,27 @@ ubuntu_legacy_support() -> end. ssl_options(Extra, Option, Config) -> - ExtraOpts = proplists:get_value(Extra, Config, []), + ExtraOpts = case proplists:get_value(Extra, Config, []) of + Settings when is_list(Settings) -> Settings; + Fun when is_function(Fun, 0) -> Fun(); + Other -> Other + end, ExtraOpts ++ ssl_options(Option, Config). ssl_options(Option, Config) when is_atom(Option) -> ProtocolOpts = proplists:get_value(protocol_opts, Config, []), - Opts = proplists:get_value(Option, Config, []), + Opts = case proplists:get_value(Option, Config, []) of + Settings when is_list(Settings) -> Settings; + Fun when is_function(Fun, 0) -> Fun(); + Other -> Other + end, Opts ++ ProtocolOpts; -ssl_options(Options, Config) -> +ssl_options(Options, Config) when is_list(Options) -> + ProtocolOpts = proplists:get_value(protocol_opts, Config, []), + Options ++ ProtocolOpts; +ssl_options(OptionFun, Config) when is_function(OptionFun, 0) -> ProtocolOpts = proplists:get_value(protocol_opts, Config, []), - Options ++ ProtocolOpts. + OptionFun() ++ ProtocolOpts. protocol_version(Config) -> case proplists:get_value(version, Config, undefined) of diff --git a/lib/ssl/test/ssl_trace_SUITE.erl b/lib/ssl/test/ssl_trace_SUITE.erl index af3b37ec2311..91cdbf5179ae 100644 --- a/lib/ssl/test/ssl_trace_SUITE.erl +++ b/lib/ssl/test/ssl_trace_SUITE.erl @@ -60,8 +60,8 @@ all() -> [tc_basic, tc_no_trace, tc_api_profile, tc_rle_profile, tc_budget_option, tc_write, tc_file_option, tc_check_profiles]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), ssl_test_lib:make_rsa_cert(Config) diff --git a/lib/ssl/test/ssl_upgrade_SUITE.erl b/lib/ssl/test/ssl_upgrade_SUITE.erl index e768964a3890..9a5f2b8e0c05 100644 --- a/lib/ssl/test/ssl_upgrade_SUITE.erl +++ b/lib/ssl/test/ssl_upgrade_SUITE.erl @@ -62,8 +62,8 @@ all() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), case ct_release_test:init(Config0) of @@ -78,7 +78,7 @@ init_per_suite(Config0) -> end_per_suite(Config) -> ct_release_test:cleanup(Config), - crypto:stop(). + application:stop(crypto). init_per_testcase(_TestCase, Config) -> ssl_test_lib:ct_log_supported_protocol_versions(Config), diff --git a/lib/ssl/test/ssl_use_srtp_SUITE.erl b/lib/ssl/test/ssl_use_srtp_SUITE.erl index a3397ce40351..64ebd3ccf239 100644 --- a/lib/ssl/test/ssl_use_srtp_SUITE.erl +++ b/lib/ssl/test/ssl_use_srtp_SUITE.erl @@ -67,8 +67,8 @@ use_srtp_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), {#{server_config := _ServerConf, diff --git a/lib/ssl/test/tls_1_3_record_SUITE.erl b/lib/ssl/test/tls_1_3_record_SUITE.erl index 6569ff15a635..a7d4176c50c7 100644 --- a/lib/ssl/test/tls_1_3_record_SUITE.erl +++ b/lib/ssl/test/tls_1_3_record_SUITE.erl @@ -55,8 +55,8 @@ all() -> '0_RTT_handshake']. init_per_suite(Config) -> - catch crypto:stop(), - try (ok == crypto:start()) andalso ssl_test_lib:sufficient_crypto_support('tlsv1.3') of + catch application:stop(crypto), + try (ok == application:start(crypto)) andalso ssl_test_lib:sufficient_crypto_support('tlsv1.3') of true -> ssl_test_lib:clean_start(), Config; diff --git a/lib/ssl/test/tls_1_3_version_SUITE.erl b/lib/ssl/test/tls_1_3_version_SUITE.erl index 7f841681744f..dab7a1d135e1 100644 --- a/lib/ssl/test/tls_1_3_version_SUITE.erl +++ b/lib/ssl/test/tls_1_3_version_SUITE.erl @@ -134,8 +134,8 @@ legacy_tests() -> ]. init_per_suite(Config) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> case ssl_test_lib:sufficient_crypto_support('tlsv1.3') of true -> diff --git a/lib/ssl/test/tls_api_SUITE.erl b/lib/ssl/test/tls_api_SUITE.erl index 0e8da54b6c57..af33c4d3f447 100644 --- a/lib/ssl/test/tls_api_SUITE.erl +++ b/lib/ssl/test/tls_api_SUITE.erl @@ -27,7 +27,7 @@ -include_lib("ssl/src/ssl_record.hrl"). -include_lib("ssl/src/ssl_internal.hrl"). -include_lib("ssl/src/ssl_api.hrl"). --include_lib("ssl/src/tls_handshake.hrl"). +-include_lib("ssl/src/ssl_connection.hrl"). -include_lib("ssl/src/ssl_alert.hrl"). -include_lib("ssl/src/ssl_cipher.hrl"). @@ -192,8 +192,8 @@ api_tests() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config1 = ssl_test_lib:make_rsa_cert_with_protected_keyfile(Config0, @@ -783,7 +783,7 @@ tls_tcp_error_propagation_in_active_mode(Config) when is_list(Config) -> {mfa, {ssl_test_lib, no_result, []}}, {options, ServerOpts}]), Port = ssl_test_lib:inet_port(Server), - {Client, #sslsocket{pid=[Pid|_]} = SslSocket} = ssl_test_lib:start_client([return_socket, + {Client, #sslsocket{connection_handler = Pid} = SslSocket} = ssl_test_lib:start_client([return_socket, {node, ClientNode}, {port, Port}, {host, Hostname}, {from, self()}, @@ -793,8 +793,8 @@ tls_tcp_error_propagation_in_active_mode(Config) when is_list(Config) -> {status, _, _, StatusInfo} = sys:get_status(Pid), [_, _,_, _, Prop] = StatusInfo, State = ssl_test_lib:state(Prop), - StaticEnv = element(2, State), - Socket = element(11, StaticEnv), + StaticEnv = State#state.static_env, + Socket = StaticEnv#static_env.socket, %% Fake tcp error Pid ! {tcp_error, Socket, etimedout}, @@ -815,7 +815,7 @@ tls_sup_shutdown(Config) when is_list(Config) -> {options, ServerOpts}]), Port = ssl_test_lib:inet_port(Server), - {_, #sslsocket{pid=[Pid|_]}} = ssl_test_lib:start_client([return_socket, + {_, #sslsocket{connection_handler = Pid}} = ssl_test_lib:start_client([return_socket, {node, ClientNode}, {port, Port}, {host, Hostname}, {from, self()}, @@ -1259,7 +1259,7 @@ tls_password_correct() -> [{doc, "Test that connection is possible with a correct password"}]. tls_password_correct(Config) when is_list(Config) -> F = fun (P) -> - ProtectedClientOpts = ?config(client_protected_rsa_opts, Config), + ProtectedClientOpts = ssl_test_lib:ssl_options(client_protected_rsa_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -1289,7 +1289,7 @@ tls_password_incorrect() -> [{doc, "Test that connection is not possible with wrong password"}]. tls_password_incorrect(Config) when is_list(Config) -> F = fun (P) -> - ProtectedClientOpts = ?config(client_protected_rsa_opts, Config), + ProtectedClientOpts = ssl_test_lib:ssl_options(client_protected_rsa_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -1323,7 +1323,7 @@ tls_password_badarg() -> [{doc, "Test that connection is not possible with badarg password"}]. tls_password_badarg(Config) when is_list(Config) -> F = fun (P, ServerError, ClientError) -> - ProtectedClientOpts = ?config(client_protected_rsa_opts, Config), + ProtectedClientOpts = ssl_test_lib:ssl_options(client_protected_rsa_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0}, diff --git a/lib/ssl/test/tls_server_session_ticket_SUITE.erl b/lib/ssl/test/tls_server_session_ticket_SUITE.erl index 283f91b73410..518cbaca1c43 100644 --- a/lib/ssl/test/tls_server_session_ticket_SUITE.erl +++ b/lib/ssl/test/tls_server_session_ticket_SUITE.erl @@ -79,8 +79,8 @@ groups() -> ]. init_per_suite(Config0) -> - catch crypto:stop(), - try crypto:start() of + catch application:stop(crypto), + try application:start(crypto) of ok -> ssl_test_lib:clean_start(), Config0 diff --git a/lib/stdlib/doc/assets/pshell.es b/lib/stdlib/doc/assets/pshell.es new file mode 100755 index 000000000000..b2cb0583dfb1 --- /dev/null +++ b/lib/stdlib/doc/assets/pshell.es @@ -0,0 +1,87 @@ +#!/usr/bin/env escript +%% pshell.es +-export([start/0]). +main(_Args) -> + shell:start_interactive({?MODULE, start, []}), + timer:sleep(infinity). %% Make sure the escript does not exit + +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:setopts([{expand_fun, fun expand_fun/1}]), + io:format("Starting process inspection shell~n"), + loop() + end). + +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} | + {no, nil(), nil()}. +expand_fun("") -> + {yes, "", ["list", "inspect", "suspend", "resume"]}; +expand_fun(Curr) -> + expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]). + +expand_fun(_Curr, []) -> + {no, "", []}; +expand_fun(Curr, [H | T]) -> + case lists:prefix(Curr, H) of + true -> + {yes, lists:reverse(lists:reverse(H) -- lists:reverse(Curr)), []}; + false -> + expand_fun(Curr, T) + end. + +loop() -> + case io:get_line("> ") of + eof -> ok; + {error, Reason} -> exit(Reason); + Data -> eval(string:trim(Data)) + end, + loop(). + +eval("list") -> + Format = " ~.10ts | ~.10ts | ~.10ts~n", + io:format(Format,["Pid", "Name", "MsgQ Len"]), + [begin + [{registered_name,Name},{message_queue_len,Len}] + = erlang:process_info(Pid, [registered_name, message_queue_len]), + io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)]) + end || Pid <- processes()]; +eval("inspect " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] = + erlang:process_info(Pid, [registered_name, memory, messages, status]), + io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n", + [Pid, to_list(Name), Status, Memory, Messages]) + end; +eval("suspend " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:suspend_process(Pid), + io:format("Suspeneded ~ts~n", [Pid]) + end; +eval("resume " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:resumne_process(Pid), + io:format("Resumed ~ts~n", [Pid]) + end; +eval(Unknown) -> + io:format("Unknown command: '~ts'~n",[Unknown]). + +to_list(Pid) when is_pid(Pid) -> + pid_to_list(Pid); +to_list(Atom) when is_atom(Atom) -> + atom_to_list(Atom); +to_list(Int) when is_integer(Int) -> + integer_to_list(Int); +to_list(List) when is_list(List) -> + List. + +parse_pid(PidStr) -> + try list_to_pid(PidStr) + catch _:_ -> io:format("Invalid pid format~n"), invalid + end. \ No newline at end of file diff --git a/lib/stdlib/doc/assets/tic-tac-toe.es b/lib/stdlib/doc/assets/tic-tac-toe.es new file mode 100755 index 000000000000..0fb694905ce2 --- /dev/null +++ b/lib/stdlib/doc/assets/tic-tac-toe.es @@ -0,0 +1,106 @@ +#!/usr/bin/env escript +main(_Args) -> + ok = shell:start_interactive({noshell, raw}), + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + loop({0, "X", list_to_tuple(lists:duplicate(9, ""))}), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. + +draw_board() -> + io:put_chars("\e[5;0H"), %% Move cursor to top left + io:put_chars( + [" ╔═══════╤═══════╤═══════╗\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║ Place an X by pressing Enter\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╚═══════╧═══════╧═══════╝\r\n"]), + ok. + +loop(State) -> + io:put_chars(draw_state(State)), + case handle_input(io:get_chars("", 30), State) of + stop -> stop; + NewState -> + io:put_chars(clear_selection(State)), + loop(NewState) + end. + +%% Clear/draw the selection markers, making sure +%% not to overwrite if a X or O exists. +%% \b = Move cursor left +%% \e[C = Move cursor right +%% \n = Move cursor down +clear_selection({Pos, _, _}) -> + [set_position(Pos), + " ","\b\b\b\b\b\b\b\n", + " \e[C\e[C\e[C\e[C\e[C ", + "\b\b\b\b\b\b\b\n"," "]. + +draw_selection({Pos, _, _}) -> + [set_position(Pos), + "┌─────┐","\b\b\b\b\b\b\b\n", + "│\e[C\e[C\e[C\e[C\e[C│", + "\b\b\b\b\b\b\b\n","└─────┘"]. + +%% Set the cursor position to be at the top +%% left of the field of the given position +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]). + +%% Update selection and whos turn it is +draw_state({_, Turn, _} = State) -> + [draw_selection(State), + io_lib:format("\e[7;45H~s",[Turn])]. + +%% Draw X or O +draw_marker(Pos, Turn) -> + [set_position(Pos), "\e[C\e[C\e[C\n", Turn]. + +handle_input({ok, Chars}, State) -> + handle_input({ok, Chars}, State); +handle_input(eof, _State) -> + stop; +handle_input("\e[A" ++ Rest, {Pos, Turn, State}) -> + %% Up key + handle_input(Rest, {max(0, Pos - 3), Turn, State}); +handle_input("\e[B" ++ Rest, {Pos, Turn, State}) -> + %% Down key + handle_input(Rest, {min(8, Pos + 3), Turn, State}); +handle_input("\e[C" ++ Rest, {Pos, Turn, State}) -> + %% right key + handle_input(Rest, {min(8, Pos + 1), Turn, State}); +handle_input("\e[D" ++ Rest, {Pos, Turn, State}) -> + %% left key + handle_input(Rest, {max(0, Pos - 1), Turn, State}); +handle_input("\r" ++ Rest, {Pos, Turn, State} = OldState) -> + NewState = + case element(Pos+1, State) of + "" when Turn =:= "X" -> + io:put_chars(draw_marker(Pos, Turn)), + {Pos, "O", setelement(Pos+1, State, Turn)}; + "" when Turn =:= "O" -> + io:put_chars(draw_marker(Pos, Turn)), + {Pos, "X", setelement(Pos+1, State, Turn)}; + _ -> io:put_chars("\^G"), OldState + end, + handle_input(Rest, NewState); +handle_input("q" ++ _, _State) -> + stop; +handle_input([_ | T], State) -> + handle_input(T, State); +handle_input([], State) -> + State. \ No newline at end of file diff --git a/lib/stdlib/doc/docs.exs b/lib/stdlib/doc/docs.exs index 15957e70f56c..d3cb216f15b3 100644 --- a/lib/stdlib/doc/docs.exs +++ b/lib/stdlib/doc/docs.exs @@ -71,6 +71,8 @@ extras: [ "guides/introduction.md", "guides/io_protocol.md", + "guides/custom_shell.md", + "guides/terminal_interface.md", "guides/unicode_usage.md", "guides/uri_string_usage.md", "references/assert_hrl.md", diff --git a/lib/stdlib/doc/guides/custom_shell.md b/lib/stdlib/doc/guides/custom_shell.md new file mode 100644 index 000000000000..4e36d87d94cb --- /dev/null +++ b/lib/stdlib/doc/guides/custom_shell.md @@ -0,0 +1,220 @@ + +# Creating a custom shell + +This guide will show how to create a custom shell. The most common +use case for this is to support other languages running on the Erlang VM, +but it can also be used to create specialized debugging shells a system. + +This guide will build on top of the built-in [Erlang line editor](`m:edlin`), +which means that the keybindings described in [tty - A Command-Line Interface](`e:erts:tty.md`) +can be used edit the input before it is passed to the custom shell. This +somewhat limits what the custom shell can do, but it also means that we do not +have to implement line editing ourselves. If you need more control over the +shell, then use [Creating a terminal application](terminal_interface.md) as +a starting-point to build your own line editor and shell. + +## A process inspection shell + +The custom shell that we are going to build is a process inspection shell +that supports the following commands: + +* `list` - lists all processes +* `inspect pid()` - inspect a process +* `suspend pid()` - suspend a process +* `resume pid()` - resume a process + +Lets get started! + +## Starting with a custom shell + +The custom shell will be implemented in an `m:escript`, but it could just +as well be in a regular system or as a remote shell. To start a custom shell +we first need to start Erlang in `-noinput` or `-noshell` mode. `m:escript` are +started by default in `-noshell` mode, so we don't have to do anything special here. +To start the custom shell we then call `shell:start_interactive/1`. + +``` +#!/usr/bin/env escript +%% pshell.es +-export([start/0]). +main(_Args) -> + shell:start_interactive({?MODULE, start, []}), + timer:sleep(infinity). %% Make sure the escript does not exit + +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:format(~"Starting process inspection shell~n"), + loop() + end). + +loop() -> + receive _M -> loop() end. +``` + +If we run the above we will get this: + +``` +$ ./pshell.es +Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns] + +Starting process inspection shell + +``` + +The `t:io:standard_io/0` of the created shell process will be set to the +Erlang line editor, which means that we can use the normal `m:io` functions +to read and write data to the terminal. + +## Adding our first command + +Let's start adding the shell interface. We will use `io:get_line/1` to read from +`t:io:standard_io/0` as this shell will be line based. However, for a more complex +shell it is better to send [`get_until` I/O requests](io_protocol.md#input-requests) +as commands read that way can span multiple lines. So we expand our `loop/0` with +a `io:get_line/1` and pass the results to our parser. + +``` +loop() -> + case io:get_line("> ") of + eof -> ok; + {error, Reason} -> exit(Reason); + Data -> eval(string:trim(Data)) + end, + loop(). + +eval("list") -> + Format = " ~.10ts | ~.10ts | ~.10ts~n", + io:format(Format,["Pid", "Name", "MsgQ Len"]), + [begin + [{registered_name,Name},{message_queue_len,Len}] + = erlang:process_info(Pid, [registered_name, message_queue_len]), + io:format(Format,[to_list(Pid), to_list(Name), to_list(Len)]) + end || Pid <- processes()]; +eval(Unknown) -> + io:format("Unknown command: '~ts'~n",[Unknown]). + +to_list(Pid) when is_pid(Pid) -> + pid_to_list(Pid); +to_list(Atom) when is_atom(Atom) -> + atom_to_list(Atom); +to_list(Int) when is_integer(Int) -> + integer_to_list(Int); +to_list(List) when is_list(List) -> + List. +``` + +If we run the above we will get this: + +```txt +$ ./pshell.es +Erlang/OTP 28 [DEVELOPMENT] [erts-15.0.1] [source-b395339a02] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns] + +Starting process inspection shell +> list + Pid | Name | MsgQ Len + <0.0.0> | init | 0 + <0.1.0> | erts_code_ | 0 + <0.2.0> | | 0 + <0.3.0> | | 0 + <0.4.0> | | 0 + <0.5.0> | | 0 + <0.6.0> | | 0 + <0.7.0> | | 0 + <0.8.0> | socket_reg | 0 + <0.10.0> | | 0 + <0.11.0> | erl_prim_l | 0 + <0.43.0> | logger | 0 + <0.45.0> | applicatio | 0 +... +``` + +With this all in place we can now easily add `inspect`, `suspend` and `resume` as well. + +``` +eval("inspect " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + [{registered_name, Name}, {memory, Memory}, {messages, Messages}, {status, Status}] = + erlang:process_info(Pid, [registered_name, memory, messages, status]), + io:format("Pid: ~p~nName: ~ts~nStatus: ~p~nMemory: ~p~nMessages: ~p~n", + [Pid, to_list(Name), Status, Memory, Messages]) + end; +eval("suspend " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:suspend_process(Pid), + io:format("Suspeneded ~ts~n") + end; +eval("resume " ++ PidStr) -> + case parse_pid(PidStr) of + invalid -> ok; + Pid -> + erlang:resumne_process(Pid), + io:format("Resumed ~ts~n") + end; +``` + +## Adding autocompletion + +Wouldn't it be great if we could add some simple auto-completion for our shell? We can do that +by setting a `m:edlin_expand` fun for our shell. This is done by calling [`io:setopts([{expand_fun, Fun}])`](`io:setopts/2`). The fun that we provide is will receive the reversed current line from +`m:edlin` and is expected to return possible expansions. Let's start by adding a simple fun to +expand our commands. + +``` +-spec start() -> pid(). +start() -> + spawn(fun() -> + io:setopts([{expand_fun, fun expand_fun/1}]), + io:format(~"Starting process inspection shell~n"), + loop() + end). + +-spec expand_fun(ReverseLine :: string()) -> {yes, string(), list(string())} | + {no, nil(), nil()}. +expand_fun("") -> %% If line is empty, we list all available commands + {yes, "", ["list", "inspect", "suspend", "resume"]}; +expand_fun(Curr) -> + expand_fun(lists:reverse(Curr), ["list", "inspect", "suspend", "resume"]). + +expand_fun(_Curr, []) -> + {no, "", []}; +expand_fun(Curr, [Cmd | T]) -> + case lists:prefix(Curr, Cmd) of + true -> + %% If Curr is a prefix of Cmd we subtract Curr from Cmd to get the + %% characters we need to complete with. + {yes, lists:reverse(lists:reverse(Cmd) -- lists:reverse(Curr)), []}; + false -> + expand_fun(Curr, T) + end. +``` + +With the above code we will get expansions of our commands if we hit `` in the shell. +Its possible to make very complex completion algorithms, for example the Erlang shell +has completions based on the function specifications of your code. It is important though that +the shell still feels responsive, so calling out to a LLM model for completion may or may not +be a good idea. + +The complete source code for this example can be found [here](assets/pshell.es). \ No newline at end of file diff --git a/lib/stdlib/doc/guides/io_protocol.md b/lib/stdlib/doc/guides/io_protocol.md index e0c793e8ed3f..30dca866ca33 100644 --- a/lib/stdlib/doc/guides/io_protocol.md +++ b/lib/stdlib/doc/guides/io_protocol.md @@ -116,7 +116,7 @@ To output characters on an I/O device, the following `Request`s exist: The I/O server replies to the client with an `io_reply` tuple, where element `Reply` is one of: -```text +```erlang ok {error, Error} ``` @@ -215,7 +215,7 @@ To read characters from an I/O device, the following `Request`s exist: A fixed number of characters is requested using the following `Request`: -```text +```erlang {get_chars, Encoding, Prompt, N} ``` @@ -224,7 +224,7 @@ A fixed number of characters is requested using the following `Request`: A single line (as in former example) is requested with the following `Request`: -```text +```erlang {get_line, Encoding, Prompt} ``` @@ -237,7 +237,7 @@ these additions necessary. The I/O server replies to the client with an `io_reply` tuple, where element `Reply` is one of: -```text +```erlang Data eof {error, Error} @@ -275,7 +275,7 @@ An I/O server in binary mode affects the data sent to the client, so that it must be able to handle binary data. For convenience, the modes of an I/O server can be set and retrieved using the following I/O requests: -```text +```erlang {setopts, Opts} ``` @@ -301,7 +301,7 @@ provided or returned data. The I/O server is to send one of the following as `Reply`: -```text +```erlang ok {error, Error} ``` @@ -312,7 +312,7 @@ plain file). To retrieve options, the following request is used: -```text +```erlang getopts ``` @@ -321,7 +321,7 @@ as well as their current values. The I/O server replies: -```text +```erlang OptList {error, Error} ``` @@ -334,7 +334,7 @@ OptList The `Request` element can in itself contain many `Request`s by using the following format: -```text +```erlang {requests, Requests} ``` @@ -358,7 +358,7 @@ ok The following I/O request is optional to implement and a client is to be prepared for an error return: -```text +```erlang {get_geometry, Geometry} ``` @@ -366,7 +366,7 @@ prepared for an error return: The I/O server is to send one of the following as `Reply`: -```text +```erlang N {error, Error} ``` @@ -381,7 +381,7 @@ If an I/O server encounters a request that it does not recognize (that is, the `io_request` tuple has the expected format, but the `Request` is unknown), the I/O server is to send a valid reply with the error tuple: -```text +```erlang {error, request} ``` diff --git a/lib/stdlib/doc/guides/terminal_interface.md b/lib/stdlib/doc/guides/terminal_interface.md new file mode 100644 index 000000000000..9cfb9e236657 --- /dev/null +++ b/lib/stdlib/doc/guides/terminal_interface.md @@ -0,0 +1,175 @@ + +# Creating a terminal application + +This guide will show how to create a very simple tic-tac-toe game in +the shell. We will go through how to read key-strokes and how to update +the screen to show the tic-tac-toe board. The game will be implemented as an +`m:escript`, but it can just as well be implemented in a regular system. + +Let us start by drawing the board which will look like this: + +```txt +╔═══════╤═══════╤═══════╗ +║┌─────┐│ │ ║ +║│ ││ │ ║ Place an X by pressing Enter +║└─────┘│ │ ║ +╟───────┼───────┼───────╢ +║ │ │ ║ +║ │ │ ║ +║ │ │ ║ +╟───────┼───────┼───────╢ +║ │ │ ║ +║ │ │ ║ +║ │ │ ║ +╚═══════╧═══════╧═══════╝ +``` +{: .monospace-font } + + +We will use the alternate screen buffer for our game so first we need to set that up: + +``` +#!/usr/bin/env escript +main(_Args) -> + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + timer:sleep(5000), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. +``` + +We then use the box drawing parts of Unicode to draw our board: + +``` +draw_board() -> + io:put_chars("\e[5;0H"), %% Move cursor to top left + io:put_chars( + [" ╔═══════╤═══════╤═══════╗\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║ Place an X by pressing Enter\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╟───────┼───────┼───────╢\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ║ │ │ ║\r\n", + " ╚═══════╧═══════╧═══════╝\r\n"]), + ok. +``` +{: .monospace-font } + +Let us add some interactivity to our game! To do that we need to change the +shell from running in `cooked` to `raw` mode. This is done by calling +[`shell:start_interactive({noshell, raw})`](`shell:start_interactive/1`). +We can then use `io:get_chars/2` to read key strokes from the user. The key +strokes will be returned as [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code), +so we will have need to handle the codes for up, down, left, right and enter. + +It could look something like this: + +``` +main(_Args) -> + ok = shell:start_interactive({noshell, raw}), + + io:put_chars("\e[?1049h"), %% Enable alternate screen buffer + io:put_chars("\e[?25l"), %% Hide the cursor + draw_board(), + loop(0), + io:put_chars("\e[?25h"), %% Show the cursor + io:put_chars("\e[?1049l"), %% Disable alternate screen buffer + ok. + +loop(Pos) -> + io:put_chars(draw_selection(Pos)), + %% Read at most 1024 characters from stdin. + {ok, Chars} = io:get_chars("", 1024), + case handle_input(Chars, Pos) of + stop -> stop; + NewPos -> + io:put_chars(clear_selection(Pos)), + loop(NewPos) + end. + +handle_input("\e[A" ++ Rest, Pos) -> + %% Up key + handle_input(Rest, max(0, Pos - 3)); +handle_input("\e[B" ++ Rest, Pos) -> + %% Down key + handle_input(Rest, min(8, Pos + 3)); +handle_input("\e[C" ++ Rest, Pos) -> + %% right key + handle_input(Rest, min(8, Pos + 1)); +handle_input("\e[D" ++ Rest, Pos) -> + %% left key + handle_input(Rest, max(0, Pos - 1)); +handle_input("q" ++ _, _State) -> + stop; +handle_input([_ | T], State) -> + handle_input(T, State); +handle_input([], State) -> + State. +``` + +Note that when using `io:get_chars/2` with the shell set in `{noshell, raw}` mode +it will return as soon as any data is available. The number of characters +is the maximum number that will be returned. We use 1024 here to make sure that +we always get all the data in one read. + +We also need to draw the selection marker, we do this using some simple drawing +routines. + +``` +%% Clear/draw the selection markers, making sure +%% not to overwrite if a X or O exists. +%% \b = Move cursor left +%% \e[C = Move cursor right +%% \n = Move cursor down +clear_selection(Pos) -> + [set_position(Pos), + " ","\b\b\b\b\b\b\b\n", + " \e[C\e[C\e[C\e[C\e[C ", + "\b\b\b\b\b\b\b\n"," "]. + +draw_selection(Pos) -> + [set_position(Pos), + "┌─────┐","\b\b\b\b\b\b\b\n", + "│\e[C\e[C\e[C\e[C\e[C│", + "\b\b\b\b\b\b\b\n","└─────┘"]. + +%% Set the cursor position to be at the top +%% left of the field of the given position +set_position(Pos) -> + Row = 6 + (Pos div 3) * 4, + Col = 7 + (Pos rem 3) * 8, + io_lib:format("\e[~p;~pH",[Row, Col]). +``` +{: #monospace-font } + +Now we have a program where we can move the marker around the board. +To complete the game we need to add some state so that we know which +squares are marked and whos turn it is. You can find the final solution +in [tic-tac-toe.es](assets/tic-tac-toe.es). \ No newline at end of file diff --git a/lib/stdlib/doc/stdlib_app.md b/lib/stdlib/doc/stdlib_app.md index 5b7e2cc4d837..aa863dba3f26 100644 --- a/lib/stdlib/doc/stdlib_app.md +++ b/lib/stdlib/doc/stdlib_app.md @@ -40,6 +40,11 @@ For more information about configuration parameters, see the - **`shell_catch_exception = boolean()`{: #shell_catch_exception }** - Can be used to set the exception handling of the evaluator process of Erlang shell. +- **`shell_docs_columns = pos_integer()`{: #shell_docs_columns }** - + Configures how wide the documentation should be rendered in the shell. + + See also `t:shell_docs:config/0`. + - **`shell_expand_location = above | below`{: #shell_expand_location }** - Sets where the tab expansion text should appear in the shell. The default is `below`. This will open a pager below the cursor that is scrollable one line @@ -55,7 +60,7 @@ For more information about configuration parameters, see the - **`format_shell_func = {Mod, Func} | string() | default`{: #format_shell_func }** - Can be used to set the formatting of the Erlang shell output. This has an effect on commands that have been submitted and how it is saved in history - or if the formatting hotkey is pressed while editing an expression (Alt-f by + or if the formatting hotkey is pressed while editing an expression (Alt+F by default). You can specify a Mod:Func/1 that expects the whole expression as a string and returns a formatted expressions as a string. See `shell:format_shell_func/1` for how to set it from inside the shell. diff --git a/lib/stdlib/examples/erl_id_trans.erl b/lib/stdlib/examples/erl_id_trans.erl index c50a6ae75e3d..c336af17ca32 100644 --- a/lib/stdlib/examples/erl_id_trans.erl +++ b/lib/stdlib/examples/erl_id_trans.erl @@ -9,11 +9,11 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB. %% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings %% AB. All Rights Reserved.'' -%% +%% %% $Id$ %% -module(erl_id_trans). @@ -321,7 +321,7 @@ guard0([]) -> []. guard_test(Expr={call,Anno,{atom,Aa,F},As0}) -> case erl_internal:type_test(F, length(As0)) of - true -> + true -> As1 = gexpr_list(As0), {call,Anno,{atom,Aa,F},As1}; _ -> @@ -381,7 +381,7 @@ gexpr({call,Anno,{atom,Aa,F},As0}) -> % Guard bif's can be remote, but only in the module erlang... gexpr({call,Anno,{remote,Aa,{atom,Ab,erlang},{atom,Ac,F}},As0}) -> case erl_internal:guard_bif(F, length(As0)) or - erl_internal:arith_op(F, length(As0)) or + erl_internal:arith_op(F, length(As0)) or erl_internal:comp_op(F, length(As0)) or erl_internal:bool_op(F, length(As0)) of true -> As1 = gexpr_list(As0), @@ -391,7 +391,7 @@ gexpr({bin,Anno,Fs}) -> Fs2 = pattern_grp(Fs), {bin,Anno,Fs2}; gexpr({op,Anno,Op,A0}) -> - case erl_internal:arith_op(Op, 1) or + case erl_internal:arith_op(Op, 1) or erl_internal:bool_op(Op, 1) of true -> A1 = gexpr(A0), {op,Anno,Op,A1} @@ -403,7 +403,7 @@ gexpr({op,Anno,Op,L0,R0}) when Op =:= 'andalso'; Op =:= 'orelse' -> {op,Anno,Op,L1,R1}; gexpr({op,Anno,Op,L0,R0}) -> case erl_internal:arith_op(Op, 2) or - erl_internal:bool_op(Op, 2) or + erl_internal:bool_op(Op, 2) or erl_internal:comp_op(Op, 2) of true -> L1 = gexpr(L0), @@ -623,14 +623,29 @@ comprehension_quals([{generate,Anno,P0,E0}|Qs]) -> E1 = expr(E0), P1 = pattern(P0), [{generate,Anno,P1,E1}|comprehension_quals(Qs)]; +comprehension_quals([{generate_strict,Anno,P0,E0}|Qs]) -> + E1 = expr(E0), + P1 = pattern(P0), + [{generate_strict,Anno,P1,E1}|comprehension_quals(Qs)]; comprehension_quals([{b_generate,Anno,P0,E0}|Qs]) -> E1 = expr(E0), P1 = pattern(P0), [{b_generate,Anno,P1,E1}|comprehension_quals(Qs)]; +comprehension_quals([{b_generate_strict,Anno,P0,E0}|Qs]) -> + E1 = expr(E0), + P1 = pattern(P0), + [{b_generate_strict,Anno,P1,E1}|comprehension_quals(Qs)]; comprehension_quals([{m_generate,Anno,P0,E0}|Qs]) -> E1 = expr(E0), P1 = pattern(P0), [{m_generate,Anno,P1,E1}|comprehension_quals(Qs)]; +comprehension_quals([{m_generate_strict,Anno,P0,E0}|Qs]) -> + E1 = expr(E0), + P1 = pattern(P0), + [{m_generate_strict,Anno,P1,E1}|comprehension_quals(Qs)]; +comprehension_quals([{zip,Anno,Gens0}|Qs]) -> + Gens1 = comprehension_quals(Gens0), + [{zip,Anno,Gens1}|comprehension_quals(Qs)]; comprehension_quals([E0|Qs]) -> E1 = expr(E0), [E1|comprehension_quals(Qs)]; diff --git a/lib/stdlib/src/argparse.erl b/lib/stdlib/src/argparse.erl index 3536bec69654..59343a963461 100644 --- a/lib/stdlib/src/argparse.erl +++ b/lib/stdlib/src/argparse.erl @@ -498,6 +498,11 @@ corresponding key is not present in the resulting map. -type arg_map() :: #{argument_name() => term()}. %% Arguments map: argument name to a term, produced by parser. Supplied to the command handler +-doc """ +List of command line arguments to be parsed. +""". +-type args() :: [string() | unicode:chardata()]. + -doc """ Command handler specification. Called by [`run/3` ](`run/3`)upon successful parser return. @@ -599,7 +604,7 @@ elements are nested command names. %% Command path, for nested commands -export_type([arg_type/0, argument_help/0, argument/0, - command/0, handler/0, cmd_path/0, arg_map/0]). + command/0, handler/0, cmd_path/0, arg_map/0, args/0]). -doc """ Returned from [`parse/2,3`](`parse/3`) when the user input cannot be parsed @@ -703,7 +708,7 @@ validate(Command, Options) -> %% @equiv parse(Args, Command, #{}) -doc(#{equiv => parse/3}). -doc(#{since => <<"OTP 26.0">>}). --spec parse(Args :: [string()], command()) -> parse_result(). +-spec parse(args(), command()) -> parse_result(). parse(Args, Command) -> parse(Args, Command, #{}). @@ -722,13 +727,14 @@ makes `parse/2,3` to return a tuple This function does not call command handler. """. -doc(#{since => <<"OTP 26.0">>}). --spec parse(Args :: [string()], command(), Options :: parser_options()) -> parse_result(). +-spec parse(args(), command(), Options :: parser_options()) -> parse_result(). parse(Args, Command, Options) -> Prog = validate(Command, Options), %% use maps and not sets v2, because sets:is_element/2 cannot be used in guards (unlike is_map_key) Prefixes = maps:from_list([{P, true} || P <- maps:get(prefixes, Options, [$-])]), + Args2 = [unicode:characters_to_list(Arg) || Arg <- Args], try - parse_impl(Args, merge_arguments(Prog, Command, init_parser(Prefixes, Command, Options))) + parse_impl(Args2, merge_arguments(Prog, Command, init_parser(Prefixes, Command, Options))) catch %% Parser error may happen at any depth, and bubbling the error is really %% cumbersome. Use exceptions and catch it before returning from `parse/2,3' instead. @@ -772,7 +778,7 @@ specification or user-provided command line input. > may result in an unexpected shutdown of a remote node. """. -doc(#{since => <<"OTP 26.0">>}). --spec run(Args :: [string()], command(), parser_options()) -> term(). +-spec run(args(), command(), parser_options()) -> term(). run(Args, Command, Options) -> try parse(Args, Command, Options) of {ok, ArgMap, Path, SubCmd} -> @@ -1661,7 +1667,10 @@ collect_options(CmdName, Command, [Cmd|Tail], Args) -> %% gets help for sub-command get_help(Command, []) -> - maps:get(help, Command, ""); + case maps:get(help, Command, "") of + Help when is_binary(Help) -> unicode:characters_to_list(Help); + Help -> Help + end; get_help(Command, [Cmd|Tail]) -> Sub = maps:get(commands, Command), SubCmd = maps:get(Cmd, Sub), diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl index 27aa88fa373e..4acae18ac76a 100644 --- a/lib/stdlib/src/beam_lib.erl +++ b/lib/stdlib/src/beam_lib.erl @@ -39,6 +39,7 @@ follows: - `indexed_imports ("ImpT")` - `labeled_exports ("ExpT")` - `labeled_locals ("LocT")` +- `literals ("LitT")` - `locals ("LocT")` - `documentation ("Docs")` @@ -231,12 +232,14 @@ computed from the `debug_info` chunk. """. -type chunkid() :: nonempty_string(). % approximation of the strings below %% "Abst" | "Dbgi" | "Attr" | "CInf" | "ExpT" | "ImpT" | "LocT" | "Atom" | "AtU8" | "Docs" +%% "LitT" -type chunkname() :: 'abstract_code' | 'debug_info' | 'attributes' | 'compile_info' | 'exports' | 'labeled_exports' | 'imports' | 'indexed_imports' | 'locals' | 'labeled_locals' - | 'atoms' | 'documentation'. + | 'atoms' | 'documentation' + | 'literals'. -type chunkref() :: chunkname() | chunkid(). -type attrib_entry() :: {Attribute :: atom(), [AttributeValue :: term()]}. @@ -246,6 +249,8 @@ computed from the `debug_info` chunk. -doc "[EEP-48 documentation format](`e:kernel:eep48_chapter.md#the-docs-format`)". -type docs() :: #docs_v1{}. +-type literals() :: {index(), term()}. + -doc """ The list of attributes is sorted on `Attribute` (in `t:attrib_entry/0`) and each attribute name occurs once in the list. The attribute values occur in the same @@ -263,7 +268,8 @@ order as in the file. The lists of functions are also sorted. | {'locals', [{atom(), arity()}]} | {'labeled_locals', [labeled_entry()]} | {'atoms', [{integer(), atom()}]} - | {'documentation', docs()}. + | {'documentation', docs()} + | {'literals', literals()}. %% Error reasons -type info_rsn() :: {'chunk_too_big', file:filename(), @@ -977,8 +983,7 @@ scan_beam(FD, Pos, What, Mod, Data) -> get_atom_data(Cs, Id, FD, Size, Pos, Pos2, Data, Encoding) -> NewCs = del_chunk(Id, Cs), {NFD, Chunk} = get_chunk(Id, Pos, Size, FD), - <<_Num:32, Chunk2/binary>> = Chunk, - {Module, _} = extract_atom(Chunk2, Encoding), + Module = extract_module(Chunk, Encoding), C = case Cs of info -> {Id, Pos, Size}; @@ -1124,6 +1129,14 @@ chunk_to_data(atoms=Id, _Chunk, _File, Cs, AtomTable0, _Mod) -> AtomTable = ensure_atoms(AtomTable0, Cs), Atoms = ets:tab2list(AtomTable), {AtomTable, {Id, lists:sort(Atoms)}}; +chunk_to_data(literals=Id, Chunk, File, _Cs, AtomTable, _Mod) -> + try extract_literals(Chunk) of + Literals -> + {AtomTable, {Id, Literals}} + catch + _:_ -> + error({invalid_chunk, File, chunk_name_to_id(Id, File)}) + end; chunk_to_data(ChunkName, Chunk, File, Cs, AtomTable, _Mod) when is_atom(ChunkName) -> case catch symbols(Chunk, AtomTable, Cs, ChunkName) of @@ -1147,6 +1160,7 @@ chunk_name_to_id(abstract_code, _) -> "Abst"; chunk_name_to_id(debug_info, _) -> "Dbgi"; chunk_name_to_id(compile_info, _) -> "CInf"; chunk_name_to_id(documentation, _) -> "Docs"; +chunk_name_to_id(literals, _) -> "LitT"; chunk_name_to_id(Other, File) -> error({unknown_chunk, File, Other}). @@ -1202,6 +1216,15 @@ ensure_atoms({empty, AT}, Cs) -> ensure_atoms(AT, _Cs) -> AT. +extract_module(<>, utf8) when Num < 0 -> + {Module, _} = extract_long_atom(B), + Module; +extract_module(<<_Num:32/signed-integer, B/binary>>, Encoding) -> + {Module, _} = extract_atom(B, Encoding), + Module. + +extract_atoms(<>, AT, utf8) when Num < 0 -> + extract_long_atoms(B, 1, AT); extract_atoms(<<_Num:32, B/binary>>, AT, Encoding) -> extract_atoms(B, 1, AT, Encoding). @@ -1216,6 +1239,47 @@ extract_atom(<>, Encoding) -> <> = B, {binary_to_atom(SB, Encoding), Tail}. +extract_long_atoms(<<>>, _I, _AT) -> + true; +extract_long_atoms(B, I, AT) -> + {Atom, B1} = extract_long_atom(B), + true = ets:insert(AT, {I, Atom}), + extract_long_atoms(B1, I+1, AT). + +extract_long_atom(B0) -> + {Len, B} = decode_arg_val(B0), + <> = B, + {binary_to_atom(SB, utf8), Tail}. + +%% Extract the value from variable-sized tagged argument. Only support +%% values from 0 through 2047, which is sufficient to handle the +%% length of atoms in the atom table. +decode_arg_val(<>) -> + {N, Code}; +decode_arg_val(<>) -> + N = (High bsl 8) bor Low, + {N, Code0}. + +extract_literals(Chunk0) -> + Literals0 = + case Chunk0 of + <<0:32, Chunk/binary>> -> + %% Literals are not compressed in Erlang/OTP 28 and + %% later. + Chunk; + <> -> + %% Literals are compressed in Erlang/OTP 27 and + %% earlier. + Chunk = zlib:uncompress(Chunk1), + OriginalSize = byte_size(Chunk), %Sanity check. + Chunk + end, + <> = Literals0, + Literals = [binary_to_term(Term) || + <> <:= Literals1], + NumLiterals = length(Literals), %Sanity check. + lists:enumerate(0, Literals). + %%% Utils. -record(bb, {pos = 0 :: integer(), @@ -1376,7 +1440,7 @@ anno_from_forms(Forms0) -> [erl_parse:anno_from_term(Form) || Form <- Forms]. start_crypto() -> - case crypto:start() of + case application:start(crypto) of {error, {already_started, _}} -> ok; ok -> diff --git a/lib/stdlib/src/binary.erl b/lib/stdlib/src/binary.erl index 4e66c00da0b8..f7acbee55d17 100644 --- a/lib/stdlib/src/binary.erl +++ b/lib/stdlib/src/binary.erl @@ -38,7 +38,8 @@ The module is provided according to Erlang Enhancement Proposal (EEP) 31. %% %% Implemented in this module: -export([replace/3, replace/4, - encode_hex/1, encode_hex/2, decode_hex/1]). + encode_hex/1, encode_hex/2, decode_hex/1, + join/2]). -export_type([cp/0]). @@ -750,7 +751,7 @@ _Examples:_ OnePos :: non_neg_integer(), Result :: binary(). -replace(Haystack,Needles,Replacement,Options) -> +replace(Subject,Pattern,Replacement,Options) -> try true = is_binary(Replacement) orelse is_function(Replacement, 1), % Make badarg instead of function clause {Part,Global,Insert} = get_opts_replace(Options,{no,false,[]}), @@ -762,9 +763,9 @@ replace(Haystack,Needles,Replacement,Options) -> end, MList = if Global -> - binary:matches(Haystack,Needles,Moptlist); + binary:matches(Subject,Pattern,Moptlist); true -> - case binary:match(Haystack,Needles,Moptlist) of + case binary:match(Subject,Pattern,Moptlist) of nomatch -> []; Match -> [Match] end @@ -781,12 +782,12 @@ replace(Haystack,Needles,Replacement,Options) -> Splits = splitat(Replacement,0,lists:sort(Li)), fun(M) -> lists:join(M, Splits) end end, - erlang:iolist_to_binary(do_replace(Haystack,MList,ReplList,0)) + erlang:iolist_to_binary(do_replace(Subject,MList,ReplList,0)) catch throw:badopt -> - badarg_with_cause([Haystack,Needles,Replacement,Options], badopt); + badarg_with_cause([Subject,Pattern,Replacement,Options], badopt); _:_ -> - badarg_with_info([Haystack,Needles,Replacement,Options]) + badarg_with_info([Subject,Pattern,Replacement,Options]) end. @@ -958,6 +959,37 @@ unhex(X) -> no, 10, 11, 12, 13, 14, 15, no, no, no, no, no, no, no, no, no %96 }). +-doc """ +Joins a list of binaries together by a specified `Separator`. + +Equivalent to `iolist_to_binary(lists:join(Separator, Binaries))`, but faster. + +_Example:_ + +```erlang +1> binary:join([<<"a">>, <<"b">>, <<"c">>], <<", ">>). +<<"a, b, c">> +``` +""". +-doc(#{since => <<"OTP 28.0">>}). +-spec join([binary()], binary()) -> binary(). +join([], Separator) when is_binary(Separator) -> <<>>; +join([H], Separator) when is_binary(H), is_binary(Separator) -> H; +join([H | T]=List, Separator) when is_binary(Separator) -> + try + Acc = <<>>, %Enable private-append optimization + join(T, Separator, <>) + catch + error:_ -> + badarg_with_info([List, Separator]) + end; +join(Arg, Separator) -> + badarg_with_info([Arg, Separator]). + +join([], _Separator, Acc) -> Acc; +join([H | T], Separator, Acc) -> + join(T, Separator, <>). + badarg_with_cause(Args, Cause) -> erlang:error(badarg, Args, [{error_info, #{module => erl_stdlib_errors, cause => Cause}}]). diff --git a/lib/stdlib/src/c.erl b/lib/stdlib/src/c.erl index eb935688a41c..85d5a0763005 100644 --- a/lib/stdlib/src/c.erl +++ b/lib/stdlib/src/c.erl @@ -66,36 +66,42 @@ this module. help() -> io:put_chars(<<"bt(Pid) -- stack backtrace for a process\n" - "c(Mod) -- compile and load module or file \n" - "cd(Dir) -- change working directory\n" - "flush() -- flush any messages sent to the shell\n" - "help() -- help info\n" + "c(Mod) -- compile and load module or file \n" + "cd(Dir) -- change working directory\n" + "flush() -- flush any messages sent to the shell\n" "h(M) -- module documentation\n" "h(M,F) -- module function documentation\n" "h(M,F,A) -- module function arity documentation\n" - "i() -- information about the system\n" - "ni() -- information about the networked system\n" - "i(X,Y,Z) -- information about pid \n" - "l(Module) -- load or reload module\n" - "lm() -- load all modified modules\n" - "lc([File]) -- compile a list of Erlang modules\n" - "ls() -- list files in the current directory\n" - "ls(Dir) -- list files in directory
\n" - "m() -- which modules are loaded\n" - "m(Mod) -- information about module \n" - "mm() -- list all modified modules\n" - "memory() -- memory allocation information\n" - "memory(T) -- memory allocation information of type \n" - "nc(File) -- compile and load code in on all nodes\n" - "nl(Module) -- load module on all nodes\n" - "pid(X,Y,Z) -- convert X,Y,Z to a Pid\n" - "pwd() -- print working directory\n" - "q() -- quit - shorthand for init:stop()\n" - "regs() -- information about registered processes\n" - "nregs() -- information about all registered processes\n" - "uptime() -- print node uptime\n" - "xm(M) -- cross reference check a module\n" - "y(File) -- generate a Yecc parser\n">>). + "hcb(Mod) -- help about a module's callbacks\n" + "hcb(Mod,CB) -- help about callback in module\n" + "hcb(Mod,CB,Arity) -- help about callback with arity in module\n" + "ht(Mod) -- help about a module's types\n" + "ht(Mod,Type) -- help about type in module\n" + "ht(Mod,Type,Arity) -- help about type with arity in module\n" + "help() -- help info\n" + "i() -- information about the system\n" + "i(X,Y,Z) -- information about pid \n" + "l(Module) -- load or reload module\n" + "lc([File]) -- compile a list of Erlang modules\n" + "lm() -- load all modified modules\n" + "ls() -- list files in the current directory\n" + "ls(Dir) -- list files in directory \n" + "m() -- which modules are loaded\n" + "m(Mod) -- information about module \n" + "memory() -- memory allocation information\n" + "memory(T) -- memory allocation information of type \n" + "mm() -- list all modified modules\n" + "nc(File) -- compile and load code in on all nodes\n" + "ni() -- information about the networked system\n" + "nl(Module) -- load module on all nodes\n" + "nregs() -- information about all registered processes\n" + "pid(X,Y,Z) -- convert X,Y,Z to a Pid\n" + "pwd() -- print working directory\n" + "q() -- quit - shorthand for init:stop()\n" + "regs() -- information about registered processes\n" + "uptime() -- print node uptime\n" + "xm(M) -- cross reference check a module\n" + "y(File) -- generate a Yecc parser\n">>). %% c(Module) %% Compile a module/file. diff --git a/lib/stdlib/src/calendar.erl b/lib/stdlib/src/calendar.erl index 7bc507b73604..0257e7b656d2 100644 --- a/lib/stdlib/src/calendar.erl +++ b/lib/stdlib/src/calendar.erl @@ -174,7 +174,7 @@ before using it. -type datetime1970() :: {{year1970(),month(),day()},time()}. -type yearweeknum() :: {year(),weeknum()}. --type rfc3339_string() :: [byte(), ...]. +-type rfc3339_string() :: [byte(), ...] | binary(). -doc """ The time unit used by the rfc3339 conversion functions. @@ -527,6 +527,9 @@ Valid option: 2> calendar:rfc3339_to_system_time("2018-02-01 15:18:02.088Z", [{unit, nanosecond}]). 1517498282088000000 +3> calendar:rfc3339_to_system_time(<<"2018-02-01 15:18:02.088Z">>, + [{unit, nanosecond}]). +1517498282088000000 ``` """. -doc(#{since => <<"OTP 21.0">>}). @@ -535,23 +538,43 @@ Valid option: Options :: [Option], Option :: {'unit', rfc3339_time_unit()}. -rfc3339_to_system_time(DateTimeString, Options) -> - Unit = proplists:get_value(unit, Options, second), - %% _T is the character separating the date and the time: +rfc3339_to_system_time(Bin, Options) when is_binary(Bin) -> + rfc3339_to_system_time_bin(Bin, Options); +rfc3339_to_system_time(List, Options) when is_list(List) -> + rfc3339_to_system_time_list(List, Options). + +%% _T is the character separating the date and the time: +rfc3339_to_system_time_bin( + <> = DateTimeBin, Options) -> + Hour = binary_to_integer(Hour0), + Min = binary_to_integer(Min0), + Sec = binary_to_integer(Sec0), + Year = binary_to_integer(Year0), + Month = binary_to_integer(Month0), + Day = binary_to_integer(Day0), + rfc3339_to_system_time_1(DateTimeBin, Options, Year, Month, Day, Hour, Min, Sec, binary_to_list(TimeStr)). + +%% _T is the character separating the date and the time: +rfc3339_to_system_time_list( [Y1, Y2, Y3, Y4, $-, Mon1, Mon2, $-, D1, D2, _T, - H1, H2, $:, Min1, Min2, $:, S1, S2 | TimeStr] = DateTimeString, + H1, H2, $:, Min1, Min2, $:, S1, S2 | TimeStr] = DateTimeString, Options) -> Hour = list_to_integer([H1, H2]), Min = list_to_integer([Min1, Min2]), Sec = list_to_integer([S1, S2]), Year = list_to_integer([Y1, Y2, Y3, Y4]), Month = list_to_integer([Mon1, Mon2]), Day = list_to_integer([D1, D2]), + rfc3339_to_system_time_1(DateTimeString, Options, Year, Month, Day, Hour, Min, Sec, TimeStr). + +rfc3339_to_system_time_1(DateTimeIn, Options, Year, Month, Day, Hour, Min, Sec, TimeStr) -> + Unit = proplists:get_value(unit, Options, second), DateTime = {{Year, Month, Day}, {Hour, Min, Sec}}, IsFractionChar = fun(C) -> C >= $0 andalso C =< $9 orelse C =:= $. end, {FractionStr, UtcOffset} = lists:splitwith(IsFractionChar, TimeStr), Time = datetime_to_system_time(DateTime), Secs = Time - offset_string_adjustment(Time, second, UtcOffset), - check(DateTimeString, Options, Secs), + check(DateTimeIn, Options, Secs), ScaledEpoch = erlang:convert_time_unit(Secs, second, Unit), ScaledEpoch + copy_sign(fraction(Unit, FractionStr), ScaledEpoch). @@ -651,6 +674,9 @@ Valid options: For `native` three fractional digits are included. Notice that trailing zeros are not removed from the fraction. +- **`{return, Return}`** - The desired encoding type for the output, + whether a string or a binary is desired. Defaults to string. + ```erlang 1> calendar:system_time_to_rfc3339(erlang:system_time(second)). "2018-04-23T14:56:28+02:00" @@ -663,6 +689,9 @@ Valid options: 4> calendar:system_time_to_rfc3339(erlang:system_time(millisecond), [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}]). "2018-04-23 12:57:20.482Z" +5> calendar:system_time_to_rfc3339(erlang:system_time(millisecond), + [{unit, millisecond}, {time_designator, $\s}, {offset, "Z"}, {return, binary}]). +<<"2018-04-23 12:57:20.482Z">> ``` [RFC 3339]: https://www.ietf.org/rfc/rfc3339.txt """. @@ -672,7 +701,8 @@ Valid options: Options :: [Option], Option :: {'offset', offset()} | {'time_designator', byte()} - | {'unit', rfc3339_time_unit()}, + | {'unit', rfc3339_time_unit()} + | {'return', 'string' | 'binary'}, DateTimeString :: rfc3339_string(). system_time_to_rfc3339(Time, Options) -> @@ -682,10 +712,10 @@ system_time_to_rfc3339(Time, Options) -> native -> TimeMS = erlang:convert_time_unit(Time, native, millisecond), OffsetOpt1 = - if is_integer(OffsetOpt0) -> - erlang:convert_time_unit(OffsetOpt0, native, - millisecond); - true -> + case is_integer(OffsetOpt0) of + true -> + erlang:convert_time_unit(OffsetOpt0, native, millisecond); + false -> OffsetOpt0 end, system_time_to_rfc3339_do(TimeMS, Options, millisecond, OffsetOpt1); @@ -707,7 +737,12 @@ system_time_to_rfc3339_do(Time, Options, Unit, OffsetOption) -> FractionStr = fraction_str(Factor, AdjustedTime), L = [pad4(Year), "-", pad2(Month), "-", pad2(Day), [T], pad2(Hour), ":", pad2(Min), ":", pad2(Sec), FractionStr, Offset], - lists:append(L). + case proplists:get_value(return, Options, string) of + string -> + lists:append(L); + binary -> + iolist_to_binary(L) + end. %% time_difference(T1, T2) = Tdiff %% diff --git a/lib/stdlib/src/edlin_key.erl b/lib/stdlib/src/edlin_key.erl index 504859883179..55844ad51731 100644 --- a/lib/stdlib/src/edlin_key.erl +++ b/lib/stdlib/src/edlin_key.erl @@ -198,13 +198,13 @@ normal_map() -> %% Enter "\n" => new_line_finish, "\r" => new_line_finish, - %%% Alt-Enter or Esc + Enter + %%% Alt+Enter or Esc + Enter "\^[\n" => new_line, "\^[\r" => new_line, %% Tab ^I "\t" => tab_expand, - %% Ctrl-alpha_key, can not distinguish case + %% Ctrl+alpha_key, can not distinguish case "\^A" => beginning_of_line, "\^B" => backward_char, %%"\^C" => sig_term_menu, currently handled by user_drv.erl @@ -228,9 +228,9 @@ normal_map() -> %%"\^X" => , "\^Y" => yank, %%"\^Z" => sig_stop, currently not handled by edlin.erl - "\^]" => auto_blink, % ctrl+5 seems to do the same thing, + "\^]" => auto_blink, % Ctrl+5 seems to do the same thing, - %%# Alt-alpha_key or Esc + alpha_key, can distinguish case, + %%# Alt+alpha_key or Esc + alpha_key, can distinguish case, "\^[B" => backward_word, "\^[b" => backward_word, "\^[c" => clear_line, @@ -356,7 +356,7 @@ valid_functions() -> %% ^V %% ^@, ^\, ^], ^^, ^_ %% not straightforward how to type these %% -%% Alt-Shift-char, Alt-char or Esc + Shift-char, Esc + char +%% Alt+Shift+char, Alt+char or Esc + Shift+char, Esc + char %% ^[A, a %% ^[C %% ^[E, e diff --git a/lib/stdlib/src/erl_anno.erl b/lib/stdlib/src/erl_anno.erl index 3a64c221b469..ef47d5a4df33 100644 --- a/lib/stdlib/src/erl_anno.erl +++ b/lib/stdlib/src/erl_anno.erl @@ -75,7 +75,7 @@ for manipulating annotations in abstract code. -export([column/1, end_location/1, file/1, generated/1, line/1, location/1, record/1, text/1]). -export([set_file/2, set_generated/2, set_line/2, set_location/2, - set_record/2, set_text/2]). + set_end_location/2, set_record/2, set_text/2]). %% To be used when necessary to avoid Dialyzer warnings. -export([to_term/1, from_term/1]). @@ -100,6 +100,7 @@ for manipulating annotations in abstract code. -type annotation() :: {'file', filename()} | {'generated', generated()} | {'location', location()} + | {'end_location', location()} | {'record', record()} | {'text', string()}. @@ -251,24 +252,37 @@ column(Anno) -> end. -doc """ -Returns the end location of the text of the annotations Anno. If there is no -text, `undefined` is returned. +Returns the end location of the annotations Anno. + +If the end location annotation is present, its value is returned. Otherwise, +if the text annotation is present, the end location is inferred from the +location and the text. Finally, if there is no text, `undefined` is returned. """. -doc(#{since => <<"OTP 18.0">>}). -spec end_location(Anno) -> location() | 'undefined' when Anno :: anno(). +end_location(Line) when ?ALINE(Line) -> + undefined; +end_location({Line, Column}) when ?ALINE(Line), ?ACOLUMN(Column) -> + undefined; end_location(Anno) -> - case text(Anno) of + case anno_info(Anno, end_location) of undefined -> - undefined; - Text -> - case location(Anno) of - {Line, Column} -> - end_location(Text, Line, Column); - Line -> - end_location(Text, Line) - end + case text(Anno) of + undefined -> + undefined; + Text -> + case location(Anno) of + {Line, Column} -> + end_location(Text, Line, Column); + Line -> + end_location(Text, Line) + end + end; + + Location -> + Location end. -doc """ @@ -403,6 +417,15 @@ set_location({L, C}=Loc, {Line, Column}) when ?ALINE(Line), ?ACOLUMN(Column), set_location(Location, Anno) -> set(location, Location, Anno). +-doc "Modifies the end location of the annotations Anno.". +-doc(#{since => <<"OTP 27.2">>}). +-spec set_end_location(Location, Anno) -> Anno when + Location :: location(), + Anno :: anno(). + +set_end_location(Location, Anno) -> + set(end_location, Location, Anno). + -doc "Modifies the record marker of the annotations Anno.". -doc(#{since => <<"OTP 18.0">>}). -spec set_record(Record, Anno) -> Anno when @@ -508,6 +531,10 @@ is_settable(location, Line) when ?LLINE(Line) -> true; is_settable(location, {Line, Column}) when ?LLINE(Line), ?LCOLUMN(Column) -> true; +is_settable(end_location, Line) when ?LLINE(Line) -> + true; +is_settable(end_location, {Line, Column}) when ?LLINE(Line), ?LCOLUMN(Column) -> + true; is_settable(record, Boolean) when Boolean; not Boolean -> true; is_settable(text, Text) -> diff --git a/lib/stdlib/src/erl_error.erl b/lib/stdlib/src/erl_error.erl index d5f1e550a394..c5ae309ce12d 100644 --- a/lib/stdlib/src/erl_error.erl +++ b/lib/stdlib/src/erl_error.erl @@ -397,6 +397,8 @@ explain_reason({bad_filter,V}, error=Cl, [], PF, S, _Enc, CL) -> format_value(V, <<"bad filter ">>, Cl, PF, S, CL); explain_reason({bad_generator,V}, error=Cl, [], PF, S, _Enc, CL) -> format_value(V, <<"bad generator ">>, Cl, PF, S, CL); +explain_reason({bad_generators,V}, error=Cl, [], PF, S, _Enc, CL) -> + format_value(V, <<"bad generators: ">>, Cl, PF, S, CL); explain_reason({unbound,V}, error, [], _PF, _S, _Enc, _CL) -> io_lib:fwrite(<<"variable ~w is unbound">>, [V]); %% Exit codes local to the shell module (restricted shell): diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl index 560c56136c8e..9e362190ef08 100644 --- a/lib/stdlib/src/erl_eval.erl +++ b/lib/stdlib/src/erl_eval.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 1996-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,7 +14,7 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% %% -module(erl_eval). @@ -129,7 +129,8 @@ to be called. -export([exprs/2,exprs/3,exprs/4,expr/2,expr/3,expr/4,expr/5, expr_list/2,expr_list/3,expr_list/4]). --export([new_bindings/0,bindings/1,binding/2,add_binding/3,del_binding/2]). +-export([new_bindings/0,new_bindings/1,bindings/1,binding/2, + add_binding/3,del_binding/2]). -export([extended_parse_exprs/1, extended_parse_term/1]). -export([is_constant_expr/1, partial_eval/1, eval_str/1]). @@ -139,7 +140,7 @@ to be called. -export([check_command/2, fun_data/1]). --import(lists, [reverse/1,foldl/3,member/2]). +-import(lists, [all/2,any/2,foldl/3,member/2,reverse/1]). -export_type([binding_struct/0]). @@ -931,6 +932,9 @@ do_apply(F, _Anno, FunOrModFun, Args) when is_function(F, 2) -> eval_lc(E, Qs, Bs, Lf, Ef, RBs, FUVs) -> ret_expr(lists:reverse(eval_lc1(E, Qs, Bs, Lf, Ef, FUVs, [])), Bs, RBs). +eval_lc1(E, [{zip, Anno, Gens}|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Lf, Ef, FUVs), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, Lf, Ef, FUVs, Acc0, fun eval_lc1/7); eval_lc1(E, [Q|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> case is_generator(Q) of true -> @@ -944,6 +948,284 @@ eval_lc1(E, [], Bs, Lf, Ef, FUVs, Acc) -> {value,V,_} = expr(E, Bs, Lf, Ef, none, FUVs), [V|Acc]. +%% convert values for generator vars from abstract form to flattened lists +convert_gen_values([{Generate, Anno, P, L0}|Qs], Acc, Bs0, Lf, Ef,FUVs) + when Generate =:= generate; + Generate =:= generate_strict; + Generate =:= b_generate; + Generate =:= b_generate_strict -> + {value,L1,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs), + convert_gen_values(Qs, [{Generate, Anno, P, L1}|Acc], Bs0, Lf, Ef, FUVs); +convert_gen_values([{Generate, Anno, P, Map0}|Qs], Acc, Bs0, Lf, Ef,FUVs) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> + {map_field_exact,_,K,V} = P, + {value,Map,_Bs1} = expr(Map0, Bs0, Lf, Ef, none, FUVs), + Iter = case is_map(Map) of + true -> + maps:iterator(Map); + false -> + %% Validate iterator. + try maps:foreach(fun(_, _) -> ok end, Map) of + _ -> + Map + catch + _:_ -> + apply_error({bad_generator,Map}, ?STACKTRACE, + Anno, Bs0, Ef, none) + end + end, + convert_gen_values(Qs, [{Generate, Anno, {tuple, Anno, [K, V]}, Iter}|Acc], + Bs0, Lf, Ef, FUVs); +convert_gen_values([], Acc, Bs0, _Lf, _Ef, _FUVs) -> + {reverse(Acc), Bs0}. + +bind_all_generators(Gens, Bs0, Lf, Ef, FUVs) -> + bind_all_generators1(Gens, [], new_bindings(Bs0), Lf, Ef, FUVs, continue). + +bind_all_generators1([{b_generate, Anno, P, <<_/bitstring>>=Bin}|Qs], + Acc, Bs0, Lf, Ef, FUVs, continue) -> + Mfun = match_fun(Bs0, Ef), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, + ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, + case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of + {match, Rest, Bs1} -> + Bs2 = zip_add_bindings(Bs1, Bs0), + case Bs2 of + nomatch -> + bind_all_generators1(Qs,[{b_generate, Anno, P, Rest}|Acc], + Bs0, Lf, Ef, FUVs, skip); + _ -> + bind_all_generators1(Qs,[{b_generate, Anno, P, Rest}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + {nomatch, Rest} -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], + Bs0, Lf, Ef, FUVs, skip); + done -> + {[], done} + end; +bind_all_generators1([{b_generate_strict, Anno, P, <<_/bitstring>>=Bin}|Qs], + Acc, Bs0, Lf, Ef, FUVs, continue) -> + Mfun = match_fun(Bs0, Ef), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, + ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, + case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of + {match, Rest, Bs1} -> + Bs2 = zip_add_bindings(Bs1, Bs0), + case Bs2 of + nomatch -> {Acc, error}; + _ -> + bind_all_generators1(Qs,[{b_generate_strict, Anno, P, Rest}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + {nomatch, _Rest} -> + {Acc, error}; + done when Bin =/= <<>> -> + {Acc, error}; + done -> + {[], done} + end; +bind_all_generators1([{b_generate, Anno, P, <<_/bitstring>>=Bin}|Qs], + Acc, Bs0, Lf, Ef, FUVs, skip) -> + Mfun = match_fun(Bs0, Ef), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, + ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, + case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of + {match, Rest, _} -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], + Bs0, Lf, Ef, FUVs, skip); + {nomatch, Rest} -> + bind_all_generators1(Qs, [{b_generate, Anno, P, Rest}|Acc], + Bs0, Lf, Ef, FUVs, skip); + done -> + {[], skip} + end; +bind_all_generators1([{b_generate_strict, Anno, P, <<_/bitstring>>=Bin}|Qs], + Acc, Bs0, Lf, Ef, FUVs, skip) -> + Mfun = match_fun(Bs0, Ef), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, + ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, + case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of + {match, Rest, _} -> + bind_all_generators1(Qs, [{b_generate_strict, Anno, P, Rest}|Acc], + Bs0, Lf, Ef, FUVs, skip); + {nomatch, _Rest} -> + {Acc, error}; + done when Bin =/= <<>> -> + {Acc, error}; + done -> + {[], skip} + end; +bind_all_generators1([{generate, Anno, P, [H|T]}|Qs], Acc, Bs0, Lf, Ef, FUVs, continue) -> + case match(P, H, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], + Bs0, Lf, Ef, FUVs, skip); + _ -> bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + nomatch -> + %% match/6 returns nomatch. Skip this value + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], Bs0, Lf, Ef, FUVs, skip) + end; +bind_all_generators1([{generate_strict, Anno, P, [H|T]}|Qs], Acc, Bs0, Lf, Ef, FUVs, continue) -> + case match(P, H, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> {Acc, error}; + _ -> bind_all_generators1(Qs,[{generate_strict, Anno, P, T}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + nomatch -> + {Acc, error} + end; +bind_all_generators1([{generate, Anno, P, [_H|T]}|Qs], Acc, Bs0, Lf, Ef, FUVs, skip) -> + bind_all_generators1(Qs,[{generate, Anno, P, T}|Acc], Bs0, Lf, Ef, FUVs, skip); +bind_all_generators1([{generate_strict, Anno, P, [H|T]}|Qs], Acc, Bs0, Lf, Ef, FUVs, skip) -> + case match(P, H, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> + {Acc, error}; + _ -> bind_all_generators1(Qs,[{generate_strict, Anno, P, T}|Acc], + Bs2, Lf, Ef, FUVs, skip) + end; + nomatch -> + {Acc, error} + end; +bind_all_generators1([{m_generate, Anno, P, Iter0}|Qs], Acc, Bs0, Lf, Ef, FUVs, continue) -> + case maps:next(Iter0) of + {K,V,Iter} -> + case match(P, {K,V}, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch-> + bind_all_generators1(Qs,[{m_generate, Anno, P, Iter}|Acc], + Bs0, Lf, Ef, FUVs, skip); + _ -> bind_all_generators1(Qs,[{m_generate, Anno, P, Iter}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + nomatch -> + bind_all_generators1(Qs, [{m_generate, Anno, P, Iter}|Acc], + Bs0, Lf, Ef, FUVs, skip) + end; + none -> + {[], done} + end; +bind_all_generators1([{m_generate_strict, Anno, P, Iter0}|Qs], Acc, Bs0, Lf, Ef, FUVs, continue) -> + case maps:next(Iter0) of + {K,V,Iter} -> + case match(P, {K,V}, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> {Acc, error}; + _ -> bind_all_generators1(Qs,[{m_generate_strict, Anno, P, Iter}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + nomatch -> + {Acc, error} + end; + none -> + {[], done} + end; +bind_all_generators1([{m_generate, Anno, P, Iter0}|Qs], Acc, Bs0, Lf, Ef, FUVs, skip) -> + case maps:next(Iter0) of + {_K,_V,Iter} -> + bind_all_generators1(Qs, [{m_generate, Anno, P, Iter}|Acc], + Bs0, Lf, Ef, FUVs, skip); + none -> + {[], skip} + end; +bind_all_generators1([{m_generate_strict, Anno, P, Iter0}|Qs], Acc, Bs0, Lf, Ef, FUVs, skip) -> + case maps:next(Iter0) of + {K,V,Iter} -> + case match(P, {K,V}, Anno, new_bindings(Bs0), Bs0, Ef) of + {match,Bsn} -> + Bs2 = zip_add_bindings(Bsn, Bs0), + case Bs2 of + nomatch -> {Acc, error}; + _ -> bind_all_generators1(Qs,[{m_generate_strict, Anno, P, Iter}|Acc], + Bs2, Lf, Ef, FUVs, continue) + end; + nomatch -> {Acc, error} + end; + none -> + {[], done} + end; +bind_all_generators1([{generate,_,_,[]}|_], _, _, _, _, _,_) -> + %% no more values left for a var, time to return + {[],done}; +bind_all_generators1([{generate_strict,_,_,[]}|_], _, _, _, _, _,_) -> + %% no more values left for a var, time to return + {[],done}; +bind_all_generators1([{generate, _Anno, _P, _Term}|_Qs], Acc, _Bs0,_Lf, _Ef, _FUVs,_) -> + {Acc, error}; +bind_all_generators1([{generate_strict, _Anno, _P, _Term}|_Qs], Acc, _Bs0,_Lf, _Ef, _FUVs,_) -> + {Acc, error}; +bind_all_generators1([{b_generate, _Anno, _P, _Term}|_Qs], Acc, _Bs0,_Lf, _Ef, _FUVs,_) -> + {Acc, error}; +bind_all_generators1([{b_generate_strict, _Anno, _P, _Term}|_Qs], Acc, _Bs0,_Lf, _Ef, _FUVs,_) -> + {Acc, error}; +bind_all_generators1([], [_H|_T] = Acc, Bs0, _Lf, _Ef, _FUVs, continue) -> + %% all vars are bind for this round + {Acc, Bs0}; +bind_all_generators1([], [_H|_T] = Acc, _Bs0,_Lf, _Ef, _FUVs, skip) -> + {Acc, skip}. + +check_bad_generators([{Generate,_,_,V}|T], Env, Acc) + when Generate =:= generate; + Generate =:= generate_strict -> + check_bad_generators(T, Env, [V|Acc]); +check_bad_generators([{Generate,_,_,Iter0}|T], Env, Acc) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> + case maps:next(Iter0) of + none -> check_bad_generators(T, Env, [#{}|Acc]); + _ -> check_bad_generators(T, Env, [#{K => V || K := V <- Iter0}|Acc]) + end; +check_bad_generators([{Generate,_,P,<<_/bitstring>>=Bin}|T], {Bs0, Lf, Ef}, Acc) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> + Mfun = match_fun(Bs0, Ef), + Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, + ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, + case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of + done -> + check_bad_generators(T, {Bs0, Lf, Ef}, [<<>>|Acc]); + _ -> + check_bad_generators(T, {Bs0, Lf, Ef}, [Bin|Acc]) + end; +check_bad_generators([{b_generate,_,_,Term}|T], Env, Acc) -> + check_bad_generators(T, Env, [Term|Acc]); +check_bad_generators([{b_generate_strict,_,_,Term}|T], Env, Acc) -> + check_bad_generators(T, Env, [Term|Acc]); +check_bad_generators([], _, Acc)-> + case any(fun is_generator_end/1, Acc) of + false -> + %% None of the generators has reached its end. + {ok, list_to_tuple(reverse(Acc))}; + true -> + case all(fun(V) -> is_generator_end(V) end, Acc) of + true -> + %% All generators have reached their end. + {ok, list_to_tuple(reverse(Acc))}; + false -> + {error, {bad_generators,list_to_tuple(reverse(Acc))}} + end + end. + +is_generator_end([]) -> true; +is_generator_end(<<>>) -> true; +is_generator_end(Other) -> Other =:= #{}. + %% eval_bc(Expr, [Qualifier], Bindings, LocalFunctionHandler, %% ExternalFuncHandler, RetBindings) -> %% {value,Value,Bindings} | Value @@ -951,6 +1233,9 @@ eval_lc1(E, [], Bs, Lf, Ef, FUVs, Acc) -> eval_bc(E, Qs, Bs, Lf, Ef, RBs, FUVs) -> ret_expr(eval_bc1(E, Qs, Bs, Lf, Ef, FUVs, <<>>), Bs, RBs). +eval_bc1(E, [{zip, Anno, Gens}|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Lf, Ef, FUVs), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, Lf, Ef, FUVs, Acc0, fun eval_bc1/7); eval_bc1(E, [Q|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> case is_generator(Q) of true -> @@ -973,6 +1258,9 @@ eval_mc(E, Qs, Bs, Lf, Ef, RBs, FUVs) -> Map = maps:from_list(L), ret_expr(Map, Bs, RBs). +eval_mc1(E, [{zip, Anno, Gens}|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> + {VarList, Bs1} = convert_gen_values(Gens, [], Bs0, Lf, Ef, FUVs), + eval_zip(E, [{zip, Anno, VarList}|Qs], Bs1, Lf, Ef, FUVs, Acc0, fun eval_mc1/7); eval_mc1(E, [Q|Qs], Bs0, Lf, Ef, FUVs, Acc0) -> case is_generator(Q) of true -> @@ -986,13 +1274,40 @@ eval_mc1({map_field_assoc,Lfa,K0,V0}, [], Bs, Lf, Ef, FUVs, Acc) -> {value,KV,_} = expr({tuple,Lfa,[K0,V0]}, Bs, Lf, Ef, none, FUVs), [KV|Acc]. -eval_generator({generate,Anno,P,L0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) -> +eval_zip(E, [{zip, Anno, VarList}|Qs], Bs0, Lf, Ef, FUVs, Acc0, Fun) -> + Gens = case check_bad_generators(VarList, {Bs0, Lf, Ef}, []) of + {ok, Acc} -> Acc; + {error, Reason} -> + apply_error(Reason, ?STACKTRACE, Anno, Bs0, Ef, none) + end, + {Rest, Bs1} = bind_all_generators(VarList, Bs0, Lf, Ef, FUVs), + case {Rest, Qs, Bs1} of + {_, _, error} -> apply_error({bad_generators,Gens}, ?STACKTRACE, Anno, Bs0, Ef, none); + {[], [], _} -> Acc0; + {[], _, _} -> Acc0; + {_,_,done} -> Acc0; + {_, _, skip} -> + eval_zip(E, [{zip, Anno, reverse(Rest)}|Qs], Bs0, Lf, Ef, FUVs, Acc0, Fun); + {_, _, _} -> + Acc1 = Fun(E, Qs, add_bindings(Bs1, Bs0), Lf, Ef, FUVs, Acc0), + eval_zip(E, [{zip, Anno, reverse(Rest)}|Qs], Bs0, Lf, Ef, FUVs, Acc1, Fun) + end. + +eval_generator({Generate,Anno,P,L0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) + when Generate =:= generate; + Generate =:= generate_strict -> {value,L1,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs), - eval_generate(L1, P, Anno, Bs0, Lf, Ef, CompFun, Acc0); -eval_generator({b_generate,Anno,P,Bin0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) -> + eval_generate(L1, P, Anno, Bs0, Lf, Ef, CompFun, + Generate =:= generate, Acc0); +eval_generator({Generate,Anno,P,Bin0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) + when Generate =:= b_generate; + Generate =:= b_generate_strict -> {value,Bin,_Bs1} = expr(Bin0, Bs0, Lf, Ef, none, FUVs), - eval_b_generate(Bin, P, Anno, Bs0, Lf, Ef, CompFun, Acc0); -eval_generator({m_generate,Anno,P,Map0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) -> + eval_b_generate(Bin, P, Anno, Bs0, Lf, Ef, CompFun, + Generate =:= b_generate, Acc0); +eval_generator({Generate,Anno,P,Map0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) + when Generate =:= m_generate; + Generate =:= m_generate_strict -> {map_field_exact,_,K,V} = P, {value,Map,_Bs1} = expr(Map0, Bs0, Lf, Ef, none, FUVs), Iter = case is_map(Map) of @@ -1009,49 +1324,58 @@ eval_generator({m_generate,Anno,P,Map0}, Bs0, Lf, Ef, FUVs, Acc0, CompFun) -> Anno, Bs0, Ef, none) end end, - eval_m_generate(Iter, {tuple,Anno,[K,V]}, Anno, Bs0, Lf, Ef, CompFun, Acc0). + eval_m_generate(Iter, {tuple,Anno,[K,V]}, Anno, Bs0, Lf, Ef, CompFun, + Generate =:= m_generate, Acc0). -eval_generate([V|Rest], P, Anno, Bs0, Lf, Ef, CompFun, Acc) -> +eval_generate([V|Rest], P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc) -> case match(P, V, Anno, new_bindings(Bs0), Bs0, Ef) of {match,Bsn} -> - Bs2 = add_bindings(Bsn, Bs0), - NewAcc = CompFun(Bs2, Acc), - eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, NewAcc); - nomatch -> - eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Acc) - end; -eval_generate([], _P, _Anno, _Bs0, _Lf, _Ef, _CompFun, Acc) -> + Bs2 = add_bindings(Bsn, Bs0), + NewAcc = CompFun(Bs2, Acc), + eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, NewAcc); + nomatch when Relaxed -> + eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc); + nomatch -> + apply_error({badmatch, V}, ?STACKTRACE, Anno, Bs0, Ef, none) + end; +eval_generate([], _P, _Anno, _Bs0, _Lf, _Ef, _CompFun, _Relaxed, Acc) -> Acc; -eval_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Acc) -> +eval_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Relaxed, _Acc) -> apply_error({bad_generator,Term}, ?STACKTRACE, Anno, Bs0, Ef, none). -eval_b_generate(<<_/bitstring>>=Bin, P, Anno, Bs0, Lf, Ef, CompFun, Acc) -> +eval_b_generate(<<_/bitstring>>=Bin, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc) -> Mfun = match_fun(Bs0, Ef), Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end, ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end, case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of - {match, Rest, Bs1} -> - Bs2 = add_bindings(Bs1, Bs0), - NewAcc = CompFun(Bs2, Acc), - eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, NewAcc); - {nomatch, Rest} -> - eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Acc); - done -> - Acc + {match, Rest, Bs1} -> + Bs2 = add_bindings(Bs1, Bs0), + NewAcc = CompFun(Bs2, Acc), + eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, NewAcc); + {nomatch, Rest} when Relaxed -> + eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc); + {nomatch, _Rest} -> + apply_error({badmatch, Bin}, ?STACKTRACE, Anno, Bs0, Ef, none); + done when not Relaxed, Bin =/= <<>> -> + apply_error({badmatch, Bin}, ?STACKTRACE, Anno, Bs0, Ef, none); + done -> + Acc end; -eval_b_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Acc) -> +eval_b_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Relaxed, _Acc) -> apply_error({bad_generator,Term}, ?STACKTRACE, Anno, Bs0, Ef, none). -eval_m_generate(Iter0, P, Anno, Bs0, Lf, Ef, CompFun, Acc0) -> +eval_m_generate(Iter0, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc0) -> case maps:next(Iter0) of {K,V,Iter} -> case match(P, {K,V}, Anno, new_bindings(Bs0), Bs0, Ef) of {match,Bsn} -> Bs2 = add_bindings(Bsn, Bs0), Acc = CompFun(Bs2, Acc0), - eval_m_generate(Iter, P, Anno, Bs0, Lf, Ef, CompFun, Acc); + eval_m_generate(Iter, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc); + nomatch when Relaxed -> + eval_m_generate(Iter, P, Anno, Bs0, Lf, Ef, CompFun, Relaxed, Acc0); nomatch -> - eval_m_generate(Iter, P, Anno, Bs0, Lf, Ef, CompFun, Acc0) + apply_error({badmatch, {K,V}}, ?STACKTRACE, Anno, Bs0, Ef, none) end; none -> Acc0 @@ -1074,8 +1398,11 @@ eval_filter(F, Bs0, Lf, Ef, CompFun, FUVs, Acc) -> end. is_generator({generate,_,_,_}) -> true; +is_generator({generate_strict,_,_,_}) -> true; is_generator({b_generate,_,_,_}) -> true; +is_generator({b_generate_strict,_,_,_}) -> true; is_generator({m_generate,_,_,_}) -> true; +is_generator({m_generate_strict,_,_,_}) -> true; is_generator(_) -> false. %% eval_map_fields([Field], Bindings, LocalFunctionHandler, @@ -1610,6 +1937,31 @@ structure. del_binding(Name, Bs) when is_map(Bs) -> maps:remove(Name, Bs); del_binding(Name, Bs) when is_list(Bs) -> orddict:erase(Name, Bs). +zip_add_bindings(Bs1, Bs2) when is_map(Bs1), is_map(Bs2) -> + zip_add_bindings_map(maps:keys(Bs1), Bs1, Bs2); +zip_add_bindings(Bs1, Bs2) when is_list(Bs1), is_list(Bs2) -> + zip_add_bindings1(orddict:to_list(Bs1), Bs2). + +zip_add_bindings_map([Key | Keys], Bs1, Bs2) -> + case {Bs1, Bs2} of + {#{Key := Same}, #{Key := Same}} -> zip_add_bindings_map(Keys, Bs1, Bs2); + {_, #{Key := _}} -> nomatch; + {#{Key := Value},_} -> zip_add_bindings_map(Keys, Bs1, Bs2#{Key => Value}) + end; +zip_add_bindings_map([], _, Bs2) -> + Bs2. + +zip_add_bindings1([{Name,Val}|Bs1], Bs2) -> + case orddict:find(Name, Bs2) of + {ok, Val} -> + zip_add_bindings1(Bs1, Bs2); + {ok, _Value} -> nomatch; + error -> + zip_add_bindings1(Bs1, orddict:store(Name, Val, Bs2)) + end; +zip_add_bindings1([], Bs2) -> + Bs2. + add_bindings(Bs1, Bs2) when is_map(Bs1), is_map(Bs2) -> maps:merge(Bs2, Bs1); add_bindings(Bs1, Bs2) -> @@ -1631,6 +1983,7 @@ merge_bindings(Bs1, Bs2, Anno, Ef) -> end end, Bs2, orddict:to_list(Bs1)). +-spec(new_bindings(binding_struct()) -> binding_struct()). new_bindings(Bs) when is_map(Bs) -> maps:new(); new_bindings(Bs) when is_list(Bs) -> orddict:new(). @@ -1843,7 +2196,7 @@ normalise_list([]) -> %%---------------------------------------------------------------------------- %% %% Evaluate expressions: -%% constants and +%% constants and %% op A %% L op R %% Things that evaluate to constants are accepted diff --git a/lib/stdlib/src/erl_expand_records.erl b/lib/stdlib/src/erl_expand_records.erl index 2b09006faf24..6b093e4c4b8b 100644 --- a/lib/stdlib/src/erl_expand_records.erl +++ b/lib/stdlib/src/erl_expand_records.erl @@ -203,8 +203,8 @@ normalise_test(function, 1) -> is_function; normalise_test(integer, 1) -> is_integer; normalise_test(list, 1) -> is_list; normalise_test(number, 1) -> is_number; -normalise_test(pid, 1) -> is_pid; -normalise_test(port, 1) -> is_port; +normalise_test(pid, 1) -> is_pid; +normalise_test(port, 1) -> is_port; normalise_test(record, 2) -> is_record; normalise_test(reference, 1) -> is_reference; normalise_test(tuple, 1) -> is_tuple; @@ -505,7 +505,7 @@ strict_record_access(E0, St0) -> St1 = St0#exprec{strict_ra = [], checked_ra = NC}, expr(E1, St1). -%% Make it look nice (?) when compiled with the 'E' flag +%% Make it look nice (?) when compiled with the 'E' flag %% ('and'/2 is left recursive). conj([], _E) -> empty; @@ -545,11 +545,21 @@ lc_tq(Anno, [{generate,AnnoG,P0,G0} | Qs0], St0) -> {P1,St2} = pattern(P0, St1), {Qs1,St3} = lc_tq(Anno, Qs0, St2), {[{generate,AnnoG,P1,G1} | Qs1],St3}; +lc_tq(Anno, [{generate_strict,AnnoG,P0,G0} | Qs0], St0) -> + {G1,St1} = expr(G0, St0), + {P1,St2} = pattern(P0, St1), + {Qs1,St3} = lc_tq(Anno, Qs0, St2), + {[{generate_strict,AnnoG,P1,G1} | Qs1],St3}; lc_tq(Anno, [{b_generate,AnnoG,P0,G0} | Qs0], St0) -> {G1,St1} = expr(G0, St0), {P1,St2} = pattern(P0, St1), {Qs1,St3} = lc_tq(Anno, Qs0, St2), {[{b_generate,AnnoG,P1,G1} | Qs1],St3}; +lc_tq(Anno, [{b_generate_strict,AnnoG,P0,G0} | Qs0], St0) -> + {G1,St1} = expr(G0, St0), + {P1,St2} = pattern(P0, St1), + {Qs1,St3} = lc_tq(Anno, Qs0, St2), + {[{b_generate_strict,AnnoG,P1,G1} | Qs1],St3}; lc_tq(Anno, [{m_generate,AnnoG,P0,G0} | Qs0], St0) -> {G1,St1} = expr(G0, St0), {map_field_exact,AnnoMFE,KeyP0,ValP0} = P0, @@ -558,6 +568,18 @@ lc_tq(Anno, [{m_generate,AnnoG,P0,G0} | Qs0], St0) -> {Qs1,St4} = lc_tq(Anno, Qs0, St3), P1 = {map_field_exact,AnnoMFE,KeyP1,ValP1}, {[{m_generate,AnnoG,P1,G1} | Qs1],St4}; +lc_tq(Anno, [{m_generate_strict,AnnoG,P0,G0} | Qs0], St0) -> + {G1,St1} = expr(G0, St0), + {map_field_exact,AnnoMFE,KeyP0,ValP0} = P0, + {KeyP1,St2} = pattern(KeyP0, St1), + {ValP1,St3} = pattern(ValP0, St2), + {Qs1,St4} = lc_tq(Anno, Qs0, St3), + P1 = {map_field_exact,AnnoMFE,KeyP1,ValP1}, + {[{m_generate_strict,AnnoG,P1,G1} | Qs1],St4}; +lc_tq(Anno, [{zip,AnnoG,G0} | Qs0], St0) -> + {G1,St1} = lc_tq(Anno, G0, St0), + {Qs1,St2} = lc_tq(Anno, Qs0, St1), + {[{zip,AnnoG,G1}|Qs1],St2}; lc_tq(Anno, [F0 | Qs0], #exprec{calltype=Calltype,raw_records=Records}=St0) -> %% Allow record/2 and expand out as guard test. IsOverriden = fun(FA) -> @@ -785,7 +807,7 @@ record_upd_fs([{record_field,Anno,{atom,_AnnoA,F},_Val} | Fs], Us, St0) -> record_upd_fs([], _, St) -> {[],[],St}. %% record_setel(Record, RecordName, [RecDefField], [Update]) -%% Build a nested chain of setelement calls to build the +%% Build a nested chain of setelement calls to build the %% updated record tuple. record_setel(R, Name, Fs, Us0) -> diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl index 8732b1743b50..e05cf24e600e 100644 --- a/lib/stdlib/src/erl_lint.erl +++ b/lib/stdlib/src/erl_lint.erl @@ -283,8 +283,12 @@ format_error_1({redefine_import,{{F,A},M}}) -> {~"function ~tw/~w already imported from ~w", [F,A,M]}; format_error_1({bad_inline,{F,A}}) -> {~"inlined function ~tw/~w undefined", [F,A]}; +format_error_1({bad_inline,{F,A},GuessF}) -> + {~"inlined function ~tw/~w undefined, did you mean ~ts/~w?", [F,A,GuessF,A]}; format_error_1({undefined_nif,{F,A}}) -> {~"nif ~tw/~w undefined", [F,A]}; +format_error_1({undefined_nif,{F,A},GuessF}) -> + {~"nif ~tw/~w undefined, did you mean ~ts/~w?", [F,A,GuessF,A]}; format_error_1(no_load_nif) -> {~"nifs defined, but no call to erlang:load_nif/2", []}; format_error_1({invalid_deprecated,D}) -> @@ -301,6 +305,8 @@ format_error_1({bad_removed,{F,A}}) -> {~"removed function ~tw/~w is still exported", [F,A]}; format_error_1({bad_nowarn_unused_function,{F,A}}) -> {~"function ~tw/~w undefined", [F,A]}; +format_error_1({bad_nowarn_unused_function,{F,A},GuessF}) -> + {~"function ~tw/~w undefined, did you mean ~ts/~w?", [F,A,GuessF,A]}; format_error_1({bad_nowarn_bif_clash,{F,A}}) -> {~"function ~tw/~w undefined", [F,A]}; format_error_1(disallowed_nowarn_bif_clash) -> @@ -319,6 +325,8 @@ format_error_1({Tag, duplicate_doc_attribute, Ann}) -> [Tag, Ann]}; format_error_1({undefined_on_load,{F,A}}) -> {~"function ~tw/~w undefined", [F,A]}; +format_error_1({undefined_on_load,{F,A},GuessF}) -> + {~"function ~tw/~w undefined, did you mean ~ts/~w?", [F,A,GuessF,A]}; format_error_1(nif_inline) -> ~"inlining is enabled - local calls to NIFs may call their Erlang implementation instead"; @@ -330,6 +338,8 @@ format_error_1({unused_import,{{F,A},M}}) -> {~"import ~w:~tw/~w is unused", [M,F,A]}; format_error_1({undefined_function,{F,A}}) -> {~"function ~tw/~w undefined", [F,A]}; +format_error_1({undefined_function,{F,A},GuessF}) -> + {~"function ~tw/~w undefined, did you mean ~ts/~w?", [F,A,GuessF,A]}; format_error_1({redefine_function,{F,A}}) -> {~"function ~tw/~w already defined", [F,A]}; format_error_1({define_import,{F,A}}) -> @@ -393,6 +403,8 @@ format_error_1({too_many_arguments,Arity}) -> {~"too many arguments (~w) -- maximum allowed is ~w", [Arity,?MAX_ARGUMENTS]}; format_error_1(update_literal) -> ~"expression updates a literal"; +format_error_1(illegal_zip_generator) -> + ~"only generators are allowed in a zip generator."; %% --- patterns and guards --- format_error_1(illegal_map_assoc_in_pattern) -> ~"illegal pattern, did you mean to use `:=`?"; format_error_1(illegal_pattern) -> ~"illegal pattern"; @@ -413,6 +425,8 @@ format_error_1(illegal_map_construction) -> %% --- records --- format_error_1({undefined_record,T}) -> {~"record ~tw undefined", [T]}; +format_error_1({undefined_record,T,GuessT}) -> + {~"record ~tw undefined, did you mean ~ts?", [T,GuessT]}; format_error_1({redefine_record,T}) -> {~"record ~tw already defined", [T]}; format_error_1({redefine_field,T,F}) -> @@ -421,6 +435,8 @@ format_error_1(bad_multi_field_init) -> {~"'_' initializes no omitted fields", []}; format_error_1({undefined_field,T,F}) -> {~"field ~tw undefined in record ~tw", [F,T]}; +format_error_1({undefined_field,T,F,GuessF}) -> + {~"field ~tw undefined in record ~tw, did you mean ~ts?", [F,T,GuessF]}; format_error_1(illegal_record_info) -> ~"illegal record info"; format_error_1({field_name_is_variable,T,F}) -> @@ -434,6 +450,8 @@ format_error_1({untyped_record,T}) -> %% --- variables ---- format_error_1({unbound_var,V}) -> {~"variable ~w is unbound", [V]}; +format_error_1({unbound_var,V,GuessV}) -> + {~"variable ~w is unbound, did you mean '~s'?", [V,GuessV]}; format_error_1({unsafe_var,V,{What,Where}}) -> {~"variable ~w unsafe in ~w ~s", [V,What,format_where(Where)]}; @@ -800,14 +818,40 @@ start(File, Opts) -> {redefined_builtin_type, bool_option(warn_redefined_builtin_type, nowarn_redefined_builtin_type, true, Opts)}, - {singleton_typevar, - bool_option(warn_singleton_typevar, nowarn_singleton_typevar, - true, Opts)}, {match_float_zero, bool_option(warn_match_float_zero, nowarn_match_float_zero, true, Opts)}, {update_literal, bool_option(warn_update_literal, nowarn_update_literal, + true, Opts)}, + %% Behaviour warnings. + {behaviours, + bool_option(warn_behaviours, + nowarn_behaviours, + true, Opts)}, + {conflicting_behaviours, + bool_option(warn_conflicting_behaviours, + nowarn_conflicting_behaviours, + true, Opts)}, + {undefined_behaviour_func, + bool_option(warn_undefined_behaviour_func, + nowarn_undefined_behaviour_func, + true, Opts)}, + {undefined_behaviour, + bool_option(warn_undefined_behaviour, + nowarn_undefined_behaviour, + true, Opts)}, + {undefined_behaviour_callbacks, + bool_option(warn_undefined_behaviour_callbacks, + nowarn_undefined_behaviour_callbacks, + true, Opts)}, + {ill_defined_behaviour_callbacks, + bool_option(warn_ill_defined_behaviour_callbacks, + nowarn_ill_defined_behaviour_callbacks, + true, Opts)}, + {ill_defined_optional_callbacks, + bool_option(warn_ill_defined_optional_callbacks, + nowarn_ill_defined_optional_callbacks, true, Opts)} ], Enabled1 = [Category || {Category,true} <- Enabled0], @@ -1218,8 +1262,13 @@ post_traversal_check(Forms, St0) -> %% check_behaviour(State0) -> State %% Check that the behaviour attribute is valid. -check_behaviour(St0) -> - behaviour_check(St0#lint.behaviour, St0). +check_behaviour(St) -> + case is_warn_enabled(behaviours, St) of + true -> + behaviour_check(St#lint.behaviour, St); + false -> + St + end. %% behaviour_check([{Anno,Behaviour}], State) -> State' %% Check behaviours for existence and defined functions. @@ -1243,10 +1292,21 @@ all_behaviour_callbacks([{Anno,B}|Bs], Acc, St0) -> all_behaviour_callbacks(Bs, [{{Anno,B},Bfs0,OBfs0}|Acc], St); all_behaviour_callbacks([], Acc, St) -> {reverse(Acc),St}. +add_behaviour_warning(Anno, Warning, St) when is_tuple(Warning) -> + Tag = element(1, Warning), + case is_warn_enabled(Tag, St) of + true -> + add_warning(Anno, Warning, St); + false -> + St + end. + behaviour_callbacks(Anno, B, St0) -> try B:behaviour_info(callbacks) of undefined -> - St1 = add_warning(Anno, {undefined_behaviour_callbacks, B}, St0), + St1 = add_behaviour_warning(Anno, + {undefined_behaviour_callbacks, B}, + St0), {[], [], St1}; Funcs -> case is_fa_list(Funcs) of @@ -1262,7 +1322,7 @@ behaviour_callbacks(Anno, B, St0) -> {Funcs, OptFuncs, St0}; false -> W = {ill_defined_optional_callbacks, B}, - St1 = add_warning(Anno, W, St0), + St1 = add_behaviour_warning(Anno, W, St0), {Funcs, [], St1} end catch @@ -1270,20 +1330,20 @@ behaviour_callbacks(Anno, B, St0) -> {Funcs, [], St0} end; false -> - St1 = add_warning(Anno, - {ill_defined_behaviour_callbacks, B}, - St0), + St1 = add_behaviour_warning(Anno, + {ill_defined_behaviour_callbacks, B}, + St0), {[], [], St1} end catch _:_ -> - St1 = add_warning(Anno, {undefined_behaviour, B}, St0), + St1 = add_behaviour_warning(Anno, {undefined_behaviour, B}, St0), St2 = check_module_name(B, Anno, St1), {[], [], St2} end. behaviour_deprecated([{{Anno, B}, Bfs, _OBfs} | T], Exports, St) -> - behaviour_deprecated(T, Exports, + behaviour_deprecated(T, Exports, behaviour_deprecated(Anno, B, Bfs, Exports, St)); behaviour_deprecated([], _Exports, St) -> St. @@ -1321,7 +1381,7 @@ behaviour_missing_callbacks([{{Anno,B},Bfs0,OBfs}|T], St0) -> case is_fa(F) of true -> M = {undefined_behaviour_func,F,B}, - add_warning(Anno, M, S0); + add_behaviour_warning(Anno, M, S0); false -> S0 % ill_defined_behaviour_callbacks end @@ -1345,7 +1405,9 @@ behaviour_add_conflicts([{Cb,[{FirstAnno,FirstB}|Cs]}|T], St0) -> behaviour_add_conflicts([], St) -> St. behaviour_add_conflict([{Anno,B}|Cs], Cb, FirstL, FirstB, St0) -> - St = add_warning(Anno, {conflicting_behaviours,Cb,B,FirstL,FirstB}, St0), + St = add_behaviour_warning(Anno, + {conflicting_behaviours,Cb,B,FirstL,FirstB}, + St0), behaviour_add_conflict(Cs, Cb, FirstL, FirstB, St); behaviour_add_conflict([], _, _, _, St) -> St. @@ -1541,9 +1603,33 @@ check_undefined_functions(#lint{called=Called0,defined=Def0}=St0) -> Called = sofs:relation(Called0, [{func,location}]), Def = sofs:from_external(gb_sets:to_list(Def0), [func]), Undef = sofs:to_external(sofs:drestriction(Called, Def)), + FAList = sofs:to_external(Def), foldl(fun ({NA,Anno}, St) -> - add_error(Anno, {undefined_function,NA}, St) - end, St0, Undef). + {Name, Arity} = NA, + PossibleFs = [atom_to_list(F) || {F, A} <- FAList, A =:= Arity], + case most_possible_string(Name, PossibleFs) of + [] -> add_error(Anno, {undefined_function,NA}, St); + GuessF -> add_error(Anno, {undefined_function,NA,GuessF}, St) + end + end, St0, Undef). + +most_possible_string(Name, PossibleNames) -> + case PossibleNames of + [] -> []; + _ -> + %% kk and kl has a similarity of 0.66. Short names are common in + %% Erlang programs, therefore we choose a relatively low threshold + %% here. + SufficientlySimilar = 0.66, + NameString = atom_to_list(Name), + Similarities = [{string:jaro_similarity(NameString, F), F} || + F <- PossibleNames], + {MaxSim, GuessName} = lists:last(lists:sort(Similarities)), + case MaxSim > SufficientlySimilar of + true -> GuessName; + false -> [] + end + end. %% check_undefined_types(State0) -> State @@ -1576,7 +1662,7 @@ check_option_functions(Forms, Tag0, Type, St0) -> DefFunctions = (gb_sets:to_list(St0#lint.defined) -- pseudolocals()) ++ [{F,A} || {{F,A},_} <- orddict:to_list(St0#lint.imports)], Bad = [{FA,Anno} || {FA,Anno} <- FAsAnno, not member(FA, DefFunctions)], - func_location_error(Type, Bad, St0). + func_location_error(Type, Bad, St0, DefFunctions). check_nifs(Forms, St0) -> FAsAnno = [{FA,Anno} || {attribute, Anno, nifs, Args} <- Forms, @@ -1589,7 +1675,8 @@ check_nifs(Forms, St0) -> end, DefFunctions = gb_sets:subtract(St1#lint.defined, gb_sets:from_list(pseudolocals())), Bad = [{FA,Anno} || {FA,Anno} <- FAsAnno, not gb_sets:is_element(FA, DefFunctions)], - func_location_error(undefined_nif, Bad, St1). + DefFunctions1 = gb_sets:to_list(DefFunctions), + func_location_error(undefined_nif, Bad, St1, DefFunctions1). nowarn_function(Tag, Opts) -> ordsets:from_list([FA || {Tag1,FAs} <- Opts, @@ -1599,8 +1686,15 @@ nowarn_function(Tag, Opts) -> func_location_warning(Type, Fs, St) -> foldl(fun ({F,Anno}, St0) -> add_warning(Anno, {Type,F}, St0) end, St, Fs). -func_location_error(Type, Fs, St) -> - foldl(fun ({F,Anno}, St0) -> add_error(Anno, {Type,F}, St0) end, St, Fs). +func_location_error(Type, Fs, St, FAList) -> + foldl(fun ({F,Anno}, St0) -> + {Name, Arity} = F, + PossibleFs = [atom_to_list(Func) || {Func, A} <- FAList, A =:= Arity], + case most_possible_string(Name, PossibleFs) of + [] -> add_error(Anno, {Type,F}, St0); + GuessF -> add_error(Anno, {Type,F,GuessF}, St0) + end + end, St, Fs). check_untyped_records(Forms, St0) -> case is_warn_enabled(untyped_record, St0) of @@ -1831,8 +1925,15 @@ on_load(Anno, Val, St) -> check_on_load(#lint{defined=Defined,on_load=[{_,0}=Fa], on_load_anno=Anno}=St) -> case gb_sets:is_member(Fa, Defined) of - true -> St; - false -> add_error(Anno, {undefined_on_load,Fa}, St) + true -> St; + false -> + DefFunctions = gb_sets:to_list(Defined), + {Name, _} = Fa, + PossibleFs = [atom_to_list(F) || {F, 0} <- DefFunctions], + case most_possible_string(Name, PossibleFs) of + [] -> add_error(Anno, {undefined_on_load,Fa}, St); + GuessF -> add_error(Anno, {undefined_on_load,Fa,GuessF}, St) + end end; check_on_load(St) -> St. @@ -1968,7 +2069,12 @@ pattern({record,Anno,Name,Pfs}, Vt, Old, St) -> St1 = used_record(Name, St), St2 = check_multi_field_init(Pfs, Anno, Fields, St1), pattern_fields(Pfs, Name, Fields, Vt, Old, St2); - error -> {[],[],add_error(Anno, {undefined_record,Name}, St)} + error -> + DefRecords = [atom_to_list(R) || R <- maps:keys(St#lint.records)], + case most_possible_string(Name, DefRecords) of + [] -> {[],[],add_error(Anno, {undefined_record,Name}, St)}; + GuessF -> {[],[],add_error(Anno, {undefined_record,Name,GuessF}, St)} + end end; pattern({bin,_,Fs}, Vt, Old, St) -> pattern_bin(Fs, Vt, Old, St); @@ -2658,7 +2764,7 @@ expr({'fun',Anno,Body}, Vt, St) -> %% It is illegal to call record_info/2 with unknown arguments. {[],add_error(Anno, illegal_record_info, St)}; {function,F,A} -> - %% BifClash - Fun expression + %% BifClash - Fun expression %% N.B. Only allows BIFs here as well, NO IMPORTS!! case ((not is_local_function(St#lint.locals,{F,A})) andalso (erl_internal:bif(F, A) andalso @@ -2710,7 +2816,7 @@ expr({call,Anno,{atom,Aa,F},As}, Vt, St0) -> AutoSuppressed = is_autoimport_suppressed(St2#lint.no_auto,{F,A}), Warn = is_warn_enabled(bif_clash, St2) and (not bif_clash_specifically_disabled(St2,{F,A})), Imported = imported(F, A, St2), - case ((not IsLocal) andalso (Imported =:= no) andalso + case ((not IsLocal) andalso (Imported =:= no) andalso IsAutoBif andalso (not AutoSuppressed)) of true -> St3 = deprecated_function(Anno, erlang, F, As, St2), @@ -2863,7 +2969,7 @@ map_fields([{Tag,_,K,V}|Fs], Vt, St, F) when Tag =:= map_field_assoc; {Vts,St3} = map_fields(Fs, Vt, St2, F), {vtupdate(Pvt, Vts),St3}; map_fields([], _, St, _) -> - {[],St}. + {[],St}. %% warn_invalid_record(Anno, Record, State0) -> State %% Adds warning if the record is invalid. @@ -2980,7 +3086,12 @@ normalise_fields(Fs) -> exist_record(Anno, Name, St) -> case is_map_key(Name, St#lint.records) of true -> used_record(Name, St); - false -> add_error(Anno, {undefined_record,Name}, St) + false -> + RecordNames = [atom_to_list(R) || R <- maps:keys(St#lint.records)], + case most_possible_string(Name, RecordNames) of + [] -> add_error(Anno, {undefined_record,Name}, St); + GuessF -> add_error(Anno, {undefined_record,Name,GuessF}, St) + end end. %% check_record(Anno, RecordName, State, CheckFun) -> @@ -2997,7 +3108,12 @@ exist_record(Anno, Name, St) -> check_record(Anno, Name, St, CheckFun) -> case maps:find(Name, St#lint.records) of {ok,{_Anno,Fields}} -> CheckFun(Fields, used_record(Name, St)); - error -> {[],add_error(Anno, {undefined_record,Name}, St)} + error -> + RecordNames = [atom_to_list(R) || R <- maps:keys(St#lint.records)], + case most_possible_string(Name, RecordNames) of + [] -> {[],add_error(Anno, {undefined_record,Name}, St)}; + GuessF -> {[],add_error(Anno, {undefined_record,Name,GuessF}, St)} + end end. used_record(Name, #lint{usage=Usage}=St) -> @@ -3027,7 +3143,12 @@ check_field({record_field,Af,{atom,Aa,F},Val}, Name, Fields, {[F|Sfs], case find_field(F, Fields) of {ok,_I} -> CheckFun(Val, Vt, St); - error -> {[],add_error(Aa, {undefined_field,Name,F}, St)} + error -> + FieldNames = [atom_to_list(R) || {record_field, _L, {_, _, R}, _} <- Fields], + case most_possible_string(F, FieldNames) of + [] -> {[],add_error(Aa, {undefined_field,Name,F}, St)}; + GuessF -> {[],add_error(Aa, {undefined_field,Name,F,GuessF}, St)} + end end} end; check_field({record_field,_Af,{var,Aa,'_'=F},Val}, _Name, _Fields, @@ -3047,7 +3168,12 @@ check_field({record_field,_Af,{var,Aa,V},_Val}, Name, _Fields, pattern_field({atom,Aa,F}, Name, Fields, St) -> case find_field(F, Fields) of {ok,_I} -> {[],St}; - error -> {[],add_error(Aa, {undefined_field,Name,F}, St)} + error -> + FieldNames = [atom_to_list(R) || {record_field, _L, {_, _, R}, _} <- Fields], + case most_possible_string(F, FieldNames) of + [] -> {[],add_error(Aa, {undefined_field,Name,F}, St)}; + GuessF -> {[],add_error(Aa, {undefined_field,Name,F,GuessF}, St)} + end end. %% pattern_fields([PatField],RecordName,[RecDefField], @@ -3078,7 +3204,12 @@ pattern_fields(Fs, Name, Fields, Vt0, Old, St0) -> record_field({atom,Aa,F}, Name, Fields, St) -> case find_field(F, Fields) of {ok,_I} -> {[],St}; - error -> {[],add_error(Aa, {undefined_field,Name,F}, St)} + error -> + FieldNames = [atom_to_list(R) || {record_field, _L, {_, _, R}, _} <- Fields], + case most_possible_string(F, FieldNames) of + [] -> {[],add_error(Aa, {undefined_field,Name,F}, St)}; + GuessF -> {[],add_error(Aa, {undefined_field,Name,F,GuessF}, St)} + end end. %% init_fields([InitField], InitAnno, RecordName, [DefField], VarTable, State) -> @@ -3192,24 +3323,16 @@ warn_redefined_builtin_type(Anno, TypePair, #lint{compile=Opts}=St) -> check_type(Types, St) -> {SeenVars, St1} = check_type_1(Types, maps:new(), St), - maps:fold(fun(Var, {seen_once, Anno}, AccSt) -> - case atom_to_list(Var) of - "_"++_ -> AccSt; - _ -> add_error(Anno, {singleton_typevar, Var}, AccSt) - end; - (Var, {seen_once_union, Anno}, AccSt) -> - case is_warn_enabled(singleton_typevar, AccSt) of - true -> - case atom_to_list(Var) of - "_"++_ -> AccSt; - _ -> add_warning(Anno, {singleton_typevar, Var}, AccSt) - end; - false -> - AccSt + maps:fold(fun(Var, {SeenOnce, Anno}, AccSt) + when SeenOnce =:= seen_once; + SeenOnce =:= seen_once_union -> + case atom_to_list(Var) of + "_"++_ -> AccSt; + _ -> add_error(Anno, {singleton_typevar, Var}, AccSt) end; - (_Var, seen_multiple, AccSt) -> - AccSt - end, St1, SeenVars). + (_Var, seen_multiple, AccSt) -> + AccSt + end, St1, SeenVars). check_type_1({type, Anno, TypeName, Args}=Type, SeenVars, #lint{types=Types}=St) -> TypePair = {TypeName, @@ -3377,16 +3500,25 @@ check_record_types(Anno, Name, Fields, SeenVars, St) -> {SeenVars, add_error(Anno, {type_syntax, record}, St)} end; error -> - {SeenVars, add_error(Anno, {undefined_record, Name}, St)} + RecordNames = [atom_to_list(R) || R <- maps:keys(St#lint.records)], + case most_possible_string(Name, RecordNames) of + [] -> {SeenVars, add_error(Anno, {undefined_record, Name}, St)}; + GuessF -> {SeenVars, add_error(Anno, {undefined_record, Name, GuessF}, St)} + end end. check_record_types([{type, _, field_type, [{atom, Anno, FName}, Type]}|Left], Name, DefFields, SeenVars, St, SeenFields) -> %% Check that the field name is valid St1 = case exist_field(FName, DefFields) of - true -> St; - false -> add_error(Anno, {undefined_field, Name, FName}, St) - end, + true -> St; + false -> + FieldNames = [atom_to_list(R) || {record_field, _L, {_, _, R}, _} <- DefFields], + case most_possible_string(FName, FieldNames) of + [] -> add_error(Anno, {undefined_field,Name,FName}, St); + GuessF -> add_error(Anno, {undefined_field,Name,FName,GuessF}, St) + end + end, %% Check for duplicates St2 = case ordsets:is_element(FName, SeenFields) of true -> add_error(Anno, {redefine_field, Name, FName}, St1); @@ -3700,7 +3832,12 @@ check_dialyzer_attribute(Forms, St0) -> case lists:member(FA, DefFunctions) of true -> St; false -> - add_error(Anno, {undefined_function,FA}, St) + {Name, Arity} = FA, + PossibleFs = [atom_to_list(F) || {F, A} <- DefFunctions, A =:= Arity], + case most_possible_string(Name, PossibleFs) of + [] -> add_error(Anno, {undefined_function,FA}, St); + GuessF -> add_error(Anno, {undefined_function,FA,GuessF}, St) + end end; false -> add_error(Anno, {bad_dialyzer_option,Option}, St) @@ -3891,16 +4028,30 @@ lc_quals(Qs, Vt0, St0) -> {Vt,Uvt,St} = lc_quals(Qs, Vt0, [], St0#lint{recdef_top = false}), {Vt,Uvt,St#lint{recdef_top = OldRecDef}}. +lc_quals([{zip,_Anno,Gens} | Qs], Vt0, Uvt0, St0) -> + St1 = are_all_generators(Gens,St0), + {Vt,Uvt,St} = handle_generators(Gens,Vt0,Uvt0,St1), + lc_quals(Qs, Vt, Uvt, St); lc_quals([{generate,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St0), lc_quals(Qs, Vt, Uvt, St); +lc_quals([{generate_strict,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> + {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St0), + lc_quals(Qs, Vt, Uvt, St); lc_quals([{b_generate,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> St1 = handle_bitstring_gen_pat(P,St0), {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St1), lc_quals(Qs, Vt, Uvt, St); +lc_quals([{b_generate_strict,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> + St1 = handle_bitstring_gen_pat(P,St0), + {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St1), + lc_quals(Qs, Vt, Uvt, St); lc_quals([{m_generate,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St0), lc_quals(Qs, Vt, Uvt, St); +lc_quals([{m_generate_strict,_Anno,P,E} | Qs], Vt0, Uvt0, St0) -> + {Vt,Uvt,St} = handle_generator(P,E,Vt0,Uvt0,St0), + lc_quals(Qs, Vt, Uvt, St); lc_quals([F|Qs], Vt, Uvt, St0) -> Info = is_guard_test2_info(St0), {Fvt,St1} = case is_guard_test2(F, Info) of @@ -3917,6 +4068,36 @@ is_guard_test2_info(#lint{records=RDs,locals=Locals,imports=Imports}) -> is_imported_function(Imports, FA) end}. +are_all_generators([{generate,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([{generate_strict,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([{b_generate,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([{b_generate_strict,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([{m_generate,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([{m_generate_strict,_,_,_}|Qs],St) -> are_all_generators(Qs,St); +are_all_generators([Q|_Qs],St) -> + Anno1 = element(2,Q), + add_error(Anno1, illegal_zip_generator, St); +are_all_generators([],St) -> St. + +handle_generators(Gens,Vt,Uvt,St0) -> + Ps = [P || {_,_,P,_} <- Gens], + Es = [E || {_,_,_,E} <- Gens], + {Evt,St1} = exprs(Es, Vt, St0), + %% Forget variables local to E immediately. + Vt1 = vtupdate(vtold(Evt, Vt), Vt), + {_, St2} = check_unused_vars(Evt, Vt, St1), + {Pvt,Pnew,St3} = comprehension_pattern(Ps, Vt1, St2), + %% Have to keep fresh variables separated from used variables somehow + %% in order to handle for example X = foo(), [X || <> <- bar()]. + %% 1 2 2 1 + Vt2 = vtupdate(Pvt, Vt1), + St4 = shadow_vars(Pnew, Vt1, generate, St3), + Svt = vtold(Vt2, Pnew), + {_, St5} = check_old_unused_vars(Svt, Uvt, St4), + NUvt = vtupdate(vtnew(Svt, Uvt), Uvt), + Vt3 = vtupdate(vtsubtract(Vt2, Pnew), Pnew), + {Vt3,NUvt,St5}. + handle_generator(P,E,Vt,Uvt,St0) -> {Evt,St1} = expr(E, Vt, St0), %% Forget variables local to E immediately. @@ -3934,6 +4115,10 @@ handle_generator(P,E,Vt,Uvt,St0) -> Vt3 = vtupdate(vtsubtract(Vt2, Pnew), Pnew), {Vt3,NUvt,St5}. +comprehension_pattern([_|_]=Ps, Vt, St) -> + Mps = [K || {map_field_exact,_,K,_} <- Ps] ++ [V || {map_field_exact,_,_,V} <- Ps], + Ps1 = [P || P <- Ps, element(1,P)=/=map_field_exact], + pattern_list(Ps1++Mps, Vt, [], St); comprehension_pattern({map_field_exact,_,K,V}, Vt, St) -> pattern_list([K,V], Vt, [], St); comprehension_pattern(P, Vt, St) -> @@ -4117,8 +4302,15 @@ pat_binsize_var(V, Anno, Vt, New, St) -> %% probably safe. exported_var(Anno, V, From, St)}; error -> - {[{V,{bound,used,[Anno]}}],[], - add_error(Anno, {unbound_var,V}, St)} + PossibleVs = [atom_to_list(DefV) || {DefV, _A} <- Vt], + case most_possible_string(V, PossibleVs) of + [] -> + {[{V,{bound,used,[Anno]}}],[], + add_error(Anno, {unbound_var,V}, St)}; + GuessV -> + {[{V,{bound,used,[Anno]}}],[], + add_error(Anno, {unbound_var,V,GuessV}, St)} + end end end. @@ -4156,8 +4348,15 @@ do_expr_var(V, Anno, Vt, St) -> {[{V,{bound,used,As}}], add_error(Anno, {stacktrace_guard,V}, St)}; error -> - {[{V,{bound,used,[Anno]}}], - add_error(Anno, {unbound_var,V}, St)} + PossibleVs = [atom_to_list(DefV) || {DefV, _A} <- Vt], + case most_possible_string(V, PossibleVs) of + [] -> + {[{V,{bound,used,[Anno]}}], + add_error(Anno, {unbound_var,V}, St)}; + GuessV -> + {[{V,{bound,used,[Anno]}}], + add_error(Anno, {unbound_var,V,GuessV}, St)} + end end. exported_var(Anno, V, From, St) -> diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 01540c00db94..7babc9c7bc1d 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -31,6 +31,7 @@ pat_expr pat_expr_max map_pat_expr record_pat_expr pat_argument_list pat_exprs list tail list_comprehension lc_expr lc_exprs +zc_exprs map_comprehension binary_comprehension tuple @@ -79,7 +80,7 @@ ssa_check_when_clauses. Terminals char integer float atom sigil_prefix string sigil_suffix var -'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.' +'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' '<:-' ';' ':' '#' '.' '&&' 'after' 'begin' 'case' 'try' 'catch' 'end' 'fun' 'if' 'of' 'receive' 'when' 'maybe' 'else' 'andalso' 'orelse' @@ -87,7 +88,7 @@ char integer float atom sigil_prefix string sigil_suffix var '*' '/' 'div' 'rem' 'band' 'and' '+' '-' 'bor' 'bxor' 'bsl' 'bsr' 'or' 'xor' '++' '--' -'==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=' '=>' ':=' +'==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=' '<:=' '=>' ':=' '<<' '>>' '!' '=' '::' '..' '...' '?=' @@ -362,11 +363,19 @@ binary_comprehension -> '<<' expr_max '||' lc_exprs '>>' : {bc,?anno('$1'),'$2','$4'}. lc_exprs -> lc_expr : ['$1']. lc_exprs -> lc_expr ',' lc_exprs : ['$1'|'$3']. +lc_exprs -> zc_exprs : [{zip, ?anno(hd('$1')), '$1'}]. +lc_exprs -> zc_exprs ',' lc_exprs : [{zip, ?anno('$2'), '$1'}|'$3']. + +zc_exprs -> lc_expr '&&' lc_expr : ['$1','$3']. +zc_exprs -> lc_expr '&&' zc_exprs : ['$1'|'$3']. lc_expr -> expr : '$1'. lc_expr -> map_field_exact '<-' expr : {m_generate,?anno('$2'),'$1','$3'}. +lc_expr -> map_field_exact '<:-' expr : {m_generate_strict,?anno('$2'),'$1','$3'}. lc_expr -> expr '<-' expr : {generate,?anno('$2'),'$1','$3'}. +lc_expr -> expr '<:-' expr : {generate_strict,?anno('$2'),'$1','$3'}. lc_expr -> binary '<=' expr : {b_generate,?anno('$2'),'$1','$3'}. +lc_expr -> binary '<:=' expr : {b_generate_strict,?anno('$2'),'$1','$3'}. tuple -> '{' '}' : {tuple,?anno('$1'),[]}. tuple -> '{' exprs '}' : {tuple,?anno('$1'),'$2'}. @@ -782,7 +791,7 @@ processed (see section [Error Information](#module-error-information)). -export_type([abstract_clause/0, abstract_expr/0, abstract_form/0, abstract_type/0, form_info/0, error_info/0]). %% The following types are exported because they are used by syntax_tools --export_type([af_binelement/1, af_generator/0, af_remote_function/0]). +-export_type([af_binelement/1, af_generator/0, af_zip_generator/0, af_remote_function/0]). %% The following type is used by PropEr -export_type([af_field_decl/0]). @@ -933,10 +942,16 @@ processed (see section [Error Information](#module-error-information)). -type af_qualifier() :: af_generator() | af_filter(). --doc "Abstract representation of a generator or a bitstring generator.". +-doc "Abstract representation of a list, bitstring or map generator.". -type af_generator() :: {'generate', anno(), af_pattern(), abstract_expr()} + | {'generate_strict', anno(), af_pattern(), abstract_expr()} | {'m_generate', anno(), af_assoc_exact(af_pattern()), abstract_expr()} - | {'b_generate', anno(), af_pattern(), abstract_expr()}. + | {'m_generate_strict', anno(), af_assoc_exact(af_pattern()), abstract_expr()} + | {'b_generate', anno(), af_pattern(), abstract_expr()} + | {'b_generate_strict', anno(), af_pattern(), abstract_expr()} + | af_zip_generator(). + +-type af_zip_generator() :: [af_generator(), ...]. -type af_filter() :: abstract_expr(). diff --git a/lib/stdlib/src/erl_pp.erl b/lib/stdlib/src/erl_pp.erl index 8cc2c24781d7..bff5a9231852 100644 --- a/lib/stdlib/src/erl_pp.erl +++ b/lib/stdlib/src/erl_pp.erl @@ -1047,15 +1047,26 @@ clauses(Type, Opts, Cs) -> lc_quals(Qs, Opts) -> {prefer_nl,[$,],lexprs(Qs, fun lc_qual/2, Opts)}. +lc_qual({zip,_,Qs}, Opts) -> + {prefer_nl,["&&"],lexprs(Qs, fun lc_qual/2, Opts)}; lc_qual({m_generate,_,Pat,E}, Opts) -> Pl = map_field(Pat, Opts), {list,[{step,[Pl,leaf(" <-")],lexpr(E, 0, Opts)}]}; +lc_qual({m_generate_strict,_,Pat,E}, Opts) -> + Pl = map_field(Pat, Opts), + {list,[{step,[Pl,leaf(" <:-")],lexpr(E, 0, Opts)}]}; lc_qual({b_generate,_,Pat,E}, Opts) -> Pl = lexpr(Pat, 0, Opts), {list,[{step,[Pl,leaf(" <=")],lexpr(E, 0, Opts)}]}; +lc_qual({b_generate_strict,_,Pat,E}, Opts) -> + Pl = lexpr(Pat, 0, Opts), + {list,[{step,[Pl,leaf(" <:=")],lexpr(E, 0, Opts)}]}; lc_qual({generate,_,Pat,E}, Opts) -> Pl = lexpr(Pat, 0, Opts), {list,[{step,[Pl,leaf(" <-")],lexpr(E, 0, Opts)}]}; +lc_qual({generate_strict,_,Pat,E}, Opts) -> + Pl = lexpr(Pat, 0, Opts), + {list,[{step,[Pl,leaf(" <:-")],lexpr(E, 0, Opts)}]}; lc_qual(Q, Opts) -> lexpr(Q, 0, Opts). diff --git a/lib/stdlib/src/erl_scan.erl b/lib/stdlib/src/erl_scan.erl index 899785ae3d8a..117acf3b01db 100644 --- a/lib/stdlib/src/erl_scan.erl +++ b/lib/stdlib/src/erl_scan.erl @@ -604,6 +604,12 @@ scan1(".."++Cs, St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "..", '..', 2); scan1("."=Cs, St, Line, Col, Toks) -> {more,{Cs,St,Col,Toks,Line,[],fun scan/6}}; +scan1("&&"++Cs, St, Line, Col, Toks) -> + tok2(Cs, St, Line, Col, Toks, "&&", '&&', 2); +scan1("&"=Cs, St, Line, Col, Toks) -> + {more,{Cs,St,Col,Toks,Line,[],fun scan/6}}; +scan1("&"++Cs, St, Line, Col, Toks) -> + tok2(Cs, St, Line, Col, Toks, "&", '&', 1); scan1([$.=C|Cs], St, Line, Col, Toks) -> scan_dot(Cs, St, Line, Col, Toks, [C]); scan1([$'|Cs], St, Line, Col, Toks) -> %' Emacs @@ -637,13 +643,19 @@ scan1("?="++Cs, St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "?=", '?=', 2); scan1("?"=Cs, St, Line, Col, Toks) -> {more,{Cs,St,Col,Toks,Line,[],fun scan/6}}; -%% << <- <= +%% << <:- <- <:= <= scan1("<<"++Cs, St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "<<", '<<', 2); +scan1("<:-"++Cs, St, Line, Col, Toks) -> + tok2(Cs, St, Line, Col, Toks, "<:-", '<:-', 3); scan1("<-"++Cs, St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "<-", '<-', 2); +scan1("<:="++Cs, St, Line, Col, Toks) -> + tok2(Cs, St, Line, Col, Toks, "<:=", '<:=', 3); scan1("<="++Cs, St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "<=", '<=', 2); +scan1("<:"=Cs, St, Line, Col, Toks) -> + {more,{Cs,St,Col,Toks,Line,[],fun scan/6}}; scan1("<"=Cs, St, Line, Col, Toks) -> {more,{Cs,St,Col,Toks,Line,[],fun scan/6}}; %% >> >= @@ -735,8 +747,6 @@ scan1([$`|Cs], St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "`", '`', 1); scan1([$~|Cs], St, Line, Col, Toks) -> tok2(Cs, St, Line, Col, Toks, "~", '~', 1); -scan1([$&|Cs], St, Line, Col, Toks) -> - tok2(Cs, St, Line, Col, Toks, "&", '&', 1); %% End of optimization. scan1([C|Cs], St, Line, Col, Toks) when ?UNI255(C) -> Str = [C], @@ -1718,7 +1728,7 @@ scan_escape([$x,H1], _Col) when ?HEX(H1) -> more; scan_escape([$x|Cs], Col) -> {error,Cs,{illegal,character},incr_column(Col, 1)}; -%% \^X -> Control-X +%% \^X -> Ctrl+X scan_escape([$^=C0,C|Cs], Col) when ?CHAR(C) -> case caret_char_code(C) of error -> diff --git a/lib/stdlib/src/erl_stdlib_errors.erl b/lib/stdlib/src/erl_stdlib_errors.erl index b5864c471f06..d841a020d830 100644 --- a/lib/stdlib/src/erl_stdlib_errors.erl +++ b/lib/stdlib/src/erl_stdlib_errors.erl @@ -100,6 +100,20 @@ format_binary_error(last, [Subject], _) -> <<>> -> empty_binary; _ -> must_be_binary(Subject) end]; +format_binary_error(join, [Binaries,Separator], _) -> + case must_be_binary(Separator) of + [] when is_list(Binaries) -> + case must_be_list(Binaries) of + [] -> + [~"not a list of binaries", []]; + Error -> + [Error, []] + end; + [] -> + [must_be_list(Binaries), []]; + Error -> + [[], Error] + end; format_binary_error(list_to_bin, [_], _) -> [not_iodata]; format_binary_error(longest_common_prefix, [_], _) -> diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl index 90302906a28b..e05d1176f750 100644 --- a/lib/stdlib/src/erl_tar.erl +++ b/lib/stdlib/src/erl_tar.erl @@ -94,7 +94,7 @@ opens a tar file on a remote machine using an SFTP channel. of `erl_tar` or `tar` which does not support PAX. In this case, the PAX headers will be extracted as regular files, and you will need to apply them manually. -- Like the above, if you must remain USTAR compatible, you must also ensure than +- Like the above, if you must remain USTAR compatible, you must also ensure that paths for symbolic/hard links are no more than 100 bytes, otherwise PAX headers will be used. """. diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl index 83806a84efcb..51b6e21f7621 100644 --- a/lib/stdlib/src/filelib.erl +++ b/lib/stdlib/src/filelib.erl @@ -997,7 +997,7 @@ safe_relative_path(Path, "") -> safe_relative_path(Path, Cwd) -> srp_path(filename:split(Path), Cwd, - sets:new([{version, 2}]), + sets:new(), []). srp_path([], _Cwd, _Seen, []) -> @@ -1017,7 +1017,7 @@ srp_path([<<"..">>|_Segs], _Cwd, _Seen, []) -> srp_path([<<"..">>|Segs], Cwd, Seen, [_|_]=Acc) -> srp_path(Segs, Cwd, Seen, lists:droplast(Acc)); srp_path([clear|Segs], Cwd, _Seen, Acc) -> - srp_path(Segs, Cwd, sets:new([{version, 2}]), Acc); + srp_path(Segs, Cwd, sets:new(), Acc); srp_path([Seg|_]=Segs, Cwd, Seen, Acc) -> case filename:pathtype(Seg) of relative -> diff --git a/lib/stdlib/src/gen_fsm.erl b/lib/stdlib/src/gen_fsm.erl index c1f53841bade..7276f192842f 100644 --- a/lib/stdlib/src/gen_fsm.erl +++ b/lib/stdlib/src/gen_fsm.erl @@ -1113,7 +1113,7 @@ send_all_state_event(Name, Event) -> -doc #{ equiv => sync_send_all_state_event(FsmRef, Event, 5000) }. -spec sync_send_all_state_event(FsmRef, Event) -> Reply when FsmRef :: fsm_ref(), - Event :: term, + Event :: term(), Reply :: term(). sync_send_all_state_event(Name, Event) -> case catch gen:call(Name, '$gen_sync_all_state_event', Event) of diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl index bb2bbbd6aecf..150ba7455b4d 100644 --- a/lib/stdlib/src/gen_statem.erl +++ b/lib/stdlib/src/gen_statem.erl @@ -447,14 +447,14 @@ handle_event(_, _, State, Data) -> > [`wait_response/1,2`](`wait_response/2`), and `check_response/2`. > - In OTP 24.0 [`receive_response/1,2`](`receive_response/2`) were added. > - In OTP 25.0 [`Module:format_status/1`](`c:format_status/1`) -> was added to replace [`Module:format_status/1`](`c:format_status/1`), +> was added to replace [`Module:format_status/2`](`c:format_status/2`), > as well as functions for collections of asynchronous calls: > `send_request/4`, `wait_response/3`, `receive_response/3`, > `check_response/3`, `reqids_new/0`, `reqids_size/1`, > `reqids_add/3`, `reqids_to_list/1`. > - In OTP 26.0 the possibility to return `{error, Reason}` from > [`Module:init/1`](`c:init/1`) was added. -> - In OTP 27.0 [`Module:format_status/1`](`c:format_status/1`) +> - In OTP 27.0 [`Module:format_status/2`](`c:format_status/2`) > was deprecated. ## See Also diff --git a/lib/stdlib/src/io.erl b/lib/stdlib/src/io.erl index f7e959fcf5a2..25ddffc10a29 100644 --- a/lib/stdlib/src/io.erl +++ b/lib/stdlib/src/io.erl @@ -453,7 +453,7 @@ to control what the terminal inputs or outputs. `terminal` is an alias for `stdout`. -See `setopts/1` for a description of the other options. +See `setopts/2` for a description of the other options. """. -spec getopts(IoDevice) -> [getopt()] | {'error', Reason} when IoDevice :: device(), @@ -524,6 +524,11 @@ The options and values supported by the OTP I/O devices are as follows: This option is only supported by the standard shell (`group.erl`). +- **`{line_history, true | false}`** - Specifies if `get_line` and `get_until` + I/O requests should be saved in the `m:shell` history buffer. + + This option is only supported by the standard shell (`group.erl`). + - **`{encoding, latin1 | unicode}`** - Specifies how characters are input or output from or to the I/O device, implying that, for example, a terminal is set to handle Unicode input and output or a file is set to handle UTF-8 data diff --git a/lib/stdlib/src/io_lib.erl b/lib/stdlib/src/io_lib.erl index 0b300088cb87..90e426ca0b79 100644 --- a/lib/stdlib/src/io_lib.erl +++ b/lib/stdlib/src/io_lib.erl @@ -85,10 +85,10 @@ used for flattening deep lists. deep_char_list/1, deep_latin1_char_list/1, printable_list/1, printable_latin1_list/1, printable_unicode_list/1]). -%% Utilities for collecting characters. --export([collect_chars/3, collect_chars/4, - collect_line/3, collect_line/4, - get_until/3, get_until/4]). +%% Utilities for collecting characters mostly used by group +-export([collect_chars/1, collect_chars/3, collect_chars/4, collect_chars_eager/4, + collect_line/1, collect_line/3, collect_line/4, collect_line_no_eol/4, + get_until/1, get_until/3, get_until/4]). %% The following functions were used by Yecc's include-file. -export([write_unicode_string/1, write_unicode_char/1, @@ -1135,6 +1135,25 @@ collect_chars_list(Stack, N, []) -> collect_chars_list(Stack,N, [H|T]) -> collect_chars_list([H|Stack], N-1, T). +%% Fetch the number of remaining bytes +-doc false. +collect_chars({_, _, N}) -> + N. + +%% A special collect_chars that never returns more_chars, +%% instead it eagerly stops collecting if it has received +%% any characters at all. +-doc false. +collect_chars_eager(State, Chars, Encoding, N) -> + case collect_chars(State, Chars, Encoding, N) of + {list, Stack, _N} when Stack =/= [] -> + {stop, lists:reverse(Stack), []}; + {binary, Stack, _N} when Stack =/= [<<>>] -> + {stop, binrev(Stack), []}; + Else -> + Else + end. + %% collect_line(State, Data, _). New in R9C. %% Returns: %% {stop,Result,RestData} @@ -1144,6 +1163,16 @@ collect_chars_list(Stack,N, [H|T]) -> collect_line(Tag, Data, Any) -> collect_line(Tag, Data, latin1, Any). +%% A special variant of collect line that trims the last newline +%% used by io:get_password/0,1 +-doc false. +collect_line_no_eol(Tag, Data, Encoding, Any) -> + case collect_line(Tag, Data, Encoding, Any) of + {stop, Line, Rest} when Line =/= eof -> + {stop, string:trim(Line), Rest}; + Else -> Else + end. + %% Now we are aware of encoding... -doc false. collect_line(start, Data, Encoding, _) when is_binary(Data) -> @@ -1196,6 +1225,11 @@ collect_line_list([H|T], Stack) -> collect_line_list([], Stack) -> Stack. +%% Return the number of remaing bytes, 0 for unknown. +-doc false. +collect_line(_State) -> + 0. + %% Translator function to emulate a new (R9C and later) %% I/O client when you have an old one. %% @@ -1252,6 +1286,11 @@ binrev(L) -> binrev(L, T) -> list_to_binary(lists:reverse(L, T)). +%% Return the number of remaing bytes, 0 for unknown. +-doc false. +get_until(_State) -> + 0. + -doc false. -spec limit_term(term(), depth()) -> term(). diff --git a/lib/stdlib/src/lists.erl b/lib/stdlib/src/lists.erl index 2c602fe56bac..8fa4bc19660f 100644 --- a/lib/stdlib/src/lists.erl +++ b/lib/stdlib/src/lists.erl @@ -2113,7 +2113,12 @@ flatmap(F, List) when is_function(F, 1) -> flatmap_1(F, List). flatmap_1(F, [Hd | Tail]) -> - F(Hd) ++ flatmap_1(F, Tail); + case F(Hd) of + %% The two first clauses are an optimization. + [] -> flatmap_1(F, Tail); + [Elem] -> [Elem | flatmap_1(F, Tail)]; + List -> List ++ flatmap_1(F, Tail) + end; flatmap_1(_F, []) -> []. diff --git a/lib/stdlib/src/maps.erl b/lib/stdlib/src/maps.erl index c3c7da928406..f48a5673af6b 100644 --- a/lib/stdlib/src/maps.erl +++ b/lib/stdlib/src/maps.erl @@ -379,33 +379,30 @@ _Example:_ merge_with(Combiner, Map1, Map2) when is_map(Map1), is_map(Map2), is_function(Combiner, 3) -> - case map_size(Map1) > map_size(Map2) of + %% Use >= because we want to avoid reversing the combiner if we can + case map_size(Map1) >= map_size(Map2) of true -> Iterator = maps:iterator(Map2), - merge_with_1(maps:next(Iterator), - Map1, - Map2, - Combiner); + merge_with_1(maps:next(Iterator), Map1, Combiner); false -> Iterator = maps:iterator(Map1), merge_with_1(maps:next(Iterator), Map2, - Map1, fun(K, V1, V2) -> Combiner(K, V2, V1) end) end; merge_with(Combiner, Map1, Map2) -> error_with_info(error_type_merge_intersect(Map1, Map2, Combiner), [Combiner, Map1, Map2]). -merge_with_1({K, V2, Iterator}, Map1, Map2, Combiner) -> +merge_with_1({K, V2, Iterator}, Map1, Combiner) -> case Map1 of #{ K := V1 } -> NewMap1 = Map1#{ K := Combiner(K, V1, V2) }, - merge_with_1(maps:next(Iterator), NewMap1, Map2, Combiner); + merge_with_1(maps:next(Iterator), NewMap1, Combiner); #{ } -> - merge_with_1(maps:next(Iterator), maps:put(K, V2, Map1), Map2, Combiner) + merge_with_1(maps:next(Iterator), maps:put(K, V2, Map1), Combiner) end; -merge_with_1(none, Result, _, _) -> +merge_with_1(none, Result, _) -> Result. diff --git a/lib/stdlib/src/otp_internal.erl b/lib/stdlib/src/otp_internal.erl index 9714a51b8b40..4c382d282df4 100644 --- a/lib/stdlib/src/otp_internal.erl +++ b/lib/stdlib/src/otp_internal.erl @@ -36,8 +36,14 @@ obsolete(calendar, local_time_to_universal_time, 1) -> {deprecated, "use calendar:local_time_to_universal_time_dst/1 instead"}; obsolete(code, lib_dir, 2) -> {deprecated, "this functionality will be removed in a future release"}; +obsolete(crypto, enable_fips_mode, 1) -> + {deprecated, "use config parameter fips_mode"}; obsolete(crypto, rand_uniform, 2) -> {deprecated, "use rand:uniform/1 instead"}; +obsolete(crypto, start, 0) -> + {deprecated, "use application:start(crypto) instead"}; +obsolete(crypto, stop, 0) -> + {deprecated, "use application:stop(crypto) instead"}; obsolete(dbg, stop_clear, 0) -> {deprecated, "use dbg:stop/0 instead", "OTP 27"}; obsolete(disk_log, inc_wrap_file, 1) -> @@ -306,5 +312,7 @@ obsolete_callback(gen_server, format_status, 2) -> {deprecated, "use format_status/1 instead"}; obsolete_callback(gen_statem, format_status, 2) -> {deprecated, "use format_status/1 instead"}; +obsolete_callback(gen_fsm, _, _) -> + {deprecated, "use the 'gen_statem' module instead"}; obsolete_callback(_,_,_) -> no. diff --git a/lib/stdlib/src/proc_lib.erl b/lib/stdlib/src/proc_lib.erl index 80909fb2c293..1a5dbd2169c2 100644 --- a/lib/stdlib/src/proc_lib.erl +++ b/lib/stdlib/src/proc_lib.erl @@ -1573,13 +1573,15 @@ about system messages, see `m:sys` and section stop(Process, Reason, Timeout) -> Mref = erlang:monitor(process, Process), T0 = erlang:monotonic_time(millisecond), + + StopTimeout = fun(infinity) -> infinity; + (T1) -> T1 - (((erlang:monotonic_time(microsecond) + 999) div 1000) - T0) + end, + RemainingTimeout = try sys:terminate(Process, Reason, Timeout) of - ok when Timeout =:= infinity -> - infinity; - ok -> - Timeout - (((erlang:monotonic_time(microsecond) + 999) div 1000) - T0) + ok -> StopTimeout(Timeout) catch exit:{noproc, {sys, terminate, _}} -> demonitor(Mref, [flush]), @@ -1587,6 +1589,8 @@ stop(Process, Reason, Timeout) -> exit:{timeout, {sys, terminate, _}} -> demonitor(Mref, [flush]), exit(timeout); + exit:{Reason, {sys, terminate, _}} -> + StopTimeout(Timeout); exit:Reason1 -> demonitor(Mref, [flush]), exit(Reason1) diff --git a/lib/stdlib/src/qlc_pt.erl b/lib/stdlib/src/qlc_pt.erl index 21c55555ae59..eae3655c4510 100644 --- a/lib/stdlib/src/qlc_pt.erl +++ b/lib/stdlib/src/qlc_pt.erl @@ -226,7 +226,7 @@ integers(_, L) -> -define(ABST_NO_MORE, {nil, Anno}). -define(ABST_MORE(Obj, Cont), {cons, Anno, Obj, Cont}). -%% Qualifier identifier. +%% Qualifier identifier. %% The first one encountered in a QLC has no=1. -record(qid, {lcid,no}). @@ -249,7 +249,7 @@ no_duplicates(Forms, Errors, Warnings0, ExtraWarnings0, Options) -> ([{File,[{L,v3_core,nomatch}]} || {File,[{L,qlc,M}]} <- mforms(ExtraWarnings), lists:member(M, [nomatch_pattern,nomatch_filter])] - ++ + ++ [{File,[{L,sys_core_fold,nomatch_guard}]} || {File,[{L,qlc,M}]} <- mforms(ExtraWarnings), M =:= nomatch_filter]), @@ -292,10 +292,16 @@ record_attributes(Forms) -> %% transformation. %% compile_messages(Forms, FormsNoShadows, Options, State) -> - %% The qlc module cannot handle binary generators. - BGenF = fun(_QId,{b_generate,Anno,_P,_LE}=BGen, GA, A) -> + %% The qlc module can only handle relaxed list generators. + BGenF = fun(_QId,{Type,Anno,_P,_LE}=BGen, GA, A) when Type =:= b_generate; Type =:= b_generate_strict -> M = {loc(Anno),?APIMOD,binary_generator}, {BGen,[{get(?QLC_FILE),[M]}|GA],A}; + (_QId,{Type,Anno,_P,_LE}=BGen, GA, A) when Type =:= m_generate; Type =:= m_generate_strict -> + M = {loc(Anno),?APIMOD,map_generator}, + {BGen,[{get(?QLC_FILE),[M]}|GA],A}; + (_QId,{generate_strict,Anno,_P,_LE}=BGen, GA, A) -> + M = {loc(Anno),?APIMOD,strict_generator}, + {BGen,[{get(?QLC_FILE),[M]}|GA],A}; (_QId, Q, GA, A) -> {Q,GA,A} end, @@ -317,7 +323,7 @@ compile_messages(Forms, FormsNoShadows, Options, State) -> badarg(Forms, State) -> F = fun(_Id, {lc,_A,_E,_Qs}=LC, Es) -> {LC,Es}; - (Id, A, Es) -> + (Id, A, Es) -> E = {get_lcid_line(Id),?APIMOD,not_a_query_list_comprehension}, {A,[{get(?QLC_FILE), [E]} | Es]} end, @@ -391,7 +397,7 @@ intro_variables(FormsNoShadows, State) -> {Filter,{GVs,[{QId,[]} | QIds]},Foo} end, Acc0 = {[],[]}, - {FForms,{GenVars,QIds}} = + {FForms,{GenVars,QIds}} = qual_fold(Fun, Acc0, [], FormsNoShadows, State), %% Note: the linter messages are the ones we are looking for. %% If there are no linter messages, the compiler will crash (ignored). @@ -441,11 +447,11 @@ compile_forms(Forms0, Options) -> end, Forms = ([F || F <- Forms0, not Exclude(element(1, F))] ++ [{eof,0}]), - try + try case compile:noenv_forms(Forms, compile_options(Options)) of {ok, _ModName, Ws0} -> {[], Ws0}; - {error, Es0, Ws0} -> + {error, Es0, Ws0} -> {Es0, Ws0} end catch _:_ -> @@ -469,11 +475,11 @@ skip_options(Skip, Options) -> [O || O <- Options, not lists:member(O, Skip)]. bitstr_options() -> - [binary_comprehension,bitlevel_binaries]. + [binary_comprehension,bitlevel_binaries]. %% In LCs it is possible to use variables introduced in filters and %% generator patterns in the right hand side of generators (ListExpr), -%% but in QLCs this is not allowed. +%% but in QLCs this is not allowed. %% %% A brand new function is returned such that there is one expression %% for each ListExpr. The expression mentions all introduced variables @@ -515,7 +521,7 @@ used_genvar_check(FormsNoShadows, State) -> UniqueFName = qlc:aux_name(used_genvar, 1, gb_sets:from_list(FunctionNames)), A = anno0(), {function,A,UniqueFName,0,[{clause,A,[],[],lists:reverse(Exprs)}]}. - + q_intro_vars(QId, [{QId, IVs} | QsIVs], IVsSoFar) -> {QsIVs, IVs ++ IVsSoFar}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -537,7 +543,7 @@ q_intro_vars(QId, [{QId, IVs} | QsIVs], IVsSoFar) -> {QsIVs, IVs ++ IVsSoFar}. %% fun). Join generators are ignored at runtime unless a fast join is %% possible, in which case they replace other generators. See also %% qlc.erl. -%% +%% %% For each QLC, every filter is given a state number and every %% generator two state numbers (one for initialization, one for %% looping over values). State 1 is reserved for the template and @@ -567,13 +573,13 @@ q_intro_vars(QId, [{QId, IVs} | QsIVs], IVsSoFar) -> {QsIVs, IVs ++ IVsSoFar}. %% Fun(, ..., Val, ...); % arguments are bound %% (3, ..., [_ | Val], ...) -> % pattern does not match %% Fun(3, ..., Val, ...); -%% (3, ..., [], ...) -> +%% (3, ..., [], ...) -> %% Fun(, ...); %% (3, ...., F, ...) -> % looping over values (using continuations) %% case F() of % get the next value by calling a continuation -%% [Pattern | Val] -> +%% [Pattern | Val] -> %% Fun(..., Val, ...); -%% [_ | Val] -> +%% [_ | Val] -> %% Fun(3, ..., Val, ...); %% [] -> %% Fun(, ...); @@ -586,11 +592,11 @@ q_intro_vars(QId, [{QId, IVs} | QsIVs], IVsSoFar) -> {QsIVs, IVs ++ IVsSoFar}. %% false -> Fun(, ...) %% end; %% (5, ...) -> % a filter so simple that it could be used as a guard -%% if +%% if %% Guard -> Fun(, ...); %% true -> Fun(, ...) %% end -%% +%% %% means state 0 if there is no last %% generator. is the evaluated list expression %% (evaluated once only). Among the arguments indicated by ellipses @@ -623,14 +629,14 @@ transform(FormsNoShadows, State) -> end, TemplS = qlc:template_state(), GoState = {TemplS + 1, TemplS + 1}, - {ModifiedForms1,_} = + {ModifiedForms1,_} = qual_fold(F1, [], GoState, FormsNoShadows, State), %% This is for info/2. QLCs in filters and the template are %% translated before the expression itself is translated. info/2 %% must not display the result of the translation, but the source %% code. - {_,Source0} = qual_fold(fun(_QId, {generate,_,_P,_E}=Q, Dict, Foo) -> + {_,Source0} = qual_fold(fun(_QId, {generate,_,_P,_E}=Q, Dict, Foo) -> {Q,Dict,Foo}; (QId, F, Dict, Foo) -> {F,maps:put(QId, F, Dict),Foo} @@ -644,7 +650,7 @@ transform(FormsNoShadows, State) -> F2 = fun(Id, {lc,_A,E,Qs}, {IntroVs0,XWarn0}) -> LcNo = get_lcid_no(Id), LcL = get_lcid_line(Id), - [RL,Fun,Go,NGV,S0,RL0,Go0,AT,Err] = + [RL,Fun,Go,NGV,S0,RL0,Go0,AT,Err] = aux_vars(['RL','Fun','Go','C','S0','RL0','Go0','AT','E'], LcNo, AllVars), ?DEBUG("RL = ~p, Fun = ~p, Go = ~p~n", [RL, Fun, Go]), @@ -666,12 +672,12 @@ transform(FormsNoShadows, State) -> {EqColumnConstants, EqualColumnConstants, ExtraConsts, SizeInfo} = constants_and_sizes(Qs, E, Dependencies, AllIVs, State), - {JoinInfo, XWarn} = + {JoinInfo, XWarn} = join_kind(Qs, LcL, AllIVs, Dependencies, State), - %% Not at all sure it is a good idea to try and find + %% Not at all sure it is a good idea to try and find %% failing qualifiers; Dialyzer does it so much better. %% But there are a few cases where qlc finds more... (r12b). - FWarn = warn_failing_qualifiers(Qs, AllIVs, Dependencies, + FWarn = warn_failing_qualifiers(Qs, AllIVs, Dependencies, State), JQs = join_quals(JoinInfo, QCs, Anno, LcNo, ExtraConsts, AllVars), XQCs = QCs ++ JQs, @@ -679,8 +685,8 @@ transform(FormsNoShadows, State) -> Template = template(E, RL, Fun, Go, AT, Anno, AllIVs, State), Fin = final(RL, AllIVs, Anno, State), FunC = {'fun',Anno,{clauses,Fin ++ Template ++ Cs0}}, - As0 = pack_args(abst_vars([S0, RL0, Fun, Go0 - | replace(AllIVs, AllIVs, nil)], + As0 = pack_args(abst_vars([S0, RL0, Fun, Go0 + | replace(AllIVs, AllIVs, nil)], Anno), Anno, State), AsW = abst_vars([S0, RL0, Go0], Anno), FunW = {'fun',Anno,{clauses,[{clause,Anno,AsW,[], @@ -690,13 +696,13 @@ transform(FormsNoShadows, State) -> OrigE = undo_no_shadows(OrigE0, State), QCode = qcode(OrigE, XQCs, Source, Anno, State), Qdata = qdata(XQCs, Anno), - TemplateInfo = + TemplateInfo = template_columns(Qs, E, AllIVs, Dependencies, State), %% ExtraConsts should be used by match_spec_quals. MSQs = match_spec_quals(E, Dependencies, Qs, State), Opt = opt_info(TemplateInfo, SizeInfo, JoinInfo, MSQs, Anno, EqColumnConstants, EqualColumnConstants), - LCTuple = + LCTuple = case qlc_kind(OrigE, Qs, State) of qlc -> {tuple,Anno,[?A(qlc_v1),FunW,QCode,Qdata,Opt]}; @@ -719,18 +725,18 @@ join_kind(Qs, LcL, AllIVs, Dependencies, State) -> Tables = lists:usort ([T || {C,_Skip} <- EqualCols2, {T,_} <- C] ++ [T || {C,_Skip} <- EqualCols2, T <- C, is_integer(T)]), - if - EqualColsN =/= []; MatchColsN =/= [] -> - {[], + if + EqualColsN =/= []; MatchColsN =/= [] -> + {[], [{get(?QLC_FILE),[{LcL,?APIMOD,too_complex_join}]}]}; EqualCols2 =:= [], MatchCols2 =:= [] -> {[], []}; - length(Tables) > 2 -> - {[], + length(Tables) > 2 -> + {[], [{get(?QLC_FILE),[{LcL,?APIMOD,too_many_joins}]}]}; EqualCols2 =:= MatchCols2 -> {EqualCols2, []}; - true -> + true -> {{EqualCols2, MatchCols2}, []} end. @@ -747,19 +753,19 @@ qlc_kind(OrigE, Qs, State) -> qlc end. -%% Finds filters and patterns that cannot match any values at all. +%% Finds filters and patterns that cannot match any values at all. %% Nothing but the patterns and the filters themselves is analyzed. %% A much weaker analysis than the one of Dialyzer's. warn_failing_qualifiers(Qualifiers, AllIVs, Dependencies, State) -> - {FilterData, GeneratorData} = qual_data(Qualifiers), + {FilterData, GeneratorData} = qual_data(Qualifiers), Anon = 1, BindFun = fun(_Op, Value) -> is_bindable(Value) end, - {PFrame, _PatternVars} = + {PFrame, _PatternVars} = pattern_frame(GeneratorData, BindFun, Anon, State), - {_, _, Imported} = + {_, _, Imported} = filter_info(FilterData, AllIVs, Dependencies, State), PFrames = frame2frames(PFrame), - {_, Warnings} = + {_, Warnings} = lists:foldl(fun({_QId,{fil,_Filter}}, {[]=Frames,Warnings}) -> {Frames,Warnings}; ({_QId,{fil,Filter}}, {Frames,Warnings}) -> @@ -770,12 +776,12 @@ warn_failing_qualifiers(Qualifiers, AllIVs, Dependencies, State) -> [{get(?QLC_FILE), [{loc(element(2, Filter)),?APIMOD, nomatch_filter}]} | Warnings]}; - Frames1 -> + Frames1 -> {Frames1,Warnings} end; ({_QId,{gen,Pattern,_}}, {Frames,Warnings}) -> case pattern(Pattern, Anon, [], BindFun, State) of - {failed, _, _} -> + {failed, _, _} -> {Frames, [{get(?QLC_FILE), [{loc(element(2, Pattern)),?APIMOD, @@ -816,7 +822,7 @@ opt_info(TemplateInfo, Sizes, JoinInfo, MSQs, Anno, C = [EqC | [EqualC || true <- [CCs =/= ECCs]]], %% Comparisons yield more constant columns than matchings. - ConstCols = [{IdNo,Col} || + ConstCols = [{IdNo,Col} || {{IdNo,Col},[_],_FilNs} <- EqualColumnConstants], ConstColsFamily = family_list(ConstCols), NSortedCols0 = [{IdNo,hd(lists:seq(1, length(Cols)+1)--Cols)} || @@ -827,7 +833,7 @@ opt_info(TemplateInfo, Sizes, JoinInfo, MSQs, Anno, N = [{n_leading_constant_columns,{'fun',Anno,{clauses,NCls}}}], ConstCls = [{clause,Anno,[?I(IdNo)],[],[abstr(Cols,Anno)]} || - {IdNo,Cols} <- ConstColsFamily] + {IdNo,Cols} <- ConstColsFamily] ++ [{clause,Anno,[?V('_')],[],[{nil,Anno}]}], CC = [{constant_columns,{'fun',Anno,{clauses,ConstCls}}}], @@ -857,10 +863,10 @@ abstr(Term, Anno) -> %% Extra generators are introduced for join. join_quals(JoinInfo, QCs, Anno, LcNo, ExtraConstants, AllVars) -> {LastGoI, LastSI} = - lists:foldl(fun({_QId,{_QIVs,{{fil,_},GoI,SI}}}, + lists:foldl(fun({_QId,{_QIVs,{{fil,_},GoI,SI}}}, {GoI0, _SI0}) when GoI >= GoI0 -> {GoI + 2, SI + 1}; - ({_QId,{_QIVs,{{gen,_,_,_},GoI,SI}}}, + ({_QId,{_QIVs,{{gen,_,_,_},GoI,SI}}}, {GoI0, _SI0}) when GoI >= GoI0 -> {GoI + 3, SI + 2}; (_, A) -> @@ -881,13 +887,13 @@ join_quals(JoinInfo, QCs, Anno, LcNo, ExtraConstants, AllVars) -> EqualCols -> [{Q1,Q2,'=='} || {Q1,Q2} <- join_qnums(EqualCols)] end, - LD = [begin - [{QId1,P1,GV1,QIVs1}] = - [{QId,P,GV,QIVs} || - {QId,{QIVs,{{gen,P,_,GV},_GoI,_SI}}} <- QCs, + LD = [begin + [{QId1,P1,GV1,QIVs1}] = + [{QId,P,GV,QIVs} || + {QId,{QIVs,{{gen,P,_,GV},_GoI,_SI}}} <- QCs, QId#qid.no =:= Q1], - [{QId2,P2,QIVs2}] = - [{QId,P,QIVs--[GV]} || + [{QId2,P2,QIVs2}] = + [{QId,P,QIVs--[GV]} || {QId,{QIVs,{{gen,P,_,GV},_,_}}} <- QCs, QId#qid.no =:= Q2], {QId1,Op,P1,GV1,QIVs1++QIVs2,QId2,P2} @@ -918,7 +924,7 @@ anon_pattern(P) -> MoreThanOnce = lists:usort(occ_vars(P) -- qlc:vars(P)), {AP, foo} = var_mapfold(fun({var, Anno, V}, A) -> case lists:member(V, MoreThanOnce) of - true -> + true -> {{var, Anno, V}, A}; false -> {{var, Anno, '_'}, A} @@ -930,7 +936,7 @@ anon_pattern(P) -> %% pattern. It is important that objects that do not pass the pattern %% are filtered out because the columns of the pattern are inspected %% in order to determine if key-sorting the operands can be avoided. -%% +%% %% No objects will be filtered out if the pattern is just a variable. join_handle(AP, Anno, [F, H, O, C], Constants) -> case {AP, Constants} of @@ -979,7 +985,7 @@ join_handle_constants(QId, ExtraConstants) -> column_fun(Columns, QualifierNumber, LcL) -> A = anno0(), - ColCls0 = + ColCls0 = [begin true = Vs0 =/= [], % at least one value to look up Vs1 = list2cons(Vs0), @@ -1021,23 +1027,23 @@ template_columns(Qs0, E0, AllIVs, Dependencies, State) -> Qs = [TemplateAsPattern | Qs0], EqualColumns = equal_columns2(Qs, AllIVs, Dependencies, State), MatchColumns = eq_columns2(Qs, AllIVs, Dependencies, State), - Equal = template_cols(EqualColumns), + Equal = template_cols(EqualColumns), Match = template_cols(MatchColumns), Anno = anno0(), - if - Match =:= Equal -> + if + Match =:= Equal -> [{?V('_'), Match}]; - true -> + true -> [{?A('=='), Equal}, {?A('=:='), Match}] end. equal_columns2(Qualifiers, AllIVs, Dependencies, State) -> - {JI, _Skip} = + {JI, _Skip} = join_info(Qualifiers, AllIVs, Dependencies, State,_JoinOp = '=='), JI. eq_columns2(Qualifiers, AllIVs, Dependencies, State) -> - {JI, _SKip} = + {JI, _SKip} = join_info(Qualifiers, AllIVs, Dependencies, State, _JoinOp = '=:='), JI. @@ -1078,7 +1084,7 @@ qualifier_dependencies(Qualifiers, IntroVs) -> UV <- qlc:vars(F)]), Depend = sofs:strict_relation(sofs:relative_product(Used, Intro)), G = sofs:family_to_digraph(sofs:relation_to_family(Depend)), - Dep0 = [{V,digraph_utils:reachable_neighbours([V], G)} || + Dep0 = [{V,digraph_utils:reachable_neighbours([V], G)} || V <- digraph:vertices(G)], true = digraph:delete(G), FilterIds = sofs:set(filter_ids(Qualifiers)), @@ -1094,27 +1100,27 @@ filter_ids(Qualifiers) -> %% The qualifiers [QualifierNumber'] are filters (F1, ..., Fn) that %% depend on QualifierNumber (a generator Pattern <- LE) only. %% MatchSpec is the match specification for [Pattern' || Pattern <- LE, -%% F1, ..., Fn], where Pattern' is Template if all qualifiers can be +%% F1, ..., Fn], where Pattern' is Template if all qualifiers can be %% replaced by one match specification, otherwise a modified Pattern. match_spec_quals(Template, Dependencies, Qualifiers, State) -> {FilterData, GeneratorData} = qual_data(Qualifiers), - NoFilterGIds = [GId || {GId,_} <- GeneratorData] + NoFilterGIds = [GId || {GId,_} <- GeneratorData] -- lists:flatmap(fun({_,GIds}) -> GIds end, Dependencies), Filters = filter_list(FilterData, Dependencies, State), - Candidates = [{QId2#qid.no,Pattern,[Filter],F} || + Candidates = [{QId2#qid.no,Pattern,[Filter],F} || {QId,[QId2]} <- Dependencies, {GQId,{gen,Pattern,_}} <- GeneratorData, GQId =:= QId2, {FQId,{fil,F}}=Filter <- Filters, % guard filters only - FQId =:= QId] + FQId =:= QId] ++ [{GId#qid.no,Pattern,[],{atom,anno0(),true}} || {GId,{gen,Pattern,_}} <- GeneratorData, lists:member(GId, NoFilterGIds)], E = {nil, anno0()}, - GF = [{{GNum,Pattern},Filter} || + GF = [{{GNum,Pattern},Filter} || {GNum,Pattern,Filter,F} <- Candidates, no =/= try_ms(E, Pattern, F, State)], - GFF = sofs:relation_to_family(sofs:relation(GF, + GFF = sofs:relation_to_family(sofs:relation(GF, [{gnum_pattern,[filter]}])), GFFL = sofs:to_external(sofs:family_union(GFF)), try @@ -1177,7 +1183,7 @@ pattern_as_template(E, TemplVar) -> %% Column = {QualifierNumber,ColumnNumber}} %% FilterNo is a filter that can be skipped at runtime provided constants %% are looked up. -%% ExtraConstants = +%% ExtraConstants = %% [{GeneratorNumber,[{ColumnNumber, %% [{AbstractConstant,AbstractOperator}]}]}] %% For every generator such that the unification binds value(s) to @@ -1188,33 +1194,33 @@ constants_and_sizes(Qualifiers0, E, Dependencies, AllIVs, State) -> TemplateAsPattern = template_as_pattern(E), Qualifiers = [TemplateAsPattern | Qualifiers0], {FilterData, GeneratorData} = qual_data(Qualifiers), - {Filter, Anon1, Imported} = + {Filter, Anon1, Imported} = filter_info(FilterData, AllIVs, Dependencies, State), PatBindFun = fun(_Op, Value) -> is_bindable(Value) end, - {PatternFrame, PatternVars} = + {PatternFrame, PatternVars} = pattern_frame(GeneratorData, PatBindFun, Anon1, State), PatternFrames = frame2frames(PatternFrame), - FilterFun = - fun(BindFun) -> + FilterFun = + fun(BindFun) -> filter(Filter, PatternFrames, BindFun, State, Imported) end, SzFs = FilterFun(PatBindFun), SizeInfo = pattern_sizes(PatternVars, SzFs), SelectorFun = const_selector(Imported), - PatternConstants = + PatternConstants = lists:flatten(frames_to_columns(PatternFrames, PatternVars, deref_pattern(Imported), SelectorFun, Imported, '=:=')), - {EqColumnConstants, _EqExtraConsts} = + {EqColumnConstants, _EqExtraConsts} = constants(FilterFun, PatternVars, PatternConstants, PatternFrame, - FilterData, Dependencies, _LookupOp1 = '=:=', + FilterData, Dependencies, _LookupOp1 = '=:=', Imported, State), - {EqualColumnConstants, EqualExtraConsts} = + {EqualColumnConstants, EqualExtraConsts} = constants(FilterFun, PatternVars, PatternConstants, PatternFrame, - FilterData, Dependencies, _LookupOp2 = '==', + FilterData, Dependencies, _LookupOp2 = '==', Imported, State), %% Use compared extra constants only because: @@ -1223,25 +1229,25 @@ constants_and_sizes(Qualifiers0, E, Dependencies, AllIVs, State) -> %% constants from the comparing unification. %% Using constants from the matching unification would make it %% possible to skip some (more) objects when joining. - ExtraCon1 = + ExtraCon1 = [{{GId,Col},{Val,Op}} || {Consts,Op} <- [{EqualExtraConsts,'=='}], {{GId,Col},Val} <- Consts], - ExtraConstants = + ExtraConstants = family_list([{GId, {Col,ValOps}} || {{GId,Col},ValOps} <- family_list(ExtraCon1)]), {EqColumnConstants, EqualColumnConstants, ExtraConstants, SizeInfo}. -constants(FilterFun, PatternVars, PatternConstants, PatternFrame, +constants(FilterFun, PatternVars, PatternConstants, PatternFrame, FilterData, Dependencies, LookupOp, Imported, State) -> BindFun = fun(_Op, Value) -> is_bindable(Value) end, Fs = FilterFun(BindFun), SelectorFun = const_selector(Imported), - ColumnConstants0 = frames_to_columns(Fs, PatternVars, + ColumnConstants0 = frames_to_columns(Fs, PatternVars, deref_lookup(Imported, LookupOp), SelectorFun, Imported, LookupOp), ColumnConstants1 = lists:flatten(ColumnConstants0), - ExtraConstants = + ExtraConstants = [{{GId,Col},Val} || {{GId,Col},Vals} <- ColumnConstants1 -- PatternConstants, GId =/= ?TNO, @@ -1282,15 +1288,15 @@ deref_lookup(Imported, '=:=') -> %% Augment ColConstants with filters that do not need to be run %% provided that constants are looked up. %% Does not find all filters that can be removed. -lu_skip(ColConstants, FilterData, PatternFrame, PatternVars, +lu_skip(ColConstants, FilterData, PatternFrame, PatternVars, Dependencies, State, Imported, LookupOp) -> %% If there is a test that does not compare or match, then the %% filter cannot be skipped. FailSelector = fun(_Frame) -> fun(Value) -> {yes, Value} end end, - %% In runtime, constants are looked up and matched against a pattern + %% In runtime, constants are looked up and matched against a pattern %% (the pattern acts like a filter), then the filters are run. PatternFrames = frame2frames(PatternFrame), - PatternColumns = + PatternColumns = lists:flatten(frames_to_columns(PatternFrames, PatternVars, deref_pattern(Imported), FailSelector, Imported, LookupOp)), @@ -1300,16 +1306,16 @@ lu_skip(ColConstants, FilterData, PatternFrame, PatternVars, %% Note: one filter at a time is tested; only the pattern is %% assumed to have been run when the filter is run. Sometimes it %% would be advantageously to assume some filter(s) occurring - %% before the filter had been run as well + %% before the filter had been run as well %% (an example: {{X,Y}} <- LE, X =:= 1, Y =:= a). BindFun = fun(_Op, Value) -> is_bindable(Value) end, ColFil = [{Column, FId#qid.no} || - {FId,{fil,Fil}} <- + {FId,{fil,Fil}} <- filter_list(FilterData, Dependencies, State), [] =/= (SFs = safe_filter(reset_anno(Fil), PatternFrames, BindFun, State, Imported)), {GId,PV} <- PatternVars, - [] =/= + [] =/= (Cols = hd(frames_to_columns(SFs, [{GId, PV}], deref_lu_skip(LookupOp, Imported), @@ -1335,19 +1341,19 @@ lu_skip(ColConstants, FilterData, PatternFrame, PatternVars, {NV, F1} = unify_column(PatternFrame, PV, Col, BindFun, Imported), - F2 = unify_var_bindings(VarValues, '=:=', NV, F1, + F2 = unify_var_bindings(VarValues, '=:=', NV, F1, BindFun, Imported, false), %% F2: the pattern has been matched and the %% constant has been looked up. If Frame has no %% more bindings than F2 (modulo unique - %% variables), then the filter can be skipped. - %% - %% Under rare circumstances (for instance: + %% variables), then the filter can be skipped. + %% + %% Under rare circumstances (for instance: %% "X =:= 1, X =:= U", U imported; only 1 is looked up), %% not all constants mentioned in a filter are looked up. %% The filter can only be skipped if all constants %% are looked up. - LookedUpConstants = + LookedUpConstants = case lists:keyfind(Column, 1, ColConstants) of false -> []; {Column, LUCs} -> LUCs @@ -1379,12 +1385,12 @@ deref_lu_skip('=:=', Imported) -> fun(PV, F) -> deref_values(PV, F, Imported) end. equal_columns(Qualifiers, AllIVs, Dependencies, State) -> - {Cs, Skip} = + {Cs, Skip} = join_info(Qualifiers, AllIVs, Dependencies, State, _JoinOp = '=='), join_gens(Cs, Qualifiers, Skip). eq_columns(Qualifiers, AllIVs, Dependencies, State) -> - {Cs, Skip} = + {Cs, Skip} = join_info(Qualifiers, AllIVs, Dependencies, State, _JoinOp = '=:='), join_gens(Cs, Qualifiers, Skip). @@ -1422,7 +1428,7 @@ skip_tag(Col, ColFils, FilterData) -> some end, {Tag, FilL}; - false -> + false -> {some,[]} end. @@ -1433,10 +1439,10 @@ skip_tag(Col, ColFils, FilterData) -> %% -> [[{QualifierNumber,ColumnNumber}]] % Eq.classes. join_info(Qualifiers, AllIVs, Dependencies, State, JoinOp) -> {FilterData, GeneratorData} = qual_data(Qualifiers), - {Filter, Anon1, Imported} = + {Filter, Anon1, Imported} = filter_info(FilterData, AllIVs, Dependencies, State), BindFun = fun(_Op, V) -> bind_no_const(V, Imported) end, - {PatternFrame, PatternVars} = + {PatternFrame, PatternVars} = pattern_frame(GeneratorData, BindFun, Anon1, State), PatternFrames = frame2frames(PatternFrame), Fs = filter(Filter, PatternFrames, BindFun, State, Imported), @@ -1474,23 +1480,23 @@ join_skip(JoinClasses, FilterData, PatternFrame, PatternVars, Dependencies, GId2#qid.no =:= Q2, %% Select a filter that depends on the two generators: - {FId,{fil,Fil}} <- + {FId,{fil,Fil}} <- filter_list(FilterData, Dependencies, State), - {value,{_,GIds}} <- + {value,{_,GIds}} <- [lists:keysearch(FId, 1, Dependencies)], GIds =:= lists:sort([GId1,GId2]), begin - %% Do what the join does: + %% Do what the join does: %% element(C1, G1) JoinOp element(C2, G2). %% As for lu_skip: sometimes it would be %% advantageously to assume some filter(s) %% occurring before the join filter had been run %% as well. BindFun = fun(_Op, V) -> is_bindable(V) end, - {V1, JF1} = + {V1, JF1} = unify_column(PatternFrame, PV1, C1, BindFun, Imported), - {V2, JF2} = + {V2, JF2} = unify_column(JF1, PV2, C2, BindFun, Imported), JF = unify(JoinOp, V1, V2, JF2, BindFun, Imported), @@ -1498,7 +1504,7 @@ join_skip(JoinClasses, FilterData, PatternFrame, PatternVars, Dependencies, SFs = safe_filter(reset_anno(Fil), PatternFrames, BindFun, State, Imported), JImp = qlc:vars([SFs, JF]), % kludge - lists:all(fun(Frame) -> + lists:all(fun(Frame) -> bindings_is_subset(Frame, JF, JImp) end, SFs) andalso SFs =/= [] end], @@ -1510,7 +1516,7 @@ filter_info(FilterData, AllIVs, Dependencies, State) -> Anon0 = 0, {Filter, Anon1} = anon_var(Filter0, Anon0), Imported = ordsets:subtract(qlc:vars(Filter), % anonymous too - ordsets:from_list(AllIVs)), + ordsets:from_list(AllIVs)), {Filter, Anon1, Imported}. %% Selects the guard filters. Other filters than guard filters are @@ -1521,7 +1527,7 @@ filter_info(FilterData, AllIVs, Dependencies, State) -> %% the failing filter is placed _after_ the guard filter, the failing %% objects have already been filtered out by the guard filter. %% Note: guard filters using variables from one generator are allowed -%% to be placed after further generators (the docs states otherwise, but +%% to be placed after further generators (the docs states otherwise, but %% this seems to be common practice). filter_list(FilterData, Dependencies, State) -> sel_gf(FilterData, 1, Dependencies, State, [], []). @@ -1561,12 +1567,12 @@ pattern_frame(GeneratorData, BindFun, Anon1, State) -> Frame0 = [], {PatternFrame, _Anon2, PatternVars} = lists:foldl(fun({QId,{gen,Pattern,_}}, {F0,An0,PVs}) -> - {F1, An1, PV} = + {F1, An1, PV} = pattern(Pattern, An0, F0, BindFun, State), {F1, An1, [{QId,PV} | PVs]} end, {Frame0, Anon1, []}, GeneratorData), {PatternFrame, PatternVars}. - + const_selector(Imported) -> selector(Imported, fun is_const/2). @@ -1575,7 +1581,7 @@ no_const_selector(Imported) -> selector(Imported, TestFun) -> fun(_Frame) -> - fun(Value) -> + fun(Value) -> case TestFun(Value, Imported) of true -> {yes, Value}; @@ -1595,7 +1601,7 @@ bind_no_const(Value, Imported) -> %% Tuple tails are variables, never constants. is_const(Value, Imported) -> - %% is_bindable() has checked that E is normalisable. + %% is_bindable() has checked that E is normalisable. [] =:= ordsets:to_list(ordsets:subtract(qlc:vars(Value), Imported)). is_bindable(Value) -> @@ -1607,7 +1613,7 @@ is_bindable(Value) -> end. pattern(P0, AnonI, Frame0, BindFun, State) -> - P1 = try + P1 = try expand_pattern_records(P0, State) catch _:_ -> P0 % template, records already expanded end, @@ -1669,10 +1675,10 @@ filter(E0, Frames0, BF, State, Imported) -> %% One frame for each path through the and/or expression. %% -%% "A xor B" is equal to "(A and not B) or (not A and B)". -%% Ignoring "not B" and "not A" this is the same as "A or B"; +%% "A xor B" is equal to "(A and not B) or (not A and B)". +%% Ignoring "not B" and "not A" this is the same as "A or B"; %% "xor" can be handled just as "or". -%% +%% %% One must handle filters with care, both when joining and when %% looking up values. The reference is a nested loop: if the filter %% fails for some combination of values, it must fail also when @@ -1705,7 +1711,7 @@ filter1({op, _, Op, L0, R0}, Fs, FS) when Op =:= '=:='; Op =:= '==' -> end, Fs); filter1({op, _, Op, L, R}, Fs, FS) when Op =:= 'and'; Op =:= 'andalso' -> filter1(R, filter1(L, Fs, FS), FS); -filter1({op, _, Op, L, R}, Fs, FS) when Op =:= 'or'; +filter1({op, _, Op, L, R}, Fs, FS) when Op =:= 'or'; Op =:= 'orelse'; Op =:= 'xor' -> filter1(L, Fs, FS) ++ filter1(R, Fs, FS); @@ -1755,7 +1761,7 @@ safe_filter1({atom,_,true}, Fs, _FS) -> safe_filter1(_E, _Fs, _FS) -> []. -%% Substitutions: +%% Substitutions: %% M:F() for {M,F}(); erlang:F() for F(); is_record() for record(). pre_expand({call,Anno1,{atom,Anno2,record},As}) -> pre_expand({call,Anno1,{atom,Anno2,is_record},As}); @@ -1779,18 +1785,18 @@ frames_to_columns(Fs, PatternVars, DerefFun, SelectorFun, Imp, CompOp) -> %% it doesn't matter, but when trying to find joined columns, the %% same variables have to be the representatives in every frame.) SizesVarsL = - [begin + [begin PatVar = {var,anno0(),PV}, - PatternSizes = [pattern_size([F], PatVar, false) || + PatternSizes = [pattern_size([F], PatVar, false) || F <- Fs], MaxPZ = lists:max([0 | PatternSizes -- [undefined]]), Vars = pat_vars(MaxPZ), {PatternId#qid.no, PatVar, PatternSizes, Vars} end || {PatternId, PV} <- PatternVars], BF = fun(_Op, Value) -> is_bindable(Value) end, - Fun = fun({_PatN, PatVar, PatSizes, Vars}, Frames) -> + Fun = fun({_PatN, PatVar, PatSizes, Vars}, Frames) -> [unify('=:=', pat_tuple(Sz, Vars), PatVar, Frame, BF, Imp) || - {Sz, Frame} <- lists:zip(PatSizes, Frames)] + Sz <- PatSizes && Frame <- Frames] end, NFs = lists:foldl(Fun, Fs, SizesVarsL), [frames2cols(NFs, PatN, PatSizes, Vars, DerefFun, SelectorFun, CompOp) || @@ -1799,8 +1805,8 @@ frames_to_columns(Fs, PatternVars, DerefFun, SelectorFun, Imp, CompOp) -> frames2cols(Fs, PatN, PatSizes, Vars, DerefFun, SelectorFun, CompOp) -> Rs = [ begin RL = [{{PatN,Col},cons2tuple(element(2, Const))} || - {V, Col} <- lists:zip(lists:sublist(Vars, PatSz), - lists:seq(1, PatSz)), + V <- lists:sublist(Vars, PatSz) && + Col <- lists:seq(1, PatSz), %% Do not handle the case where several %% values compare equal, e.g. "X =:= 1 %% andalso X == 1.0". Looking up both @@ -1820,7 +1826,7 @@ frames2cols(Fs, PatN, PatSizes, Vars, DerefFun, SelectorFun, CompOp) -> tl(Consts = DerefFun(V, F)) =:= [], (Const = (SelectorFun(F))(hd(Consts))) =/= no], sofs:relation(RL) % possibly empty - end || {F,PatSz} <- lists:zip(Fs, PatSizes)], + end || F <- Fs && PatSz <- PatSizes], Ss = sofs:from_sets(Rs), %% D: columns occurring in every frame (path). D = sofs:intersection(sofs:projection(fun(S) -> sofs:projection(1, S) end, @@ -1845,7 +1851,7 @@ col_ignore(Vs, '==') -> length(Vs) =/= length(lists:usort([element(2, normalise(V)) || V <- Vs])). pattern_sizes(PatternVars, Fs) -> - [{QId#qid.no, Size} || + [{QId#qid.no, Size} || {QId,PV} <- PatternVars, undefined =/= (Size = pattern_size(Fs, {var,anno0(),PV}, true))]. @@ -1961,14 +1967,14 @@ unify(Op, E1, E2, F, _BF, _Imported, Safe) -> try {ok, C1} = normalise(E1), {ok, C2} = normalise(E2), - if + if Op =:= '=:=', C1 =:= C2 -> F; Op =:= '==', C1 == C2 -> F; true -> failed - end + end catch error:_ when Safe -> failed; error:_ when not Safe -> F % ignored end. @@ -1983,7 +1989,7 @@ unify(Op, E1, E2, F, _BF, _Imported, Safe) -> %% to find lookup values for such QLCs at all. That might have been a %% better design decision. --record(bind, {var, value, op}). +-record(bind, {var, value, op}). extend_frame(Op, Var, Value, F, BF, Imported, Safe) -> case var_values(Var, F) of @@ -1994,7 +2000,7 @@ extend_frame(Op, Var, Value, F, BF, Imported, Safe) -> [] -> add_binding(Op, Value, Var, F, BF, Imported, Safe); ValsOps -> - maybe_add_binding(ValsOps, Op, Value, Var, F, + maybe_add_binding(ValsOps, Op, Value, Var, F, BF, Imported, Safe) end; _ -> @@ -2010,7 +2016,7 @@ maybe_add_binding(ValsOps, Op, Var, Value, F0, BF, Imported, Safe) -> failed; F -> case already_bound(Op, Var, Value, F) of - true -> + true -> F; false -> add_binding(Op, Var, Value, F, BF, Imported, Safe) @@ -2045,19 +2051,19 @@ deref_op(_, _) -> %%% Note: usort works; {integer,A,3} does not match {float,A,3.0}. var_values(Var, Frame) -> - [{Value, Op} || + [{Value, Op} || #bind{value = Value, op = Op} <- var_bindings(Var, Frame)]. deref_var(Var, Frame, Imported) -> deref_var(Var, Frame, fun(_DV, _Op) -> true end, Imported). deref_var(Var, Frame, BFun, Imported) -> - lists:usort([ValOp || + lists:usort([ValOp || #bind{value = Value, op = Op} <- var_bindings(Var, Frame), ValOp <- deref_value(Value, Op, Frame, BFun, Imported)]). deref_value(Value, Op, Frame, BFun, Imported) -> - lists:usort([{Val,value_op(ValOp, Op, Imported)} || + lists:usort([{Val,value_op(ValOp, Op, Imported)} || {Val,_Op}=ValOp <- deref(Value, Frame, BFun, Imported)]). add_binding(Op, Var0, Value0, F, BF, Imported, Safe) -> @@ -2095,11 +2101,11 @@ do_swap_var_value({var, _, V1}=Var1, {var, _, V2}=Var2, F, Imported) -> [] -> case swap_vv(Var2, Var1, F) of [] -> - ordsets:is_element(V1, Imported) andalso + ordsets:is_element(V1, Imported) andalso not ordsets:is_element(V2, Imported); _Bs -> true - end; + end; _Bs -> false end; @@ -2133,7 +2139,7 @@ deref_values(E, Frame, Imported) -> deref_values(E, Frame, fun(_DV, _Op) -> true end, Imported). deref_values(E, Frame, BFun, Imported) -> - lists:usort([V || + lists:usort([V || {V, Op} <- deref(E, Frame, BFun, Imported), BFun(V, Op)]). @@ -2142,7 +2148,7 @@ deref(E, F, Imp) -> deref(E, F, BFun, Imp). deref({var, _, _}=V, F, BFun, Imp) -> - DBs = lists:flatmap(fun(B) -> deref_binding(B, F, BFun, Imp) + DBs = lists:flatmap(fun(B) -> deref_binding(B, F, BFun, Imp) end, var_bindings(V, F)), case DBs of [] -> @@ -2151,7 +2157,7 @@ deref({var, _, _}=V, F, BFun, Imp) -> lists:usort(DBs) end; deref(T, F, BFun, Imp) when is_tuple(T) -> - [{list_to_tuple(DL), Op} || + [{list_to_tuple(DL), Op} || {DL, Op} <- deref(tuple_to_list(T), F, BFun, Imp)]; deref(Es, F, BFun, Imp) when is_list(Es) -> L = [deref(C, F, BFun, Imp) || C <- Es], @@ -2167,7 +2173,7 @@ deref_binding(Bind, Frame, BFun, Imp) -> [{Val, Op} || {Val, _Op}=ValOp <- deref(Value, Frame, BFun, Imp), BFun(Val, Op = value_op(ValOp, Op0, Imp))]. - + deref_list(L) -> Op = case lists:usort([Op || {_Val, Op} <- L]) of ['=:='] -> @@ -2220,7 +2226,7 @@ has_int({float,_,F}) when round(F) == F -> has_int(T) when is_tuple(T) -> has_int(tuple_to_list(T)); has_int([E | Es]) -> - has_int(E), + has_int(E), has_int(Es); has_int(_) -> false. @@ -2260,7 +2266,7 @@ cons2list(E) -> % tuple tail (always a variable) %% Returns true if all bindings in F1 also occur in F2. %% Viewing F1 and F2 as sets, the fact that F1 is a subset of F2 iff -%% F1 union F2 is equal to F2 is used. (This should take care of +%% F1 union F2 is equal to F2 is used. (This should take care of %% issues with anonymous variables.) bindings_is_subset(F1, F2, Imported) -> BF = fun(_Op, _Value) -> true end, % don't need any test here @@ -2287,13 +2293,13 @@ try_ms(E, P, Fltr, State) -> Expr = {call,Anno,{remote,Anno,{atom,Anno,ets},{atom,Anno,fun2ms}},[Fun]}, Form = {function,Anno,foo,0,[{clause,Anno,[],[],[Expr]}]}, X = ms_transform:parse_transform(State#state.records ++ [Form], []), - case catch + case catch begin {function,Anno,foo,0,[{clause,Anno,[],[],[MS0]}]} = lists:last(X), MS = erl_parse:normalise(var2const(MS0)), XMS = ets:match_spec_compile(MS), true = ets:is_compiled_ms(XMS), - {ok, MS, MS0} + {ok, MS, MS0} end of {'EXIT', _Reason} -> no; @@ -2310,7 +2316,7 @@ filters_as_one(FilterData) -> end, Filter1, Filters). qual_data(Qualifiers) -> - F = fun(T) -> + F = fun(T) -> [{QId,Q} || {QId,_,_,Q} <- Qualifiers, element(1,Q) =:= T] end, {F(fil), F(gen)}. @@ -2319,7 +2325,7 @@ set_field(Pos, Fs, Data) -> lists:sublist(Fs, Pos-1) ++ [Data] ++ lists:nthtail(Pos, Fs). qdata([{#qid{no = QIdNo},{_QIVs,{{gen,_P,LE,_GV},GoI,SI}}} | QCs], Anno) -> - Init = case LE of + Init = case LE of {join, Op, Q1, Q2, H1, H2, Cs1_0, Cs2_0} -> Cs1 = qcon(Cs1_0), Cs2 = qcon(Cs2_0), @@ -2358,7 +2364,7 @@ qcode(E, QCs, Source, Anno, State) -> {bin, Anno, [{bin_element, Anno, {string, Anno, binary_to_list(Bin)}, default, default}]} - end || {_,C} <- lists:keysort(1, [{qlc:template_state(),E} | + end || {_,C} <- lists:keysort(1, [{qlc:template_state(),E} | qcode(QCs, Source, State)])], {'fun', Anno, {clauses, [{clause, Anno, [], [], [{tuple, Anno, CL}]}]}}. @@ -2414,7 +2420,7 @@ template(E, RL, Fun, Go, AT, Anno, IVs, State) -> %% Extra careful here or arguments will be lifted into a wide fun. F = case split_args([Next | As0], Anno, State) of - {ArgsL, ArgsT} -> + {ArgsL, ArgsT} -> Call = {call,Anno,?V(Fun),ArgsL++[{var,Anno,AT}]}, {block,Anno, [{match,Anno,{var,Anno,AT},ArgsT}, @@ -2446,7 +2452,7 @@ generator(S, QIVs, P, GV, NGV, E, IVs, RL, Fun, Go, GoI, Anno, State) -> CsL = generator_list(P, GV, NGV, As, AsM, AsC, AsD, Fun, Anno, State), CsF = generator_cont(P, GV, NGV, E, As, AsM, AsC, AsD, Fun, Anno, State), [InitC | CsL ++ CsF]. - + generator_init(S, Anno, GV, RL, Fun, Go, GoI, IVs, State) -> As0 = abst_vars([RL, Fun, Go] ++ replace([GV], IVs, '_'), Anno), As = pack_args([?I(S) | As0], Anno, State), @@ -2478,7 +2484,7 @@ generator_cont(P, GV, NGV, E, As0, AsM, AsC, AsD, Fun, Anno, State) -> Cls = [CM, CC, CD, CE], B = {'case',Anno,{call,Anno,?V(GV),[]},Cls}, [{clause,Anno,As,[],[B]}]. - + filter(E, Anno, QIVs, S, RL, Fun, Go, GoI, IVs, State) -> IAs = replace(QIVs, IVs, '_'), As = pack_args([?I(S) | abst_vars([RL, Fun, Go] ++ IAs, Anno)], Anno, State), @@ -2491,17 +2497,17 @@ filter(E, Anno, QIVs, S, RL, Fun, Go, GoI, IVs, State) -> %% comprehension: if a filter looks like a guard test, it returns %% 'false' rather than fails. Body = case is_guard_test(E, State) of - true -> + true -> CT = {clause,Anno,[],[[E]],[{call,Anno,?V(Fun),NAsT}]}, CF = {clause,Anno,[],[[?A(true)]],[{call,Anno,?V(Fun),NAsF}]}, [{'if',Anno,[CT,CF]}]; - false -> + false -> CT = {clause,Anno,[?A(true)],[],[{call,Anno,?V(Fun),NAsT}]}, CF = {clause,Anno,[?A(false)],[],[{call,Anno,?V(Fun),NAsF}]}, [{'case',Anno,E,[CT,CF]}] end, [{clause,Anno,As,[],Body}]. - + pack_args(Args, Anno, State) -> case split_args(Args, Anno, State) of {ArgsL, ArgsT} -> @@ -2511,17 +2517,17 @@ pack_args(Args, Anno, State) -> end. split_args(Args, Anno, State) when length(Args) > State#state.maxargs -> - {lists:sublist(Args, State#state.maxargs-1), + {lists:sublist(Args, State#state.maxargs-1), {tuple,Anno,lists:nthtail(State#state.maxargs-1, Args)}}; split_args(Args, _Anno, _State) -> Args. - + %% Replace every element in IEs that is a member of Es by R, keep all %% other elements as they are. replace(Es, IEs, R) -> [case lists:member(E, Es) of - true -> R; - false -> E + true -> R; + false -> E end || E <- IEs]. is_list_c(V, Anno) -> @@ -2659,7 +2665,7 @@ no_shadows(Forms0, State) -> %% Variables that may shadow other variables are introduced in %% LCs and Funs. Such variables (call them SV, Shadowing %% Variables) are now renamed. Each (new) occurrence in a pattern - %% is assigned an index (integer), unique in the file. + %% is assigned an index (integer), unique in the file. %% %% The state {LastIndex,ActiveVars,UsedVars,AllVars,Singletons,State} %% holds the last index used for each SV (LastIndex), the SVs in @@ -2725,7 +2731,7 @@ nos({lc,Anno,E0,Qs0}, S) -> {LE, _} = nos(LE0, QS0), {P, QS} = nos_pattern(P0, QS0), {{T,GAnno,P,LE}, QS}; - (Filter, QS) -> + (Filter, QS) -> nos(Filter, QS) end, {Qs, S1} = lists:mapfoldl(F, S, Qs0), @@ -2754,12 +2760,12 @@ nos_pattern([P0 | Ps0], S0, PVs0) -> {Ps, S, PVs} = nos_pattern(Ps0, S1, PVs1), {[P | Ps], S, PVs}; nos_pattern({var,Anno,V}, {LI,Vs0,UV,A,Sg,State}, PVs0) when V =/= '_' -> - {Name, Vs, PVs} = + {Name, Vs, PVs} = case lists:keyfind(V, 1, PVs0) of {V, VN} -> - _ = used_var(V, Vs0, UV), + _ = used_var(V, Vs0, UV), {VN, Vs0, PVs0}; - false -> + false -> {VN, Vs1} = next_var(V, Vs0, A, LI, UV), N = case lists:member(VN, Sg) of true -> '_'; @@ -2823,7 +2829,7 @@ undo_no_shadows1({var, Anno, _}=Var, State) -> Var end. -%% QLC identifier. +%% QLC identifier. %% The first one encountered in the file has No=1. make_lcid(Anno, No) when is_integer(No), No > 0 -> diff --git a/lib/stdlib/src/rand.erl b/lib/stdlib/src/rand.erl index cddc3a1fedbd..c4e4981ca2ab 100644 --- a/lib/stdlib/src/rand.erl +++ b/lib/stdlib/src/rand.erl @@ -1761,8 +1761,7 @@ exs1024_jump({L, RL}, AS, JL, J, N, TN) -> {_, NS} = exs1024_next({L, RL}), case ?MASK(1, J) of 1 -> - AS2 = lists:zipwith(fun(X, Y) -> X bxor Y end, - AS, L ++ lists:reverse(RL)), + AS2 = [X bxor Y || X <- AS && Y <- L ++ lists:reverse(RL)], exs1024_jump(NS, AS2, JL, J bsr 1, N-1, TN-1); 0 -> exs1024_jump(NS, AS, JL, J bsr 1, N-1, TN-1) diff --git a/lib/stdlib/src/re.erl b/lib/stdlib/src/re.erl index 8351619b49c4..31103b3931be 100644 --- a/lib/stdlib/src/re.erl +++ b/lib/stdlib/src/re.erl @@ -1081,6 +1081,8 @@ split(Subject,RE,Options) -> case compile_split(RE,NewOpt) of {error,_Err} -> throw(badre); + {_PreCompiled, _NumSub, _RunOpt} when FlatSubject =:= <<>> -> + []; {PreCompiled, NumSub, RunOpt} -> %% OK, lets run case re:run(FlatSubject,PreCompiled,RunOpt ++ [global]) of diff --git a/lib/stdlib/src/sets.erl b/lib/stdlib/src/sets.erl index ca133465de11..471cce4bbb07 100644 --- a/lib/stdlib/src/sets.erl +++ b/lib/stdlib/src/sets.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 2000-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,7 +14,7 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% %% @@ -52,14 +52,12 @@ undefined representation. One difference is that while this module considers two elements as different if they do not match (`=:=`), `ordsets` considers two elements as different if and only if they do not compare equal (`==`). -Erlang/OTP 24.0 introduced a new internal representation for sets which is more -performant. Developers can use this new representation by passing the -`{version, 2}` flag to `new/1` and `from_list/2`, such as -`sets:new([{version, 2}])`. This new representation will become the default in -future Erlang/OTP versions. Functions that work on two sets, such as `union/2` -and similar, will work with sets of different versions. In such cases, there is -no guarantee about the version of the returned set. Explicit conversion from the -old version to the new one can be done with +Erlang/OTP 24.0 introduced a new more performant representation for sets which +has become the default in Erlang/OTP 28. Developers can use the old representation +by passing the `{version, 1}` flag to `new/1` and `from_list/2`. Functions that +work on two sets, such as `union/2`, will work with sets of different +versions. In such cases, there is no guarantee about the version of the returned set. +Explicit conversion from the old version to the new one can be done with `sets:from_list(sets:to_list(Old), [{version,2}])`. ## Compatibility @@ -167,19 +165,19 @@ representations. %% new() -> Set -doc "Returns a new empty set.". -spec new() -> set(none()). -new() -> - Empty = mk_seg(?seg_size), - #set{empty = Empty, segs = {Empty}}. +new() -> #{}. -doc "Returns a new empty set at the given version.". -doc(#{since => <<"OTP 24.0">>}). -spec new([{version, 1..2}]) -> set(none()). new([{version, 2}]) -> - #{}; + new(); new(Opts) -> - case proplists:get_value(version, Opts, 1) of - 1 -> new(); - 2 -> new([{version, 2}]) + case proplists:get_value(version, Opts, 2) of + 1 -> + Empty = mk_seg(?seg_size), + #set{empty = Empty, segs = {Empty}}; + 2 -> new() end. %% from_list([Elem]) -> Set. @@ -189,7 +187,7 @@ new(Opts) -> List :: [Element], Set :: set(Element). from_list(Ls) -> - lists:foldl(fun (E, S) -> add_element(E, S) end, new(), Ls). + maps:from_keys(Ls, ?VALUE). -doc "Returns a set of the elements in `List` at the given version.". -doc(#{since => <<"OTP 24.0">>}). @@ -197,11 +195,11 @@ from_list(Ls) -> List :: [Element], Set :: set(Element). from_list(Ls, [{version, 2}]) -> - maps:from_keys(Ls, ?VALUE); + from_list(Ls); from_list(Ls, Opts) -> - case proplists:get_value(version, Opts, 1) of - 1 -> from_list(Ls); - 2 -> from_list(Ls, [{version, 2}]) + case proplists:get_value(version, Opts, 2) of + 1 -> lists:foldl(fun (E, S) -> add_element(E, S) end, new([{version, 1}]), Ls); + 2 -> from_list(Ls) end. %%------------------------------------------------------------------------------ @@ -259,7 +257,7 @@ is_equal(S1, S2) -> end. canonicalize_v2(S) -> - from_list(to_list(S), [{version, 2}]). + from_list(to_list(S)). %% to_list(Set) -> [Elem]. %% Return the elements in Set as a list. @@ -626,7 +624,7 @@ map(F, #{}=D) when is_function(F, 1) -> maps:from_keys([F(K) || K := _ <- D], ?VALUE); map(F, #set{}=D) when is_function(F, 1) -> fold(fun(E, Acc) -> add_element(F(E), Acc) end, - sets:new([{version, 1}]), + new([{version, 1}]), D). %% filtermap(Fun, Set) -> Set. @@ -647,7 +645,7 @@ filtermap(F, #set{}=D) when is_function(F, 1) -> false -> Acc end end, - sets:new([{version, 1}]), + new([{version, 1}]), D). %% get_slot(Hashdb, Key) -> Slot. @@ -815,7 +813,7 @@ expand_segs({B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16}, Empty) -> Empty,Empty,Empty,Empty,Empty,Empty,Empty,Empty, Empty,Empty,Empty,Empty,Empty,Empty,Empty,Empty}; expand_segs(Segs, Empty) -> - list_to_tuple(tuple_to_list(Segs) + list_to_tuple(tuple_to_list(Segs) ++ lists:duplicate(tuple_size(Segs), Empty)). -spec contract_segs(segs(E)) -> segs(E). diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl index 8075e658cd76..6d30ff35646b 100644 --- a/lib/stdlib/src/shell.erl +++ b/lib/stdlib/src/shell.erl @@ -30,7 +30,7 @@ -export([read_and_add_records/5]). -export([default_multiline_prompt/1, inverted_space_prompt/1]). -export([prompt_width/1, prompt_width/2]). --export([whereis/0]). +-export([help/0,whereis/0]). -define(LINEMAX, 30). -define(CHAR_MAX, 60). @@ -65,6 +65,9 @@ non_local_allowed(_,_,State) -> Starts the interactive shell if it has not already been started. It can be used to programatically start the shell from an escript or when erl is started with the -noinput or -noshell flags. + +Calling this function will start a remote shell if `-remsh` is given on the +command line or a local shell if not. """. -doc(#{since => <<"OTP 26.0">>}). -spec start_interactive() -> ok | {error, already_started}. @@ -78,18 +81,30 @@ or when [`erl`](`e:erts:erl_cmd.md`) is started with the [`-noshell`](`e:erts:erl_cmd.md#noshell`) flags. The following options are allowed: -- **noshell** - Starts the interactive shell as if - [`-noshell`](`e:erts:erl_cmd.md#noshell`) was given to - [`erl`](`e:erts:erl_cmd.md`). This is only useful when erl is started with - [`-noinput`](`e:erts:erl_cmd.md#noinput`) and the system want to read input - data. +- **noshell | {noshell, Mode}** - Starts the interactive shell + as if [`-noshell`](`e:erts:erl_cmd.md#noshell`) was given to + [`erl`](`e:erts:erl_cmd.md`). + + It is possible to give a `Mode` indicating if the input should be set + in `cooked` or `raw` mode. `Mode` only has en effect if `t:io:user/0` is a tty. + If no `Mode` is given, it defaults is `cooked`. + + When in `raw` mode all key presses are passed to `t:io:user/0` as they are + typed when they are typed and the characters are not echoed to the terminal. + It is possible to set the `echo` to `true` using `io:setopts/2` to enabling + echoing again. + + When in `cooked` mode the OS will handle the line editing and all data is + passed to `t:io:user/0` when a newline is entered. - **[mfa()](`t:erlang:mfa/0`)** - Starts the interactive shell using - [`mfa()`](`t:erlang:mfa/0`) as the default shell. + [`mfa()`](`t:erlang:mfa/0`) as the default shell. The `t:mfa/0` should + return the `t:pid/0` of the created shell process. - **\{[node()](`t:erlang:node/0`), [mfa()](`t:erlang:mfa/0`)\}** - Starts the interactive shell using [`mfa()`](`t:erlang:mfa/0`) on - [`node()`](`t:erlang:node/0`) as the default shell. + [`node()`](`t:erlang:node/0`) as the default shell. The `t:mfa/0` should + return the `t:pid/0` of the created shell process. - **\{remote, [`string()`](`t:erlang:string/0`)\}** - Starts the interactive shell using as if [`-remsh`](`e:erts:erl_cmd.md#remsh`) was given to @@ -113,7 +128,7 @@ On error this function will return: description of the error reasons. """. -doc(#{since => <<"OTP 26.0">>}). --spec start_interactive(noshell | {module(), atom(), [term()]}) -> +-spec start_interactive(noshell | {noshell, raw | cooked} | {module(), atom(), [term()]}) -> ok | {error, already_started}; ({remote, string()}) -> ok | {error, already_started | noconnection}; @@ -121,6 +136,10 @@ On error this function will return: ok | {error, already_started | noconnection | badfile | nofile | on_load_failure}. start_interactive({Node, {M, F, A}}) -> user_drv:start_shell(#{ initial_shell => {Node, M, F ,A} }); +start_interactive(noshell) -> + start_interactive({noshell, cooked}); +start_interactive({noshell, Type}) when Type =:= raw; Type =:= cooked -> + user_drv:start_shell(#{ initial_shell => noshell, input => Type }); start_interactive(InitialShell) -> user_drv:start_shell(#{ initial_shell => InitialShell }). @@ -232,6 +251,11 @@ server(StartSync) -> init:wait_until_started() end end, + + %% We disable line history for all commands. We will explicitly enable + %% it only for the commands that we want. + _ = io:setopts([{line_history, false}]), + %% Our spawner has fixed the process groups. Bs = erl_eval:new_bindings(), @@ -350,7 +374,7 @@ server_loop(N0, Eval_0, Bs00, RT, FT, Ds00, History0, Results0) -> [N]), server_loop(N0, Eval0, Bs0, RT, FT, Ds0, History0, Results0); eof -> - fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), + catch fwrite_severity(fatal, <<"Terminating erlang (~w)">>, [node()]), halt() end. @@ -360,11 +384,13 @@ get_command(Prompt, Eval, Bs, RT, FT, Ds) -> Parse = fun() -> put('$ancestors', Ancestors), + PreviousHistory = proplists:get_value(line_history, io:getopts()), + [ok = io:setopts([{line_history, true}]) || PreviousHistory =/= undefined], + Res = io:scan_erl_exprs(group_leader(), Prompt, {1,1}, + [text,{reserved_word_fun,ResWordFun}]), + _ = [io:setopts([{line_history, PreviousHistory}]) || PreviousHistory =/= undefined], exit( - case - io:scan_erl_exprs(group_leader(), Prompt, {1,1}, - [text,{reserved_word_fun,ResWordFun}]) - of + case Res of {ok,Toks,_EndPos} -> %% NOTE: we can handle function definitions, records and type declarations %% but this cannot be handled by the function which only expects erl_parse:abstract_expressions() @@ -434,12 +460,12 @@ escape_quotes([], Acc) -> % because we've been prepending for efficiency reasons. lists:reverse(Acc); -escape_quotes([$\\, $\" | Rest], Acc) -> +escape_quotes([$\\, $\" | Rest], Acc) -> % If we find an escaped quote (\"), % we escape the backslash and the quote (\\\") and continue. escape_quotes(Rest, [$\", $\\, $\\, $\\ | Acc]); -escape_quotes([$\" | Rest], Acc) -> +escape_quotes([$\" | Rest], Acc) -> % If we find a quote ("), % we escape it (\\") and continue. escape_quotes(Rest, [$\", $\\ | Acc]); @@ -635,8 +661,16 @@ expand_fields([], _C) -> []. expand_quals([{generate,A,P,E}|Qs], C) -> [{generate,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; +expand_quals([{generate_strict,A,P,E}|Qs], C) -> + [{generate_strict,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; expand_quals([{b_generate,A,P,E}|Qs], C) -> [{b_generate,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; +expand_quals([{b_generate_strict,A,P,E}|Qs], C) -> + [{b_generate_strict,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; +expand_quals([{m_generate,A,P,E}|Qs], C) -> + [{m_generate,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; +expand_quals([{m_generate_strict,A,P,E}|Qs], C) -> + [{m_generate_strict,A,P,expand_expr(E, C)}|expand_quals(Qs, C)]; expand_quals([E|Qs], C) -> [expand_expr(E, C)|expand_quals(Qs, C)]; expand_quals([], _C) -> []. @@ -728,6 +762,8 @@ shell_cmd(Es, Eval, Bs, RT, FT, Ds, W) -> shell_rep(Eval, Bs, RT, FT, Ds). shell_rep(Ev, Bs0, RT, FT, Ds0) -> + shell_rep(Ev, Bs0, RT, FT, Ds0, 5000). +shell_rep(Ev, Bs0, RT, FT, Ds0, Timeout) -> receive {shell_rep,Ev,{value,V,Bs,Ds}} -> {V,Ev,Bs,Ds}; @@ -774,6 +810,9 @@ shell_rep(Ev, Bs0, RT, FT, Ds0) -> _Other -> % Ignore everything else io:format("Throwing ~p~n", [_Other]), shell_rep(Ev, Bs0, RT, FT, Ds0) + after Timeout -> + io:format("Command is taking a long time, type Ctrl+G, then enter 'i' to interrupt~n"), + shell_rep(Ev, Bs0, RT, FT, Ds0, infinity) end. nocatch(throw, {Term,Stack}) -> @@ -1166,6 +1205,47 @@ init_dict([{K,V}|Ds]) -> init_dict(Ds); init_dict([]) -> true. +-doc false. +help() -> + S = ~""" + ** shell internal commands ** + b() -- display all variable bindings + e(N) -- repeat the expression in query + exit() -- terminate the shell instance + f() -- forget all variable bindings + f(X) -- forget the binding of variable X + ff() -- forget all locally defined functions + ff(F,A) -- forget locally defined function named as atom F and arity A + fl() -- forget all locally defined functions, types and records + h() -- history + h(Mod) -- help about module + h(Mod,Func) -- help about function in module + h(Mod,Func,Arity) -- help about function with arity in module + lf() -- list locally defined functions + lr() -- list locally defined records + lt() -- list locally defined types + rd(R,D) -- define a record + rf() -- remove all record information + rf(R) -- remove record information about R + rl() -- display all record information + rl(R) -- display record information about R + rp(Term) -- display Term using the shell's record information + rr(File) -- read record information from File (wildcards allowed) + rr(F,R) -- read selected record information from file(s) + rr(F,R,O) -- read selected record information with options + tf() -- forget all locally defined types + tf(T) -- forget locally defined type named as atom T + v(N) -- use the value of query + catch_exception(B) -- how exceptions are handled + history(N) -- set how many previous commands to keep + results(N) -- set how many previous command results to keep + save_module(FilePath) -- save all locally defined functions, types and records to a file + """, + io:put_chars(S), + io:nl(), + true. + + %% local_func(Function, Args, Bindings, Shell, RecordTable, %% LocalFuncHandler, ExternalFuncHandler) -> {value,Val,Bs} %% Evaluate local functions, including shell commands. @@ -1979,7 +2059,7 @@ multiline_prompt_func(PromptFunc) -> Can be used to set the formatting of the Erlang shell output. This has an effect on commands that have been submitted, and how it is saved in history. -Or if the formatting hotkey is pressed while editing an expression (Alt-r by default). You +Or if the formatting hotkey is pressed while editing an expression (Alt+R by default). You can specify a `Mod:Func/1` that expects the whole expression as a string and returns a formatted expressions as a string. See [`stdlib app config`](stdlib_app.md#format_shell_func) for how to set it before @@ -2018,7 +2098,7 @@ expressions submitted to the shell prettier. String2 :: string(). erl_pp_format_func(String) -> %% A simple pretty printer function of shell expressions. - %% + %% %% Comments will be filtered. %% If you add return_comments to the option list, %% parsing will fail, and we will end up with the original string. diff --git a/lib/stdlib/src/shell_default.erl b/lib/stdlib/src/shell_default.erl index bbb1e2e254a6..2baddfa45c80 100644 --- a/lib/stdlib/src/shell_default.erl +++ b/lib/stdlib/src/shell_default.erl @@ -72,50 +72,10 @@ code:load_abs("$PATH/user_default"). -export(['$handle_undefined_function'/2]). -import(io, [format/1]). --doc "Print the help for all shell internal commands.". +-doc "Print the help for all shell commands.". -spec help() -> true. help() -> - S = ~""" - ** shell internal commands ** - b() -- display all variable bindings - e(N) -- repeat the expression in query - f() -- forget all variable bindings - f(X) -- forget the binding of variable X - h() -- history - h(Mod) -- help about module - h(Mod,Func)-- help about function in module - h(Mod,Func,Arity) -- help about function with arity in module - ht(Mod) -- help about a module's types - ht(Mod,Type) -- help about type in module - ht(Mod,Type,Arity) -- help about type with arity in module - hcb(Mod) -- help about a module's callbacks - hcb(Mod,CB) -- help about callback in module - hcb(Mod,CB,Arity) -- help about callback with arity in module - history(N) -- set how many previous commands to keep - results(N) -- set how many previous command results to keep - catch_exception(B) -- how exceptions are handled - v(N) -- use the value of query - rd(R,D) -- define a record - rf() -- remove all record information - rf(R) -- remove record information about R - rl() -- display all record information - rl(R) -- display record information about R - rp(Term) -- display Term using the shell's record information - rr(File) -- read record information from File (wildcards allowed) - rr(F,R) -- read selected record information from file(s) - rr(F,R,O) -- read selected record information with options - lf() -- list locally defined functions - lt() -- list locally defined types - lr() -- list locally defined records - ff() -- forget all locally defined functions - ff({F,A}) -- forget locally defined function named as atom F and arity A - tf() -- forget all locally defined types - tf(T) -- forget locally defined type named as atom T - fl() -- forget all locally defined functions, types and records - save_module(FilePath) -- save all locally defined functions, types and records to a file - """, - io:put_chars(S), - io:nl(), + shell:help(), c:help(), format(~"** commands in module i (interpreter interface) **\n"), format(~"ih() -- print help for the i module\n"), diff --git a/lib/stdlib/src/shell_docs.erl b/lib/stdlib/src/shell_docs.erl index dd9b3680eec1..3fd2c1f96af6 100644 --- a/lib/stdlib/src/shell_docs.erl +++ b/lib/stdlib/src/shell_docs.erl @@ -117,7 +117,9 @@ The configuration of how the documentation should be rendered. - **columns** - Configure how wide the target documentation should be rendered. By default `shell_docs` used the value returned by - [`io:columns()`](`io:columns/0`). + [`io:columns()`](`io:columns/0`). It is possible to override this default + by setting the stdlib configuration parameter `shell_docs_columns` + to a `t:pos_integer/0` value. """. -doc #{ since => ~"OTP 23.2" }. -type config() :: #{ encoding => unicode | latin1, @@ -593,10 +595,9 @@ extract_type_specs(Module) -> maybe Path = find_path(Module), true ?= non_existing =/= Path, - {ok, {_ModName, - [{debug_info, - {debug_info_v1,erl_abstract_code, - {AST, _Opts}}}]}} ?= beam_lib:chunks(Path, [debug_info]), + {ok, {Module, + [{abstract_code, + {raw_abstract_v1,AST}}]}} ?= beam_lib:chunks(Path, [abstract_code]), %% the mapping keys 'type', 'function', and 'callback' correspond %% to existing EEP-48 {**Kind**, Name, Arity} format, where Kind @@ -606,6 +607,7 @@ extract_type_specs(Module) -> lists:foldl(fun filter_exported_types/2, Acc, AST) else false -> #{}; % when non_existing =/= Path, + {ok, {Module, [{abstract_code, no_abstract_code}]}} -> #{}; % from beam_lib:chunks/1 {error,beam_lib,{file_error,_,_}} -> #{} % from beam_lib:chunks/1 end. @@ -961,12 +963,7 @@ init_config(D, Config) when is_map(Config) -> Columns = case maps:find(columns, Config) of error -> - case io:columns() of - {ok, C} -> - C; - _ -> - 80 - end; + get_columns(); {ok, C} -> C end, @@ -979,6 +976,19 @@ init_config(D, Config) when is_map(Config) -> init_config(D, Config) -> Config#config{ docs = D }. +get_columns() -> + case application:get_env(stdlib, shell_docs_columns) of + {ok, C} when is_integer(C), C > 0 -> + C; + _ -> + case io:columns() of + {ok, C} -> + C; + _ -> + 80 + end + end. + render_docs(Elems,State,Pos,Ind,D) when is_list(Elems) -> lists:mapfoldl(fun(Elem,P) -> render_docs(Elem,State,P,Ind,D) diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl index 248441a73475..64517e0454a8 100644 --- a/lib/stdlib/src/supervisor.erl +++ b/lib/stdlib/src/supervisor.erl @@ -283,9 +283,9 @@ but the map is preferred. -export([start_link/2, start_link/3, start_child/2, restart_child/2, delete_child/2, terminate_child/2, - which_children/1, count_children/1, - check_childspecs/1, check_childspecs/2, - get_childspec/2]). + which_children/1, which_child/2, + count_children/1, check_childspecs/1, + check_childspecs/2, get_childspec/2]). %% Internal exports -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -456,12 +456,15 @@ see more details [above](`m:supervisor#sup_flags`). intensity = 1 :: non_neg_integer(), period = 5 :: pos_integer(), restarts = [], + nrestarts = 0, dynamic_restarts = 0 :: non_neg_integer(), auto_shutdown = never :: auto_shutdown(), module, args}). -type state() :: #state{}. +-define(DIRTY_RESTART_LIMIT, 1000). + -define(is_simple(State), State#state.strategy =:= simple_one_for_one). -define(is_temporary(_Child_), _Child_#child.restart_type=:=temporary). -define(is_transient(_Child_), _Child_#child.restart_type=:=transient). @@ -760,6 +763,25 @@ The following information is given for each child specification/process: which_children(Supervisor) -> call(Supervisor, which_children). +-doc """ +Returns information about the child specification and child process identified +by the given `Id`. + +See `which_children/1` for an explanation of the information returned. + +If no child with the given `Id` exists, returns `{error, not_found}`. +""". +-spec which_child(SupRef, Id) -> Result when + SupRef :: sup_ref(), + Id :: pid() | child_id(), + Result :: {'ok', {Id, Child, Type, Modules}} | {'error', Error}, + Child :: child() | 'restarting', + Type :: worker(), + Modules :: modules(), + Error :: 'not_found'. +which_child(Supervisor, Id) -> + call(Supervisor, {which_child, Id}). + -doc """ Returns a [property list](`t:proplists:proplist/0`) containing the counts for each of the following elements of the supervisor's child specifications and managed @@ -1088,6 +1110,37 @@ handle_call(which_children, _From, State) -> State#state.children), {reply, Resp, State}; +%% which_child for simple_one_for_one can only be done with pid +handle_call({which_child, Id}, _From, State) when not is_pid(Id), + ?is_simple(State) -> + {reply, {error, simple_one_for_one}, State}; + +handle_call({which_child, Pid}, _From, State) when ?is_simple(State) -> + Result = case find_dynamic_child(Pid, State) of + {ok, #child{pid = ?restarting(_), + child_type = CT, modules = Mods}} -> + {ok, {undefined, restarting, CT, Mods}}; + {ok, #child{pid = Pid, + child_type = CT, modules = Mods}} -> + {ok, {undefined, Pid, CT, Mods}}; + error -> + {error, not_found} + end, + {reply, Result, State}; + +handle_call({which_child, Id}, _From, State) -> + Result = case find_child(Id, State) of + {ok, #child{pid = ?restarting(_), + child_type = CT, modules = Mods}} -> + {ok, {Id, restarting, CT, Mods}}; + {ok, #child{pid = Pid, + child_type = CT, modules = Mods}} -> + {ok, {Id, Pid, CT, Mods}}; + error -> + {error, not_found} + end, + {reply, Result, State}; + handle_call(count_children, _From, #state{dynamic_restarts = Restarts} = State) when ?is_simple(State) -> #child{child_type = CT} = get_dynamic_child(State), @@ -2089,27 +2142,39 @@ child_to_spec(#child{id = Id, %%% Returns: {ok, State'} | {terminate, State'} %%% ------------------------------------------------------ -add_restart(State) -> - I = State#state.intensity, - P = State#state.period, - R = State#state.restarts, - Now = erlang:monotonic_time(1), - R1 = add_restart(R, Now, P), - State1 = State#state{restarts = R1}, - case length(R1) of - CurI when CurI =< I -> - {ok, State1}; - _ -> - {terminate, State1} +%% shortcut: if the intensity limit is 0, no restarts are allowed; +%% it is safe to disallow the restart flat out +add_restart(State=#state{intensity=0}) -> + {terminate, State}; +%% shortcut: if the number of restarts is below the intensity +%% limit, it is safe to allow the restart, add the restart to +%% the list and not care about expired restarts; to prevent +%% accumulating a large list of expired restarts over time, +%% this shortcut is limited to ?DIRTY_RESTART_LIMIT restarts +add_restart(State=#state{intensity=I, restarts=R, nrestarts=NR}) + when NR < min(I, ?DIRTY_RESTART_LIMIT) -> + {ok, State#state{restarts=[erlang:monotonic_time(second)|R], nrestarts=NR + 1}}; +%% calculate the real number of restarts within the period +%% and remove expired restarts; based on the calculated number +%% of restarts, allow or disallow the restart +add_restart(State=#state{intensity=I, period=P, restarts=R}) -> + Now = erlang:monotonic_time(second), + Treshold = Now - P, + case can_restart(I - 1, Treshold, R, [], 0) of + {true, NR1, R1} -> + {ok, State#state{restarts = [Now|R1], nrestarts = NR1 + 1}}; + {false, NR1, R1} -> + {terminate, State#state{restarts = R1, nrestarts = NR1}} end. -add_restart(Restarts0, Now, Period) -> - Threshold = Now - Period, - Restarts1 = lists:takewhile( - fun (R) -> R >= Threshold end, - Restarts0 - ), - [Now | Restarts1]. +can_restart(_, _, [], Acc, NR) -> + {true, NR, lists:reverse(Acc)}; +can_restart(_, Treshold, [Restart|_], Acc, NR) when Restart < Treshold -> + {true, NR, lists:reverse(Acc)}; +can_restart(0, _, [_|_], Acc, NR) -> + {false, NR, lists:reverse(Acc)}; +can_restart(N, Treshold, [Restart|Restarts], Acc, NR) -> + can_restart(N - 1, Treshold, Restarts, [Restart|Acc], NR + 1). %%% ------------------------------------------------------ %%% Error and progress reporting. diff --git a/lib/stdlib/test/Makefile b/lib/stdlib/test/Makefile index 55d9acbdb7e3..779ccad43726 100644 --- a/lib/stdlib/test/Makefile +++ b/lib/stdlib/test/Makefile @@ -16,6 +16,7 @@ MODULES= \ binref \ c_SUITE \ calendar_SUITE \ + calendar_prop_SUITE \ dets_SUITE \ dict_SUITE \ dict_test_lib \ @@ -163,7 +164,7 @@ docs: # ---------------------------------------------------- # Release Target -# ---------------------------------------------------- +# ---------------------------------------------------- include $(ERL_TOP)/make/otp_release_targets.mk release_spec: opt diff --git a/lib/stdlib/test/argparse_SUITE.erl b/lib/stdlib/test/argparse_SUITE.erl index f0cd7c39f716..e23eb72f041b 100644 --- a/lib/stdlib/test/argparse_SUITE.erl +++ b/lib/stdlib/test/argparse_SUITE.erl @@ -23,6 +23,7 @@ -export([ readme/0, readme/1, basic/0, basic/1, + binary_args/0, binary_args/1, long_form_eq/0, long_form_eq/1, built_in_types/0, built_in_types/1, type_validators/0, type_validators/1, @@ -43,6 +44,7 @@ proxy_arguments/0, proxy_arguments/1, usage/0, usage/1, + usage_help_binary/0, usage_help_binary/1, usage_required_args/0, usage_required_args/1, usage_template/0, usage_template/1, usage_args_ordering/0, usage_args_ordering/1, @@ -54,6 +56,7 @@ validator_exception_format/0, validator_exception_format/1, run_handle/0, run_handle/1, + run_handle_binary_args/0, run_handle_binary_args/1, run_args_ordering/0, run_args_ordering/1 ]). @@ -65,21 +68,21 @@ suite() -> groups() -> [ {parser, [parallel], [ - readme, basic, long_form_eq, built_in_types, type_validators, + readme, basic, binary_args, long_form_eq, built_in_types, type_validators, invalid_arguments, complex_command, unicode, parser_error, nargs, argparse, negative, nodigits, pos_mixed_with_opt, default_for_not_required, global_default, subcommand, very_short, multi_short, proxy_arguments ]}, {usage, [parallel], [ - usage, usage_required_args, usage_template, usage_args_ordering, + usage, usage_help_binary, usage_required_args, usage_template, usage_args_ordering, parser_error_usage, command_usage, usage_width ]}, {validator, [parallel], [ validator_exception, validator_exception_format ]}, {run, [parallel], [ - run_handle, run_args_ordering + run_handle, run_handle_binary_args, run_args_ordering ]} ]. @@ -227,6 +230,15 @@ basic(Config) when is_list(Config) -> ?assertEqual({ok, #{arg => [true, false]}, [Prog], ArgListCmd}, parse(["true false"], ArgListCmd)). +binary_args() -> + [{doc, "Args are provided as binarys"}]. + +binary_args(Config) when is_list(Config) -> + %% no command, just argument list + KernelCmd = #{arguments => [#{name => kernel, long => "kernel", type => atom, nargs => 2}]}, + ?assertEqual({ok, #{kernel => [port, dist]}, [prog()], KernelCmd}, + argparse:parse([<<"-kernel">>, <<"port">>, <<"dist">>], KernelCmd)). + long_form_eq() -> [{doc, "Tests that long form supports --arg=value"}]. @@ -815,6 +827,33 @@ usage(Config) when is_list(Config) -> #{progname => "erl", command => ["status", "crawler"]}))), ok. +usage_help_binary() -> + [{doc, "Test binary command help string"}]. + +usage_help_binary(Config) when is_list(Config) -> + Cmd2 = #{arguments => [#{ + name => shard, + type => integer, + default => 0, + help => <<"help binary for shard">>}], + commands => #{"somecommand" => #{ help => <<"help binary for somecommand">> }}, + help => "help binary for command" + }, + + Expected = "Usage:\n" + " erl {somecommand} \n" + "\n" + "help binary for command\n" + "\n" + "Subcommands:\n" + " somecommand help binary for somecommand\n" + "\n" + "Arguments:\n" + " shard help binary for shard (int), default: 0\n", + + ?assertEqual(Expected, + unicode:characters_to_list(argparse:help(Cmd2, #{ progname => erl }))). + usage_required_args() -> [{doc, "Verify that required args are printed as required in usage"}]. @@ -1100,6 +1139,16 @@ run_handle(Config) when is_list(Config) -> arguments => [#{name => arg}]}}}, #{})). +run_handle_binary_args() -> + [{doc, "Verify that argparse:run/3, accepts binary args"}]. + +run_handle_binary_args(Config) when is_list(Config) -> + %% no subcommand, positional module-based function + ?assertEqual(6, + argparse:run([<<"2">>, <<"3">>], #{handler => {erlang, '*', undefined}, + arguments => [#{name => l, type => integer}, #{name => r, type => integer}]}, + #{})). + run_args_ordering() -> [{doc, "Test that positional arguments are parsed in the correct order"}]. diff --git a/lib/stdlib/test/beam_lib_SUITE.erl b/lib/stdlib/test/beam_lib_SUITE.erl index c8c1a6548465..9a568f595fa5 100644 --- a/lib/stdlib/test/beam_lib_SUITE.erl +++ b/lib/stdlib/test/beam_lib_SUITE.erl @@ -36,7 +36,8 @@ init_per_group/2,end_per_group/2, normal/1, error/1, cmp/1, cmp_literals/1, strip/1, strip_add_chunks/1, otp_6711/1, building/1, md5/1, encrypted_abstr/1, encrypted_abstr_file/1, - missing_debug_info_backend/1]). + missing_debug_info_backend/1, literals/1 + ]). -export([test_makedep_abstract_code/1]). -export([init_per_testcase/2, end_per_testcase/2]). @@ -48,7 +49,8 @@ suite() -> all() -> [error, normal, cmp, cmp_literals, strip, strip_add_chunks, otp_6711, building, md5, encrypted_abstr, encrypted_abstr_file, - missing_debug_info_backend, test_makedep_abstract_code + missing_debug_info_backend, test_makedep_abstract_code, + literals ]. groups() -> @@ -94,6 +96,7 @@ normal(Conf) when is_list(Conf) -> P0 = pps(), do_normal(Source, PrivDir, BeamFile, []), + do_normal(Source, PrivDir, BeamFile, [r27]), {ok,_} = compile:file(Source, [{outdir,PrivDir}, no_debug_info]), {ok, {simple, [{debug_info, {debug_info_v1, erl_abstract_code, {none, _}}}]}} = @@ -118,7 +121,7 @@ do_normal(Source, PrivDir, BeamFile, Opts) -> do_normal(BeamFile, Opts), do_normal(Binary, Opts). -do_normal(BeamFile, Opts) -> +do_normal(BeamFile, _Opts) -> Imports = {imports, [{erlang, get_module_info, 1}, {erlang, get_module_info, 2}, {lists, member, 2}]}, @@ -151,10 +154,8 @@ do_normal(BeamFile, Opts) -> %% Test reading optional chunks. All = ["Atom", "Code", "StrT", "ImpT", "ExpT", "FunT", "LitT", "AtU8"], {ok,{simple,Chunks}} = beam_lib:chunks(BeamFile, All, [allow_missing_chunks]), - case {verify_simple(Chunks),Opts} of - {{missing_chunk, AtomBin}, []} when is_binary(AtomBin) -> ok; - {{AtomBin, missing_chunk}, [no_utf8_atoms]} when is_binary(AtomBin) -> ok - end, + {missing_chunk, AtomBin} = verify_simple(Chunks), + true = is_binary(AtomBin), %% 'allow_missing_chunks' should work for named chunks too. {ok, {simple, StrippedBeam}} = beam_lib:strip(BeamFile), @@ -654,7 +655,7 @@ encrypted_abstr_1(Conf) -> do_encrypted_abstr(BeamFile, Key), do_encrypted_abstr(Binary, Key), - ok = crypto:stop(), %To get rid of extra ets tables. + ok = application:stop(crypto), %To get rid of extra ets tables. file:delete(BeamFile), file:delete(Source), NoOfTables = erlang:system_info(ets_count), @@ -780,7 +781,7 @@ encrypted_abstr_file_1(Conf) -> do_encrypted_abstr_file(Binary, Key), ok = file:set_cwd(OldCwd), - ok = crypto:stop(), %To get rid of extra ets tables. + ok = application:stop(crypto), %To get rid of extra ets tables. file:delete(filename:join(PrivDir, ".erlang.crypt")), file:delete(BeamFile), file:delete(Source), @@ -875,6 +876,29 @@ missing_debug_info_backend(Conf) -> ok. +literals(Conf) -> + do_literals(Conf, []), + do_literals(Conf, [r27]), + + ok. + +do_literals(Conf, Options) -> + PrivDir = ?privdir, + Simple = filename:join(PrivDir, "simple"), + Source = Simple ++ ".erl", + BeamFile = Simple ++ ".beam", + simple_file(Source, simple, literals), + + {ok,simple} = compile:file(Source, [{outdir,PrivDir},report|Options]), + + {ok, {simple, [{literals,[{0,{literal,tuple}}]}]}} = + beam_lib:chunks(BeamFile, [literals]), + + ok = file:delete(Source), + ok = file:delete(BeamFile), + + ok. + compare_chunks(File1, File2, ChunkIds) -> {ok, {_, Chunks1}} = beam_lib:chunks(File1, ChunkIds), {ok, {_, Chunks2}} = beam_lib:chunks(File2, ChunkIds), @@ -980,6 +1004,12 @@ simple_file(File, Module, lines) -> "t(A) ->\n" " A+1.\n"]), ok = file:write_file(File, B); +simple_file(File, Module, literals) -> + B = list_to_binary(["-module(", atom_to_list(Module), "). " + "-export([t/0]). " + "t() -> " + " {literal, tuple}. "]), + ok = file:write_file(File, B); simple_file(File, Module, F) -> B = list_to_binary(["-module(", atom_to_list(Module), "). " "-export([t/0]). " @@ -991,7 +1021,7 @@ simple_file(File, Module, F) -> ok = file:write_file(File, B). run_if_crypto_works(Test) -> - try begin crypto:start(), crypto:stop(), ok end of + try begin application:start(crypto), application:stop(crypto), ok end of ok -> Test() catch diff --git a/lib/stdlib/test/binary_module_SUITE.erl b/lib/stdlib/test/binary_module_SUITE.erl index 27eb7de92cf2..3d9efd919e55 100644 --- a/lib/stdlib/test/binary_module_SUITE.erl +++ b/lib/stdlib/test/binary_module_SUITE.erl @@ -23,7 +23,7 @@ interesting/1,scope_return/1,random_ref_comp/1,random_ref_sr_comp/1, random_ref_fla_comp/1,parts/1, bin_to_list/1, list_to_bin/1, copy/1, referenced/1,guard/1,encode_decode/1,badargs/1,longest_common_trap/1, - check_no_invalid_read_bug/1,error_info/1, hex_encoding/1]). + check_no_invalid_read_bug/1,error_info/1, hex_encoding/1, join/1]). -export([random_number/1, make_unaligned/1]). @@ -38,7 +38,7 @@ all() -> random_ref_comp, parts, bin_to_list, list_to_bin, copy, referenced, guard, encode_decode, badargs, longest_common_trap, check_no_invalid_read_bug, - error_info, hex_encoding]. + error_info, hex_encoding, join]. -define(MASK_ERROR(EXPR),mask_error((catch (EXPR)))). @@ -260,6 +260,13 @@ badargs(Config) when is_list(Config) -> badarg = ?MASK_ERROR(binary:encode_hex([])), badarg = ?MASK_ERROR(binary:encode_hex(#{})), badarg = ?MASK_ERROR(binary:encode_hex(foo)), + + badarg = ?MASK_ERROR(binary:join(<<"">>, ",")), + badarg = ?MASK_ERROR(binary:join([""], <<",">>)), + badarg = ?MASK_ERROR(binary:join([123], <<",">>)), + badarg = ?MASK_ERROR(binary:join(123, <<",">>)), + badarg = ?MASK_ERROR(binary:join(#{}, <<",">>)), + badarg = ?MASK_ERROR(binary:join(foo, <<",">>)), ok. %% Whitebox test to force special trap conditions in @@ -1454,6 +1461,12 @@ error_info(_Config) -> {last,[<<1:1>>]}, {last,[<<>>]}, + {join,[no_list,<<>>]}, + {join,[[a|b],<<>>]}, + {join,[[a],<<>>]}, + {join,[[],<<1:7>>]}, + {join,[[],bad_separator]}, + {list_to_bin,[<<1,2,3>>]}, {list_to_bin,[{1,2,3}]}, @@ -1581,6 +1594,11 @@ do_hex_roundtrip(Bytes) -> ok end. +join(Config) when is_list(Config) -> + ~"a, b, c" = binary:join([~"a", ~"b", ~"c"], ~", "), + ~"a" = binary:join([~"a"], ~", "), + ~"" = binary:join([], ~", "). + %%% %%% Utilities. %%% diff --git a/lib/stdlib/test/calendar_prop_SUITE.erl b/lib/stdlib/test/calendar_prop_SUITE.erl new file mode 100644 index 000000000000..e4f6c00926ee --- /dev/null +++ b/lib/stdlib/test/calendar_prop_SUITE.erl @@ -0,0 +1,50 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(calendar_prop_SUITE). + +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, + init_per_group/2, end_per_group/2, + rfc3339_lists_binaries/1]). + +suite() -> + [{ct_hooks,[ts_install_cth]}]. + +all() -> + [rfc3339_lists_binaries]. + +groups() -> + []. + +init_per_suite(Config) -> + ct_property_test:init_per_suite(Config). + +end_per_suite(_Config) -> + ok. + +init_per_group(_GroupName, Config) -> + Config. + +end_per_group(_GroupName, Config) -> + Config. + +rfc3339_lists_binaries(Config) when is_list(Config) -> + ct_property_test:quickcheck( + calendar_prop:rfc3339_lists_binaries(), + Config). diff --git a/lib/stdlib/test/erl_anno_SUITE.erl b/lib/stdlib/test/erl_anno_SUITE.erl index 71ea9c3e1e0e..bc95ee6582a5 100644 --- a/lib/stdlib/test/erl_anno_SUITE.erl +++ b/lib/stdlib/test/erl_anno_SUITE.erl @@ -131,6 +131,11 @@ end_location(_Config) -> test(1, [{text, "TEXT", [{end_location, 1}, {length, 4}]}, {text, "TEXT\n", [{end_location, 2}, {length, 5}]}, {text, "TEXT\ntxt", [{end_location, 2}, {length, 8}]}]), + test({1, 17}, [{end_location, {1, 21}, [{end_location, {1, 21}}]}, + {end_location, {2, 1}, [{end_location, {2, 1}}]}]), + test(1, [{end_location, 1, [{end_location, 1}]}, + {end_location, 2, [{end_location, 2}]}, + {end_location, {1, 2}, [{end_location, {1, 2}}]}]), ok. %% Test 'file'. @@ -396,6 +401,8 @@ anno_set(line, Value, Anno) -> erl_anno:set_line(Value, Anno); anno_set(location, Value, Anno) -> erl_anno:set_location(Value, Anno); +anno_set(end_location, Value, Anno) -> + erl_anno:set_end_location(Value, Anno); anno_set(record, Value, Anno) -> erl_anno:set_record(Value, Anno); anno_set(text, Value, Anno) -> @@ -463,6 +470,23 @@ primary_value(line, State) -> Line -> Line end}; +primary_value(end_location, State) -> + case lists:keyfind(end_location, 1, State) of + false -> + case lists:keyfind(text, 1, State) of + false -> + undefined; + {text, Text} -> + case lists:keyfind(location, 1, State) of + false -> + undefined; + {location, Location} -> + {end_location, erl_anno:end_location(erl_anno:set_text(Text, erl_anno:new(Location)))} + end + end; + Tuple -> + Tuple + end; primary_value(Item, State) -> case lists:keyfind(Item, 1, State) of false -> @@ -475,7 +499,7 @@ default() -> [{Tag, default_value(Tag)} || Tag <- default_items()]. primary_items() -> - [file, generated, line, location, record, text]. + [file, generated, line, location, end_location, record, text]. secondary_items() -> %% 'length' has not been implemented diff --git a/lib/stdlib/test/erl_eval_SUITE.erl b/lib/stdlib/test/erl_eval_SUITE.erl index e1486dba246b..674204ff7c62 100644 --- a/lib/stdlib/test/erl_eval_SUITE.erl +++ b/lib/stdlib/test/erl_eval_SUITE.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 1998-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,11 +14,11 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% -module(erl_eval_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_testcase/2, end_per_testcase/2, init_per_group/2,end_per_group/2]). @@ -29,6 +29,9 @@ pattern_expr/1, guard_3/1, guard_4/1, guard_5/1, lc/1, + zlc/1, + zbc/1, + zmc/1, simple_cases/1, unary_plus/1, apply_atom/1, @@ -57,6 +60,7 @@ eep49/1, binary_and_map_aliases/1, eep58/1, + strict_generators/1, binary_skip/1]). %% @@ -66,7 +70,7 @@ -import(lists,[concat/1, sort/1]). --export([count_down/2, count_down_fun/0, do_apply/2, +-export([count_down/2, count_down_fun/0, do_apply/2, local_func/3, local_func_value/2]). -export([simple/0]). -export([my_div/2]). @@ -91,7 +95,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,1}}]. -all() -> +all() -> [guard_1, guard_2, match_pattern, string_plusplus, pattern_expr, match_bin, guard_3, guard_4, guard_5, lc, simple_cases, unary_plus, apply_atom, otp_5269, @@ -99,9 +103,10 @@ all() -> otp_8133, otp_10622, otp_13228, otp_14826, funs, custom_stacktrace, try_catch, eval_expr_5, zero_width, eep37, eep43, otp_15035, otp_16439, otp_14708, otp_16545, otp_16865, - eep49, binary_and_map_aliases, eep58, binary_skip]. + eep49, binary_and_map_aliases, eep58, strict_generators, binary_skip, + zlc, zbc, zmc]. -groups() -> +groups() -> []. init_per_suite(Config) -> @@ -280,6 +285,161 @@ lc(Config) when is_list(Config) -> "[X || X <- [true,false], X].", [true]), ok. +%% EEP-73 zip generator. +zlc(Config) when is_list(Config) -> + check(fun() -> + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4,5,6]] + end, + "begin X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4,5,6]] end.", + [{1,4},{2,5},{3,6}]), + check(fun() -> + S1 = [x, y, z], S2 = [5, 10, 15], X = 32, Y = 32, + [{X, Y} || X <- S1 && Y <- S2] + end, + "begin + S1 = [x, y, z], S2 = [5, 10, 15], X = 32, Y = 32, + [{X, Y} || X <- S1 && Y <- S2] + end.", + [{x,5}, {y,10}, {z,15}]), + check(fun() -> + [{X, Y, K} || X <:- [1,2,3] && Y:=K <- #{1=>a, 2=>b, 3=>c}] + end, + "begin [{X, Y, K} || X <:- [1,2,3] && Y:=K <- #{1=>a, 2=>b, 3=>c}] end.", + [{1,1,a},{2,2,b},{3,3,c}]), + check(fun() -> + [{X, W+Y} || X <- [a, b, c] && <> <= <<2, 4, 6>>, W <- [1,2]] + end, + "begin [{X, W+Y} || X <- [a, b, c] && <> <= <<2, 4, 6>>, W <- [1,2]] end.", + [{a,3}, {a,4}, {b,5}, {b,6}, {c,7}, {c,8}]), + check(fun() -> + [{X, W+Y} || W <- [0], X <- [a, b, c] && <> <:= <<2, 4, 6>>, Y<4] + end, + "begin [{X, W+Y} || W <- [0], X <- [a, b, c] && <> <:= <<2, 4, 6>>, Y<4] end.", + [{a,2}]), + check(fun() -> + [{X,Y}|| a=b=X <- [1,2] && Y <-[1,2]] end, + "begin [{X,Y}|| a=b=X <- [1,2] && Y <-[1,2]] end.", + []), + check(fun() -> + [{A,B,W} || {Same,W} <- [{a,1}], + {Same,A} <- [{a,1},{b,9},{x,10}] && {Same,B} <- [{a,7},{wrong,8},{x,20}]] + end, + "begin [{A,B,W} || {Same,W} <- [{a,1}], + {Same,A} <- [{a,1},{b,9},{x,10}] && {Same,B} <- [{a,7},{wrong,8},{x,20}]] + end.", + [{1,7,1},{10,20,1}]), + error_check("[X || X <- a && Y <- [1]].",{bad_generators,{a,[1]}}), + error_check("[{X,Y} || X <- a && <> <= <<1,2>>].",{bad_generators,{a,<<1,2>>}}), + error_check("[{X,V} || X <- a && _K := V <- #{b=>3}].",{bad_generators,{a,#{b=>3}}}), + error_check("begin + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y <- [4]] end.", + {bad_generators,{[2,3],[]}}), + error_check("begin + X = 32, Y = 32, [{X, Y} || X <- [1,2,3] && Y:=_V <- #{1=>1}] end.", + {bad_generators,{[2,3],#{}}}), + ok. + +zbc(Config) when is_list(Config) -> + check(fun() -> + <<3, 4, 5>> + end, + "begin + X = 32, Y = 32, + << <<(X+Y)/integer>> || <> <= <<1,2,3>> && <> <= <<2,2,2>> >> + end.", + <<3, 4, 5>>), + check(fun() -> + <<4,5,6,5,6,7,6,7,8>> + end, + "begin + X = 32, Y = 32, Z = 32, + << <<(X+Y+Z)/integer>> || <> <= <<1,2,3>> && <> <= <<2,2,2>>, Z<-[1,2,3] >> + end.", + <<4,5,6,5,6,7,6,7,8>>), + check(fun() -> + <<4, 5, 6>> + end, + "begin + L1 = <<1, 2, 3>>, L2 = <<1, 1, 1>>, L3 = <<2, 2, 2>>, + << <<(X+Y+Z)/integer>> || <> <= L1 && <> <= L2 && <> <= L3 >> + end.", + <<4, 5, 6>>), + check(fun() -> + << <<(X+Y):64>>|| a=b=X <- [1,2] && Y <- [1,2] >> end, + "begin << <<(X+Y):64>>|| a=b=X <- [1,2] && Y <- [1,2] >> end.", + <<>>), + check(fun() -> + << <<(X+Y):64>>|| a=b=X <- [1,2] && <> <= <<1,2>> >> end, + "begin << <<(X+Y):64>>|| a=b=X <- [1,2] && <> <= <<1,2>> >> end.", + <<>>), + check(fun() -> + << <<(X+V):64>>|| a=b=X <- [1,2] && _K:=V <- #{a=>1,b=>2}>> end, + "begin << <<(X+V):64>>|| a=b=X <- [1,2] && _K:=V <- #{a=>1,b=>2}>> end.", + <<>>), + error_check("begin << <<(X+Y):8>> || <> <= <<1,2>> && <> <= <<1,2>> >> end.", + {bad_generators,{<<>>,<<1,2>>}}), + error_check("begin << <> || <> <= a && Y <- [1]>> end.",{bad_generators,{a,[1]}}), + error_check("begin + X = 32, Y = 32, + << <<(X+Y)/integer>> || X <- [1,2] && Y <- [1,2,3,4]>> + end.", + {bad_generators,{[],[3,4]}}), + error_check("begin << <> || X <- [1] && Y <- a && <> <= <<2>> >> end.", + {bad_generators,{[1], a, <<2>>}}), + ok. + +zmc(Config) when is_list(Config) -> + check(fun() -> + [{a,b,1,3}] + end, + "begin + M1 = #{a=>1}, M2 = #{b=>3}, + [{K1, K2, V1, V2} || K1 := V1 <- M1 && K2 := V2 <- M2] + end.", + [{a,b,1,3}]), + check(fun() -> + [A * 4 || A <- lists:seq(1, 50)] + end, + "begin + Seq = lists:seq(1, 50), + M1 = maps:iterator(#{X=>X || X <- Seq}, ordered), + M2 = maps:iterator(#{X=>X || X <- lists:seq(1,50)}, ordered), + [X+Y+Z+W || X := Y <- M1 && Z := W <- M2] + end.", + [A * 4 || A <- lists:seq(1, 50)]), + check(fun() -> + [{A, A*3, A*2, A*4} || A <- lists:seq(1, 50)] + end, + "begin + Seq = lists:seq(1, 50), + M3 = maps:iterator(#{X=>X*3 || X <- Seq}, ordered), + M4 = maps:iterator(#{X*2=>X*4 || X <- Seq}, ordered), + [{X, Y, Z, W} || X := Y <- M3 && Z := W <- M4] + end.", + [{A, A*3, A*2, A*4} || A <- lists:seq(1, 50)]), + check(fun() -> + #{K1 => V1+V2 || K1:=V1 <:- #{a=>1} && _K2:=V2 <- #{b=>3}} + end, + "begin + #{K1 => V1+V2 || K1:=V1 <- #{a=>1} && _K2:=V2 <- #{b=>3}} + end.", + #{a=>4}), + check(fun() -> + #{K=>V || a := b <- #{x => y} && K := V <- #{x => y}} + end, + "begin + #{K=>V || a := b <- #{x => y} && K := V <- #{x => y}} + end.", + #{}), + error_check("begin + #{K1 => V1+V2 || K1:=V1 <- #{a=>1} && + _K2:=V2 <- maps:iterator(#{b=>3,c=>4}, ordered)} + end.", + {bad_generators,{#{},#{c=>4}}}), + error_check("begin #{X=>Y || X <- [1] && Y <- a && K1:=V1 <- #{b=>3}} end.", + {bad_generators,{[1], a, #{b=>3}}}), + ok. + %% Simple cases, just to cover some code. simple_cases(Config) when is_list(Config) -> check(fun() -> A = $C end, "A = $C.", $C), @@ -386,7 +546,7 @@ simple_cases(Config) when is_list(Config) -> (X) when X == 2 -> zwei end, ett = F(1), zwei = F(2) end, "begin F = fun(X) when X == 1 -> ett; - (X) when X == 2 -> zwei end, + (X) when X == 2 -> zwei end, ett = F(1), zwei = F(2) end.", zwei), error_check("begin F = fun(1) -> ett end, zwei = F(2) end.", @@ -517,7 +677,7 @@ unary_plus(Config) when is_list(Config) -> %% OTP-5064. Can no longer apply atoms. apply_atom(Config) when is_list(Config) -> error_check("[X || X <- [[1],[2]], - begin L = length, L(X) =:= 1 end].", + begin L = length, L(X) =:= 1 end].", {badfun,length}), ok. @@ -527,7 +687,7 @@ otp_5269(Config) when is_list(Config) -> F = fun(<>) -> B end, F(<<16:8, 7:16>>) end, - "begin + "begin L = 8, F = fun(<>) -> B end, F(<<16:8, 7:16>>) end.", 7), @@ -535,7 +695,7 @@ otp_5269(Config) when is_list(Config) -> F = fun(<>) -> B end, F(<<16:8, 7:16>>) end, - "begin + "begin L = 8, F = fun(<>) -> B end, F(<<16:8, 7:16>>) end.", 7), @@ -544,7 +704,7 @@ otp_5269(Config) when is_list(Config) -> 7), error_check("begin L = 8, <> = <<16:8, 7:16>> end.", {badmatch,<<16:8,7:16>>}), - + error_check("begin <> = <<16:16,8:16>>, L end.", {badmatch, <<16:16,8:16>>}), check(fun() -> U = 8, (fun(<>) -> U end)(<<32:8>>) end, @@ -579,18 +739,18 @@ otp_5269(Config) when is_list(Config) -> %% OTP-6539. try/catch bugs. otp_6539(Config) when is_list(Config) -> check(fun() -> - F = fun(A,B) -> - try A+B - catch _:_ -> dontthinkso - end + F = fun(A,B) -> + try A+B + catch _:_ -> dontthinkso + end end, lists:zipwith(F, [1,2], [2,3]) end, - "begin - F = fun(A,B) -> - try A+B - catch _:_ -> dontthinkso - end + "begin + F = fun(A,B) -> + try A+B + catch _:_ -> dontthinkso + end end, lists:zipwith(F, [1,2], [2,3]) end.", @@ -615,10 +775,10 @@ otp_6543(Config) when is_list(Config) -> "<< <> || <> <= <<\"hej\">> >>.", <<1,2,2,0,1,2,1,1,1,2,2,2>>), check(fun() -> - << <> || + << <> || <<65,X:4>> <= <<65,7:4,65,3:4,66,8:4>> >> end, - "<< <> || + "<< <> || <<65,X:4>> <= <<65,7:4,65,3:4,66,8:4>> >>.", <<7,3>>), check(fun() -> <<34:18/big>> end, @@ -692,61 +852,61 @@ otp_6543(Config) when is_list(Config) -> 34), check(fun() -> <> = <<34:18/little-signed>>, X end, - "begin <> = <<34:18/little-signed>>, + "begin <> = <<34:18/little-signed>>, X end.", 34), check(fun() -> <> = <<34:18/native-signed>>, X end, - "begin <> = <<34:18/native-signed>>, + "begin <> = <<34:18/native-signed>>, X end.", 34), check(fun() -> <> = <<34:18/big-unsigned>>, X end, - "begin <> = <<34:18/big-unsigned>>, + "begin <> = <<34:18/big-unsigned>>, X end.", 34), check(fun() -> - <> = <<34:18/little-unsigned>>, + <> = <<34:18/little-unsigned>>, X end, - "begin <> = <<34:18/little-unsigned>>, + "begin <> = <<34:18/little-unsigned>>, X end.", 34), check(fun() -> - <> = <<34:18/native-unsigned>>, + <> = <<34:18/native-unsigned>>, X end, - "begin <> = <<34:18/native-unsigned>>, + "begin <> = <<34:18/native-unsigned>>, X end.", 34), check(fun() -> <> = <<2.0:32/float-big>>, X end, - "begin <> = <<2.0:32/float-big>>, + "begin <> = <<2.0:32/float-big>>, X end.", 2.0), check(fun() -> <> = <<2.0:32/float-little>>, X end, - "begin <> = <<2.0:32/float-little>>, + "begin <> = <<2.0:32/float-little>>, X end.", 2.0), check(fun() -> <> = <<2.0:32/float-native>>, X end, - "begin <> = <<2.0:32/float-native>>, + "begin <> = <<2.0:32/float-native>>, X end.", 2.0), check( - fun() -> + fun() -> [X || <<"hej",X:8>> <= <<"hej",8,"san",9,"hej",17,"hej">>] end, - "[X || <<\"hej\",X:8>> <= + "[X || <<\"hej\",X:8>> <= <<\"hej\",8,\"san\",9,\"hej\",17,\"hej\">>].", [8,17]), check( fun() -> L = 8, << <> || <> <= <<16:8, 7:16>> >> end, - "begin L = 8, << <> || <> <= <<16:8, 7:16>> >> + "begin L = 8, << <> || <> <= <<16:8, 7:16>> >> end.", <<0,0,0,7>>), - %% Test the Value part of a binary segment. + %% Test the Value part of a binary segment. %% "Old" bugs have been fixed (partial_eval is called on Value). check(fun() -> [ 3 || <<17/float>> <= <<17.0/float>>] end, "[ 3 || <<17/float>> <= <<17.0/float>>].", @@ -773,28 +933,28 @@ otp_6543(Config) when is_list(Config) -> check(fun() -> [ foo || <<(1 bsl 1024)/float>> <- [<<(1 bsl 1023)/float>>]] end, - "[ foo || <<(1 bsl 1024)/float>> <- + "[ foo || <<(1 bsl 1024)/float>> <- [<<(1 bsl 1023)/float>>]].", []), check(fun() -> [ foo || <<(1 bsl 1024)/float>> <= <<(1 bsl 1023)/float>>] end, - "[ foo || <<(1 bsl 1024)/float>> <= + "[ foo || <<(1 bsl 1024)/float>> <= <<(1 bsl 1023)/float>>].", []), check(fun() -> - L = 8, + L = 8, [{L,B} || <> <= <<32:8,7:32/float>>] end, - "begin L = 8, + "begin L = 8, [{L,B} || <> <= <<32:8,7:32/float>>] end.", [{32,7.0}]), check(fun() -> - L = 8, + L = 8, [{L,B} || <> <- [<<32:8,7:32/float>>]] end, - "begin L = 8, + "begin L = 8, [{L,B} || <> <- [<<32:8,7:32/float>>]] end.", [{32,7.0}]), @@ -910,47 +1070,47 @@ otp_7550(Config) when is_list(Config) -> otp_8133(Config) when is_list(Config) -> check( fun() -> - E = fun(N) -> - if - is_integer(N) -> <>; - true -> throw(foo) - end + E = fun(N) -> + if + is_integer(N) -> <>; + true -> throw(foo) + end end, - try << << (E(V))/binary >> || V <- [1,2,3,a] >> + try << << (E(V))/binary >> || V <- [1,2,3,a] >> catch foo -> ok end end, "begin - E = fun(N) -> - if is_integer(N) -> <>; - true -> throw(foo) - end + E = fun(N) -> + if is_integer(N) -> <>; + true -> throw(foo) + end end, - try << << (E(V))/binary >> || V <- [1,2,3,a] >> + try << << (E(V))/binary >> || V <- [1,2,3,a] >> catch foo -> ok end end.", ok), check( fun() -> - E = fun(N) -> - if - is_integer(N) -> <>; + E = fun(N) -> + if + is_integer(N) -> <>; - true -> erlang:error(foo) - end + true -> erlang:error(foo) + end end, - try << << (E(V))/binary >> || V <- [1,2,3,a] >> + try << << (E(V))/binary >> || V <- [1,2,3,a] >> catch error:foo -> ok end end, "begin - E = fun(N) -> - if is_integer(N) -> <>; - true -> erlang:error(foo) - end + E = fun(N) -> + if is_integer(N) -> <>; + true -> erlang:error(foo) + end end, - try << << (E(V))/binary >> || V <- [1,2,3,a] >> + try << << (E(V))/binary >> || V <- [1,2,3,a] >> catch error:foo -> ok end end.", @@ -1094,13 +1254,13 @@ otp_14826(_Config) -> ?MODULE]), backtrace_check("[A || A <- a].", {bad_generator, a}, - [{erl_eval,eval_generate,8}, {erl_eval, eval_lc, 7}]), + [{erl_eval,eval_generate,9}, {erl_eval, eval_lc, 7}]), backtrace_check("<< <> || <> <= a>>.", {bad_generator, a}, - [{erl_eval,eval_b_generate,8}, {erl_eval, eval_bc, 7}]), + [{erl_eval,eval_b_generate,9}, {erl_eval, eval_bc, 7}]), backtrace_check("[A || A <- [1], begin a end].", {bad_filter, a}, - [{erl_eval,eval_filter,7}, {erl_eval, eval_generate, 8}]), + [{erl_eval,eval_filter,7}, {erl_eval, eval_generate, 9}]), fun() -> {'EXIT', {{badarity, {_Fun, []}}, BT}} = (catch parse_and_run("fun(A) -> A end().")), @@ -1423,7 +1583,7 @@ many_args(N) -> [many_args1(I) || I <- lists:seq(1, N)]. many_args1(N) -> - F = fun(L, P) -> + F = fun(L, P) -> tl(lists:flatten([","++P++integer_to_list(E) || E <- L])) end, L = lists:seq(1, N), @@ -1441,16 +1601,16 @@ do_funs(LFH, EFH) -> M = atom_to_list(?MODULE), check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end, F1(F1, 1000) end, - concat(["begin F1 = fun(F,N) -> ", M, + concat(["begin F1 = fun(F,N) -> ", M, ":count_down(F, N) end, F1(F1,1000) end."]), 0, ['F1'], LFH, EFH), check(fun() -> F1 = fun(F,N) -> apply(?MODULE,count_down,[F,N]) end, F1(F1, 1000) end, - concat(["begin F1 = fun(F,N) -> apply(", M, + concat(["begin F1 = fun(F,N) -> apply(", M, ",count_down,[F, N]) end, F1(F1,1000) end."]), 0, ['F1'], LFH, EFH), check(fun() -> F = fun(F,N) when N > 0 -> apply(F,[F,N-1]); - (_F,0) -> ok end, + (_F,0) -> ok end, F(F, 1000) end, "begin F = fun(F,N) when N > 0 -> apply(F,[F,N-1]);" @@ -1459,7 +1619,7 @@ do_funs(LFH, EFH) -> ok, ['F'], LFH, EFH), check(fun() -> F = fun(F,N) when N > 0 -> apply(erlang,apply,[F,[F,N-1]]); - (_F,0) -> ok end, + (_F,0) -> ok end, F(F, 1000) end, "begin F = fun(F,N) when N > 0 ->" @@ -1478,7 +1638,7 @@ do_funs(LFH, EFH) -> check(fun() -> F = fun(X) -> A = 1+X, {X,A} end, true = {2,3} == F(2) end, - "begin F = fun(X) -> A = 1+X, {X,A} end, + "begin F = fun(X) -> A = 1+X, {X,A} end, true = {2,3} == F(2) end.", true, ['F'], LFH, EFH), check(fun() -> F = fun(X) -> erlang:'+'(X,2) end, true = 3 == F(1) end, @@ -1486,7 +1646,7 @@ do_funs(LFH, EFH) -> " true = 3 == F(1) end.", true, ['F'], LFH, EFH), check(fun() -> F = fun(X) -> byte_size(X) end, - ?MODULE:do_apply(F,<<"hej">>) end, + ?MODULE:do_apply(F,<<"hej">>) end, concat(["begin F = fun(X) -> size(X) end,", M,":do_apply(F,<<\"hej\">>) end."]), 3, ['F'], LFH, EFH), @@ -1495,22 +1655,22 @@ do_funs(LFH, EFH) -> Z = 5, F2 = fun(X, Y) -> F1(Z,{X,Y}) end, F3 = fun(X, Y) -> {a,F1(Z,{X,Y})} end, - {5,{x,y}} = F2(x,y), - {a,{5,{y,x}}} = F3(y,x), - {5,{5,y}} = F2(Z,y), + {5,{x,y}} = F2(x,y), + {a,{5,{y,x}}} = F3(y,x), + {5,{5,y}} = F2(Z,y), true = {5,{x,5}} == F2(x,Z) end, "begin F1 = fun(X, Z) -> {X,Z} end, Z = 5, F2 = fun(X, Y) -> F1(Z,{X,Y}) end, F3 = fun(X, Y) -> {a,F1(Z,{X,Y})} end, - {5,{x,y}} = F2(x,y), - {a,{5,{y,x}}} = F3(y,x), - {5,{5,y}} = F2(Z,y), + {5,{x,y}} = F2(x,y), + {a,{5,{y,x}}} = F3(y,x), + {5,{5,y}} = F2(Z,y), true = {5,{x,5}} == F2(x,Z) end.", true, ['F1','Z','F2','F3'], LFH, EFH), check(fun() -> F = fun(X) -> byte_size(X) end, F2 = fun(Y) -> F(Y) end, - ?MODULE:do_apply(F2,<<"hej">>) end, + ?MODULE:do_apply(F2,<<"hej">>) end, concat(["begin F = fun(X) -> size(X) end,", "F2 = fun(Y) -> F(Y) end,", M,":do_apply(F2,<<\"hej\">>) end."]), @@ -1525,11 +1685,11 @@ do_funs(LFH, EFH) -> {1,1} = F2(1), Z = 7, Z end, "begin F = fun(Z) -> Z end, F2 = fun(X) -> F(X), Z = {X,X}, Z end, - {1,1} = F2(1), Z = 7, Z end.", 7, ['F','F2','Z'], + {1,1} = F2(1), Z = 7, Z end.", 7, ['F','F2','Z'], LFH, EFH), check(fun() -> F = fun(F, N) -> [?MODULE:count_down(F,N) || X <-[1]] end, F(F,2) end, - concat(["begin F = fun(F, N) -> [", M, + concat(["begin F = fun(F, N) -> [", M, ":count_down(F,N) || X <-[1]] end, F(F,2) end."]), [[[0]]], ['F'], LFH, EFH), ok. @@ -1663,7 +1823,7 @@ try_catch(Config) when is_list(Config) -> {badmatch,2}), %% Uncaught exception with after check(fun () -> {'EXIT',{{badmatch,2},_}} = - begin catch try 1=2 + begin catch try 1=2 after put(try_catch, 3) end end, get(try_catch) end, "begin {'EXIT',{{badmatch,2},_}} = " @@ -2057,6 +2217,92 @@ eep58(Config) when is_list(Config) -> ok. +strict_generators(Config) when is_list(Config) -> + %% Basic scenario for each comprehension and generator type + check(fun() -> [X+1 || X <:- [1,2,3]] end, + "[X+1 || X <:- [1,2,3]].", + [2,3,4]), + check(fun() -> [X+1 || <> <:= <<1,2,3>>] end, + "[X+1 || <> <:= <<1,2,3>>].", + [2,3,4]), + check(fun() -> [X*Y || X := Y <:- #{1 => 2, 3 => 4}] end, + "[X*Y || X := Y <:- #{1 => 2, 3 => 4}].", + [2,12]), + check(fun() -> << <<(X+1)>> || X <:- [1,2,3]>> end, + "<< <<(X+1)>> || X <:- [1,2,3]>>.", + <<2,3,4>>), + check(fun() -> << <<(X+1)>> || <> <:= <<1,2,3>> >> end, + "<< <<(X+1)>> || <> <:= <<1,2,3>> >>.", + <<2,3,4>>), + check(fun() -> << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4} >> end, + "<< <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4} >>.", + <<2,12>>), + check(fun() -> #{X => X+1 || X <:- [1,2,3]} end, + "#{X => X+1 || X <:- [1,2,3]}.", + #{1 => 2, 2 => 3, 3 => 4}), + check(fun() -> #{X => X+1 || <> <:= <<1,2,3>>} end, + "#{X => X+1 || <> <:= <<1,2,3>>}.", + #{1 => 2, 2 => 3, 3 => 4}), + check(fun() -> #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}} end, + "#{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}}.", + #{2 => 4, 4 => 8}), + + %% A failing guard following a strict generator is ok + check(fun() -> [X+1 || X <:- [1,2,3], X > 1] end, + "[X+1 || X <:- [1,2,3], X > 1].", + [3,4]), + check(fun() -> [X+1 || <> <:= <<1,2,3>>, X > 1] end, + "[X+1 || <> <:= <<1,2,3>>, X > 1].", + [3,4]), + check(fun() -> [X*Y || X := Y <:- #{1 => 2, 3 => 4}, X > 1] end, + "[X*Y || X := Y <:- #{1 => 2, 3 => 4}, X > 1].", + [12]), + check(fun() -> << <<(X+1)>> || X <:- [1,2,3], X > 1>> end, + "<< <<(X+1)>> || X <:- [1,2,3], X > 1>>.", + <<3,4>>), + check(fun() -> << <<(X+1)>> || <> <:= <<1,2,3>>, X > 1 >> end, + "<< <<(X+1)>> || <> <:= <<1,2,3>>, X > 1 >>.", + <<3,4>>), + check(fun() -> << <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4}, X > 1 >> end, + "<< <<(X*Y)>> || X := Y <:- #{1 => 2, 3 => 4}, X > 1 >>.", + <<12>>), + check(fun() -> #{X => X+1 || X <:- [1,2,3], X > 1} end, + "#{X => X+1 || X <:- [1,2,3], X > 1}.", + #{2 => 3, 3 => 4}), + check(fun() -> #{X => X+1 || <> <:= <<1,2,3>>, X > 1} end, + "#{X => X+1 || <> <:= <<1,2,3>>, X > 1}.", + #{2 => 3, 3 => 4}), + check(fun() -> #{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}, X > 1} end, + "#{X+1 => Y*2 || X := Y <:- #{1 => 2, 3 => 4}, X > 1}.", + #{4 => 8}), + + %% Non-matching elements cause a badmatch error + error_check("[X || {ok, X} <:- [{ok,1},2,{ok,3}]].", + {badmatch,2}), + error_check("[X || <<0:1, X:7>> <:= <<1,128,2>>].", + {badmatch,<<128,2>>}), + error_check("[X || X := ok <:- #{1 => ok, 2 => error, 3 => ok}].", + {badmatch,{2,error}}), + error_check("<< <> || {ok, X} <:- [{ok,1},2,{ok,3}] >>.", + {badmatch,2}), + error_check("<< <> || <<0:1, X:7>> <:= <<1,128,2>> >>.", + {badmatch,<<128,2>>}), + error_check("<< <> || X := ok <:- #{1 => ok, 2 => error, 3 => ok} >>.", + {badmatch,{2,error}}), + error_check("#{X => X+1 || {ok, X} <:- [{ok,1},2,{ok,3}]}.", + {badmatch,2}), + error_check("#{X => X+1 || <<0:1, X:7>> <:= <<1,128,2>>}.", + {badmatch,<<128,2>>}), + error_check("#{X => X+1 || X := ok <:- #{1 => ok, 2 => error, 3 => ok}}.", + {badmatch,{2,error}}), + + %% Binary generators don't allow unused bits at the end either + error_check("[X || <> <:= <<0>>].", + {badmatch,<<0:2>>}), + error_check("[Y || <> <:= <<8,1,9,2>>].", + {badmatch,<<9,2>>}), + ok. + binary_skip(Config) when is_list(Config) -> check(fun() -> X = 32, [X || <> <= <<-1:64, 0:64, 0:64, 0:64>>] end, "begin X = 32, [X || <> <= <<-1:64, 0:64, 0:64, 0:64>>] end.", @@ -2074,7 +2320,7 @@ check(F, String, Result) -> check1(F, String, Result), FunString = concat(["fun() -> ", no_final_dot(String), " end(). "]), check1(F, FunString, Result), - CompileString = concat(["hd(lists:map(fun(_) -> ", no_final_dot(String), + CompileString = concat(["hd(lists:map(fun(_) -> ", no_final_dot(String), " end, [foo])). "]), check1(F, CompileString, Result). diff --git a/lib/stdlib/test/erl_expand_records_SUITE.erl b/lib/stdlib/test/erl_expand_records_SUITE.erl index fe055e03f773..e51044febf2d 100644 --- a/lib/stdlib/test/erl_expand_records_SUITE.erl +++ b/lib/stdlib/test/erl_expand_records_SUITE.erl @@ -39,7 +39,7 @@ -export([attributes/1, expr/1, guard/1, init/1, pattern/1, strict/1, update/1, otp_5915/1, otp_7931/1, otp_5990/1, - otp_7078/1, maps/1, + otp_7078/1, maps/1, zlc/1, side_effects/1]). init_per_testcase(_Case, Config) -> @@ -55,7 +55,7 @@ suite() -> all() -> [attributes, expr, guard, init, pattern, strict, update, maps, - side_effects, {group, tickets}]. + side_effects, zlc, {group, tickets}]. groups() -> [{tickets, [], @@ -459,6 +459,15 @@ maps(Config) when is_list(Config) -> run(Config, Ts, [strict_record_tests]), ok. +zlc(Config) when is_list(Config) -> + Ts = [<<"-record(rr, {a,b,c}). + t() -> R0 = id(#rr{a=[{X,Y}||X <- [1,2] && Y <- [a,b]]}), + ok. + id(X) -> X. + ">>], + run(Config, Ts, [strict_record_tests]), + ok. + %% Strict record tests in guards. otp_5915(Config) when is_list(Config) -> %% These tests are also run by the compiler's record_SUITE. diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl index 1bb6c8c3b398..10bd35c566a8 100644 --- a/lib/stdlib/test/erl_lint_SUITE.erl +++ b/lib/stdlib/test/erl_lint_SUITE.erl @@ -86,7 +86,9 @@ tilde_k/1, match_float_zero/1, undefined_module/1, - update_literal/1]). + update_literal/1, + messages_with_jaro_suggestions/1, + illegal_zip_generator/1]). suite() -> [{ct_hooks,[ts_install_cth]}, @@ -121,7 +123,9 @@ all() -> documentation_attributes, match_float_zero, undefined_module, - update_literal]. + update_literal, + messages_with_jaro_suggestions, + illegal_zip_generator]. groups() -> [{unused_vars_warn, [], @@ -1034,7 +1038,7 @@ singleton_type_var_errors(Config) when is_list(Config) -> error. ">>, [], - {warnings,[{{2,36},erl_lint,{singleton_typevar,'Unknown'}}]}}, + {errors,[{{2,36},erl_lint,{singleton_typevar,'Unknown'}}], []}}, {singleton_error2, <<"-spec test_singleton_list_typevars_in_union([Opts]) -> term() when @@ -1042,7 +1046,7 @@ singleton_type_var_errors(Config) when is_list(Config) -> test_singleton_list_typevars_in_union(_) -> error.">>, [], - {warnings,[{{2,36},erl_lint,{singleton_typevar,'Unknown'}}]}}, + {errors,[{{2,36},erl_lint,{singleton_typevar,'Unknown'}}], []}}, {singleton_error3, <<"-spec test_singleton_list_typevars_in_list([Opts]) -> term() when @@ -1067,7 +1071,7 @@ singleton_type_var_errors(Config) when is_list(Config) -> test_singleton_buried_typevars_in_union(_) -> error.">>, [], - {warnings,[{{3,38},erl_lint,{singleton_typevar,'X'}}]}}, + {errors,[{{3,38},erl_lint,{singleton_typevar,'X'}}], []}}, {singleton_error6, <<"-spec test_multiple_subtypes_to_same_typevar(Opts) -> term() when @@ -1099,15 +1103,6 @@ singleton_type_var_errors(Config) when is_list(Config) -> [], {errors,[{{2,21},erl_lint,{singleton_typevar,'Unused'}}],[]}}, - {singleton_disabled_warning, - <<"-spec test_singleton_typevars_in_union(Opts) -> term() when - Opts :: {ok, Unknown} | {error, Unknown}. - test_singleton_typevars_in_union(_) -> - error. - ">>, - [nowarn_singleton_typevar], - []}, - {singleton_ok1, <<"-spec test_multiple_occurrences_singleton(Opts) -> term() when Opts :: {Foo, Foo}. @@ -1498,15 +1493,15 @@ unsafe_vars_try(Config) when is_list(Config) -> {errors,[{{5,41},erl_lint,{unsafe_var,'R',{'try',{3,19}}}}, {{7,24},erl_lint,{unsafe_var,'Rc',{'try',{3,19}}}}, {{13,38},erl_lint,{unsafe_var,'R',{'try',{10,19}}}}, - {{13,40},erl_lint,{unbound_var,'RR'}}, - {{13,43},erl_lint,{unbound_var,'Ro'}}, + {{13,40},erl_lint,{unbound_var,'RR',"R"}}, + {{13,43},erl_lint,{unbound_var,'Ro',"R"}}, {{15,24},erl_lint,{unsafe_var,'R',{'try',{10,19}}}}, {{15,26},erl_lint,{unsafe_var,'RR',{'try',{10,19}}}}, {{15,29},erl_lint,{unsafe_var,'Ro',{'try',{10,19}}}}, {{15,32},erl_lint,{unsafe_var,'Class',{'try',{10,19}}}}, {{15,38},erl_lint,{unsafe_var,'Data',{'try',{10,19}}}}, {{21,38},erl_lint,{unsafe_var,'R',{'try',{18,19}}}}, - {{21,40},erl_lint,{unbound_var,'RR'}}, + {{21,40},erl_lint,{unbound_var,'RR',"R"}}, {{23,27},erl_lint,{unsafe_var,'R',{'try',{18,19}}}}, {{23,29},erl_lint,{unsafe_var,'RR',{'try',{18,19}}}}, {{23,32},erl_lint,{unsafe_var,'Class',{'try',{18,19}}}}, @@ -1531,8 +1526,8 @@ unsafe_vars_try(Config) when is_list(Config) -> ">>, [], {errors,[{{6,41},erl_lint,{unsafe_var,'R',{'try',{3,19}}}}, - {{6,43},erl_lint,{unbound_var,'RR'}}, - {{6,46},erl_lint,{unbound_var,'Ro'}}, + {{6,43},erl_lint,{unbound_var,'RR',"R"}}, + {{6,46},erl_lint,{unbound_var,'Ro',"R"}}, {{8,27},erl_lint,{unsafe_var,'R',{'try',{3,19}}}}, {{8,29},erl_lint,{unsafe_var,'RR',{'try',{3,19}}}}, {{8,32},erl_lint,{unsafe_var,'Ro',{'try',{3,19}}}}, @@ -2315,7 +2310,7 @@ otp_5362(Config) when is_list(Config) -> {[warn_unused_vars, warn_unused_import]}, {error,[{{5,15},erl_lint,{bad_inline,{inl,7}}}, {{6,15},erl_lint,{bad_inline,{inl,17}}}, - {{11,18},erl_lint,{undefined_function,{fipp,0}}}, + {{11,18},erl_lint,{undefined_function,{fipp,0},"foop"}}, {{22,15},erl_lint,{bad_nowarn_unused_function,{and_not_used,2}}}], [{{3,15},erl_lint,{unused_import,{{b,1},lists}}}, {{9,14},erl_lint,{unused_function,{foop,0}}}, @@ -3082,7 +3077,7 @@ otp_11254(Config) when is_list(Config) -> manifest(Module, Name) -> fun Module:Nine/1. ">>, - {error,[{{4,26},erl_lint,{unbound_var,'Nine'}}], + {error,[{{4,26},erl_lint,{unbound_var,'Nine',"Name"}}], [{{3,30},erl_lint,{unused_var,'Name'}}]} = run_test2(Config, Ts, []), ok. @@ -3478,6 +3473,15 @@ behaviour_basic(Config) when is_list(Config) -> {warnings,[{{1,22},erl_lint,{undefined_behaviour_func,{start,2},application}}]}} ], [] = run(Config, Ts), + + Subst0 = #{behaviour1 => [nowarn_undefined_behaviour_func], + behaviour2 => [nowarn_undefined_behaviour_func], + behaviour4 => [nowarn_undefined_behaviour_func]}, + [] = run(Config, rewrite(Ts, Subst0)), + + Subst = #{K => [nowarn_behaviours] || K := _ <- Subst0}, + [] = run(Config, rewrite(Ts, Subst)), + ok. %% Basic tests with multiple behaviours. @@ -3544,13 +3548,14 @@ behaviour_multiple(Config) when is_list(Config) -> {behaviour4, <<"-behaviour(gen_server). - -behaviour(gen_fsm). + -behaviour(gen_statem). -behaviour(supervisor). -export([init/1,handle_call/3,handle_cast/2, handle_info/2,handle_info/3, handle_event/3,handle_sync_event/4, code_change/3,code_change/4, - terminate/2,terminate/3,terminate/4]). + terminate/2,terminate/3,terminate/4, + callback_mode/0]). init(_) -> ok. handle_call(_, _, _) -> ok. handle_event(_, _, _) -> ok. @@ -3563,22 +3568,32 @@ behaviour_multiple(Config) when is_list(Config) -> terminate(_, _) -> ok. terminate(_, _, _) -> ok. terminate(_, _, _, _) -> ok. + callback_mode() -> state_functions. ">>, [], {warnings,[{{2,16}, erl_lint, - {conflicting_behaviours,{init,1},gen_fsm,{1,22},gen_server}}, + {conflicting_behaviours,{init,1},gen_statem,{1,22},gen_server}}, {{3,16}, erl_lint, {conflicting_behaviours,{init,1},supervisor,{1,22},gen_server}}]}} ], [] = run(Config, Ts), + + Subst = #{behaviour3 => [nowarn_undefined_behaviour_func, + nowarn_conflicting_behaviours], + american_behavior3 => [nowarn_undefined_behaviour_func, + nowarn_conflicting_behaviours], + behaviour4 => [nowarn_conflicting_behaviours]}, + [] = run(Config, rewrite(Ts, Subst)), + ok. %% OTP-11861. behaviour_info() and -callback. otp_11861(Conf) when is_list(Conf) -> CallbackFiles = [callback1, callback2, callback3, - bad_behaviour1, bad_behaviour2], + bad_behaviour1, bad_behaviour2, + bad_behaviour3], lists:foreach(fun(M) -> F = filename:join(?datadir, M), Opts = [{outdir,?privdir}, return], @@ -3759,9 +3774,31 @@ otp_11861(Conf) when is_list(Conf) -> f1(_) -> ok. ">>, [], - []} + []}, + + {otp_11861_19, + <<" + -export([good/1]). + -behaviour(bad_behaviour3). + good(_) -> ok. + ">>, + [], + {warnings,[{{3,16},erl_lint,{ill_defined_optional_callbacks,bad_behaviour3}}]}} ], [] = run(Conf, Ts), + + Subst0 = #{otp_11861_1 => [nowarn_conflicting_behaviours], + otp_11861_11 => [nowarn_ill_defined_behaviour_callbacks], + otp_11861_12 => [nowarn_undefined_behaviour], + otp_11861_13 => [nowarn_undefined_behaviour], + otp_11861_17 => [nowarn_undefined_behaviour_callbacks], + otp_11861_19 => [nowarn_ill_defined_optional_callbacks] + }, + [] = run(Conf, rewrite(Ts, Subst0)), + + Subst = #{K => [nowarn_behaviours] || K := _ <- Subst0}, + [] = run(Conf, rewrite(Ts, Subst)), + true = code:set_path(CodePath), ok. @@ -5395,10 +5432,102 @@ update_literal(Config) -> ok. +%% For certain kinds of errors that are easily caused by typos, error +%% messages try to suggest fixes according to jaro_similarity. +messages_with_jaro_suggestions(Config) -> + Ts = [{on_load_fun, + <<"-on_load(foa/0). + foo() -> ok.">>, + {[]}, + {error,[{{1,22},erl_lint,{undefined_on_load,{foa,0},"foo"}}], + [{{2,15},erl_lint,{unused_function,{foo,0}}}]}}, + {undefined_nif, + <<"-export([foo/1]). + -nifs([foa/1]). + -on_load(init/0). + init() -> + ok = erlang:load_nif(\"./example_nif\", 0). + foo(_X) -> + erlang:nif_error(nif_library_not_loaded).">>, + {[]}, + {errors,[{{2,16},erl_lint,{undefined_nif,{foa,1},"foo"}}],[]}}, + {record_and_field, + <<"-record(meep, { moo, muu }). + t(State) -> + Var = State#meep.mo, + State#mee{ moo = Var }.">>, + {[]}, + {error,[{{3,36},erl_lint,{undefined_field,meep,mo,"moo"}}, + {{4,24},erl_lint,{undefined_record,mee,"meep"}}], + [{{2,15},erl_lint,{unused_function,{t,1}}}, + {{3,19},erl_lint,{unused_var,'Var'}}]}}, + {unbound_var, + <<"-record(meep, { moo, muu }). + t(State) -> + Var = State#meep.moo, + Stat#meep{ moo = Var }.">>, + {[]}, + {error,[{{4,19},erl_lint,{unbound_var,'Stat',"State"}}], + [{{2,15},erl_lint,{unused_function,{t,1}}}]}}, + {undefined_fun, + <<"-export([bar/1]). + baz(X) -> X.">>, + {[]}, + {error,[{{1,22},erl_lint,{undefined_function,{bar,1},"baz"}}], + [{{2,15},erl_lint,{unused_function,{baz,1}}}]}}, + {nowarn_undefined_fun, + <<"-compile({nowarn_unused_function,[{an_not_used,1}]}). + and_not_used(_) -> foo.">>, + {[]}, + {error,[{{1,22}, erl_lint, + {bad_nowarn_unused_function,{an_not_used,1},"and_not_used"}}], + [{{2,15},erl_lint,{unused_function,{and_not_used,1}}}]}}, + {bad_inline, + <<"-compile({inline, {go,1}}). + gi(A) -> {A}.">>, + {[]}, + {error,[{{1,22},erl_lint,{bad_inline,{go,1},"gi"}}], + [{{2,15},erl_lint,{unused_function,{gi,1}}}]}} + ], + [] = run(Config, Ts), + + ok. + +illegal_zip_generator(Config) -> + Ts = [{not_generator, + <<"-compile({nowarn_unused_function,[{foo,0}]}). + foo() -> [X + Y || X <- [1,2,3,4] && Y <- [5,6,7] && X > 1]. + ">>, + {[]}, + {errors,[{{2,68},erl_lint,illegal_zip_generator}],[]}}, + {not_generator, + <<"-compile({nowarn_unused_function,[{bar,0}]}). + bar() -> [X + Y || X <- [[1,2],[3,4]] && lists:sum(X) > 0 && Y <- [5,6,7]]. + ">>, + {[]}, + {errors,[{{2,67},erl_lint,illegal_zip_generator}],[]}} + ], + [] = run(Config,Ts), + + ok. + %%% %%% Common utilities. %%% +rewrite([{Name,Code,[],{warnings,_}}=H|T], Subst) -> + case Subst of + #{Name := Opts} -> + io:format("~s: testing with options ~p\n", [Name,Opts]), + [{Name,Code,Opts,[]}|rewrite(T, Subst)]; + #{} -> + [H|rewrite(T, Subst)] + end; +rewrite([H|T], Subst) -> + [H|rewrite(T, Subst)]; +rewrite([], _Subst) -> + []. + format_error(E) -> lists:flatten(erl_lint:format_error(E)). diff --git a/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour1.erl b/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour1.erl index 230f4b45194d..8e4c305d6dc1 100644 --- a/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour1.erl +++ b/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour1.erl @@ -3,4 +3,6 @@ -export([behaviour_info/1]). behaviour_info(callbacks) -> - [{a,1,bad}]. + [{a,1,bad}]; +behaviour_info(optional_callbacks) -> + [{b,1,bad}]. diff --git a/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour3.erl b/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour3.erl new file mode 100644 index 000000000000..b156f6184a29 --- /dev/null +++ b/lib/stdlib/test/erl_lint_SUITE_data/bad_behaviour3.erl @@ -0,0 +1,7 @@ +-module(bad_behaviour3). +-export([behaviour_info/1]). + +behaviour_info(callbacks) -> + [{good,1}]; +behaviour_info(optional_callbacks) -> + [{b,1,bad}]. diff --git a/lib/stdlib/test/erl_scan_SUITE.erl b/lib/stdlib/test/erl_scan_SUITE.erl index 771ffe19a00b..656e33ea2008 100644 --- a/lib/stdlib/test/erl_scan_SUITE.erl +++ b/lib/stdlib/test/erl_scan_SUITE.erl @@ -57,11 +57,11 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,20}}]. -all() -> +all() -> [{group, error}, iso88591, otp_7810, otp_10302, otp_10990, otp_10992, otp_11807, otp_16480, otp_17024, text_fun, triple_quoted_string]. -groups() -> +groups() -> [{error, [], [error_1, error_2]}]. init_per_suite(Config) -> @@ -223,7 +223,7 @@ punctuations() -> Ts = [{W,{1,1}}], test_string(S, Ts) end || S <- L], - Three = ["/=:=", "<=:=", "==:=", ">=:="], % three tokens... + Three = ["/=:=", "<:=", "==:=", ">=:="], % three tokens... No = Three ++ L, SL0 = [{S1++S2,{-length(S1),S1,S2}} || S1 <- L, diff --git a/lib/stdlib/test/escript_SUITE.erl b/lib/stdlib/test/escript_SUITE.erl index 8899ab2deeef..4d7e9a28cf7d 100644 --- a/lib/stdlib/test/escript_SUITE.erl +++ b/lib/stdlib/test/escript_SUITE.erl @@ -39,7 +39,8 @@ overflow/1, verify_sections/4, unicode/1, - bad_io_server/1 + bad_io_server/1, + bypass_unicode_conversion/1 ]). -include_lib("common_test/include/ct.hrl"). @@ -54,9 +55,10 @@ all() -> emulator_flags_no_shebang, two_lines, module_script, beam_script, archive_script, epp, create_and_extract, foldl, overflow, - archive_script_file_access, unicode, bad_io_server]. + archive_script_file_access, unicode, bad_io_server, + bypass_unicode_conversion]. -groups() -> +groups() -> []. init_per_suite(Config) -> @@ -978,6 +980,29 @@ bad_io_server(Config) when is_list(Config) -> "called as '\\x{400}' / 0\nExitCode:127">>]), ok. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +bypass_unicode_conversion(Config) when is_list(Config) -> + Data = proplists:get_value(data_dir, Config), + Dir = filename:absname(Data), %Get rid of trailing slash. + ToNull = case os:type() of + {win32,_} -> " 1> nul "; + _ -> " 1> /dev/null " + end, + Cmd = fun(Enc) -> "bypass_unicode_conversion "++atom_to_list(Enc)++ToNull end, + {TimeLatin1, _} = timer:tc( + fun() -> run(Config, Dir, Cmd(latin1), [<<"ExitCode:0">>]) end), + {TimeUnicode, _} = timer:tc( + fun() -> run(Config, Dir, Cmd(unicode), [<<"ExitCode:0">>]) end), + %% Check that Time(latin1) is about the same as Time(unicode) + %% Without the bypass, the time difference would be about 5x. + %% Turns out that the timing might be a bit unstable, so we allow a 2x difference. + io:format("Time(latin1) = ~p ~~= Time(unicode) = ~p~n", [TimeLatin1, TimeUnicode]), + true = TimeLatin1 =< TimeUnicode * 2, + ok. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + run(Config, Dir, Cmd, Expected) -> run_with_opts(Config, Dir, "", Cmd, Expected). diff --git a/lib/stdlib/test/escript_SUITE_data/bypass_unicode_conversion b/lib/stdlib/test/escript_SUITE_data/bypass_unicode_conversion new file mode 100644 index 000000000000..4b08d103c58d --- /dev/null +++ b/lib/stdlib/test/escript_SUITE_data/bypass_unicode_conversion @@ -0,0 +1,7 @@ +#!/usr/bin/env escript + +main([Enc]) -> + Data = {tuple, {list, lists:seq(1,1000000)}}, + io:setopts(group_leader(), [{encoding, list_to_atom(Enc)}]), + file:write(group_leader(), term_to_binary(Data)), + ok. diff --git a/lib/stdlib/test/io_proto_SUITE.erl b/lib/stdlib/test/io_proto_SUITE.erl index 7c4b7d867ba5..a838f082ec41 100644 --- a/lib/stdlib/test/io_proto_SUITE.erl +++ b/lib/stdlib/test/io_proto_SUITE.erl @@ -316,19 +316,45 @@ setopts_getopts(Config) when is_list(Config) -> {expect, "true"} ],[],"",["-oldshell"]), - %% Test that terminal options when used in non-terminal - %% are returned as they should + %% Test that terminal options when used in non-terminal are returned as they should + %% both when run as an os:cmd and when run directly as a port. Erl = ct:get_progname(), - Str = os:cmd(Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"), + CmdStr = os:cmd(Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"), maybe - {ok, T, _} ?= erl_scan:string(Str), + {ok, T, _} ?= erl_scan:string(CmdStr), {ok, Opts} ?= erl_parse:parse_term(T), ?assertEqual(false, proplists:get_value(terminal,Opts)), - ?assertEqual(false, proplists:get_value(stdin,Opts)), + case os:type() of + {win32, nt} -> + %% On Windows stdin will be a tty + ?assertEqual(true, proplists:get_value(stdin,Opts)); + _ -> + ?assertEqual(false, proplists:get_value(stdin,Opts)) + end, ?assertEqual(false, proplists:get_value(stdout,Opts)), ?assertEqual(false, proplists:get_value(stderr,Opts)) else - _ -> ct:fail({failed_to_parse, Str}) + _ -> ct:fail({failed_to_parse, CmdStr}) + end, + + Port = erlang:open_port({spawn, Erl ++ " -noshell -eval \"io:format(~s'~p.',[io:getopts()])\" -s init stop"}, + [exit_status]), + PortStr = (fun F() -> + receive + {Port,{data,D}} -> D ++ F(); + {Port,{exit_status,0}} -> [] + end + end)(), + + maybe + {ok, PortT, _} ?= erl_scan:string(PortStr), + {ok, PortOpts} ?= erl_parse:parse_term(PortT), + ?assertEqual(false, proplists:get_value(terminal,PortOpts)), + ?assertEqual(false, proplists:get_value(stdin,PortOpts)), + ?assertEqual(false, proplists:get_value(stdout,PortOpts)), + ?assertEqual(proplists:get_value(stderr, io:getopts()), proplists:get_value(stderr,PortOpts)) + else + _ -> ct:fail({failed_to_parse, PortStr}) end, ok. diff --git a/lib/stdlib/test/proc_lib_SUITE.erl b/lib/stdlib/test/proc_lib_SUITE.erl index 6683fd7d2a14..59c08e17bf7e 100644 --- a/lib/stdlib/test/proc_lib_SUITE.erl +++ b/lib/stdlib/test/proc_lib_SUITE.erl @@ -695,6 +695,18 @@ stop(_Config) -> timeout end, + %% Ensure that if process stops with same reason just as stop is called, + %% stop does not throw an exception. + PidNormalStop = proc_lib:spawn(fun() -> timer:sleep(1000) end), + ok = proc_lib:stop(PidNormalStop,normal,2000), + false = erlang:is_process_alive(PidNormalStop), + PidDieStop = proc_lib:spawn(fun() -> timer:sleep(1000), exit(die) end), + ok = proc_lib:stop(PidDieStop,die,2000), + false = erlang:is_process_alive(PidDieStop), + PidDieStopCrash = proc_lib:spawn(fun() -> timer:sleep(1000), exit(die) end), + {'EXIT', {die, _}} = catch (proc_lib:stop(PidDieStopCrash,normal,2000)), + false = erlang:is_process_alive(PidDieStopCrash), + %% Success case with other reason than 'normal' Pid5 = proc_lib:spawn(SysMsgProc), ok = proc_lib:stop(Pid5,other_reason,infinity), diff --git a/lib/stdlib/test/property_test/calendar_prop.erl b/lib/stdlib/test/property_test/calendar_prop.erl new file mode 100644 index 000000000000..bdae48852b5a --- /dev/null +++ b/lib/stdlib/test/property_test/calendar_prop.erl @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2024. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%% +%% %CopyrightEnd% +%% +-module(calendar_prop). +-compile([export_all, nowarn_export_all]). + +-include_lib("common_test/include/ct_property_test.hrl"). + +%%%%%%%%%%%%%%%%%% +%%% Properties %%% +%%%%%%%%%%%%%%%%%% + +between_40_years_ago_and_in_40_years() -> + integer(erlang:system_time(millisecond) - 40*1000*60*60*24*365, + erlang:system_time(millisecond) + 40*1000*60*60*24*365). + +rfc3339_lists_binaries() -> + Ms = [{unit, millisecond}], + ?FORALL( + TS, + between_40_years_ago_and_in_40_years(), + begin + DateTimeString = calendar:system_time_to_rfc3339(TS, Ms), + DateTimeBin = calendar:system_time_to_rfc3339(TS, [{return, binary} | Ms]), + ListToBinary = erlang:list_to_binary(DateTimeString), + FromStr = calendar:rfc3339_to_system_time(DateTimeString, Ms), + FromBin = calendar:rfc3339_to_system_time(DateTimeBin, Ms), + DateTimeBin =:= ListToBinary andalso FromStr =:= FromBin + end + ). diff --git a/lib/stdlib/test/property_test/lists_prop.erl b/lib/stdlib/test/property_test/lists_prop.erl index 2522a9b38b6f..a552d2676462 100644 --- a/lib/stdlib/test/property_test/lists_prop.erl +++ b/lib/stdlib/test/property_test/lists_prop.erl @@ -2056,7 +2056,7 @@ check_uniqed(L, UL) -> check_uniqed(fun(X) -> X end, L, UL). check_uniqed(Fn, L, UL) -> - check_uniqed1(Fn, L, UL, sets:new([{version, 2}])). + check_uniqed1(Fn, L, UL, sets:new()). check_uniqed1(Fn, [E|L], [], Seen) -> sets:is_element(Fn(E), Seen) andalso diff --git a/lib/stdlib/test/re_SUITE.erl b/lib/stdlib/test/re_SUITE.erl index 9a7b5b470e27..39d76a599377 100644 --- a/lib/stdlib/test/re_SUITE.erl +++ b/lib/stdlib/test/re_SUITE.erl @@ -476,6 +476,10 @@ split_autogen(Config) when is_list(Config) -> %% Test special options to split. split_options(Config) when is_list(Config) -> + ok = splittest("", "", [trim], []), + ok = splittest("", " ", [trim], []), + ok = splittest("", "()", [group, trim], []), + ok = splittest("", "( )", [group, trim], []), ok = splittest("a b c ","( )",[group,trim],[[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>]]), ok = splittest("a b c ","( )",[group,{parts,0}],[[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>]]), ok = splittest("a b c ","( )",[{parts,infinity},group],[[<<"a">>,<<" ">>],[<<"b">>,<<" ">>],[<<"c">>,<<" ">>],[<<>>]]), diff --git a/lib/stdlib/test/sets_SUITE.erl b/lib/stdlib/test/sets_SUITE.erl index 9832db112d6e..733767d37b15 100644 --- a/lib/stdlib/test/sets_SUITE.erl +++ b/lib/stdlib/test/sets_SUITE.erl @@ -1,8 +1,8 @@ %% %% %CopyrightBegin% -%% +%% %% Copyright Ericsson AB 2004-2024. All Rights Reserved. -%% +%% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at @@ -14,7 +14,7 @@ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. -%% +%% %% %CopyrightEnd% %% @@ -23,7 +23,7 @@ -module(sets_SUITE). --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, init_per_testcase/2,end_per_testcase/2, create/1,add_element/1,del_element/1, @@ -45,13 +45,13 @@ suite() -> [{ct_hooks,[ts_install_cth]}, {timetrap,{minutes,5}}]. -all() -> +all() -> [create, add_element, del_element, subtract, intersection, union, is_subset, is_set, fold, filter, map, filtermap, take_smallest, take_largest, iterate, is_empty, is_disjoint, is_equal]. -groups() -> +groups() -> []. init_per_suite(Config) -> @@ -121,7 +121,7 @@ add_element_del([], M, S, Del, _) -> del_element(Config) when is_list(Config) -> test_all([{0,132},{253,258},{510,514},{1022,1026}], fun del_element_1/2). -del_element_1(List, M) -> +del_element_1(List, M) -> S0 = M(from_list, List), Empty = foldl(fun(El, Set) -> M(del_element, {El,Set}) end, S0, List), true = M(is_equal, {Empty,M(empty, [])}), @@ -564,13 +564,13 @@ sets_mods() -> mixed_new() -> case erlang:erase(sets_type) of undefined -> erlang:put(sets_type, deprecated), sets:new([{version,2}]); - deprecated -> sets:new() + deprecated -> sets:new([{version, 1}]) end. mixed_from_list(L) -> case erlang:erase(sets_type) of undefined -> erlang:put(sets_type, deprecated), sets:from_list(L, [{version,2}]); - deprecated -> sets:from_list(L) + deprecated -> sets:from_list(L, [{version, 1}]) end. test_all(Tester) -> @@ -604,7 +604,7 @@ all_same_1([], _) -> ok. rnd_list(Sz) -> rnd_list_1(Sz, []). - + atomic_rnd_term() -> case rand:uniform(3) of 1 -> list_to_atom(integer_to_list($\s+rand:uniform(94))++"rnd"); @@ -617,7 +617,7 @@ rnd_list_1(N, Acc) -> rnd_list_1(N-1, [atomic_rnd_term()|Acc]). mutate_some(List) -> mutate_some(List, []). - + mutate_some([X,Y,Z|T], Acc) -> %% Intentionally change order. (Order should not matter.) mutate_some(T, [{X},Z,Y|Acc]); diff --git a/lib/stdlib/test/shell_docs_SUITE.erl b/lib/stdlib/test/shell_docs_SUITE.erl index 4f4745085c77..0db48b4d6a7b 100644 --- a/lib/stdlib/test/shell_docs_SUITE.erl +++ b/lib/stdlib/test/shell_docs_SUITE.erl @@ -22,9 +22,9 @@ -moduledoc false. -export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1, - init_per_group/2, end_per_group/2]). + init_per_group/2, end_per_group/2, init_per_testcase/2, end_per_testcase/2]). --export([render/1, links/1, normalize/1, render_prop/1,render_non_native/1]). +-export([render/1, links/1, normalize/1, render_prop/1,render_non_native/1, ansi/1, columns/1]). -export([render_function/1, render_type/1, render_callback/1]). -export([render_all/1, update_render/0, update_render/1]). @@ -40,9 +40,11 @@ suite() -> all() -> [ {group, render}, {group, prop}, - {group, render_smoke} + {group, render_smoke}, + ansi, columns ]. + groups() -> [ {prop,[],[render_prop]}, {render, [], [render, render_non_native, links, normalize]}, @@ -66,8 +68,23 @@ init_per_group(prop, Config) -> init_per_group(_GroupName, Config) -> Config. -end_per_group(_GroupName, Config) -> - Config. +end_per_group(_GroupName, _Config) -> + ok. + +init_per_testcase(_TestCase, Config) -> + Env = [{App, Key, application:get_env(App, Key)} + || {App, Key} <- [{kernel, shell_docs_ansi}, + {stdlib, shell_docs_columns}]], + [{env, Env} | Config]. + +end_per_testcase(_TestCase, Config) -> + lists:foreach( + fun({App, Key, undefined}) -> + application:unset_env(App, Key); + ({App, Key, {ok, Val}}) -> + application:set_env(App, Key, Val) + end, + proplists:get_value(env, Config)). %% We keep the docs of a couple of complex modules %% in the data_dir in order to compare then with the original @@ -505,6 +522,60 @@ sanitize(FName) -> end, FName, [{"/","slash"},{":","colon"}, {"\\*","star"},{"<","lt"},{">","gt"},{"=","eq"}]). +ansi(_Config) -> + {ok, Docs} = code:get_doc(?MODULE), + + HasESC = + fun(Config) -> + Doc = shell_docs:render(?MODULE, Docs, Config), + string:find(Doc, "\e") =/= nomatch + end, + + application:set_env(kernel, shell_docs_ansi, true), + ?assert(HasESC(#{})), + ?assertNot(HasESC(#{ansi => false})), + ?assert(HasESC(#{ansi => true})), + + application:set_env(kernel, shell_docs_ansi, false), + ?assertNot(HasESC(#{})), + ?assertNot(HasESC(#{ansi => false})), + ?assert(HasESC(#{ansi => true})), + + ok. + +-doc """ +Doc doc doc doc doc doc doc doc doc doc doc doc doc doc doc. +""". +columns(_Config) -> + {ok, Docs} = code:get_doc(?MODULE), + + MaxColumns = + fun(Config0) -> + Config = maps:merge(#{ansi => false}, Config0), + Doc = shell_docs:render(?MODULE, ?FUNCTION_NAME, Docs, Config), + Lines = string:split(Doc, "\n", all), + lists:max(lists:map(fun string:length/1, Lines)) + end, + + application:set_env(stdlib, shell_docs_columns, 30), + ?assert(MaxColumns(#{}) =< 30), + ?assert(MaxColumns(#{columns => 20}) =< 20), + + application:set_env(stdlib, shell_docs_columns, not_an_integer), + ?assert(MaxColumns(#{}) > 30), + + application:set_env(stdlib, shell_docs_columns, 0), + ?assert(MaxColumns(#{}) > 30), + + application:set_env(stdlib, shell_docs_columns, -30), + ?assert(MaxColumns(#{}) > 30), + + application:unset_env(stdlib, shell_docs_columns), + ?assert(MaxColumns(#{}) > 30), + ?assert(MaxColumns(#{columns => 20}) =< 20), + + ok. + %% %% Parallel map function. %% diff --git a/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1 index abe984d9f6d0..1a87d3cee192 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1 +++ b/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1 @@ -1 +1 @@ -{docs_v1,{21,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,#{<<101,110>> => <<84,104,101,32,69,114,108,97,110,103,32,66,73,70,115,32,97,110,100,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,46,10,10,66,121,32,99,111,110,118,101,110,116,105,111,110,44,32,109,111,115,116,32,91,66,117,105,108,116,45,73,110,32,70,117,110,99,116,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,102,117,110,99,116,105,111,110,115,46,109,100,35,98,117,105,108,116,45,105,110,45,102,117,110,99,116,105,111,110,115,45,98,105,102,115,96,41,10,40,66,73,70,115,41,32,97,110,100,32,97,108,108,32,91,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,93,40,96,101,58,115,121,115,116,101,109,58,116,121,112,101,115,112,101,99,46,109,100,35,112,114,101,100,101,102,105,110,101,100,96,41,32,97,114,101,32,105,110,99,108,117,100,101,100,10,105,110,32,116,104,105,115,32,109,111,100,117,108,101,46,32,83,111,109,101,32,111,102,32,116,104,101,32,66,73,70,115,32,97,110,100,32,97,108,108,32,111,102,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,32,118,105,101,119,101,100,32,109,111,114,101,10,111,114,32,108,101,115,115,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,32,97,110,100,32,97,114,101,32,95,97,117,116,111,45,105,109,112,111,114,116,101,100,95,46,10,84,104,117,115,44,32,105,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,97,108,108,115,10,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,97,110,100,32,91,96,101,114,108,97,110,103,58,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,10,97,114,101,32,105,100,101,110,116,105,99,97,108,46,10,10,65,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,97,110,110,111,116,97,116,101,100,32,119,105,116,104,32,96,97,117,116,111,45,105,109,112,111,114,116,101,100,96,32,97,110,100,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,10,97,110,110,111,116,97,116,101,100,32,119,105,116,104,32,96,112,114,101,100,101,102,105,110,101,100,96,46,10,10,83,111,109,101,32,97,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,97,108,115,111,32,97,108,108,111,119,101,100,32,105,110,32,91,103,117,97,114,100,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,103,117,97,114,100,45,101,120,112,114,101,115,115,105,111,110,115,96,41,46,10,83,117,99,104,32,66,73,70,115,32,97,114,101,32,97,110,110,111,116,101,100,32,119,105,116,104,32,98,111,116,104,32,96,97,117,116,111,45,105,109,112,111,114,116,101,100,96,32,97,110,100,32,96,103,117,97,114,100,45,98,105,102,96,46,10,10,66,73,70,115,32,99,97,110,32,102,97,105,108,32,102,111,114,32,118,97,114,105,111,117,115,32,114,101,97,115,111,110,115,46,32,65,108,108,32,66,73,70,115,32,102,97,105,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,121,10,97,114,101,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,115,32,111,102,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,46,32,84,104,101,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,10,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,101,97,99,104,32,105,110,100,105,118,105,100,117,97,108,32,66,73,70,46>>},#{otp_doc_vsn => {1,0,0}},[{{type,memory_type,0},{12185,2},[<<109,101,109,111,114,121,95,116,121,112,101,40,41>>],none,#{exported => false}},{{type,send_destination,0},{11024,2},[<<115,101,110,100,95,100,101,115,116,105,110,97,116,105,111,110,40,41>>],#{<<101,110>> => <<84,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,102,111,114,32,97,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,46,10,10,84,104,105,115,32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,32,114,101,102,101,114,101,110,99,101,10,100,101,110,111,116,105,110,103,32,97,32,112,114,111,99,101,115,115,32,97,108,105,97,115,44,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,96,10,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>},#{exported => true,specification => [{attribute,{11031,2},type,{send_destination,{type,{11031,29},union,[{type,{11031,29},pid,[]},{type,{11032,29},reference,[]},{type,{11033,29},port,[]},{ann_type,{11034,30},[{var,{11034,30},'RegName'},{type,{11034,41},atom,[]}]},{type,{11035,29},tuple,[{ann_type,{11035,30},[{var,{11035,30},'RegName'},{type,{11035,41},atom,[]}]},{ann_type,{11035,49},[{var,{11035,49},'Node'},{type,{11035,57},node,[]}]}]}]},[]}}]}},{{type,spawn_opt_option,0},{9997,2},[<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110,40,41>>],#{<<101,110>> => <<79,112,116,105,111,110,115,32,102,111,114,32,91,96,115,112,97,119,110,95,111,112,116,40,41,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,46>>},#{exported => true,specification => [{attribute,{9998,2},type,{spawn_opt_option,{type,{9999,2},union,[{atom,{9999,2},link},{atom,{10000,9},monitor},{type,{10001,9},tuple,[{atom,{10001,10},monitor},{ann_type,{10001,19},[{var,{10001,19},'MonitorOpts'},{type,{10001,34},list,[{user_type,{10001,35},monitor_option,[]}]}]}]},{type,{10002,9},tuple,[{atom,{10002,10},priority},{ann_type,{10002,20},[{var,{10002,20},'Level'},{user_type,{10002,29},priority_level,[]}]}]},{type,{10003,9},tuple,[{atom,{10003,10},fullsweep_after},{ann_type,{10003,27},[{var,{10003,27},'Number'},{type,{10003,37},non_neg_integer,[]}]}]},{type,{10004,9},tuple,[{atom,{10004,10},min_heap_size},{ann_type,{10004,25},[{var,{10004,25},'Size'},{type,{10004,33},non_neg_integer,[]}]}]},{type,{10005,9},tuple,[{atom,{10005,10},min_bin_vheap_size},{ann_type,{10005,30},[{var,{10005,30},'VSize'},{type,{10005,39},non_neg_integer,[]}]}]},{type,{10006,9},tuple,[{atom,{10006,10},max_heap_size},{ann_type,{10006,25},[{var,{10006,25},'Size'},{user_type,{10006,33},max_heap_size,[]}]}]},{type,{10007,9},tuple,[{atom,{10007,10},message_queue_data},{ann_type,{10007,30},[{var,{10007,30},'MQD'},{user_type,{10007,37},message_queue_data,[]}]}]},{type,{10008,9},tuple,[{atom,{10008,10},async_dist},{ann_type,{10008,22},[{var,{10008,22},'Enabled'},{type,{10008,33},boolean,[]}]}]}]},[]}}]}},{{type,max_heap_size,0},{9985,2},[<<109,97,120,95,104,101,97,112,95,115,105,122,101,40,41>>],#{<<101,110>> => <<80,114,111,99,101,115,115,32,109,97,120,32,104,101,97,112,32,115,105,122,101,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41>>},#{exported => true,specification => [{attribute,{9989,2},type,{max_heap_size,{ann_type,{9990,9},[{var,{9990,9},'Size'},{type,{9990,17},union,[{type,{9990,17},non_neg_integer,[]},{type,{9992,9},map,[{type,{9992,17},map_field_assoc,[{atom,{9992,12},size},{type,{9992,20},non_neg_integer,[]}]},{type,{9993,17},map_field_assoc,[{atom,{9993,12},kill},{type,{9993,20},boolean,[]}]},{type,{9994,25},map_field_assoc,[{atom,{9994,12},error_logger},{type,{9994,28},boolean,[]}]},{type,{9995,36},map_field_assoc,[{atom,{9995,12},include_shared_binaries},{type,{9995,39},boolean,[]}]}]}]}]},[]}}]}},{{type,garbage_collection_defaults,0},{9667,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,100,101,102,97,117,108,116,115,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,119,105,116,104,32,116,104,101,32,115,121,115,116,101,109,32,119,105,100,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,100,101,102,97,117,108,116,115,46>>},#{exported => false,specification => [{attribute,{9668,2},type,{garbage_collection_defaults,{type,{9668,40},list,[{type,{9668,41},union,[{type,{9668,41},tuple,[{atom,{9668,42},max_heap_size},{type,{9668,57},non_neg_integer,[]}]},{type,{9669,41},tuple,[{atom,{9669,42},min_bin_vheap_size},{type,{9669,62},non_neg_integer,[]}]},{type,{9670,41},tuple,[{atom,{9670,42},min_heap_size},{type,{9670,57},non_neg_integer,[]}]},{type,{9671,41},tuple,[{atom,{9671,42},fullsweep_after},{type,{9671,59},non_neg_integer,[]}]}]}]},[]}}]}},{{type,info_list,0},{9664,2},[<<105,110,102,111,95,108,105,115,116,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9665,2},type,{info_list,{type,{9665,22},nil,[]},[]}}]}},{{type,sub_level,0},{9661,2},[<<115,117,98,95,108,101,118,101,108,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9662,2},type,{sub_level,{type,{9662,22},union,[{type,{9662,22},list,[{ann_type,{9662,23},[{var,{9662,23},'LevelEntry'},{user_type,{9662,37},level_entry,[]}]}]},{ann_type,{9663,23},[{var,{9663,23},'LogicalCpuId'},{type,{9663,39},tuple,[{atom,{9663,40},logical},{type,{9663,49},non_neg_integer,[]}]}]}]},[]}}]}},{{type,level_tag,0},{9659,2},[<<108,101,118,101,108,95,116,97,103,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9660,2},type,{level_tag,{type,{9660,22},union,[{atom,{9660,22},core},{atom,{9660,29},node},{atom,{9660,36},processor},{atom,{9660,48},thread}]},[]}}]}},{{type,level_entry,0},{9653,2},[<<108,101,118,101,108,95,101,110,116,114,121,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9654,2},type,{level_entry,{type,{9655,9},union,[{type,{9655,9},tuple,[{ann_type,{9655,10},[{var,{9655,10},'LevelTag'},{user_type,{9655,22},level_tag,[]}]},{ann_type,{9655,35},[{var,{9655,35},'SubLevel'},{user_type,{9655,47},sub_level,[]}]}]},{type,{9656,9},tuple,[{ann_type,{9656,10},[{var,{9656,10},'LevelTag'},{user_type,{9656,22},level_tag,[]}]},{ann_type,{9657,10},[{var,{9657,10},'InfoList'},{user_type,{9657,22},info_list,[]}]},{ann_type,{9658,10},[{var,{9658,10},'SubLevel'},{user_type,{9658,22},sub_level,[]}]}]}]},[]}}]}},{{type,cpu_topology,0},{9633,2},[<<99,112,117,95,116,111,112,111,108,111,103,121,40,41>>],#{<<101,110>> => <<84,104,101,32,99,117,114,114,101,110,116,32,99,112,117,32,116,111,112,111,108,111,103,121,46,10,10,96,110,111,100,101,96,32,114,101,102,101,114,115,32,116,111,32,78,111,110,45,85,110,105,102,111,114,109,32,77,101,109,111,114,121,32,65,99,99,101,115,115,32,40,78,85,77,65,41,32,110,111,100,101,115,46,32,96,116,104,114,101,97,100,96,32,114,101,102,101,114,115,10,116,111,32,104,97,114,100,119,97,114,101,32,116,104,114,101,97,100,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,73,110,116,101,108,32,104,121,112,101,114,45,116,104,114,101,97,100,115,41,46,10,10,65,32,108,101,118,101,108,32,105,110,32,116,101,114,109,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,99,97,110,32,98,101,32,111,109,105,116,116,101,100,32,105,102,32,111,110,108,121,32,111,110,101,32,101,110,116,114,121,32,101,120,105,115,116,115,32,97,110,100,10,96,73,110,102,111,76,105,115,116,96,32,105,115,32,101,109,112,116,121,46,10,10,96,116,104,114,101,97,100,96,32,99,97,110,32,111,110,108,121,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32,96,99,111,114,101,96,46,32,96,99,111,114,101,96,32,99,97,110,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,10,96,112,114,111,99,101,115,115,111,114,96,32,111,114,32,96,110,111,100,101,96,46,32,96,112,114,111,99,101,115,115,111,114,96,32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,10,96,110,111,100,101,96,46,32,96,110,111,100,101,96,32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32,96,112,114,111,99,101,115,115,111,114,96,46,32,84,104,97,116,10,105,115,44,32,78,85,77,65,32,110,111,100,101,115,32,99,97,110,32,98,101,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,111,114,32,112,114,111,99,101,115,115,111,114,32,101,120,116,101,114,110,97,108,46,32,65,32,67,80,85,10,116,111,112,111,108,111,103,121,32,99,97,110,32,99,111,110,115,105,115,116,32,111,102,32,97,32,109,105,120,32,111,102,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,78,85,77,65,32,110,111,100,101,115,44,10,97,115,32,108,111,110,103,32,97,115,32,101,97,99,104,32,108,111,103,105,99,97,108,32,67,80,85,32,98,101,108,111,110,103,115,32,116,111,32,95,111,110,101,95,32,78,85,77,65,32,110,111,100,101,46,32,67,97,99,104,101,32,104,105,101,114,97,114,99,104,121,32,105,115,10,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,116,121,112,101,44,32,98,117,116,32,119,105,108,108,32,98,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,79,116,104,101,114,10,116,104,105,110,103,115,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,105,116,32,105,110,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,83,111,44,32,101,120,112,101,99,116,10,116,104,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,116,121,112,101,32,116,111,32,99,104,97,110,103,101,46>>},#{exported => false,specification => [{attribute,{9651,2},type,{cpu_topology,{type,{9652,9},union,[{type,{9652,9},list,[{ann_type,{9652,10},[{var,{9652,10},'LevelEntry'},{user_type,{9652,24},level_entry,[]}]}]},{atom,{9652,41},undefined}]},[]}}]}},{{type,trace_pattern_flag,0},{9567,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,trace_match_spec,0},{9546,2},[<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99,40,41>>],none,#{exported => false}},{{type,trace_pattern_mfa,0},{9544,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97,40,41>>],none,#{exported => false}},{{type,match_variable,0},{9543,2},[<<109,97,116,99,104,95,118,97,114,105,97,98,108,101,40,41>>],none,#{exported => false}},{{type,scheduler_bind_type,0},{8751,2},[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41>>],#{<<101,110>> => <<84,104,101,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,46>>},#{exported => false,specification => [{attribute,{8752,2},type,{scheduler_bind_type,{type,{8753,7},union,[{atom,{8753,7},no_node_processor_spread},{atom,{8754,7},no_node_thread_spread},{atom,{8755,7},no_spread},{atom,{8756,7},processor_spread},{atom,{8757,7},spread},{atom,{8758,7},thread_spread},{atom,{8759,7},thread_no_node_processor_spread},{atom,{8760,7},unbound}]},[]}}]}},{{type,stack_item,0},{7793,2},[<<115,116,97,99,107,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,process_info_result_item,0},{7743,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,process_info_item,0},{7705,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,message_queue_data,0},{7359,2},[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41>>],#{<<101,110>> => <<83,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,80,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,100,97,116,97,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41>>},#{exported => true,specification => [{attribute,{7366,2},type,{message_queue_data,{type,{7367,2},union,[{atom,{7367,2},off_heap},{atom,{7367,13},on_heap}]},[]}}]}},{{type,priority_level,0},{7352,2},[<<112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41>>],#{<<101,110>> => <<80,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41>>},#{exported => true,specification => [{attribute,{7356,2},type,{priority_level,{type,{7357,7},union,[{atom,{7357,7},low},{atom,{7357,13},normal},{atom,{7357,22},high},{atom,{7357,29},max}]},[]}}]}},{{type,monitor_option,0},{4195,2},[<<109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41>>],#{<<101,110>> => <<83,101,101,32,96,109,111,110,105,116,111,114,47,51,96,46>>},#{exported => true,specification => [{attribute,{4196,2},type,{monitor_option,{type,{4196,27},union,[{type,{4196,27},tuple,[{atom,{4196,28},alias},{type,{4196,37},union,[{atom,{4196,37},explicit_unalias},{atom,{4196,58},demonitor},{atom,{4196,72},reply_demonitor}]}]},{type,{4197,27},tuple,[{atom,{4197,28},tag},{type,{4197,35},term,[]}]}]},[]}}]}},{{type,monitor_port_identifier,0},{4194,2},[<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,monitor_process_identifier,0},{4193,2},[<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,registered_process_identifier,0},{4192,2},[<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,registered_name,0},{4191,2},[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,40,41>>],none,#{exported => false}},{{type,halt_options,0},{3186,2},[<<104,97,108,116,95,111,112,116,105,111,110,115,40,41>>],none,#{exported => false}},{{type,trace_info_return,0},{633,2},[<<116,114,97,99,101,95,105,110,102,111,95,114,101,116,117,114,110,40,41>>],none,#{exported => false}},{{type,trace_info_flag,0},{617,2},[<<116,114,97,99,101,95,105,110,102,111,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,trace_info_item_result,0},{607,2},[<<116,114,97,99,101,95,105,110,102,111,95,105,116,101,109,95,114,101,115,117,108,116,40,41>>],none,#{exported => false}},{{type,trace_flag,0},{581,2},[<<116,114,97,99,101,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,bitstring_list,0},{578,2},[<<98,105,116,115,116,114,105,110,103,95,108,105,115,116,40,41>>],none,#{exported => false}},{{type,raise_stacktrace,0},{569,2},[<<114,97,105,115,101,95,115,116,97,99,107,116,114,97,99,101,40,41>>],#{<<101,110>> => <<65,32,101,120,116,101,110,100,101,100,32,96,116,58,115,116,97,99,107,116,114,97,99,101,47,48,96,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,96,114,97,105,115,101,47,51,96,46>>},#{exported => true,specification => [{attribute,{572,2},type,{raise_stacktrace,{type,{573,7},union,[{type,{573,7},list,[{type,{573,8},union,[{type,{573,8},tuple,[{type,{573,9},module,[]},{type,{573,19},atom,[]},{type,{573,27},union,[{type,{573,27},arity,[]},{type,{573,37},list,[{type,{573,38},term,[]}]}]}]},{type,{574,8},tuple,[{type,{574,9},function,[]},{type,{574,21},union,[{type,{574,21},arity,[]},{type,{574,31},list,[{type,{574,32},term,[]}]}]}]}]}]},{user_type,{575,9},stacktrace,[]}]},[]}}]}},{{type,system_monitor_option,0},{560,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,system_profile_option,0},{551,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,fun_info_item,0},{533,2},[<<102,117,110,95,105,110,102,111,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,iovec,0},{396,2},[<<105,111,118,101,99,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,102,117,108,32,116,111,32,117,115,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,10,91,96,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,96,93,40,101,114,108,95,110,105,102,46,109,100,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,41,46>>},#{exported => true,specification => [{attribute,{400,2},type,{iovec,{type,{400,18},list,[{type,{400,19},binary,[]}]},[]}}]}},{{type,dist_handle,0},{392,2},[<<100,105,115,116,95,104,97,110,100,108,101,40,41>>],#{<<101,110>> => <<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>},#{exported => true,specification => [{attribute,{393,2},opaque,{dist_handle,{type,{393,26},atom,[]},[]}}]}},{{type,nif_resource,0},{385,2},[<<110,105,102,95,114,101,115,111,117,114,99,101,40,41>>],#{<<101,110>> => <<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,10,91,78,73,70,32,114,101,115,111,117,114,99,101,32,111,98,106,101,99,116,32,93,40,101,114,108,95,110,105,102,46,109,100,35,114,101,115,111,117,114,99,101,95,111,98,106,101,99,116,115,41,46>>},#{exported => true,specification => [{attribute,{389,2},opaque,{nif_resource,{type,{389,27},reference,[]},[]}}]}},{{type,prepared_code,0},{382,2},[<<112,114,101,112,97,114,101,100,95,99,111,100,101,40,41>>],none,#{exported => true}},{{type,deprecated_time_unit,0},{364,2},[<<100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41>>],#{<<101,110>> => <<84,104,101,32,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,32,116,121,112,101,32,97,108,115,111,32,99,111,110,115,105,115,116,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,95,100,101,112,114,101,99,97,116,101,100,95,32,115,121,109,98,111,108,105,99,10,116,105,109,101,32,117,110,105,116,115,58,10,10,45,32,42,42,96,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,109,105,108,108,105,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,109,105,108,108,105,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,109,105,99,114,111,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,109,105,99,114,111,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,110,97,110,111,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,110,97,110,111,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46>>},#{exported => true,specification => [{attribute,{376,2},type,{deprecated_time_unit,{type,{377,7},union,[{atom,{377,7},seconds},{atom,{378,9},milli_seconds},{atom,{379,9},micro_seconds},{atom,{380,9},nano_seconds}]},[]}}]}},{{type,time_unit,0},{295,2},[<<116,105,109,101,95,117,110,105,116,40,41>>],#{<<101,110>> => <<84,104,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,101,114,108,97,110,103,32,116,105,109,101,32,65,80,73,115,46,10,10,83,117,112,112,111,114,116,101,100,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,58,10,10,45,32,42,42,96,80,97,114,116,115,80,101,114,83,101,99,111,110,100,32,58,58,32,105,110,116,101,103,101,114,40,41,32,62,61,32,49,96,42,42,32,45,32,84,105,109,101,32,117,110,105,116,32,101,120,112,114,101,115,115,101,100,32,105,110,32,112,97,114,116,115,32,112,101,114,10,32,32,115,101,99,111,110,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,101,113,117,97,108,115,32,96,49,47,80,97,114,116,115,80,101,114,83,101,99,111,110,100,96,32,115,101,99,111,110,100,46,10,10,45,32,42,42,96,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,105,110,116,101,103,101,114,32,96,49,96,46,10,10,45,32,42,42,96,109,105,108,108,105,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,10,32,32,116,104,101,32,105,110,116,101,103,101,114,32,96,49,48,48,48,96,46,10,10,45,32,42,42,96,109,105,99,114,111,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,10,32,32,116,104,101,32,105,110,116,101,103,101,114,32,96,49,48,48,48,95,48,48,48,96,46,10,10,45,32,42,42,96,110,97,110,111,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,105,110,116,101,103,101,114,32,96,49,48,48,48,95,48,48,48,95,48,48,48,96,46,10,10,45,32,42,42,96,110,97,116,105,118,101,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,110,97,116,105,118,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,44,32,97,110,100,32,114,101,109,97,105,110,115,32,116,104,101,10,32,32,115,97,109,101,32,117,110,116,105,108,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,101,114,109,105,110,97,116,101,115,46,32,73,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,111,112,112,101,100,32,97,110,100,10,32,32,116,104,101,110,32,115,116,97,114,116,101,100,32,97,103,97,105,110,32,40,101,118,101,110,32,111,110,32,116,104,101,32,115,97,109,101,32,109,97,99,104,105,110,101,41,44,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,10,32,32,110,101,119,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,97,110,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,111,108,100,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,10,10,32,32,79,110,101,32,99,97,110,32,103,101,116,32,97,110,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,49,44,32,115,101,99,111,110,100,44,32,110,97,116,105,118,101,41,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,46,32,84,104,101,10,32,32,114,101,115,117,108,116,32,101,113,117,97,108,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,32,100,111,101,115,32,110,111,116,32,97,100,100,32,117,112,32,116,111,32,97,32,119,104,111,108,101,32,110,117,109,98,101,114,44,10,32,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,100,111,119,110,119,97,114,100,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,103,105,118,101,115,32,121,111,117,32,109,111,114,101,32,111,114,32,108,101,115,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,62,32,97,98,111,117,116,32,116,104,101,32,113,117,97,108,105,116,121,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,73,116,32,115,101,116,115,32,97,32,108,105,109,105,116,32,102,111,114,32,116,104,101,10,32,32,62,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,97,110,100,32,102,111,114,32,116,104,101,10,32,32,62,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,44,32,98,117,116,32,105,116,32,103,105,118,101,115,10,32,32,62,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,102,10,32,32,62,32,116,105,109,101,32,118,97,108,117,101,115,46,32,84,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,10,32,32,62,32,116,105,109,101,32,118,97,108,117,101,115,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,46,10,10,45,32,42,42,96,112,101,114,102,95,99,111,117,110,116,101,114,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,99,111,117,110,116,101,114,32,116,105,109,101,10,32,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,96,112,101,114,102,95,99,111,117,110,116,101,114,96,32,116,105,109,101,32,117,110,105,116,32,98,101,104,97,118,101,115,32,109,117,99,104,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,10,32,32,117,110,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,114,117,110,116,105,109,101,32,114,101,115,116,97,114,116,115,46,32,84,111,32,103,101,116,32,118,97,108,117,101,115,32,111,102,32,116,104,105,115,10,32,32,116,121,112,101,44,32,99,97,108,108,32,96,111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48,96,46,10,10,45,32,42,42,96,116,58,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,47,48,96,42,42,32,45,10,32,32,68,101,112,114,101,99,97,116,101,100,32,115,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,84,104,101,32,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,32,116,121,112,101,32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,111,32,99,111,110,118,101,114,116,32,116,105,109,101,32,118,97,108,117,101,115,32,98,101,116,119,101,101,110,32,116,105,109,101,10,117,110,105,116,115,44,32,117,115,101,32,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,46>>},#{exported => true,specification => [{attribute,{353,2},type,{time_unit,{type,{354,2},union,[{type,{354,2},pos_integer,[]},{atom,{355,9},second},{atom,{356,9},millisecond},{atom,{357,9},microsecond},{atom,{358,9},nanosecond},{atom,{359,9},native},{atom,{360,9},perf_counter},{user_type,{361,9},deprecated_time_unit,[]}]},[]}}]}},{{type,timestamp,0},{290,2},[<<116,105,109,101,115,116,97,109,112,40,41>>],#{<<101,110>> => <<83,101,101,32,91,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,47,48,96,93,40,96,116,105,109,101,115,116,97,109,112,47,48,96,41,46>>},#{exported => true,specification => [{attribute,{291,2},type,{timestamp,{type,{291,22},tuple,[{ann_type,{291,23},[{var,{291,23},'MegaSecs'},{type,{291,35},non_neg_integer,[]}]},{ann_type,{292,23},[{var,{292,23},'Secs'},{type,{292,31},non_neg_integer,[]}]},{ann_type,{293,23},[{var,{293,23},'MicroSecs'},{type,{293,36},non_neg_integer,[]}]}]},[]}}]}},{{type,ext_iovec,0},{285,2},[<<101,120,116,95,105,111,118,101,99,40,41>>],#{<<101,110>> => <<65,32,116,101,114,109,32,111,102,32,116,121,112,101,32,96,116,58,105,111,118,101,99,47,48,96,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,10,102,111,114,109,97,116,46>>},#{exported => false,specification => [{attribute,{289,2},type,{ext_iovec,{user_type,{289,22},iovec,[]},[]}}]}},{{type,ext_binary,0},{283,2},[<<101,120,116,95,98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>},#{exported => false,specification => [{attribute,{284,2},type,{ext_binary,{type,{284,23},binary,[]},[]}}]}},{{type,stacktrace,0},{274,2},[<<115,116,97,99,107,116,114,97,99,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,115,116,97,99,107,116,114,97,99,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,98,121,10,91,69,114,114,111,114,115,32,97,110,100,32,69,114,114,111,114,32,72,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,115,116,97,99,107,116,114,97,99,101,96,41,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,46>>},#{exported => true,specification => [{attribute,{279,2},type,{stacktrace,{type,{279,23},list,[{type,{279,24},union,[{type,{279,24},tuple,[{type,{279,25},module,[]},{type,{279,35},atom,[]},{type,{279,43},union,[{type,{279,43},arity,[]},{type,{279,53},list,[{type,{279,54},term,[]}]}]},{type,{280,25},list,[{user_type,{280,26},stacktrace_extrainfo,[]}]}]},{type,{281,24},tuple,[{type,{281,25},function,[]},{type,{281,37},union,[{type,{281,37},arity,[]},{type,{281,47},list,[{type,{281,48},term,[]}]}]},{type,{281,57},list,[{user_type,{281,58},stacktrace_extrainfo,[]}]}]}]}]},[]}}]}},{{type,stacktrace_extrainfo,0},{269,2},[<<115,116,97,99,107,116,114,97,99,101,95,101,120,116,114,97,105,110,102,111,40,41>>],none,#{exported => false}},{{type,tuple,0},{246,2},[<<116,117,112,108,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,116,117,112,108,101,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,116,117,112,108,101,96,41,46>>},#{exported => true,specification => [{attribute,{247,2},type,{tuple,{type,{247,18},tuple,any},[]}}]}},{{type,timeout,0},{241,2},[<<116,105,109,101,111,117,116,40,41>>],#{<<101,110>> => <<65,32,116,105,109,101,111,117,116,32,118,97,108,117,101,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,97,10,91,114,101,99,101,105,118,101,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,114,101,99,101,105,118,101,96,41,46>>},#{exported => true,specification => [{attribute,{245,2},type,{timeout,{type,{245,20},union,[{atom,{245,20},infinity},{type,{245,33},non_neg_integer,[]}]},[]}}]}},{{type,term,0},{239,2},[<<116,101,114,109,40,41>>],#{<<101,110>> => <<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32,96,116,58,97,110,121,47,48,96,46>>},#{exported => true,specification => [{attribute,{240,2},type,{term,{type,{240,17},any,[]},[]}}]}},{{type,string,0},{234,2},[<<115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,105,115,116,32,111,102,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,117,110,105,99,111,100,101,10,99,111,100,101,112,111,105,110,116,115,46>>},#{exported => true,specification => [{attribute,{238,2},type,{string,{type,{238,19},list,[{type,{238,20},char,[]}]},[]}}]}},{{type,reference,0},{232,2},[<<114,101,102,101,114,101,110,99,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,114,101,102,101,114,101,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,114,101,102,101,114,101,110,99,101,96,41,46>>},#{exported => true,specification => [{attribute,{233,2},type,{reference,{type,{233,22},reference,[]},[]}}]}},{{type,pos_integer,0},{230,2},[<<112,111,115,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,110,32,105,110,116,101,103,101,114,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46>>},#{exported => true,specification => [{attribute,{231,2},type,{pos_integer,{type,{231,24},pos_integer,[]},[]}}]}},{{type,port,0},{228,2},[<<112,111,114,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,112,111,114,116,45,105,100,101,110,116,105,102,105,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{229,2},type,{port,{type,{229,17},port,[]},[]}}]}},{{type,pid,0},{226,2},[<<112,105,100,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,112,105,100,96,41,46>>},#{exported => true,specification => [{attribute,{227,2},type,{pid,{type,{227,16},pid,[]},[]}}]}},{{type,number,0},{224,2},[<<110,117,109,98,101,114,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,110,117,109,98,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{225,2},type,{number,{type,{225,19},union,[{type,{225,19},integer,[]},{type,{225,31},float,[]}]},[]}}]}},{{type,nonempty_string,0},{222,2},[<<110,111,110,101,109,112,116,121,95,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,96,116,58,115,116,114,105,110,103,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,99,104,97,114,97,99,116,101,114,115,46>>},#{exported => true,specification => [{attribute,{223,2},type,{nonempty_string,{type,{223,28},nonempty_list,[{type,{223,42},char,[]}]},[]}}]}},{{type,nonempty_maybe_improper_list,2},{217,2},[<<110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41,93,40,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,41,10,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{221,2},type,{nonempty_maybe_improper_list,{type,{221,69},nonempty_maybe_improper_list,[{var,{221,98},'ContentType'},{var,{221,111},'TerminationType'}]},[{var,{221,36},'ContentType'},{var,{221,49},'TerminationType'}]}}]}},{{type,nonempty_maybe_improper_list,0},{215,2},[<<110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{216,2},type,{nonempty_maybe_improper_list,{type,{216,41},nonempty_maybe_improper_list,[{type,{216,70},any,[]},{type,{216,77},any,[]}]},[]}}]}},{{type,nonempty_list,1},{213,2},[<<110,111,110,101,109,112,116,121,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41,93,40,96,116,58,108,105,115,116,47,48,96,41,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{214,2},type,{nonempty_list,{type,{214,37},nonempty_list,[{var,{214,38},'ContentType'}]},[{var,{214,21},'ContentType'}]}}]}},{{type,nonempty_list,0},{211,2},[<<110,111,110,101,109,112,116,121,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,96,116,58,108,105,115,116,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{212,2},type,{nonempty_list,{type,{212,26},nonempty_list,[{type,{212,40},any,[]}]},[]}}]}},{{type,nonempty_improper_list,2},{208,2},[<<110,111,110,101,109,112,116,121,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,50,93,40,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,41,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{209,2},type,{nonempty_improper_list,{type,{210,9},nonempty_improper_list,[{var,{210,32},'ContentType'},{var,{210,45},'TerminationType'}]},[{var,{209,30},'ContentType'},{var,{209,43},'TerminationType'}]}}]}},{{type,nonempty_bitstring,0},{206,2},[<<110,111,110,101,109,112,116,121,95,98,105,116,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,96,116,58,98,105,116,115,116,114,105,110,103,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>},#{exported => true,specification => [{attribute,{207,2},type,{nonempty_bitstring,{type,{207,31},binary,[{integer,{207,35},1},{integer,{207,42},1}]},[]}}]}},{{type,nonempty_binary,0},{204,2},[<<110,111,110,101,109,112,116,121,95,98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,32,96,116,58,98,105,110,97,114,121,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>},#{exported => true,specification => [{attribute,{205,2},type,{nonempty_binary,{type,{205,28},binary,[{integer,{205,32},8},{integer,{205,39},8}]},[]}}]}},{{type,none,0},{197,2},[<<110,111,110,101,40,41>>],#{<<101,110>> => <<84,104,105,115,32,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,95,110,101,118,101,114,95,32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,59,32,116,104,97,116,32,105,115,10,105,116,32,119,105,108,108,32,95,97,108,119,97,121,115,95,32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46,10,10,73,110,32,97,32,115,112,101,99,44,32,117,115,101,32,96,116,58,110,111,95,114,101,116,117,114,110,47,48,96,32,102,111,114,32,116,104,101,32,115,97,107,101,32,111,102,32,99,108,97,114,105,116,121,46>>},#{exported => true,specification => [{attribute,{203,2},type,{none,{type,{203,17},none,[]},[]}}]}},{{type,non_neg_integer,0},{195,2},[<<110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,97,110,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,111,114,32,48,46>>},#{exported => true,specification => [{attribute,{196,2},type,{non_neg_integer,{type,{196,28},non_neg_integer,[]},[]}}]}},{{type,node,0},{193,2},[<<110,111,100,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,110,111,100,101,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,35,110,111,100,101,115,96,41,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>},#{exported => true,specification => [{attribute,{194,2},type,{node,{type,{194,17},atom,[]},[]}}]}},{{type,no_return,0},{188,2},[<<110,111,95,114,101,116,117,114,110,40,41>>],#{<<101,110>> => <<84,104,101,32,116,121,112,101,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,95,110,101,118,101,114,95,32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,44,32,116,104,97,116,32,105,115,32,105,116,10,119,105,108,108,32,95,97,108,119,97,121,115,95,32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>},#{exported => true,specification => [{attribute,{192,2},type,{no_return,{type,{192,22},none,[]},[]}}]}},{{type,nil,0},{186,2},[<<110,105,108,40,41>>],#{<<101,110>> => <<84,104,101,32,101,109,112,116,121,32,96,116,58,108,105,115,116,47,48,96,46>>},#{exported => true,specification => [{attribute,{187,2},type,{nil,{type,{187,16},nil,[]},[]}}]}},{{type,neg_integer,0},{184,2},[<<110,101,103,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{185,2},type,{neg_integer,{type,{185,24},neg_integer,[]},[]}}]}},{{type,module,0},{182,2},[<<109,111,100,117,108,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>},#{exported => true,specification => [{attribute,{183,2},type,{module,{type,{183,19},atom,[]},[]}}]}},{{type,mfa,0},{180,2},[<<109,102,97,40,41>>],#{<<101,110>> => <<65,32,116,104,114,101,101,45,116,117,112,108,101,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,102,117,110,99,116,105,111,110,32,115,105,103,110,97,116,117,114,101,46>>},#{exported => true,specification => [{attribute,{181,2},type,{mfa,{type,{181,16},tuple,[{type,{181,17},module,[]},{type,{181,26},atom,[]},{type,{181,33},arity,[]}]},[]}}]}},{{type,maybe_improper_list,2},{173,2},[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,44,32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,10,119,105,116,104,32,97,32,91,96,91,93,96,93,40,96,116,58,110,105,108,47,48,96,41,44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,102,32,116,104,101,32,116,121,112,101,10,96,67,111,110,116,101,110,116,84,121,112,101,96,46>>},#{exported => true,specification => [{attribute,{178,2},type,{maybe_improper_list,{type,{179,9},maybe_improper_list,[{var,{179,29},'ContentType'},{var,{179,42},'TerminationType'}]},[{var,{178,27},'ContentType'},{var,{178,40},'TerminationType'}]}}]}},{{type,maybe_improper_list,0},{168,2},[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,10,119,105,116,104,32,97,32,91,96,91,93,96,93,40,96,116,58,110,105,108,47,48,96,41,44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,99,97,110,32,98,101,32,111,102,32,97,110,121,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{172,2},type,{maybe_improper_list,{type,{172,32},maybe_improper_list,[{type,{172,52},any,[]},{type,{172,59},any,[]}]},[]}}]}},{{type,map,0},{163,2},[<<109,97,112,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,109,97,112,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,109,97,112,96,41,32,99,111,110,116,97,105,110,105,110,103,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,107,101,121,32,97,110,100,10,118,97,108,117,101,32,97,115,115,111,99,105,97,116,105,111,110,115,46>>},#{exported => true,specification => [{attribute,{167,2},type,{map,{type,{167,16},map,[{type,{167,25},map_field_assoc,[{type,{167,19},any,[]},{type,{167,28},any,[]}]}]},[]}}]}},{{type,list,1},{158,2},[<<108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,116,104,101,32,116,121,112,101,10,96,67,111,110,116,101,110,116,84,121,112,101,96,46>>},#{exported => true,specification => [{attribute,{162,2},type,{list,{type,{162,28},list,[{var,{162,29},'ContentType'}]},[{var,{162,12},'ContentType'}]}}]}},{{type,list,0},{156,2},[<<108,105,115,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,97,110,121,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{157,2},type,{list,{type,{157,17},list,[{type,{157,18},any,[]}]},[]}}]}},{{type,iolist,0},{147,2},[<<105,111,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,10,10,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,32,97,110,121,10,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32,96,102,105,108,101,58,119,114,105,116,101,47,50,96,32,111,114,32,96,103,101,110,95,116,99,112,58,115,101,110,100,47,50,96,46,10,10,73,110,32,109,111,115,116,32,117,115,101,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,96,116,58,105,111,100,97,116,97,47,48,96,32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{155,2},type,{iolist,{type,{155,19},maybe_improper_list,[{type,{155,39},union,[{type,{155,39},byte,[]},{type,{155,48},binary,[]},{type,{155,59},iolist,[]}]},{type,{155,69},union,[{type,{155,69},binary,[]},{type,{155,80},nil,[]}]}]},[]}}]}},{{type,iodata,0},{136,2},[<<105,111,100,97,116,97,40,41>>],#{<<101,110>> => <<65,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,10,10,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,10,97,110,121,32,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32,96,102,105,108,101,58,119,114,105,116,101,47,50,96,32,111,114,32,96,103,101,110,95,116,99,112,58,115,101,110,100,47,50,96,46,10,10,84,111,32,99,111,110,118,101,114,116,32,97,110,32,96,116,58,105,111,100,97,116,97,47,48,96,32,116,101,114,109,32,116,111,32,96,116,58,98,105,110,97,114,121,47,48,96,32,121,111,117,32,99,97,110,32,117,115,101,10,91,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,50,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,32,84,111,32,116,114,97,110,115,99,111,100,101,32,97,32,96,116,58,115,116,114,105,110,103,47,48,96,32,111,114,10,96,116,58,117,110,105,99,111,100,101,58,99,104,97,114,100,97,116,97,47,48,96,32,116,111,32,96,116,58,105,111,100,97,116,97,47,48,96,32,121,111,117,32,99,97,110,32,117,115,101,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,49,96,46>>},#{exported => true,specification => [{attribute,{146,2},type,{iodata,{type,{146,19},union,[{type,{146,19},iolist,[]},{type,{146,30},binary,[]}]},[]}}]}},{{type,integer,0},{134,2},[<<105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,105,110,116,101,103,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{135,2},type,{integer,{type,{135,20},integer,[]},[]}}]}},{{type,identifier,0},{128,2},[<<105,100,101,110,116,105,102,105,101,114,40,41>>],#{<<101,110>> => <<65,110,32,117,110,105,113,117,101,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,115,111,109,101,32,101,110,116,105,116,121,44,32,102,111,114,32,101,120,97,109,112,108,101,32,97,10,91,112,114,111,99,101,115,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,96,41,44,32,91,112,111,114,116,93,40,96,101,58,115,121,115,116,101,109,58,112,111,114,116,115,46,109,100,35,112,111,114,116,115,96,41,32,111,114,10,91,109,111,110,105,116,111,114,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46>>},#{exported => true,specification => [{attribute,{133,2},type,{identifier,{type,{133,23},union,[{type,{133,23},pid,[]},{type,{133,31},port,[]},{type,{133,40},reference,[]}]},[]}}]}},{{type,function,0},{126,2},[<<102,117,110,99,116,105,111,110,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,102,117,110,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,117,110,96,41,46>>},#{exported => true,specification => [{attribute,{127,2},type,{function,{type,{127,21},'fun',[]},[]}}]}},{{type,float,0},{124,2},[<<102,108,111,97,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,102,108,111,97,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{125,2},type,{float,{type,{125,18},float,[]},[]}}]}},{{type,dynamic,0},{122,2},[<<100,121,110,97,109,105,99,40,41>>],#{<<101,110>> => <<84,104,101,32,91,100,121,110,97,109,105,99,93,40,96,101,58,115,121,115,116,101,109,58,116,121,112,101,115,112,101,99,46,109,100,35,100,121,110,97,109,105,99,96,41,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{123,2},type,{dynamic,{type,{123,20},dynamic,[]},[]}}]}},{{type,char,0},{120,2},[<<99,104,97,114,40,41>>],#{<<101,110>> => <<65,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,32,111,114,32,97,32,96,109,58,117,110,105,99,111,100,101,96,32,99,111,100,101,112,111,105,110,116,32,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{121,2},type,{char,{type,{121,17},range,[{integer,{121,17},0},{integer,{121,20},1114111}]},[]}}]}},{{type,byte,0},{118,2},[<<98,121,116,101,40,41>>],#{<<101,110>> => <<65,32,98,121,116,101,32,111,102,32,100,97,116,97,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{119,2},type,{byte,{type,{119,17},range,[{integer,{119,17},0},{integer,{119,20},255}]},[]}}]}},{{type,boolean,0},{116,2},[<<98,111,111,108,101,97,110,40,41>>],#{<<101,110>> => <<65,32,91,98,111,111,108,101,97,110,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,111,111,108,101,97,110,96,41,32,118,97,108,117,101,46>>},#{exported => true,specification => [{attribute,{117,2},type,{boolean,{type,{117,20},union,[{atom,{117,20},true},{atom,{117,27},false}]},[]}}]}},{{type,bool,0},{114,2},[<<98,111,111,108,40,41>>],hidden,#{exported => true}},{{type,bitstring,0},{112,2},[<<98,105,116,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,98,105,116,115,116,114,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115,96,41,46>>},#{exported => true,specification => [{attribute,{113,2},type,{bitstring,{type,{113,22},binary,[{integer,113,0},{integer,{113,28},1}]},[]}}]}},{{type,binary,0},{107,2},[<<98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,98,105,110,97,114,121,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115,96,41,44,32,116,104,97,116,32,105,115,44,10,97,32,98,105,116,115,116,114,105,110,103,32,119,105,116,104,32,97,32,115,105,122,101,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,46>>},#{exported => true,specification => [{attribute,{111,2},type,{binary,{type,{111,19},binary,[{integer,111,0},{integer,{111,25},8}]},[]}}]}},{{type,atom,0},{105,2},[<<97,116,111,109,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,97,116,111,109,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,97,116,111,109,96,41,46>>},#{exported => true,specification => [{attribute,{106,2},type,{atom,{type,{106,17},atom,[]},[]}}]}},{{type,arity,0},{103,2},[<<97,114,105,116,121,40,41>>],#{<<101,110>> => <<84,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,111,114,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{104,2},type,{arity,{type,{104,18},arity,[]},[]}}]}},{{type,any,0},{101,2},[<<97,110,121,40,41>>],#{<<101,110>> => <<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32,96,116,58,116,101,114,109,47,48,96,46>>},#{exported => true,specification => [{attribute,{102,2},type,{any,{type,{102,16},any,[]},[]}}]}},{{function,'!',2},{12744,2},[<<39,33,39,40,68,115,116,44,32,77,115,103,41>>],hidden,#{}},{{function,'not',1},{12739,2},[<<39,110,111,116,39,40,65,41>>],hidden,#{}},{{function,'xor',2},{12735,2},[<<39,120,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'or',2},{12730,2},[<<39,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'and',2},{12726,2},[<<39,97,110,100,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'++',2},{12721,2},[<<39,43,43,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'--',2},{12717,2},[<<39,45,45,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bnot',1},{12712,2},[<<39,98,110,111,116,39,40,65,41>>],hidden,#{}},{{function,'bxor',2},{12708,2},[<<39,98,120,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'band',2},{12704,2},[<<39,98,97,110,100,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bor',2},{12700,2},[<<39,98,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bsr',2},{12696,2},[<<39,98,115,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bsl',2},{12692,2},[<<39,98,115,108,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'rem',2},{12688,2},[<<39,114,101,109,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'div',2},{12684,2},[<<39,100,105,118,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'*',2},{12680,2},[<<39,42,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'/',2},{12676,2},[<<39,47,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'+',2},{12672,2},[<<39,43,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'-',2},{12668,2},[<<39,45,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'+',1},{12664,2},[<<39,43,39,40,65,41>>],hidden,#{}},{{function,'-',1},{12660,2},[<<39,45,39,40,65,41>>],hidden,#{}},{{function,'>',2},{12655,2},[<<39,62,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'<',2},{12651,2},[<<39,60,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'>=',2},{12647,2},[<<39,62,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=<',2},{12643,2},[<<39,61,60,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=/=',2},{12639,2},[<<39,61,47,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'/=',2},{12635,2},[<<39,47,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=:=',2},{12631,2},[<<39,61,58,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'==',2},{12627,2},[<<39,61,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,gather_gc_info_result,1},{12610,2},[<<103,97,116,104,101,114,95,103,99,95,105,110,102,111,95,114,101,115,117,108,116,40,82,101,102,41>>],hidden,#{}},{{function,alloc_sizes,1},{12563,2},[<<97,108,108,111,99,95,115,105,122,101,115,40,65,108,108,111,99,115,41>>],hidden,#{}},{{function,alloc_info,1},{12559,2},[<<97,108,108,111,99,95,105,110,102,111,40,65,108,108,111,99,115,41>>],hidden,#{}},{{function,memory,1},{12319,2},[<<109,101,109,111,114,121,47,49>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,109,101,109,111,114,121,32,111,102,32,116,121,112,101,32,96,84,121,112,101,96,46,32,84,104,101,10,97,114,103,117,109,101,110,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,32,111,102,32,96,116,58,109,101,109,111,114,121,95,116,121,112,101,47,48,96,32,97,116,111,109,115,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,10,97,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,115,116,32,111,102,32,96,123,109,101,109,111,114,121,95,116,121,112,101,40,41,44,32,83,105,122,101,32,58,58,32,105,110,116,101,103,101,114,32,62,61,32,48,125,96,32,116,117,112,108,101,115,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,49,96,32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,10,62,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,84,121,112,101,96,32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,116,121,112,101,115,32,108,105,115,116,101,100,32,105,110,32,116,104,101,10,32,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,93,40,96,109,101,109,111,114,121,47,48,96,41,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,109,97,120,105,109,117,109,96,32,105,115,32,112,97,115,115,101,100,32,97,115,32,96,84,121,112,101,96,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,110,111,116,32,114,117,110,32,105,110,10,32,32,105,110,115,116,114,117,109,101,110,116,101,100,32,109,111,100,101,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,97,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,10,32,32,100,105,115,97,98,108,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,93,40,96,109,101,109,111,114,121,47,48,96,41,46>>},#{group => system,specification => [{attribute,{12344,2},spec,{{memory,1},[{type,{12344,13},'fun',[{type,{12344,13},product,[{ann_type,{12344,14},[{var,{12344,14},'Type'},{user_type,{12344,22},memory_type,[]}]}]},{type,{12344,40},non_neg_integer,[]}]},{type,{12345,20},'fun',[{type,{12345,20},product,[{ann_type,{12345,21},[{var,{12345,21},'TypeList'},{type,{12345,33},list,[{user_type,{12345,34},memory_type,[]}]}]}]},{type,{12345,53},list,[{type,{12345,54},tuple,[{user_type,{12345,55},memory_type,[]},{type,{12345,70},non_neg_integer,[]}]}]}]}]}}]}},{{function,memory,0},{12202,2},[<<109,101,109,111,114,121,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,10,101,109,117,108,97,116,111,114,46,10,10,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,32,96,123,84,121,112,101,44,32,83,105,122,101,125,96,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,96,84,121,112,101,96,10,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,109,101,109,111,114,121,32,116,121,112,101,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,10,105,110,32,98,121,116,101,115,46,10,10,77,101,109,111,114,121,32,116,121,112,101,115,58,10,10,45,32,42,42,96,116,111,116,97,108,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,10,32,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,102,111,114,32,96,112,114,111,99,101,115,115,101,115,96,32,97,110,100,32,96,115,121,115,116,101,109,96,46,10,10,45,32,42,42,96,112,114,111,99,101,115,115,101,115,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,10,32,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,10,10,45,32,42,42,96,112,114,111,99,101,115,115,101,115,95,117,115,101,100,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,112,114,111,99,101,115,115,101,115,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,115,121,115,116,101,109,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,10,32,32,116,104,97,116,32,105,115,32,110,111,116,32,100,105,114,101,99,116,108,121,32,114,101,108,97,116,101,100,32,116,111,32,97,110,121,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,77,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,10,32,32,96,112,114,111,99,101,115,115,101,115,96,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,101,109,111,114,121,46,32,96,109,58,105,110,115,116,114,117,109,101,110,116,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,10,32,32,97,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,98,114,101,97,107,100,111,119,110,32,111,102,32,119,104,97,116,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,105,115,32,116,121,112,101,46,10,10,45,32,42,42,96,97,116,111,109,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,10,32,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,97,116,111,109,95,117,115,101,100,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,10,32,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,97,116,111,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,98,105,110,97,114,105,101,115,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,99,111,100,101,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,114,108,97,110,103,32,99,111,100,101,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,101,116,115,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,84,83,32,116,97,98,108,101,115,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,109,97,120,105,109,117,109,96,42,42,32,45,32,84,104,101,32,109,97,120,105,109,117,109,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,115,105,110,99,101,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,105,115,32,111,110,108,121,32,112,114,101,115,101,110,116,32,119,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,10,32,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,114,117,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,115,101,101,10,32,32,96,109,58,105,110,115,116,114,117,109,101,110,116,96,32,97,110,100,47,111,114,32,91,96,101,114,108,40,49,41,96,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,46,32,83,111,109,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,114,116,10,62,32,111,102,32,116,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,116,46,10,62,10,62,32,87,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,32,105,115,32,109,111,114,101,10,62,32,97,99,99,117,114,97,116,101,44,32,98,117,116,32,109,101,109,111,114,121,32,100,105,114,101,99,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,96,109,97,108,108,111,99,96,32,40,97,110,100,32,102,114,105,101,110,100,115,41,32,105,115,32,115,116,105,108,108,10,62,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,46,32,68,105,114,101,99,116,32,99,97,108,108,115,32,116,111,32,96,109,97,108,108,111,99,96,32,97,114,101,32,111,110,108,121,32,100,111,110,101,32,102,114,111,109,10,62,32,79,83,45,115,112,101,99,105,102,105,99,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,97,110,100,32,112,101,114,104,97,112,115,32,102,114,111,109,32,117,115,101,114,45,105,109,112,108,101,109,101,110,116,101,100,32,69,114,108,97,110,103,32,100,114,105,118,101,114,115,10,62,32,116,104,97,116,32,100,111,32,110,111,116,32,117,115,101,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,100,114,105,118,101,114,32,105,110,116,101,114,102,97,99,101,46,10,62,10,62,32,65,115,32,116,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,96,112,114,111,99,101,115,115,101,115,96,32,97,110,100,32,96,115,121,115,116,101,109,96,44,32,116,104,101,32,101,114,114,111,114,32,105,110,10,62,32,96,115,121,115,116,101,109,96,32,112,114,111,112,97,103,97,116,101,115,32,116,111,32,116,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,46,10,62,10,62,32,84,104,101,32,100,105,102,102,101,114,101,110,116,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,97,114,101,32,115,117,109,109,101,100,32,97,114,101,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,44,10,62,32,119,104,105,99,104,32,105,110,116,114,111,100,117,99,101,115,32,97,110,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,10,10,84,104,101,32,100,105,102,102,101,114,101,110,116,32,118,97,108,117,101,115,32,104,97,118,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,108,97,116,105,111,110,32,116,111,32,101,97,99,104,32,111,116,104,101,114,46,32,86,97,108,117,101,115,32,98,101,103,105,110,110,105,110,103,10,119,105,116,104,32,97,110,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,96,96,96,116,101,120,116,10,116,111,116,97,108,32,32,32,32,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,115,121,115,116,101,109,10,112,114,111,99,101,115,115,101,115,32,32,61,32,112,114,111,99,101,115,115,101,115,95,117,115,101,100,32,43,32,80,114,111,99,101,115,115,101,115,78,111,116,85,115,101,100,10,115,121,115,116,101,109,32,32,32,32,32,61,32,97,116,111,109,32,43,32,98,105,110,97,114,121,32,43,32,99,111,100,101,32,43,32,101,116,115,32,43,32,79,116,104,101,114,83,121,115,116,101,109,10,97,116,111,109,32,32,32,32,32,32,32,61,32,97,116,111,109,95,117,115,101,100,32,43,32,65,116,111,109,78,111,116,85,115,101,100,10,82,101,97,108,84,111,116,97,108,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,82,101,97,108,83,121,115,116,101,109,10,82,101,97,108,83,121,115,116,101,109,32,61,32,115,121,115,116,101,109,32,43,32,77,105,115,115,101,100,83,121,115,116,101,109,10,96,96,96,10,10,77,111,114,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,10,62,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,104,97,114,101,100,32,108,105,98,114,97,114,105,101,115,44,32,116,104,101,32,99,111,100,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,116,115,101,108,102,44,10,62,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,115,116,97,99,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,96,116,111,116,97,108,96,10,62,32,118,97,108,117,101,32,105,115,32,95,110,111,116,95,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,97,108,108,32,112,97,103,101,115,32,109,97,112,112,101,100,32,116,111,10,62,32,116,104,101,32,101,109,117,108,97,116,111,114,46,10,62,10,62,32,65,108,115,111,44,32,98,101,99,97,117,115,101,32,111,102,32,102,114,97,103,109,101,110,116,97,116,105,111,110,32,97,110,100,32,112,114,101,114,101,115,101,114,118,97,116,105,111,110,32,111,102,32,109,101,109,111,114,121,32,97,114,101,97,115,44,32,116,104,101,32,115,105,122,101,32,111,102,10,62,32,116,104,101,32,109,101,109,111,114,121,32,115,101,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,99,97,110,32,98,101,10,62,32,109,117,99,104,32,108,97,114,103,101,114,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,10,62,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46,10,10,70,97,105,108,117,114,101,58,32,96,110,111,116,115,117,112,96,32,105,102,32,97,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,10,100,105,115,97,98,108,101,100,46>>},#{group => system,specification => [{attribute,{12300,2},spec,{{memory,0},[{type,{12300,13},bounded_fun,[{type,{12300,13},'fun',[{type,{12300,13},product,[]},{type,{12300,19},list,[{type,{12300,20},tuple,[{var,{12300,21},'Type'},{var,{12300,27},'Size'}]}]}]},[{type,{12301,7},constraint,[{atom,{12301,7},is_subtype},[{var,{12301,7},'Type'},{user_type,{12301,15},memory_type,[]}]]},{type,{12302,7},constraint,[{atom,{12302,7},is_subtype},[{var,{12302,7},'Size'},{type,{12302,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,max,2},{12134,2},[<<109,97,120,40,84,101,114,109,49,44,32,84,101,114,109,50,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,111,102,32,96,84,101,114,109,49,96,32,97,110,100,32,96,84,101,114,109,50,96,46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,10,96,61,61,96,32,111,112,101,114,97,116,111,114,44,32,96,84,101,114,109,49,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,101,32,91,69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115,96,41,32,99,111,110,116,97,105,110,115,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32,96,61,61,96,32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,44,32,50,41,46,10,50,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,46,48,44,32,49,41,46,10,49,46,48,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,44,32,49,46,48,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,98,34,10,96,96,96,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,115,32,116,101,115,116,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46>>},#{group => terms,specification => [{attribute,{12168,2},spec,{{max,2},[{type,{12168,10},bounded_fun,[{type,{12168,10},'fun',[{type,{12168,10},product,[{var,{12168,11},'Term1'},{var,{12168,18},'Term2'}]},{var,{12168,28},'Maximum'}]},[{type,{12169,7},constraint,[{atom,{12169,7},is_subtype},[{var,{12169,7},'Term1'},{type,{12169,16},term,[]}]]},{type,{12170,7},constraint,[{atom,{12170,7},is_subtype},[{var,{12170,7},'Term2'},{type,{12170,16},term,[]}]]},{type,{12171,7},constraint,[{atom,{12171,7},is_subtype},[{var,{12171,7},'Maximum'},{type,{12171,18},term,[]}]]}]]}]}}]}},{{function,min,2},{12090,2},[<<109,105,110,40,84,101,114,109,49,44,32,84,101,114,109,50,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,96,84,101,114,109,49,96,32,97,110,100,32,96,84,101,114,109,50,96,46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,10,96,61,61,96,32,111,112,101,114,97,116,111,114,44,32,96,84,101,114,109,49,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,101,32,91,69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115,96,41,32,99,111,110,116,97,105,110,115,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32,96,61,61,96,32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,44,32,50,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,46,48,44,32,49,41,46,10,49,46,48,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,44,32,49,46,48,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,97,98,99,34,10,96,96,96,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,115,32,116,101,115,116,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46>>},#{group => terms,specification => [{attribute,{12124,2},spec,{{min,2},[{type,{12124,10},bounded_fun,[{type,{12124,10},'fun',[{type,{12124,10},product,[{var,{12124,11},'Term1'},{var,{12124,18},'Term2'}]},{var,{12124,28},'Minimum'}]},[{type,{12125,7},constraint,[{atom,{12125,7},is_subtype},[{var,{12125,7},'Term1'},{type,{12125,16},term,[]}]]},{type,{12126,7},constraint,[{atom,{12126,7},is_subtype},[{var,{12126,7},'Term2'},{type,{12126,16},term,[]}]]},{type,{12127,7},constraint,[{atom,{12127,7},is_subtype},[{var,{12127,7},'Minimum'},{type,{12127,18},term,[]}]]}]]}]}}]}},{{function,format_cpu_topology,1},{12047,2},[<<102,111,114,109,97,116,95,99,112,117,95,116,111,112,111,108,111,103,121,40,73,110,116,101,114,110,97,108,67,112,117,84,111,112,111,108,111,103,121,41>>],hidden,#{}},{{function,set_cpu_topology,1},{11955,2},[<<115,101,116,95,99,112,117,95,116,111,112,111,108,111,103,121,40,67,112,117,84,111,112,111,108,111,103,121,41>>],hidden,#{}},{{function,integer_to_binary,2},{11924,2},[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,73,110,116,101,103,101,114,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,32,105,110,32,98,97,115,101,10,96,66,97,115,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,49,48,50,51,44,32,49,54,41,46,10,60,60,34,51,70,70,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{11937,2},spec,{{integer_to_binary,2},[{type,{11937,24},bounded_fun,[{type,{11937,24},'fun',[{type,{11937,24},product,[{var,{11937,25},'Integer'},{var,{11937,34},'Base'}]},{type,{11937,43},binary,[]}]},[{type,{11938,7},constraint,[{atom,{11938,7},is_subtype},[{var,{11938,7},'Integer'},{type,{11938,18},integer,[]}]]},{type,{11939,7},constraint,[{atom,{11939,7},is_subtype},[{var,{11939,7},'Base'},{type,{11939,15},range,[{integer,{11939,15},2},{integer,{11939,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_list,2},{11906,2},[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,73,110,116,101,103,101,114,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,32,105,110,32,98,97,115,101,10,96,66,97,115,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,49,48,50,51,44,32,49,54,41,46,10,34,51,70,70,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{11918,2},spec,{{integer_to_list,2},[{type,{11918,22},bounded_fun,[{type,{11918,22},'fun',[{type,{11918,22},product,[{var,{11918,23},'Integer'},{var,{11918,32},'Base'}]},{type,{11918,41},string,[]}]},[{type,{11919,7},constraint,[{atom,{11919,7},is_subtype},[{var,{11919,7},'Integer'},{type,{11919,18},integer,[]}]]},{type,{11920,7},constraint,[{atom,{11920,7},is_subtype},[{var,{11920,7},'Base'},{type,{11920,15},range,[{integer,{11920,15},2},{integer,{11920,18},36}]}]]}]]}]}}]}},{{function,get_cookie,1},{11891,2},[<<103,101,116,95,99,111,111,107,105,101,40,78,111,100,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32,110,111,100,101,32,96,78,111,100,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,10,116,104,101,32,97,116,111,109,32,96,110,111,99,111,111,107,105,101,96,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,96,115,101,116,95,99,111,111,107,105,101,47,50,96,46>>},#{group => distribution,specification => [{attribute,{11897,2},spec,{{get_cookie,1},[{type,{11897,17},bounded_fun,[{type,{11897,17},'fun',[{type,{11897,17},product,[{var,{11897,18},'Node'}]},{type,{11897,27},union,[{var,{11897,27},'Cookie'},{atom,{11897,36},nocookie}]}]},[{type,{11898,7},constraint,[{atom,{11898,7},is_subtype},[{var,{11898,7},'Node'},{type,{11898,15},node,[]}]]},{type,{11899,7},constraint,[{atom,{11899,7},is_subtype},[{var,{11899,7},'Cookie'},{type,{11899,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,get_cookie,0},{11881,2},[<<103,101,116,95,99,111,111,107,105,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,97,116,111,109,32,96,110,111,99,111,111,107,105,101,96,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,96,115,101,116,95,99,111,111,107,105,101,47,49,96,46>>},#{group => distribution,specification => [{attribute,{11886,2},spec,{{get_cookie,0},[{type,{11886,17},bounded_fun,[{type,{11886,17},'fun',[{type,{11886,17},product,[]},{type,{11886,23},union,[{var,{11886,23},'Cookie'},{atom,{11886,32},nocookie}]}]},[{type,{11887,7},constraint,[{atom,{11887,7},is_subtype},[{var,{11887,7},'Cookie'},{type,{11887,17},atom,[]}]]}]]}]}}]}},{{function,set_cookie,2},{11858,2},[<<115,101,116,95,99,111,111,107,105,101,40,78,111,100,101,44,32,67,111,111,107,105,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32,96,78,111,100,101,96,32,116,111,32,116,104,101,32,97,116,111,109,32,96,67,111,111,107,105,101,96,46,32,73,102,32,96,78,111,100,101,96,32,105,115,32,116,104,101,32,108,111,99,97,108,10,110,111,100,101,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,115,101,116,115,32,116,104,101,32,99,111,111,107,105,101,32,111,102,32,97,108,108,32,111,116,104,101,114,32,110,111,100,101,115,32,40,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,10,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,41,32,116,111,32,96,67,111,111,107,105,101,96,46,10,10,83,101,101,32,115,101,99,116,105,111,110,32,91,68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,96,41,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,89,111,117,32,99,97,110,32,103,101,116,32,116,104,105,115,32,118,97,108,117,101,32,117,115,105,110,103,32,96,103,101,116,95,99,111,111,107,105,101,47,49,96,46,10,10,70,97,105,108,117,114,101,58,32,96,102,117,110,99,116,105,111,110,95,99,108,97,117,115,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{11871,2},spec,{{set_cookie,2},[{type,{11871,17},bounded_fun,[{type,{11871,17},'fun',[{type,{11871,17},product,[{var,{11871,18},'Node'},{var,{11871,24},'Cookie'}]},{atom,{11871,35},true}]},[{type,{11872,7},constraint,[{atom,{11872,7},is_subtype},[{var,{11872,7},'Node'},{type,{11872,15},node,[]}]]},{type,{11873,7},constraint,[{atom,{11873,7},is_subtype},[{var,{11873,7},'Cookie'},{type,{11873,17},atom,[]}]]}]]}]}}]}},{{function,set_cookie,1},{11837,2},[<<115,101,116,95,99,111,111,107,105,101,40,67,111,111,107,105,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,111,32,116,104,101,32,97,116,111,109,32,96,67,111,111,107,105,101,96,44,32,119,104,105,99,104,32,105,115,32,97,108,115,111,32,116,104,101,10,99,111,111,107,105,101,32,102,111,114,32,97,108,108,32,110,111,100,101,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,32,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32,96,115,101,116,95,99,111,111,107,105,101,47,50,96,10,96,67,111,111,107,105,101,96,46,10,10,83,101,101,32,115,101,99,116,105,111,110,32,91,68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,96,41,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,89,111,117,32,99,97,110,32,103,101,116,32,116,104,105,115,32,118,97,108,117,101,32,117,115,105,110,103,32,96,103,101,116,95,99,111,111,107,105,101,47,48,96,46,10,10,70,97,105,108,117,114,101,58,32,96,102,117,110,99,116,105,111,110,95,99,108,97,117,115,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{11851,2},spec,{{set_cookie,1},[{type,{11851,17},bounded_fun,[{type,{11851,17},'fun',[{type,{11851,17},product,[{var,{11851,18},'Cookie'}]},{atom,{11851,29},true}]},[{type,{11852,7},constraint,[{atom,{11852,7},is_subtype},[{var,{11852,7},'Cookie'},{type,{11852,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,delay_trap,2},{11831,2},[<<100,101,108,97,121,95,116,114,97,112,47,50>>],hidden,#{}},{{function,dmonitor_node,3},{11811,2},[<<100,109,111,110,105,116,111,114,95,110,111,100,101,47,51>>],hidden,#{}},{{function,dist_get_stat,1},{11799,2},[<<100,105,115,116,95,103,101,116,95,115,116,97,116,40,68,72,97,110,100,108,101,41>>],hidden,#{}},{{function,dist_ctrl_get_opt,2},{11773,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,111,112,116,40,68,72,97,110,100,108,101,44,32,79,112,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,10,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,93,40,96,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,41,10,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11792,2},spec,{{dist_ctrl_get_opt,2},[{type,{11792,24},bounded_fun,[{type,{11792,24},'fun',[{type,{11792,24},product,[{var,{11792,25},'DHandle'},{atom,{11792,34},get_size}]},{var,{11792,49},'Value'}]},[{type,{11793,7},constraint,[{atom,{11793,7},is_subtype},[{var,{11793,7},'DHandle'},{user_type,{11793,18},dist_handle,[]}]]},{type,{11794,7},constraint,[{atom,{11794,7},is_subtype},[{var,{11794,7},'Value'},{type,{11794,16},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_set_opt,3},{11733,2},[<<100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,40,68,72,97,110,100,108,101,44,32,79,112,116,44,32,86,97,108,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,84,104,105,115,32,111,112,116,105,111,110,32,99,111,110,116,114,111,108,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,99,97,108,108,115,32,116,111,10,91,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49,96,41,32,119,104,101,114,101,32,96,68,72,97,110,100,108,101,96,10,101,113,117,97,108,115,32,96,68,72,97,110,100,108,101,96,32,117,115,101,100,32,119,104,101,110,32,115,101,116,116,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,87,104,101,110,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,105,115,58,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,32,119,105,108,108,32,106,117,115,116,32,114,101,116,117,114,110,32,96,68,97,116,97,96,32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,10,32,32,99,104,97,110,110,101,108,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,32,119,105,108,108,32,114,101,116,117,114,110,32,96,68,97,116,97,96,32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,10,32,32,99,104,97,110,110,101,108,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,96,83,105,122,101,96,32,111,102,32,96,68,97,116,97,96,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,116,117,112,108,101,10,32,32,111,110,32,116,104,101,32,102,111,114,109,32,96,123,83,105,122,101,44,32,68,97,116,97,125,96,46,10,10,65,108,108,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,32,116,111,32,100,101,102,97,117,108,116,32,119,104,101,110,32,97,32,99,104,97,110,110,101,108,32,105,115,32,99,108,111,115,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11765,2},spec,{{dist_ctrl_set_opt,3},[{type,{11765,24},bounded_fun,[{type,{11765,24},'fun',[{type,{11765,24},product,[{var,{11765,25},'DHandle'},{atom,{11765,34},get_size},{var,{11765,46},'Value'}]},{var,{11765,56},'OldValue'}]},[{type,{11766,7},constraint,[{atom,{11766,7},is_subtype},[{var,{11766,7},'DHandle'},{user_type,{11766,18},dist_handle,[]}]]},{type,{11767,7},constraint,[{atom,{11767,7},is_subtype},[{var,{11767,7},'Value'},{type,{11767,16},boolean,[]}]]},{type,{11768,7},constraint,[{atom,{11768,7},is_subtype},[{var,{11768,7},'OldValue'},{type,{11768,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_get_data_notification,1},{11704,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41>>],#{<<101,110>> => <<82,101,113,117,101,115,116,32,110,111,116,105,102,105,99,97,116,105,111,110,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,102,101,116,99,104,32,117,115,105,110,103,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49,96,41,32,102,111,114,32,116,104,101,10,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,87,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,104,101,32,109,101,115,115,97,103,101,32,96,100,105,115,116,95,100,97,116,97,96,46,10,79,110,99,101,32,97,32,96,100,105,115,116,95,100,97,116,97,96,32,109,101,115,115,97,103,101,115,32,104,97,115,32,98,101,101,110,32,115,101,110,116,44,32,110,111,32,109,111,114,101,32,96,100,105,115,116,95,100,97,116,97,96,32,109,101,115,115,97,103,101,115,32,119,105,108,108,10,98,101,32,115,101,110,116,32,117,110,116,105,108,32,116,104,101,32,91,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,41,10,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,32,97,103,97,105,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11727,2},spec,{{dist_ctrl_get_data_notification,1},[{type,{11727,38},bounded_fun,[{type,{11727,38},'fun',[{type,{11727,38},product,[{var,{11727,39},'DHandle'}]},{atom,{11727,51},ok}]},[{type,{11728,7},constraint,[{atom,{11728,7},is_subtype},[{var,{11728,7},'DHandle'},{user_type,{11728,18},dist_handle,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_get_data,1},{11669,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>],#{<<101,110>> => <<71,101,116,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,115,115,101,100,32,116,111,32,116,104,101,10,114,101,109,111,116,101,32,110,111,100,101,46,10,10,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,32,73,102,32,110,111,32,100,97,116,97,32,105,115,10,97,118,97,105,108,97,98,108,101,44,32,116,104,101,32,97,116,111,109,32,96,110,111,110,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,101,32,99,97,110,32,114,101,113,117,101,115,116,32,116,111,32,98,101,32,105,110,102,111,114,109,101,100,32,98,121,32,97,10,109,101,115,115,97,103,101,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,98,121,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,41,46,10,10,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,104,101,110,32,116,104,101,114,101,32,97,114,101,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,99,111,110,102,105,103,117,114,101,100,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,68,72,97,110,100,108,101,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,10,102,111,114,32,116,104,101,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,93,40,96,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,41,32,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11696,2},spec,{{dist_ctrl_get_data,1},[{type,{11696,25},bounded_fun,[{type,{11696,25},'fun',[{type,{11696,25},product,[{var,{11696,26},'DHandle'}]},{type,{11696,38},union,[{type,{11696,38},tuple,[{var,{11696,39},'Size'},{var,{11696,45},'Data'}]},{var,{11696,53},'Data'},{atom,{11696,60},none}]}]},[{type,{11697,7},constraint,[{atom,{11697,7},is_subtype},[{var,{11697,7},'Size'},{type,{11697,15},non_neg_integer,[]}]]},{type,{11698,7},constraint,[{atom,{11698,7},is_subtype},[{var,{11698,7},'DHandle'},{user_type,{11698,18},dist_handle,[]}]]},{type,{11699,7},constraint,[{atom,{11699,7},is_subtype},[{var,{11699,7},'Data'},{user_type,{11699,15},iovec,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_put_data,2},{11642,2},[<<100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41>>],#{<<101,110>> => <<68,101,108,105,118,101,114,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,116,111,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,117,110,108,101,115,115,32,97,110,10,62,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,10,62,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50,96,41,46,10,62,32,73,102,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,44,32,111,110,108,121,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,112,117,116,10,62,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,46,10,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,10,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,32,77,111,114,101,10,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11662,2},spec,{{dist_ctrl_put_data,2},[{type,{11662,25},bounded_fun,[{type,{11662,25},'fun',[{type,{11662,25},product,[{var,{11662,26},'DHandle'},{var,{11662,35},'Data'}]},{atom,{11662,44},ok}]},[{type,{11663,7},constraint,[{atom,{11663,7},is_subtype},[{var,{11663,7},'DHandle'},{user_type,{11663,18},dist_handle,[]}]]},{type,{11664,7},constraint,[{atom,{11664,7},is_subtype},[{var,{11664,7},'Data'},{type,{11664,15},iodata,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_input_handler,2},{11609,2},[<<100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41>>],#{<<101,110>> => <<82,101,103,105,115,116,101,114,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,79,110,99,101,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,44,32,96,73,110,112,117,116,72,97,110,100,108,101,114,96,32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,41,32,119,105,116,104,32,116,104,101,10,96,68,72,97,110,100,108,101,96,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,105,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,87,104,101,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,62,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,32,112,114,111,99,101,115,115,44,32,105,116,32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,108,115,111,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,99,97,108,108,101,100,32,119,104,101,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,10,62,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,32,112,111,114,116,46,32,84,104,101,32,100,97,116,97,10,62,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,115,104,111,117,108,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,62,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,110,112,117,116,72,97,110,100,108,101,114,96,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,115,104,111,117,108,100,32,99,97,108,108,10,62,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,93,40,96,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,41,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,46,10,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,10,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,32,77,111,114,101,10,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11635,2},spec,{{dist_ctrl_input_handler,2},[{type,{11635,30},bounded_fun,[{type,{11635,30},'fun',[{type,{11635,30},product,[{var,{11635,31},'DHandle'},{var,{11635,40},'InputHandler'}]},{atom,{11635,57},ok}]},[{type,{11636,7},constraint,[{atom,{11636,7},is_subtype},[{var,{11636,7},'DHandle'},{user_type,{11636,18},dist_handle,[]}]]},{type,{11637,7},constraint,[{atom,{11637,7},is_subtype},[{var,{11637,7},'InputHandler'},{type,{11637,23},pid,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,port_get_data,1},{11598,2},[<<112,111,114,116,95,103,101,116,95,100,97,116,97,40,80,111,114,116,41>>],hidden,#{}},{{function,port_set_data,2},{11590,2},[<<112,111,114,116,95,115,101,116,95,100,97,116,97,40,80,111,114,116,44,32,68,97,116,97,41>>],hidden,#{}},{{function,port_info,2},[{file,[46,46,47,46,46,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,95,112,111,114,116,95,105,110,102,111,46,109,100]},{location,{1,1}}],[<<112,111,114,116,95,105,110,102,111,40,80,111,114,116,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,80,111,114,116,96,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,111,112,101,110,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,96,112,111,114,116,95,105,110,102,111,47,50,96,32,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,96,73,116,101,109,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,110,100,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,80,111,114,116,96,46,10,10,45,32,96,99,111,110,110,101,99,116,101,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,99,111,110,110,101,99,116,101,100,44,32,80,105,100,125,96,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46,10,45,32,96,105,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,105,100,44,32,73,110,100,101,120,125,96,32,119,104,101,114,101,32,96,73,110,100,101,120,96,32,105,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,105,110,100,101,120,32,111,102,32,116,104,101,32,112,111,114,116,46,32,84,104,105,115,32,105,110,100,101,120,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,112,111,114,116,115,46,10,45,32,96,105,110,112,117,116,96,32,45,32,114,101,116,117,114,110,115,32,96,123,105,110,112,117,116,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,112,111,114,116,46,10,45,32,96,108,105,110,107,115,96,32,45,32,114,101,116,117,114,110,115,32,96,123,108,105,110,107,115,44,32,80,105,100,115,125,96,32,119,104,101,114,101,32,96,80,105,100,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,105,115,32,108,105,110,107,101,100,32,116,111,46,10,45,32,96,108,111,99,107,105,110,103,96,32,45,32,114,101,116,117,114,110,115,32,96,123,108,111,99,107,105,110,103,44,32,76,111,99,107,105,110,103,125,96,32,119,104,101,114,101,32,96,76,111,99,107,105,110,103,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,32,32,42,32,96,112,111,114,116,95,108,101,118,101,108,96,32,40,112,111,114,116,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41,10,32,32,42,32,96,100,114,105,118,101,114,95,108,101,118,101,108,96,32,40,100,114,105,118,101,114,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,114,101,115,117,108,116,115,32,97,114,101,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,101,109,111,114,121,96,32,123,58,32,35,112,111,114,116,95,105,110,102,111,95,109,101,109,111,114,121,32,125,32,45,32,114,101,116,117,114,110,115,32,96,123,109,101,109,111,114,121,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,105,115,32,112,111,114,116,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,112,111,114,116,32,105,116,115,101,108,102,32,99,97,110,32,104,97,118,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,96,66,121,116,101,115,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,111,110,105,116,111,114,115,96,32,45,32,114,101,116,117,114,110,115,32,96,123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125,96,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,115,96,32,114,101,112,114,101,115,101,110,116,32,112,114,111,99,101,115,115,101,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,111,110,105,116,111,114,101,100,95,98,121,96,32,45,32,114,101,116,117,114,110,115,32,96,123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125,96,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,101,100,66,121,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,105,100,115,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,103,105,118,101,110,32,112,111,114,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,45,32,96,110,97,109,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,110,97,109,101,44,32,78,97,109,101,125,96,32,119,104,101,114,101,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,99,111,109,109,97,110,100,32,110,97,109,101,32,115,101,116,32,98,121,32,96,111,112,101,110,95,112,111,114,116,47,50,96,46,10,45,32,96,111,115,95,112,105,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,111,115,95,112,105,100,44,32,79,115,80,105,100,125,96,32,119,104,101,114,101,32,96,79,115,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,111,102,32,97,110,32,79,83,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,119,105,116,104,32,91,96,111,112,101,110,95,112,111,114,116,40,123,115,112,97,119,110,32,124,32,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,44,32,79,112,116,105,111,110,115,41,96,93,40,96,111,112,101,110,95,112,111,114,116,47,50,96,41,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,97,119,110,105,110,103,32,97,110,32,79,83,32,112,114,111,99,101,115,115,44,32,116,104,101,32,118,97,108,117,101,32,105,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,111,117,116,112,117,116,96,32,45,32,114,101,116,117,114,110,115,32,96,123,111,117,116,112,117,116,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,112,111,114,116,32,102,114,111,109,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,44,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,51,96,44,32,111,114,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,96,46,10,45,32,96,112,97,114,97,108,108,101,108,105,115,109,96,32,45,32,114,101,116,117,114,110,115,32,96,123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125,96,32,119,104,101,114,101,32,96,66,111,111,108,101,97,110,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,104,105,110,116,32,117,115,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,111,112,116,105,111,110,32,91,96,112,97,114,97,108,108,101,108,105,115,109,96,93,40,96,109,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,41,32,111,102,32,96,111,112,101,110,95,112,111,114,116,47,50,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,113,117,101,117,101,95,115,105,122,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,113,117,101,117,101,95,115,105,122,101,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,113,117,101,117,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,100,114,105,118,101,114,32,113,117,101,117,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,82,101,103,105,115,116,101,114,101,100,78,97,109,101,125,96,32,119,104,101,114,101,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,116,104,101,32,112,111,114,116,46,32,73,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>},#{group => ports,specification => [{attribute,{11536,2},spec,{{port_info,2},[{type,{11536,16},bounded_fun,[{type,{11536,16},'fun',[{type,{11536,16},product,[{var,{11536,17},'Port'},{ann_type,{11536,23},[{var,{11536,23},'Item'},{atom,{11536,31},connected}]}]},{type,{11536,45},union,[{type,{11536,45},tuple,[{atom,{11536,46},connected},{var,{11536,57},'Pid'}]},{atom,{11536,64},undefined}]}]},[{type,{11537,7},constraint,[{atom,{11537,7},is_subtype},[{var,{11537,7},'Port'},{type,{11537,15},union,[{type,{11537,15},port,[]},{type,{11537,24},atom,[]}]}]]},{type,{11538,7},constraint,[{atom,{11538,7},is_subtype},[{var,{11538,7},'Pid'},{type,{11538,14},pid,[]}]]}]]},{type,{11539,9},bounded_fun,[{type,{11539,9},'fun',[{type,{11539,9},product,[{var,{11539,10},'Port'},{ann_type,{11539,16},[{var,{11539,16},'Item'},{atom,{11539,24},id}]}]},{type,{11539,31},union,[{type,{11539,31},tuple,[{atom,{11539,32},id},{var,{11539,36},'Index'}]},{atom,{11539,45},undefined}]}]},[{type,{11540,7},constraint,[{atom,{11540,7},is_subtype},[{var,{11540,7},'Port'},{type,{11540,15},union,[{type,{11540,15},port,[]},{type,{11540,24},atom,[]}]}]]},{type,{11541,7},constraint,[{atom,{11541,7},is_subtype},[{var,{11541,7},'Index'},{type,{11541,16},non_neg_integer,[]}]]}]]},{type,{11542,9},bounded_fun,[{type,{11542,9},'fun',[{type,{11542,9},product,[{var,{11542,10},'Port'},{ann_type,{11542,16},[{var,{11542,16},'Item'},{atom,{11542,24},input}]}]},{type,{11542,34},union,[{type,{11542,34},tuple,[{atom,{11542,35},input},{var,{11542,42},'Bytes'}]},{atom,{11542,51},undefined}]}]},[{type,{11543,7},constraint,[{atom,{11543,7},is_subtype},[{var,{11543,7},'Port'},{type,{11543,15},union,[{type,{11543,15},port,[]},{type,{11543,24},atom,[]}]}]]},{type,{11544,7},constraint,[{atom,{11544,7},is_subtype},[{var,{11544,7},'Bytes'},{type,{11544,16},non_neg_integer,[]}]]}]]},{type,{11545,9},bounded_fun,[{type,{11545,9},'fun',[{type,{11545,9},product,[{var,{11545,10},'Port'},{ann_type,{11545,16},[{var,{11545,16},'Item'},{atom,{11545,24},links}]}]},{type,{11545,34},union,[{type,{11545,34},tuple,[{atom,{11545,35},links},{var,{11545,42},'Pids'}]},{atom,{11545,50},undefined}]}]},[{type,{11546,7},constraint,[{atom,{11546,7},is_subtype},[{var,{11546,7},'Port'},{type,{11546,15},union,[{type,{11546,15},port,[]},{type,{11546,24},atom,[]}]}]]},{type,{11547,7},constraint,[{atom,{11547,7},is_subtype},[{var,{11547,7},'Pids'},{type,{11547,15},list,[{type,{11547,16},pid,[]}]}]]}]]},{type,{11548,9},bounded_fun,[{type,{11548,9},'fun',[{type,{11548,9},product,[{var,{11548,10},'Port'},{ann_type,{11548,16},[{var,{11548,16},'Item'},{atom,{11548,24},locking}]}]},{type,{11548,36},union,[{type,{11548,36},tuple,[{atom,{11548,37},locking},{var,{11548,46},'Locking'}]},{atom,{11548,57},undefined}]}]},[{type,{11549,7},constraint,[{atom,{11549,7},is_subtype},[{var,{11549,7},'Port'},{type,{11549,15},union,[{type,{11549,15},port,[]},{type,{11549,24},atom,[]}]}]]},{type,{11550,7},constraint,[{atom,{11550,7},is_subtype},[{var,{11550,7},'Locking'},{type,{11550,18},union,[{atom,{11550,18},false},{atom,{11550,28},port_level},{atom,{11550,43},driver_level}]}]]}]]},{type,{11551,9},bounded_fun,[{type,{11551,9},'fun',[{type,{11551,9},product,[{var,{11551,10},'Port'},{ann_type,{11551,16},[{var,{11551,16},'Item'},{atom,{11551,24},memory}]}]},{type,{11551,35},union,[{type,{11551,35},tuple,[{atom,{11551,36},memory},{var,{11551,44},'Bytes'}]},{atom,{11551,53},undefined}]}]},[{type,{11552,7},constraint,[{atom,{11552,7},is_subtype},[{var,{11552,7},'Port'},{type,{11552,15},union,[{type,{11552,15},port,[]},{type,{11552,24},atom,[]}]}]]},{type,{11553,7},constraint,[{atom,{11553,7},is_subtype},[{var,{11553,7},'Bytes'},{type,{11553,16},non_neg_integer,[]}]]}]]},{type,{11554,9},bounded_fun,[{type,{11554,9},'fun',[{type,{11554,9},product,[{var,{11554,10},'Port'},{ann_type,{11554,16},[{var,{11554,16},'Item'},{atom,{11554,24},monitors}]}]},{type,{11554,37},union,[{type,{11554,37},tuple,[{atom,{11554,38},monitors},{var,{11554,48},'Monitors'}]},{atom,{11554,60},undefined}]}]},[{type,{11555,7},constraint,[{atom,{11555,7},is_subtype},[{var,{11555,7},'Port'},{type,{11555,15},union,[{type,{11555,15},port,[]},{type,{11555,24},atom,[]}]}]]},{type,{11556,7},constraint,[{atom,{11556,7},is_subtype},[{var,{11556,7},'Monitors'},{type,{11556,19},list,[{type,{11556,20},tuple,[{atom,{11556,21},process},{type,{11556,30},pid,[]}]}]}]]}]]},{type,{11557,9},bounded_fun,[{type,{11557,9},'fun',[{type,{11557,9},product,[{var,{11557,10},'Port'},{ann_type,{11557,16},[{var,{11557,16},'Item'},{atom,{11557,24},monitored_by}]}]},{type,{11557,41},union,[{type,{11557,41},tuple,[{atom,{11557,42},monitored_by},{var,{11557,56},'MonitoredBy'}]},{atom,{11557,71},undefined}]}]},[{type,{11558,7},constraint,[{atom,{11558,7},is_subtype},[{var,{11558,7},'Port'},{type,{11558,15},union,[{type,{11558,15},port,[]},{type,{11558,24},atom,[]}]}]]},{type,{11559,7},constraint,[{atom,{11559,7},is_subtype},[{var,{11559,7},'MonitoredBy'},{type,{11559,22},list,[{type,{11559,23},pid,[]}]}]]}]]},{type,{11560,9},bounded_fun,[{type,{11560,9},'fun',[{type,{11560,9},product,[{var,{11560,10},'Port'},{ann_type,{11560,16},[{var,{11560,16},'Item'},{atom,{11560,24},name}]}]},{type,{11560,33},union,[{type,{11560,33},tuple,[{atom,{11560,34},name},{var,{11560,40},'Name'}]},{atom,{11560,48},undefined}]}]},[{type,{11561,7},constraint,[{atom,{11561,7},is_subtype},[{var,{11561,7},'Port'},{type,{11561,15},union,[{type,{11561,15},port,[]},{type,{11561,24},atom,[]}]}]]},{type,{11562,7},constraint,[{atom,{11562,7},is_subtype},[{var,{11562,7},'Name'},{type,{11562,15},string,[]}]]}]]},{type,{11563,9},bounded_fun,[{type,{11563,9},'fun',[{type,{11563,9},product,[{var,{11563,10},'Port'},{ann_type,{11563,16},[{var,{11563,16},'Item'},{atom,{11563,24},os_pid}]}]},{type,{11563,35},union,[{type,{11563,35},tuple,[{atom,{11563,36},os_pid},{var,{11563,44},'OsPid'}]},{atom,{11563,53},undefined}]}]},[{type,{11564,7},constraint,[{atom,{11564,7},is_subtype},[{var,{11564,7},'Port'},{type,{11564,15},union,[{type,{11564,15},port,[]},{type,{11564,24},atom,[]}]}]]},{type,{11565,7},constraint,[{atom,{11565,7},is_subtype},[{var,{11565,7},'OsPid'},{type,{11565,16},union,[{type,{11565,16},non_neg_integer,[]},{atom,{11565,36},undefined}]}]]}]]},{type,{11566,9},bounded_fun,[{type,{11566,9},'fun',[{type,{11566,9},product,[{var,{11566,10},'Port'},{ann_type,{11566,16},[{var,{11566,16},'Item'},{atom,{11566,24},output}]}]},{type,{11566,35},union,[{type,{11566,35},tuple,[{atom,{11566,36},output},{var,{11566,44},'Bytes'}]},{atom,{11566,53},undefined}]}]},[{type,{11567,7},constraint,[{atom,{11567,7},is_subtype},[{var,{11567,7},'Port'},{type,{11567,15},union,[{type,{11567,15},port,[]},{type,{11567,24},atom,[]}]}]]},{type,{11568,7},constraint,[{atom,{11568,7},is_subtype},[{var,{11568,7},'Bytes'},{type,{11568,16},non_neg_integer,[]}]]}]]},{type,{11569,9},bounded_fun,[{type,{11569,9},'fun',[{type,{11569,9},product,[{var,{11569,10},'Port'},{ann_type,{11569,16},[{var,{11569,16},'Item'},{atom,{11569,24},parallelism}]}]},{type,{11569,40},union,[{type,{11569,40},tuple,[{atom,{11569,41},parallelism},{var,{11569,54},'Boolean'}]},{atom,{11569,65},undefined}]}]},[{type,{11570,7},constraint,[{atom,{11570,7},is_subtype},[{var,{11570,7},'Port'},{type,{11570,15},union,[{type,{11570,15},port,[]},{type,{11570,24},atom,[]}]}]]},{type,{11571,7},constraint,[{atom,{11571,7},is_subtype},[{var,{11571,7},'Boolean'},{type,{11571,18},boolean,[]}]]}]]},{type,{11572,9},bounded_fun,[{type,{11572,9},'fun',[{type,{11572,9},product,[{var,{11572,10},'Port'},{ann_type,{11572,16},[{var,{11572,16},'Item'},{atom,{11572,24},queue_size}]}]},{type,{11572,39},union,[{type,{11572,39},tuple,[{atom,{11572,40},queue_size},{var,{11572,52},'Bytes'}]},{atom,{11572,61},undefined}]}]},[{type,{11573,7},constraint,[{atom,{11573,7},is_subtype},[{var,{11573,7},'Port'},{type,{11573,15},union,[{type,{11573,15},port,[]},{type,{11573,24},atom,[]}]}]]},{type,{11574,7},constraint,[{atom,{11574,7},is_subtype},[{var,{11574,7},'Bytes'},{type,{11574,16},non_neg_integer,[]}]]}]]},{type,{11575,9},bounded_fun,[{type,{11575,9},'fun',[{type,{11575,9},product,[{var,{11575,10},'Port'},{ann_type,{11575,16},[{var,{11575,16},'Item'},{atom,{11575,24},registered_name}]}]},{type,{11575,44},union,[{type,{11575,44},tuple,[{atom,{11575,45},registered_name},{var,{11575,62},'RegisteredName'}]},{type,{11575,80},nil,[]},{atom,{11575,85},undefined}]}]},[{type,{11576,7},constraint,[{atom,{11576,7},is_subtype},[{var,{11576,7},'Port'},{type,{11576,15},union,[{type,{11576,15},port,[]},{type,{11576,24},atom,[]}]}]]},{type,{11577,7},constraint,[{atom,{11577,7},is_subtype},[{var,{11577,7},'RegisteredName'},{type,{11577,25},atom,[]}]]}]]}]}}]}},{{function,port_info,1},{11490,2},[<<112,111,114,116,95,105,110,102,111,40,80,111,114,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,80,111,114,116,96,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,10,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,111,112,101,110,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,97,108,108,32,116,104,101,32,116,117,112,108,101,115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,10,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,10,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,91,96,112,111,114,116,95,105,110,102,111,47,49,96,93,40,96,112,111,114,116,95,105,110,102,111,47,49,96,41,32,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,84,104,101,32,114,101,115,117,108,116,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,96,73,116,101,109,96,115,58,10,10,45,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,40,105,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,41,10,45,32,96,105,100,96,10,45,32,96,99,111,110,110,101,99,116,101,100,96,10,45,32,96,108,105,110,107,115,96,10,45,32,96,110,97,109,101,96,10,45,32,96,105,110,112,117,116,96,10,45,32,96,111,117,116,112,117,116,96,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,96,73,116,101,109,96,115,44,32,115,101,101,32,96,112,111,114,116,95,105,110,102,111,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>},#{group => ports,specification => [{attribute,{11514,2},spec,{{port_info,1},[{type,{11514,16},bounded_fun,[{type,{11514,16},'fun',[{type,{11514,16},product,[{var,{11514,17},'Port'}]},{var,{11514,26},'Result'}]},[{type,{11515,7},constraint,[{atom,{11515,7},is_subtype},[{var,{11515,7},'Port'},{type,{11515,15},union,[{type,{11515,15},port,[]},{type,{11515,24},atom,[]}]}]]},{type,{11516,7},constraint,[{atom,{11516,7},is_subtype},[{var,{11516,7},'ResultItem'},{type,{11516,21},union,[{type,{11516,21},tuple,[{atom,{11516,22},registered_name},{ann_type,{11516,39},[{var,{11516,39},'RegisteredName'},{type,{11516,57},atom,[]}]}]},{type,{11517,7},tuple,[{atom,{11517,8},id},{ann_type,{11517,12},[{var,{11517,12},'Index'},{type,{11517,21},non_neg_integer,[]}]}]},{type,{11518,7},tuple,[{atom,{11518,8},connected},{ann_type,{11518,19},[{var,{11518,19},'Pid'},{type,{11518,26},pid,[]}]}]},{type,{11519,7},tuple,[{atom,{11519,8},links},{ann_type,{11519,15},[{var,{11519,15},'Pids'},{type,{11519,23},list,[{type,{11519,24},pid,[]}]}]}]},{type,{11520,7},tuple,[{atom,{11520,8},name},{ann_type,{11520,14},[{var,{11520,14},'String'},{type,{11520,24},string,[]}]}]},{type,{11521,7},tuple,[{atom,{11521,8},input},{ann_type,{11521,15},[{var,{11521,15},'Bytes'},{type,{11521,24},non_neg_integer,[]}]}]},{type,{11522,7},tuple,[{atom,{11522,8},output},{ann_type,{11522,16},[{var,{11522,16},'Bytes'},{type,{11522,25},non_neg_integer,[]}]}]},{type,{11523,7},tuple,[{atom,{11523,8},os_pid},{ann_type,{11523,16},[{var,{11523,16},'OsPid'},{type,{11523,25},union,[{type,{11523,25},non_neg_integer,[]},{atom,{11523,45},undefined}]}]}]}]}]]},{type,{11524,7},constraint,[{atom,{11524,7},is_subtype},[{var,{11524,7},'Result'},{type,{11524,17},union,[{type,{11524,17},list,[{var,{11524,18},'ResultItem'}]},{atom,{11524,32},undefined}]}]]}]]}]}}]}},{{function,port_call,3},{11439,2},[<<112,111,114,116,95,99,97,108,108,40,80,111,114,116,44,32,79,112,101,114,97,116,105,111,110,44,32,68,97,116,97,41>>],#{<<101,110>> => <<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,96,79,112,101,114,97,116,105,111,110,96,32,97,110,100,32,96,68,97,116,97,96,10,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,10,116,104,105,115,32,102,101,97,116,117,114,101,46,10,10,96,80,111,114,116,96,32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,114,101,102,101,114,114,105,110,103,32,116,111,32,97,32,100,114,105,118,101,114,46,10,10,96,79,112,101,114,97,116,105,111,110,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,100,114,105,118,101,114,46,10,10,96,68,97,116,97,96,32,105,115,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,46,32,84,104,105,115,32,100,97,116,97,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,98,105,110,97,114,121,32,116,101,114,109,32,102,111,114,109,97,116,32,97,110,100,32,115,101,110,116,10,116,111,32,116,104,101,32,112,111,114,116,46,10,10,82,101,116,117,114,110,115,32,97,32,116,101,114,109,32,102,114,111,109,32,116,104,101,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,10,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,101,114,97,116,105,111,110,96,32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,10,32,32,111,112,101,114,97,116,105,111,110,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,10,32,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32,96,79,112,101,114,97,116,105,111,110,96,32,111,114,32,96,68,97,116,97,96,41,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,99,97,108,108,32,96,112,111,114,116,95,99,97,108,108,96,32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32,96,80,111,114,116,96,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,10,32,32,62,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,10,32,32,62,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>},#{group => ports,specification => [{attribute,{11476,2},spec,{{port_call,3},[{type,{11476,16},bounded_fun,[{type,{11476,16},'fun',[{type,{11476,16},product,[{var,{11476,17},'Port'},{var,{11476,23},'Operation'},{var,{11476,34},'Data'}]},{type,{11476,43},term,[]}]},[{type,{11477,7},constraint,[{atom,{11477,7},is_subtype},[{var,{11477,7},'Port'},{type,{11477,15},union,[{type,{11477,15},port,[]},{type,{11477,24},atom,[]}]}]]},{type,{11478,7},constraint,[{atom,{11478,7},is_subtype},[{var,{11478,7},'Operation'},{type,{11478,20},integer,[]}]]},{type,{11479,7},constraint,[{atom,{11479,7},is_subtype},[{var,{11479,7},'Data'},{type,{11479,15},term,[]}]]}]]}]}}]}},{{function,port_call,2},{11425,2},[<<112,111,114,116,95,99,97,108,108,40,80,111,114,116,44,32,68,97,116,97,41>>],hidden,#{}},{{function,port_control,3},{11383,2},[<<112,111,114,116,95,99,111,110,116,114,111,108,40,80,111,114,116,44,32,79,112,101,114,97,116,105,111,110,44,32,68,97,116,97,41>>],#{<<101,110>> => <<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,96,79,112,101,114,97,116,105,111,110,96,10,97,110,100,32,96,68,97,116,97,96,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,10,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,99,111,110,116,114,111,108,32,102,101,97,116,117,114,101,46,10,10,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,53,53,44,32,111,114,32,97,32,98,105,110,97,114,121,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,10,112,111,114,116,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,111,112,101,110,32,112,111,114,116,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,10,32,32,112,111,114,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,101,114,97,116,105,111,110,96,32,99,97,110,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,10,32,32,111,112,101,114,97,116,105,111,110,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,10,32,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32,96,79,112,101,114,97,116,105,111,110,96,32,111,114,32,96,68,97,116,97,96,41,46,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,99,97,108,108,32,91,96,112,111,114,116,95,99,111,110,116,114,111,108,47,51,96,93,40,96,112,111,114,116,95,99,111,110,116,114,111,108,47,51,96,41,32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32,96,80,111,114,116,96,10,32,32,62,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,32,32,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,10,32,32,62,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>},#{group => ports,specification => [{attribute,{11411,2},spec,{{port_control,3},[{type,{11411,19},bounded_fun,[{type,{11411,19},'fun',[{type,{11411,19},product,[{var,{11411,20},'Port'},{var,{11411,26},'Operation'},{var,{11411,37},'Data'}]},{type,{11411,46},union,[{type,{11411,46},iodata,[]},{type,{11411,57},binary,[]}]}]},[{type,{11412,7},constraint,[{atom,{11412,7},is_subtype},[{var,{11412,7},'Port'},{type,{11412,15},union,[{type,{11412,15},port,[]},{type,{11412,24},atom,[]}]}]]},{type,{11413,7},constraint,[{atom,{11413,7},is_subtype},[{var,{11413,7},'Operation'},{type,{11413,20},integer,[]}]]},{type,{11414,7},constraint,[{atom,{11414,7},is_subtype},[{var,{11414,7},'Data'},{type,{11414,15},iodata,[]}]]}]]}]}}]}},{{function,port_close,1},{11339,2},[<<112,111,114,116,95,99,108,111,115,101,40,80,111,114,116,41>>],#{<<101,110>> => <<67,108,111,115,101,115,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125,96,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,10,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,40,115,101,101,32,98,101,108,111,119,41,44,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,95,110,111,116,95,10,114,101,112,108,121,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,108,111,115,101,100,125,96,46,10,10,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,119,105,116,104,32,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,44,32,110,111,116,32,111,110,108,121,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,10,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,32,114,101,116,117,114,110,115,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,100,111,101,115,10,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,10,73,102,32,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,10,114,101,112,108,105,101,115,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,108,111,115,101,100,125,96,32,119,104,101,110,32,97,108,108,32,98,117,102,102,101,114,115,32,104,97,118,101,32,98,101,101,110,32,102,108,117,115,104,101,100,32,97,110,100,32,116,104,101,32,112,111,114,116,10,114,101,97,108,108,121,32,99,108,111,115,101,115,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,32,111,119,110,101,114,95,10,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,117,115,105,110,103,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125,96,32,97,115,32,105,102,10,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125,96,32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,10,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,10,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,10,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,10,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>},#{group => ports,specification => [{attribute,{11371,2},spec,{{port_close,1},[{type,{11371,17},bounded_fun,[{type,{11371,17},'fun',[{type,{11371,17},product,[{var,{11371,18},'Port'}]},{atom,{11371,27},true}]},[{type,{11372,7},constraint,[{atom,{11372,7},is_subtype},[{var,{11372,7},'Port'},{type,{11372,15},union,[{type,{11372,15},port,[]},{type,{11372,24},atom,[]}]}]]}]]}]}}]}},{{function,port_connect,2},{11283,2},[<<112,111,114,116,95,99,111,110,110,101,99,116,40,80,111,114,116,44,32,80,105,100,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,111,114,116,41,32,116,111,32,96,80,105,100,96,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,10,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,84,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,44,32,115,101,101,32,98,101,108,111,119,46,10,45,32,84,104,101,32,112,111,114,116,32,100,111,101,115,32,95,110,111,116,95,32,114,101,112,108,121,32,119,105,116,104,32,96,123,80,111,114,116,44,99,111,110,110,101,99,116,101,100,125,96,46,10,45,32,96,112,111,114,116,95,99,111,110,110,101,99,116,47,49,96,32,105,115,32,115,121,110,99,104,114,111,110,111,117,115,44,32,115,101,101,32,98,101,108,111,119,46,10,45,32,84,104,101,32,110,101,119,32,112,111,114,116,32,111,119,110,101,114,32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46,10,10,84,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,115,116,97,121,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,97,110,100,32,109,117,115,116,32,99,97,108,108,10,91,96,117,110,108,105,110,107,40,80,111,114,116,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,100,101,115,105,114,101,100,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,116,111,32,98,101,32,97,110,121,32,112,114,111,99,101,115,115,32,119,105,116,104,32,91,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,93,40,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,41,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,32,105,102,10,96,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,10,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,10,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,111,110,110,101,99,116,101,100,125,96,32,116,111,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,46,32,78,111,116,105,99,101,10,116,104,97,116,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,105,115,32,115,116,105,108,108,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,119,104,105,108,101,32,116,104,101,32,110,101,119,32,105,115,32,110,111,116,46,32,73,102,10,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,10,111,119,110,101,114,95,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,32,97,108,115,111,32,105,102,32,96,80,105,100,96,32,105,115,10,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,117,115,105,110,103,10,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,10,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,105,115,32,116,114,117,108,121,10,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,10,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,115,121,110,99,104,114,111,110,111,117,115,46,32,91,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,93,40,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,10,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,10,32,32,112,114,111,99,101,115,115,46>>},#{group => ports,specification => [{attribute,{11326,2},spec,{{port_connect,2},[{type,{11326,19},bounded_fun,[{type,{11326,19},'fun',[{type,{11326,19},product,[{var,{11326,20},'Port'},{var,{11326,26},'Pid'}]},{atom,{11326,34},true}]},[{type,{11327,7},constraint,[{atom,{11327,7},is_subtype},[{var,{11327,7},'Port'},{type,{11327,15},union,[{type,{11327,15},port,[]},{type,{11327,24},atom,[]}]}]]},{type,{11328,7},constraint,[{atom,{11328,7},is_subtype},[{var,{11328,7},'Pid'},{type,{11328,14},pid,[]}]]}]]}]}}]}},{{function,port_command,3},{11223,2},[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,91,93,41,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,51,96,41,32,101,113,117,97,108,115,10,91,96,112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,10,97,110,121,109,111,114,101,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,102,111,114,99,101,96,42,42,32,45,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,10,32,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,102,111,114,99,101,100,32,116,104,114,111,117,103,104,46,32,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,10,32,32,101,120,99,101,112,116,105,111,110,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,100,114,105,118,101,114,32,102,108,97,103,10,32,32,91,96,69,82,76,95,68,82,86,95,70,76,65,71,95,83,79,70,84,95,66,85,83,89,96,93,40,100,114,105,118,101,114,95,101,110,116,114,121,46,109,100,35,100,114,105,118,101,114,95,102,108,97,103,115,41,46,10,10,45,32,42,42,96,110,111,115,117,115,112,101,110,100,96,42,42,32,45,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,10,32,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,32,97,110,100,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,108,105,115,116,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,111,112,116,105,111,110,32,96,102,111,114,99,101,96,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,98,117,116,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,10,32,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,102,111,114,99,105,110,103,32,116,104,114,111,117,103,104,32,97,32,98,117,115,121,32,112,111,114,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>},#{group => ports,specification => [{attribute,{11267,2},spec,{{port_command,3},[{type,{11267,19},bounded_fun,[{type,{11267,19},'fun',[{type,{11267,19},product,[{var,{11267,20},'Port'},{var,{11267,26},'Data'},{var,{11267,32},'OptionList'}]},{type,{11267,47},boolean,[]}]},[{type,{11268,7},constraint,[{atom,{11268,7},is_subtype},[{var,{11268,7},'Port'},{type,{11268,15},union,[{type,{11268,15},port,[]},{type,{11268,24},atom,[]}]}]]},{type,{11269,7},constraint,[{atom,{11269,7},is_subtype},[{var,{11269,7},'Data'},{type,{11269,15},iodata,[]}]]},{type,{11270,7},constraint,[{atom,{11270,7},is_subtype},[{var,{11270,7},'Option'},{type,{11270,17},union,[{atom,{11270,17},force},{atom,{11270,25},nosuspend}]}]]},{type,{11271,7},constraint,[{atom,{11271,7},is_subtype},[{var,{11271,7},'OptionList'},{type,{11271,21},list,[{var,{11271,22},'Option'}]}]]}]]}]}}]}},{{function,port_command,2},{11170,2},[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41>>],#{<<101,110>> => <<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,83,97,109,101,32,97,115,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,101,120,99,101,112,116,32,102,111,114,10,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,97,110,100,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,32,119,105,116,104,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,44,10,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,10,105,102,32,96,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,116,104,101,10,100,97,116,97,32,109,101,115,115,97,103,101,32,100,105,115,97,112,112,101,97,114,115,32,119,105,116,104,111,117,116,32,97,32,115,111,117,110,100,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,111,112,101,110,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,32,111,119,110,101,114,95,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,32,84,104,101,32,112,111,114,116,10,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,32,97,108,115,111,32,105,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,116,111,32,97,32,112,111,114,116,32,117,115,105,110,103,10,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,10,97,110,121,32,109,111,114,101,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,105,115,32,116,114,117,108,121,10,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,10,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,115,121,110,99,104,114,111,110,111,117,115,46,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,10,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>},#{group => ports,specification => [{attribute,{11210,2},spec,{{port_command,2},[{type,{11210,19},bounded_fun,[{type,{11210,19},'fun',[{type,{11210,19},product,[{var,{11210,20},'Port'},{var,{11210,26},'Data'}]},{atom,{11210,35},true}]},[{type,{11211,7},constraint,[{atom,{11211,7},is_subtype},[{var,{11211,7},'Port'},{type,{11211,15},union,[{type,{11211,15},port,[]},{type,{11211,24},atom,[]}]}]]},{type,{11212,7},constraint,[{atom,{11212,7},is_subtype},[{var,{11212,7},'Data'},{type,{11212,15},iodata,[]}]]}]]}]}}]}},{{function,localtime_to_universaltime,1},{11123,2},[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,44,32,105,102,32,115,117,112,112,111,114,116,101,100,10,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,32,97,110,100,32,96,76,111,99,97,108,116,105,109,101,96,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,111,99,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{11138,2},spec,{{localtime_to_universaltime,1},[{type,{11138,33},bounded_fun,[{type,{11138,33},'fun',[{type,{11138,33},product,[{var,{11138,34},'Localtime'}]},{var,{11138,48},'Universaltime'}]},[{type,{11139,7},constraint,[{atom,{11139,7},is_subtype},[{var,{11139,7},'Localtime'},{remote_type,{11139,20},[{atom,{11139,20},calendar},{atom,{11139,29},datetime},[]]}]]},{type,{11140,7},constraint,[{atom,{11140,7},is_subtype},[{var,{11140,7},'Universaltime'},{remote_type,{11140,24},[{atom,{11140,24},calendar},{atom,{11140,33},datetime},[]]}]]}]]}]}}]}},{{function,send_nosuspend,3},{11087,2},[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,32,124,32,79,112,116,105,111,110,115,93,41,96,93,40,96,115,101,110,100,47,51,96,41,44,32,98,117,116,10,119,105,116,104,32,97,32,66,111,111,108,101,97,110,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,108,105,107,101,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,93,40,96,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,41,44,32,98,117,116,10,116,97,107,101,115,32,97,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,44,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,111,110,108,121,32,111,112,116,105,111,110,32,105,115,32,96,110,111,99,111,110,110,101,99,116,96,44,10,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,117,114,114,101,110,116,108,121,10,114,101,97,99,104,97,98,108,101,32,98,121,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,32,105,115,32,116,111,32,116,114,121,32,116,111,32,99,111,110,110,101,99,116,32,116,111,32,116,104,101,10,110,111,100,101,44,32,119,104,105,99,104,32,99,97,110,32,115,116,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,97,32,115,104,111,114,116,32,112,101,114,105,111,100,46,32,84,104,101,32,117,115,101,32,111,102,32,111,112,116,105,111,110,10,96,110,111,99,111,110,110,101,99,116,96,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,103,101,116,32,116,104,101,32,115,108,105,103,104,116,101,115,116,32,100,101,108,97,121,32,119,104,101,110,10,115,101,110,100,105,110,103,32,116,111,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,101,115,112,101,99,105,97,108,108,121,32,117,115,101,102,117,108,32,119,104,101,110,32,99,111,109,109,117,110,105,99,97,116,105,110,103,32,119,105,116,104,10,110,111,100,101,115,32,116,104,97,116,32,101,120,112,101,99,116,32,116,111,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,99,111,110,110,101,99,116,105,110,103,32,112,97,114,116,32,40,116,104,97,116,32,105,115,44,32,110,111,100,101,115,32,119,114,105,116,116,101,110,32,105,110,32,67,10,111,114,32,74,97,118,97,41,46,10,10,87,104,101,110,101,118,101,114,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,40,101,105,116,104,101,114,32,119,104,101,110,32,97,32,115,117,115,112,101,110,100,32,119,111,117,108,100,32,111,99,99,117,114,32,111,114,32,119,104,101,110,10,96,110,111,99,111,110,110,101,99,116,96,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,116,104,101,32,110,111,100,101,32,119,97,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,110,110,101,99,116,101,100,41,44,32,116,104,101,32,109,101,115,115,97,103,101,10,105,115,32,103,117,97,114,97,110,116,101,101,100,32,95,110,111,116,95,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,101,110,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{11110,2},spec,{{send_nosuspend,3},[{type,{11110,21},bounded_fun,[{type,{11110,21},'fun',[{type,{11110,21},product,[{var,{11110,22},'Dest'},{var,{11110,28},'Msg'},{var,{11110,33},'Options'}]},{type,{11110,45},boolean,[]}]},[{type,{11111,7},constraint,[{atom,{11111,7},is_subtype},[{var,{11111,7},'Dest'},{user_type,{11111,15},send_destination,[]}]]},{type,{11112,7},constraint,[{atom,{11112,7},is_subtype},[{var,{11112,7},'Msg'},{type,{11112,14},term,[]}]]},{type,{11113,7},constraint,[{atom,{11113,7},is_subtype},[{var,{11113,7},'Options'},{type,{11113,18},list,[{atom,{11113,19},noconnect}]}]]}]]}]}}]}},{{function,send_nosuspend,2},{11037,2},[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,40,68,101,115,116,44,32,77,115,103,41>>],#{<<101,110>> => <<83,101,110,100,32,97,32,109,101,115,115,97,103,101,32,119,105,116,104,111,117,116,32,115,117,115,112,101,110,100,105,110,103,32,116,104,101,32,99,97,108,108,101,114,46,10,10,69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,93,41,96,93,40,96,115,101,110,100,47,51,96,41,44,32,98,117,116,32,114,101,116,117,114,110,115,10,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,115,101,110,116,32,97,110,100,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,110,111,116,32,115,101,110,116,32,98,101,99,97,117,115,101,10,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,104,97,100,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,110,32,117,110,114,101,108,105,97,98,108,101,32,114,101,109,111,116,101,32,110,111,100,101,10,119,105,116,104,111,117,116,32,101,118,101,114,32,98,108,111,99,107,105,110,103,32,116,104,101,32,115,101,110,100,105,110,103,32,40,69,114,108,97,110,103,41,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,10,114,101,109,111,116,101,32,110,111,100,101,32,40,117,115,117,97,108,108,121,32,110,111,116,32,97,32,114,101,97,108,32,69,114,108,97,110,103,32,110,111,100,101,44,32,98,117,116,32,97,32,110,111,100,101,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,32,105,115,10,111,118,101,114,108,111,97,100,101,100,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,95,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,95,32,97,110,100,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,84,104,101,32,115,97,109,101,32,111,99,99,117,114,115,32,105,102,32,96,68,101,115,116,96,32,114,101,102,101,114,115,32,116,111,32,97,32,108,111,99,97,108,32,112,111,114,116,32,116,104,97,116,32,105,115,32,98,117,115,121,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,10,100,101,115,116,105,110,97,116,105,111,110,115,32,40,97,108,108,111,119,101,100,32,102,111,114,32,116,104,101,32,111,114,100,105,110,97,114,121,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,96,39,33,39,96,41,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,115,101,110,100,115,10,116,104,101,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,32,119,104,101,114,101,32,97,32,112,114,111,99,101,115,115,10,99,111,109,109,117,110,105,99,97,116,101,115,32,119,105,116,104,32,69,114,108,97,110,103,32,110,111,100,101,115,32,116,104,97,116,32,99,97,110,32,100,105,115,97,112,112,101,97,114,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,97,99,101,44,32,99,97,117,115,105,110,103,32,116,104,101,10,84,67,80,32,98,117,102,102,101,114,115,32,97,110,100,32,116,104,101,32,100,114,105,118,101,114,115,32,113,117,101,117,101,32,116,111,32,98,101,32,111,118,101,114,45,102,117,108,108,32,98,101,102,111,114,101,32,116,104,101,32,110,111,100,101,32,105,115,32,115,104,117,116,32,100,111,119,110,10,40,98,101,99,97,117,115,101,32,111,102,32,116,105,99,107,32,116,105,109,101,45,111,117,116,115,41,32,98,121,32,96,110,101,116,95,107,101,114,110,101,108,96,46,32,84,104,101,32,110,111,114,109,97,108,32,114,101,97,99,116,105,111,110,32,116,111,32,116,97,107,101,32,119,104,101,110,10,116,104,105,115,32,111,99,99,117,114,115,32,105,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,112,114,101,109,97,116,117,114,101,32,115,104,117,116,100,111,119,110,32,111,102,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,105,103,110,111,114,105,110,103,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,117,108,100,32,114,101,115,117,108,116,32,105,110,32,97,110,10,95,117,110,114,101,108,105,97,98,108,101,95,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,44,32,119,104,105,99,104,32,105,115,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,10,109,111,100,101,108,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32,95,110,111,116,95,32,115,101,110,116,32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,73,110,32,109,97,110,121,32,115,121,115,116,101,109,115,44,32,116,114,97,110,115,105,101,110,116,32,115,116,97,116,101,115,32,111,102,32,111,118,101,114,108,111,97,100,101,100,32,113,117,101,117,101,115,32,97,114,101,32,110,111,114,109,97,108,46,32,65,108,116,104,111,117,103,104,32,116,104,105,115,10,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,100,111,101,115,32,110,111,116,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,10,110,111,110,45,114,101,115,112,111,110,115,105,118,101,44,32,105,116,32,99,111,117,108,100,32,98,101,32,97,32,116,101,109,112,111,114,97,114,121,32,111,118,101,114,108,111,97,100,46,32,65,108,115,111,44,32,97,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,96,116,114,117,101,96,10,100,111,101,115,32,111,110,108,121,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,109,101,115,115,97,103,101,32,99,97,110,32,98,101,32,115,101,110,116,32,111,110,32,116,104,101,32,40,84,67,80,41,32,99,104,97,110,110,101,108,32,119,105,116,104,111,117,116,10,98,108,111,99,107,105,110,103,59,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,114,114,105,118,101,32,97,116,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,70,111,114,32,97,10,100,105,115,99,111,110,110,101,99,116,101,100,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,32,110,111,100,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,96,116,114,117,101,96,32,40,109,105,109,105,99,115,32,116,104,101,10,98,101,104,97,118,105,111,114,32,111,102,32,111,112,101,114,97,116,111,114,32,96,33,96,41,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,97,110,100,32,116,104,101,32,97,99,116,105,111,110,115,32,116,111,32,116,97,107,101,32,119,104,101,110,10,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,97,114,101,32,97,112,112,108,105,99,97,116,105,111,110,45,32,97,110,100,32,104,97,114,100,119,97,114,101,45,115,112,101,99,105,102,105,99,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{11077,2},spec,{{send_nosuspend,2},[{type,{11077,21},bounded_fun,[{type,{11077,21},'fun',[{type,{11077,21},product,[{var,{11077,22},'Dest'},{var,{11077,28},'Msg'}]},{type,{11077,36},boolean,[]}]},[{type,{11078,7},constraint,[{atom,{11078,7},is_subtype},[{var,{11078,7},'Dest'},{user_type,{11078,15},send_destination,[]}]]},{type,{11079,7},constraint,[{atom,{11079,7},is_subtype},[{var,{11079,7},'Msg'},{type,{11079,14},term,[]}]]}]]}]}}]}},{{function,fun_info,1},{10930,2},[<<102,117,110,95,105,110,102,111,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,117,110,32,96,70,117,110,96,46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,10,116,117,112,108,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,10,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,98,117,116,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,98,101,32,117,115,101,102,117,108,32,105,110,10,62,32,108,105,98,114,97,114,121,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,110,101,101,100,32,116,111,32,118,101,114,105,102,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,46,10,10,84,119,111,32,116,121,112,101,115,32,111,102,32,102,117,110,115,32,104,97,118,101,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,115,101,109,97,110,116,105,99,115,58,10,10,45,32,65,32,102,117,110,32,99,114,101,97,116,101,100,32,98,121,32,96,102,117,110,32,77,58,70,47,65,96,32,105,115,32,99,97,108,108,101,100,32,97,110,32,95,101,120,116,101,114,110,97,108,95,32,102,117,110,46,32,67,97,108,108,105,110,103,32,105,116,32,119,105,108,108,10,32,32,97,108,119,97,121,115,32,99,97,108,108,32,116,104,101,32,102,117,110,99,116,105,111,110,32,96,70,96,32,119,105,116,104,32,97,114,105,116,121,32,96,65,96,32,105,110,32,116,104,101,32,108,97,116,101,115,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32,96,77,96,46,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,100,117,108,101,32,96,77,96,32,100,111,101,115,32,110,111,116,32,101,118,101,110,32,110,101,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,10,32,32,96,102,117,110,32,77,58,70,47,65,96,32,105,115,32,99,114,101,97,116,101,100,46,10,45,32,65,108,108,32,111,116,104,101,114,32,102,117,110,115,32,97,114,101,32,99,97,108,108,101,100,32,95,108,111,99,97,108,95,46,32,87,104,101,110,32,97,32,108,111,99,97,108,32,102,117,110,32,105,115,32,99,97,108,108,101,100,44,32,116,104,101,32,115,97,109,101,10,32,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,32,105,115,32,99,97,108,108,101,100,32,40,101,118,101,110,32,105,102,32,97,32,110,101,119,101,114,32,118,101,114,115,105,111,110,32,111,102,10,32,32,116,104,101,32,109,111,100,117,108,101,32,104,97,115,32,98,101,101,110,32,108,111,97,100,101,100,41,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,97,108,119,97,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,102,111,114,32,98,111,116,104,32,108,111,99,97,108,32,97,110,100,10,101,120,116,101,114,110,97,108,32,102,117,110,115,58,10,10,45,32,42,42,96,123,116,121,112,101,44,32,84,121,112,101,125,96,42,42,32,45,32,96,84,121,112,101,96,32,105,115,32,96,108,111,99,97,108,96,32,111,114,32,96,101,120,116,101,114,110,97,108,96,46,10,10,45,32,42,42,96,123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,32,40,97,110,32,97,116,111,109,41,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,102,117,110,32,105,115,32,100,101,102,105,110,101,100,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46,10,10,45,32,42,42,96,123,110,97,109,101,44,32,78,97,109,101,125,96,42,42,32,45,32,96,78,97,109,101,96,32,40,97,110,32,97,116,111,109,41,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,110,97,109,101,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,116,104,97,116,10,32,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,102,117,110,46,32,40,84,104,105,115,32,110,97,109,101,32,119,97,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,97,110,100,32,105,115,32,111,110,108,121,32,111,102,10,32,32,105,110,102,111,114,109,97,116,105,111,110,97,108,32,117,115,101,46,32,65,115,32,105,116,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,99,97,108,108,101,100,32,100,105,114,101,99,116,108,121,46,41,10,32,32,73,102,32,110,111,32,99,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,101,32,102,117,110,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,110,10,32,32,97,116,111,109,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32,116,104,97,116,10,32,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46,10,10,45,32,42,42,96,123,97,114,105,116,121,44,32,65,114,105,116,121,125,96,42,42,32,45,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,102,117,110,32,105,115,32,116,111,10,32,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,46,10,10,45,32,42,42,96,123,101,110,118,44,32,69,110,118,125,96,42,42,32,45,32,96,69,110,118,96,32,40,97,32,108,105,115,116,41,32,105,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,114,32,102,114,101,101,32,118,97,114,105,97,98,108,101,115,32,102,111,114,32,116,104,101,10,32,32,102,117,110,46,32,70,111,114,32,101,120,116,101,114,110,97,108,32,102,117,110,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,105,115,32,97,108,119,97,121,115,32,101,109,112,116,121,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,110,108,121,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,105,102,32,96,70,117,110,96,32,105,115,32,108,111,99,97,108,58,10,10,45,32,42,42,96,123,112,105,100,44,32,80,105,100,125,96,42,42,32,45,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,96,105,110,105,116,96,32,112,114,111,99,101,115,115,32,111,110,10,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,83,116,97,114,116,105,110,103,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,50,55,44,32,96,80,105,100,96,32,97,108,119,97,121,115,32,112,111,105,110,116,115,32,116,111,32,116,104,101,32,108,111,99,97,108,32,96,105,110,105,116,96,32,112,114,111,99,101,115,115,44,10,32,32,62,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,105,99,104,32,112,114,111,99,101,115,115,32,111,114,32,110,111,100,101,32,116,104,101,32,102,117,110,32,119,97,115,32,111,114,105,103,105,110,97,108,108,121,32,99,114,101,97,116,101,100,32,111,110,46,10,32,32,62,10,32,32,62,32,83,101,101,10,32,32,62,32,91,85,112,99,111,109,105,110,103,32,80,111,116,101,110,116,105,97,108,32,73,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,32,93,40,96,101,58,103,101,110,101,114,97,108,95,105,110,102,111,58,117,112,99,111,109,105,110,103,95,105,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,46,109,100,35,102,117,110,45,99,114,101,97,116,111,114,45,112,105,100,45,119,105,108,108,45,97,108,119,97,121,115,45,98,101,45,108,111,99,97,108,45,105,110,105,116,45,112,114,111,99,101,115,115,96,41,46,10,10,45,32,42,42,96,123,105,110,100,101,120,44,32,73,110,100,101,120,125,96,42,42,32,45,32,96,73,110,100,101,120,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,10,32,32,116,97,98,108,101,46,10,10,45,32,42,42,96,123,110,101,119,95,105,110,100,101,120,44,32,73,110,100,101,120,125,96,42,42,32,45,32,96,73,110,100,101,120,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,10,32,32,102,117,110,32,116,97,98,108,101,46,10,10,45,32,42,42,96,123,110,101,119,95,117,110,105,113,44,32,85,110,105,113,125,96,42,42,32,45,32,96,85,110,105,113,96,32,40,97,32,98,105,110,97,114,121,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,73,116,10,32,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,123,117,110,105,113,44,32,85,110,105,113,125,96,42,42,32,45,32,96,85,110,105,113,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,65,115,10,32,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,10,32,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,119,97,115,32,98,97,115,101,100,32,111,110,32,111,110,108,121,32,116,104,101,32,98,111,100,121,10,32,32,111,102,32,116,104,101,32,102,117,110,46>>},#{group => terms,specification => [{attribute,{11006,2},spec,{{fun_info,1},[{type,{11006,15},bounded_fun,[{type,{11006,15},'fun',[{type,{11006,15},product,[{var,{11006,16},'Fun'}]},{type,{11006,24},list,[{type,{11006,25},tuple,[{var,{11006,26},'Item'},{var,{11006,32},'Info'}]}]}]},[{type,{11007,7},constraint,[{atom,{11007,7},is_subtype},[{var,{11007,7},'Fun'},{type,{11007,14},function,[]}]]},{type,{11008,7},constraint,[{atom,{11008,7},is_subtype},[{var,{11008,7},'Item'},{type,{11008,15},union,[{atom,{11008,15},arity},{atom,{11008,23},env},{atom,{11008,29},index},{atom,{11008,37},name},{atom,{11009,15},module},{atom,{11009,24},new_index},{atom,{11009,36},new_uniq},{atom,{11009,47},pid},{atom,{11009,53},type},{atom,{11009,60},uniq}]}]]},{type,{11010,7},constraint,[{atom,{11010,7},is_subtype},[{var,{11010,7},'Info'},{type,{11010,15},term,[]}]]}]]}]}}]}},{{function,disconnect_node,1},{10910,2},[<<100,105,115,99,111,110,110,101,99,116,95,110,111,100,101,40,78,111,100,101,41>>],#{<<101,110>> => <<70,111,114,99,101,115,32,116,104,101,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,111,102,32,97,32,110,111,100,101,46,10,10,68,111,105,110,103,32,116,104,105,115,32,109,97,107,101,115,32,105,116,32,97,112,112,101,97,114,115,32,116,111,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,32,97,115,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,104,97,115,32,99,114,97,115,104,101,100,46,10,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,110,101,116,119,111,114,107,32,97,117,116,104,101,110,116,105,99,97,116,105,111,110,32,112,114,111,116,111,99,111,108,115,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,32,73,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,10,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,105,103,110,111,114,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,121,32,114,101,116,117,114,110,32,98,101,102,111,114,101,32,91,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,115,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,104,97,118,101,10,62,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46>>},#{group => distribution,specification => [{attribute,{10925,2},spec,{{disconnect_node,1},[{type,{10925,22},bounded_fun,[{type,{10925,22},'fun',[{type,{10925,22},product,[{var,{10925,23},'Node'}]},{type,{10925,32},union,[{type,{10925,32},boolean,[]},{atom,{10925,44},ignored}]}]},[{type,{10926,7},constraint,[{atom,{10926,7},is_subtype},[{var,{10926,7},'Node'},{type,{10926,15},node,[]}]]}]]}]}}]}},{{function,nodes,2},{10837,2},[<<110,111,100,101,115,40,65,114,103,44,32,73,110,102,111,79,112,116,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,78,111,100,101,73,110,102,111,96,32,116,117,112,108,101,115,46,10,10,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,46,32,78,111,100,101,115,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,97,114,101,32,100,101,116,101,114,109,105,110,101,100,10,98,121,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,96,65,114,103,96,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,102,111,114,32,91,96,110,111,100,101,115,40,65,114,103,41,96,93,40,96,110,111,100,101,115,47,49,96,41,46,10,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,111,102,32,96,78,111,100,101,73,110,102,111,96,32,116,117,112,108,101,115,32,105,115,32,97,32,109,97,112,32,99,111,110,116,97,105,110,105,110,103,32,102,117,114,116,104,101,114,32,105,110,102,111,114,109,97,116,105,111,110,10,97,98,111,117,116,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,46,10,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,112,114,101,115,101,110,116,32,105,110,32,116,104,105,115,32,109,97,112,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,10,96,73,110,102,111,79,112,116,115,96,32,109,97,112,32,112,97,115,115,101,100,32,97,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,97,115,115,111,99,105,97,116,105,111,110,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,96,73,110,102,111,79,112,116,115,96,32,109,97,112,58,10,10,45,32,42,42,96,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,98,111,111,108,101,97,110,40,41,96,42,42,32,45,32,73,102,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,97,115,115,111,99,105,97,116,105,111,110,32,101,113,117,97,108,115,10,32,32,96,116,114,117,101,96,44,32,116,104,101,32,96,73,110,102,111,96,32,109,97,112,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,107,101,121,10,32,32,96,99,111,110,110,101,99,116,105,111,110,95,105,100,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,46,32,73,102,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,10,32,32,101,113,117,97,108,115,32,96,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,44,32,111,114,32,105,115,32,116,104,101,32,110,111,100,101,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,10,32,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,110,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,10,32,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,10,10,32,32,91,93,40,41,123,58,32,35,99,111,110,110,101,99,116,105,111,110,95,105,100,32,125,32,84,104,101,32,105,110,116,101,103,101,114,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,118,97,108,117,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,10,32,32,97,32,110,111,100,101,32,110,97,109,101,32,105,100,101,110,116,105,102,105,101,115,32,97,32,115,112,101,99,105,102,105,99,32,99,111,110,110,101,99,116,105,111,110,32,105,110,115,116,97,110,99,101,32,116,111,32,116,104,101,32,110,111,100,101,32,119,105,116,104,32,116,104,97,116,10,32,32,110,111,100,101,32,110,97,109,101,46,32,84,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,118,97,108,117,101,32,105,115,32,110,111,100,101,32,108,111,99,97,108,46,32,84,104,97,116,32,105,115,44,32,111,110,32,116,104,101,10,32,32,111,116,104,101,114,32,110,111,100,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,119,105,108,108,32,95,110,111,116,95,32,98,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,46,32,73,102,32,97,10,32,32,99,111,110,110,101,99,116,105,111,110,32,105,115,32,116,97,107,101,110,32,100,111,119,110,32,97,110,100,32,116,104,101,110,32,116,97,107,101,110,32,117,112,32,97,103,97,105,110,44,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,10,32,32,118,97,108,117,101,32,119,105,108,108,32,99,104,97,110,103,101,32,102,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,32,84,104,101,32,97,109,111,117,110,116,32,111,102,32,118,97,108,117,101,115,32,102,111,114,10,32,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,44,32,115,111,32,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,115,101,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,10,32,32,102,111,114,32,100,105,102,102,101,114,101,110,116,32,105,110,115,116,97,110,99,101,115,44,32,98,117,116,32,113,117,105,116,101,32,117,110,108,105,107,101,108,121,46,32,73,116,32,105,115,32,117,110,100,101,102,105,110,101,100,32,104,111,119,32,116,104,101,32,118,97,108,117,101,10,32,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,116,119,111,32,99,111,110,115,101,99,117,116,105,118,101,32,99,111,110,110,101,99,116,105,111,110,32,105,110,115,116,97,110,99,101,115,46,10,10,45,32,42,42,96,110,111,100,101,95,116,121,112,101,32,61,62,32,98,111,111,108,101,97,110,40,41,96,42,42,32,45,32,73,102,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,97,115,115,111,99,105,97,116,105,111,110,32,101,113,117,97,108,115,32,96,116,114,117,101,96,44,10,32,32,116,104,101,32,96,73,110,102,111,96,32,109,97,112,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,107,101,121,32,96,110,111,100,101,95,116,121,112,101,96,10,32,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,78,111,100,101,84,121,112,101,73,110,102,111,96,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,110,111,100,101,32,116,121,112,101,115,10,32,32,101,120,105,115,116,58,10,10,32,32,45,32,42,42,96,118,105,115,105,98,108,101,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,32,32,32,32,116,104,114,111,117,103,104,32,97,110,32,111,114,100,105,110,97,114,121,32,118,105,115,105,98,108,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,119,111,117,108,100,32,97,112,112,101,97,114,10,32,32,32,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,98,121,32,96,110,111,100,101,115,47,48,96,46,10,10,32,32,45,32,42,42,96,104,105,100,100,101,110,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,32,32,32,32,116,104,114,111,117,103,104,32,97,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,119,111,117,108,100,32,95,110,111,116,95,32,97,112,112,101,97,114,32,105,110,10,32,32,32,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,98,121,32,96,110,111,100,101,115,47,48,96,46,10,10,32,32,45,32,42,42,96,116,104,105,115,96,42,42,32,45,32,84,104,105,115,32,105,115,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,32,32,45,32,42,42,96,107,110,111,119,110,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,111,110,110,101,99,116,101,100,32,98,117,116,32,107,110,111,119,110,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,32,32,112,114,111,99,101,115,115,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,40,97,64,108,111,99,97,108,104,111,115,116,41,49,62,32,110,111,100,101,115,40,91,116,104,105,115,44,32,99,111,110,110,101,99,116,101,100,93,44,32,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,61,62,116,114,117,101,44,32,110,111,100,101,95,116,121,112,101,61,62,116,114,117,101,125,41,46,10,91,123,99,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,49,51,56,57,50,49,48,56,44,110,111,100,101,95,116,121,112,101,32,61,62,32,104,105,100,100,101,110,125,125,44,10,32,123,98,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,51,48,54,55,53,53,51,44,110,111,100,101,95,116,121,112,101,32,61,62,32,118,105,115,105,98,108,101,125,125,44,10,32,123,97,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,117,110,100,101,102,105,110,101,100,44,110,111,100,101,95,116,121,112,101,32,61,62,32,116,104,105,115,125,125,93,10,40,97,64,108,111,99,97,108,104,111,115,116,41,50,62,10,96,96,96>>},#{group => distribution,specification => [{attribute,{10896,2},spec,{{nodes,2},[{type,{10896,12},bounded_fun,[{type,{10896,12},'fun',[{type,{10896,12},product,[{var,{10896,13},'Arg'},{var,{10896,18},'InfoOpts'}]},{type,{10896,31},list,[{var,{10896,32},'NodeInfo'}]}]},[{type,{10897,7},constraint,[{atom,{10897,7},is_subtype},[{var,{10897,7},'NodeType'},{type,{10897,19},union,[{atom,{10897,19},visible},{atom,{10897,29},hidden},{atom,{10897,38},connected},{atom,{10897,50},this},{atom,{10897,57},known}]}]]},{type,{10898,7},constraint,[{atom,{10898,7},is_subtype},[{var,{10898,7},'Arg'},{type,{10898,14},union,[{var,{10898,14},'NodeType'},{type,{10898,25},list,[{var,{10898,26},'NodeType'}]}]}]]},{type,{10899,7},constraint,[{atom,{10899,7},is_subtype},[{var,{10899,7},'InfoOpts'},{type,{10899,19},map,[{type,{10899,35},map_field_assoc,[{atom,{10899,21},connection_id},{type,{10899,38},boolean,[]}]},{type,{10900,31},map_field_assoc,[{atom,{10900,21},node_type},{type,{10900,34},boolean,[]}]}]}]]},{type,{10901,7},constraint,[{atom,{10901,7},is_subtype},[{var,{10901,7},'NodeTypeInfo'},{type,{10901,23},union,[{atom,{10901,23},visible},{atom,{10901,33},hidden},{atom,{10901,42},this},{atom,{10901,49},known}]}]]},{type,{10902,7},constraint,[{atom,{10902,7},is_subtype},[{var,{10902,7},'ConnectionId'},{type,{10902,23},union,[{atom,{10902,23},undefined},{type,{10902,35},integer,[]}]}]]},{type,{10903,7},constraint,[{atom,{10903,7},is_subtype},[{var,{10903,7},'Info'},{type,{10903,15},map,[{type,{10903,31},map_field_assoc,[{atom,{10903,17},connection_id},{var,{10903,34},'ConnectionId'}]},{type,{10904,27},map_field_assoc,[{atom,{10904,17},node_type},{var,{10904,30},'NodeTypeInfo'}]}]}]]},{type,{10905,7},constraint,[{atom,{10905,7},is_subtype},[{var,{10905,7},'NodeInfo'},{type,{10905,19},tuple,[{type,{10905,20},node,[]},{var,{10905,28},'Info'}]}]]}]]}]}}],since => <<79,84,80,32,50,53,46,49>>}},{{function,nodes,1},{10804,2},[<<110,111,100,101,115,40,65,114,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,10,114,101,115,117,108,116,44,32,119,104,101,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,44,32,105,115,32,116,104,101,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,115,97,116,105,115,102,121,105,110,103,32,116,104,101,10,100,105,115,106,117,110,99,116,105,111,110,40,115,41,32,111,102,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,46,10,10,96,78,111,100,101,84,121,112,101,96,115,58,10,10,45,32,42,42,96,118,105,115,105,98,108,101,96,123,58,32,35,110,111,100,101,115,95,118,105,115,105,98,108,101,32,125,42,42,32,45,32,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,10,32,32,99,111,110,110,101,99,116,105,111,110,115,46,10,10,45,32,42,42,96,104,105,100,100,101,110,96,42,42,32,45,32,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,46,10,10,45,32,42,42,96,99,111,110,110,101,99,116,101,100,96,42,42,32,45,32,65,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,46,10,10,45,32,42,42,96,116,104,105,115,96,42,42,32,45,32,84,104,105,115,32,110,111,100,101,46,10,10,45,32,42,42,96,107,110,111,119,110,96,42,42,32,45,32,78,111,100,101,115,32,116,104,97,116,32,97,114,101,32,107,110,111,119,110,32,116,111,32,116,104,105,115,32,110,111,100,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,32,97,110,100,10,32,32,110,111,100,101,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,10,32,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,84,104,101,32,115,101,116,32,111,102,32,107,110,111,119,110,32,110,111,100,101,115,32,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,10,32,32,116,104,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,99,97,110,32,98,101,32,100,101,108,97,121,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41,46,10,10,83,111,109,101,32,101,113,117,97,108,105,116,105,101,115,58,32,96,91,110,111,100,101,40,41,93,32,61,32,110,111,100,101,115,40,116,104,105,115,41,96,44,10,96,110,111,100,101,115,40,99,111,110,110,101,99,116,101,100,41,32,61,32,110,111,100,101,115,40,91,118,105,115,105,98,108,101,44,32,104,105,100,100,101,110,93,41,96,44,32,97,110,100,32,96,110,111,100,101,115,40,41,32,61,32,110,111,100,101,115,40,118,105,115,105,98,108,101,41,96,46>>},#{group => distribution,specification => [{attribute,{10830,2},spec,{{nodes,1},[{type,{10830,12},bounded_fun,[{type,{10830,12},'fun',[{type,{10830,12},product,[{var,{10830,13},'Arg'}]},{var,{10830,21},'Nodes'}]},[{type,{10831,7},constraint,[{atom,{10831,7},is_subtype},[{var,{10831,7},'Arg'},{type,{10831,14},union,[{var,{10831,14},'NodeType'},{type,{10831,25},list,[{var,{10831,26},'NodeType'}]}]}]]},{type,{10832,7},constraint,[{atom,{10832,7},is_subtype},[{var,{10832,7},'NodeType'},{type,{10832,19},union,[{atom,{10832,19},visible},{atom,{10832,29},hidden},{atom,{10832,38},connected},{atom,{10832,50},this},{atom,{10832,57},known}]}]]},{type,{10833,7},constraint,[{atom,{10833,7},is_subtype},[{var,{10833,7},'Nodes'},{type,{10833,16},list,[{type,{10833,17},node,[]}]}]]}]]}]}}]}},{{function,nodes,0},{10793,2},[<<110,111,100,101,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,10,40,116,104,97,116,32,105,115,44,32,91,104,105,100,100,101,110,32,110,111,100,101,115,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,35,104,105,100,100,101,110,45,110,111,100,101,115,96,41,32,97,114,101,32,110,111,116,10,108,105,115,116,101,100,41,46,32,83,97,109,101,32,97,115,32,91,110,111,100,101,115,40,118,105,115,105,98,108,101,41,93,40,35,110,111,100,101,115,95,118,105,115,105,98,108,101,41,46>>},#{group => distribution,specification => [{attribute,{10799,2},spec,{{nodes,0},[{type,{10799,12},bounded_fun,[{type,{10799,12},'fun',[{type,{10799,12},product,[]},{var,{10799,18},'Nodes'}]},[{type,{10800,7},constraint,[{atom,{10800,7},is_subtype},[{var,{10800,7},'Nodes'},{type,{10800,16},list,[{type,{10800,17},node,[]}]}]]}]]}]}}]}},{{function,yield,0},{10769,2},[<<121,105,101,108,100,40,41>>],#{<<101,110>> => <<84,114,105,101,115,32,116,111,32,103,105,118,101,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,111,114,32,104,105,103,104,101,114,32,112,114,105,111,114,105,116,121,32,40,105,102,32,97,110,121,41,32,97,32,99,104,97,110,99,101,10,116,111,32,101,120,101,99,117,116,101,32,98,101,102,111,114,101,32,114,101,116,117,114,110,105,110,103,46,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,32,114,117,110,115,10,98,101,116,119,101,101,110,32,116,104,101,32,105,110,118,111,99,97,116,105,111,110,32,97,110,100,32,114,101,116,117,114,110,32,111,102,32,96,101,114,108,97,110,103,58,121,105,101,108,100,47,48,96,46,10,10,83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,10,91,96,114,101,99,101,105,118,101,45,97,102,116,101,114,96,32,101,120,112,114,101,115,115,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,114,101,99,101,105,118,101,96,41,32,102,111,114,32,104,111,119,32,116,111,32,109,97,107,101,10,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,108,101,101,112,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,110,117,109,98,101,114,32,111,102,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,32,97,110,121,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,105,115,32,66,73,70,46,32,85,115,105,110,103,32,116,104,105,115,32,66,73,70,32,119,105,116,104,111,117,116,32,97,10,62,32,116,104,111,114,111,117,103,104,32,103,114,97,115,112,32,111,102,32,104,111,119,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,111,114,107,115,32,99,97,110,32,99,97,117,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,46,10,62,32,84,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,112,117,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,108,97,115,116,32,105,110,10,62,32,116,104,101,32,99,117,114,114,101,110,116,32,115,99,104,101,100,117,108,101,114,39,115,32,113,117,101,117,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,111,102,32,116,104,101,32,115,97,109,101,32,112,114,105,111,114,105,116,121,32,97,115,32,116,104,101,10,62,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{10787,2},spec,{{yield,0},[{type,{10787,12},'fun',[{type,{10787,12},product,[]},{atom,{10787,18},true}]}]}}]}},{{function,spawn_request_abandon,1},{10720,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,40,82,101,113,73,100,41>>],#{<<101,110>> => <<65,98,97,110,100,111,110,32,97,32,112,114,101,118,105,111,117,115,108,121,32,105,115,115,117,101,100,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,96,82,101,113,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,114,101,113,117,101,115,116,10,105,100,101,110,116,105,102,105,101,114,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,98,121,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,105,110,32,97,10,99,97,108,108,32,102,114,111,109,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,109,97,100,101,32,116,104,101,32,114,101,113,117,101,115,116,10,99,97,110,32,97,98,97,110,100,111,110,32,116,104,101,32,114,101,113,117,101,115,116,46,10,10,65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,111,110,108,121,32,98,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,10,99,111,109,112,108,101,116,101,100,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,10,110,111,116,32,98,101,32,101,102,102,101,99,116,101,100,32,98,121,32,102,117,116,117,114,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,116,115,101,108,102,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,105,116,32,119,105,108,108,32,110,111,116,32,114,101,99,101,105,118,101,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,101,32,114,101,113,117,101,115,116,32,105,115,32,104,111,119,101,118,101,114,32,110,111,116,10,119,105,116,104,100,114,97,119,110,44,32,115,111,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,101,32,114,101,113,117,101,115,116,46,32,73,102,32,97,10,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,97,102,116,101,114,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,44,32,110,111,32,109,111,110,105,116,111,114,115,32,110,111,114,10,108,105,110,107,115,32,119,105,108,108,32,98,101,32,115,101,116,32,117,112,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,41,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,73,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,110,99,108,117,100,101,100,32,116,104,101,32,96,108,105,110,107,96,32,111,112,116,105,111,110,44,32,116,104,101,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,105,115,10,114,101,113,117,101,115,116,32,119,105,108,108,32,98,101,32,115,101,110,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,105,116,115,32,112,97,114,101,110,116,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,10,96,97,98,97,110,100,111,110,101,100,96,32,119,104,101,110,32,105,116,32,105,115,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,97,98,97,110,100,111,110,101,100,32,109,97,121,10,62,32,99,111,109,109,117,110,105,99,97,116,101,32,119,105,116,104,32,105,116,115,32,112,97,114,101,110,116,32,97,115,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,73,116,32,105,115,32,95,111,110,108,121,95,32,116,104,101,32,100,105,114,101,99,116,10,62,32,101,102,102,101,99,116,115,32,111,110,32,116,104,101,32,112,97,114,101,110,116,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,115,112,97,119,110,32,114,101,113,117,101,115,116,44,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,97,110,99,101,108,101,100,32,98,121,10,62,32,97,98,97,110,100,111,110,105,110,103,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,10,82,101,116,117,114,110,32,118,97,108,117,101,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,46,32,84,104,101,32,96,82,101,113,73,100,96,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,10,32,32,100,105,100,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,110,32,111,117,116,115,116,97,110,100,105,110,103,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,115,117,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,105,116,104,101,114,58,10,10,32,32,45,32,96,82,101,113,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,112,114,101,118,105,111,117,108,115,121,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,32,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,99,111,109,112,108,101,116,101,100,32,97,110,100,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,104,97,115,32,97,108,114,101,97,100,121,10,32,32,32,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,108,101,115,115,32,116,104,101,32,115,112,97,119,110,32,114,101,112,108,121,32,119,97,115,32,100,105,115,97,98,108,101,100,32,105,110,10,32,32,32,32,116,104,101,32,114,101,113,117,101,115,116,46,10,32,32,45,32,96,82,101,113,73,100,96,32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,97,100,101,32,98,121,32,116,104,101,10,32,32,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,82,101,113,73,100,96,32,105,115,32,110,111,116,32,97,32,114,101,102,101,114,101,110,99,101,46>>},#{group => processes,specification => [{attribute,{10764,2},spec,{{spawn_request_abandon,1},[{type,{10764,28},'fun',[{type,{10764,28},product,[{ann_type,{10764,29},[{var,{10764,29},'ReqId'},{type,{10764,38},reference,[]}]}]},{type,{10764,54},boolean,[]}]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,5},{10539,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<65,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,82,101,116,117,114,110,115,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,96,82,101,113,73,100,96,46,10,10,91,93,40,41,123,58,32,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,32,125,10,10,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,78,111,100,101,96,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,10,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32,96,123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,111,107,44,32,80,105,100,125,96,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,10,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,96,82,101,112,108,121,84,97,103,96,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,116,104,101,32,97,116,111,109,10,96,115,112,97,119,110,95,114,101,112,108,121,96,32,117,110,108,101,115,115,32,109,111,100,105,102,105,101,100,32,98,121,32,116,104,101,32,96,123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125,96,32,111,112,116,105,111,110,46,32,84,104,101,32,110,101,119,10,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,10,10,91,93,40,41,123,58,32,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,32,125,10,10,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,32,101,105,116,104,101,114,32,105,102,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,102,97,105,108,101,100,32,111,114,32,105,102,32,116,104,101,10,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,105,110,116,101,114,114,117,112,116,101,100,32,98,121,32,97,32,99,111,110,110,101,99,116,105,111,110,32,102,97,105,108,117,114,101,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,10,102,97,105,108,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,10,96,123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,101,114,114,111,114,44,32,82,101,97,115,111,110,125,96,32,119,104,101,114,101,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,46,32,83,117,99,104,32,97,10,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,110,32,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,115,112,97,119,110,32,101,114,114,111,114,32,96,82,101,97,115,111,110,96,115,32,97,114,101,32,100,101,102,105,110,101,100,44,32,98,117,116,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,97,110,121,10,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,58,10,10,45,32,42,42,96,98,97,100,111,112,116,96,42,42,32,45,32,65,110,32,105,110,118,97,108,105,100,32,96,79,112,116,105,111,110,96,32,119,97,115,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,32,78,111,116,101,32,116,104,97,116,32,100,105,102,102,101,114,101,110,116,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,109,97,121,32,115,117,112,112,111,114,116,32,100,105,102,102,101,114,101,110,116,32,111,112,116,105,111,110,115,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,115,10,32,32,105,115,115,117,101,100,32,98,121,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,46,10,10,45,32,42,42,96,110,111,99,111,110,110,101,99,116,105,111,110,96,42,42,32,45,32,70,97,105,108,117,114,101,32,116,111,32,115,101,116,32,117,112,32,97,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,78,111,100,101,96,32,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,32,119,97,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,110,10,32,32,116,104,101,32,99,97,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,119,97,115,32,108,111,115,116,44,32,97,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,67,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,100,117,101,32,116,111,32,116,104,97,116,32,115,111,109,101,32,115,121,115,116,101,109,10,32,32,108,105,109,105,116,32,119,97,115,32,114,101,97,99,104,101,100,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,97,98,108,101,32,119,97,115,32,102,117,108,108,46,10,10,86,97,108,105,100,32,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,109,111,110,105,116,111,114,96,42,42,32,45,32,73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,10,32,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,10,32,32,99,97,108,108,101,100,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32,96,82,101,113,73,100,96,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,32,105,115,32,97,108,115,111,32,117,115,101,100,32,97,115,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,97,115,32,105,102,32,105,116,32,119,97,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,10,32,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,109,111,110,105,116,111,114,32,99,97,110,32,110,111,116,32,98,101,32,91,100,101,109,111,110,105,116,111,114,101,100,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,10,32,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,102,111,114,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,32,32,109,111,110,105,116,111,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,10,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,10,32,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,119,105,108,108,10,32,32,98,101,32,100,101,108,105,118,101,114,101,100,46,10,10,32,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,10,32,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,10,32,32,111,102,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125,96,42,42,32,45,32,73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,10,32,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,10,32,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,101,101,32,116,104,101,10,32,32,96,109,111,110,105,116,111,114,96,32,111,112,116,105,111,110,32,97,98,111,118,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,32,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,10,32,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,97,110,32,97,108,105,97,115,32,105,115,10,32,32,99,114,101,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,44,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,10,32,32,109,111,110,105,116,111,114,32,105,115,32,97,99,116,105,118,97,116,101,100,46,10,10,45,32,42,42,96,108,105,110,107,96,42,42,32,45,32,73,110,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,108,105,110,107,10,32,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32,91,96,108,105,110,107,40,80,105,100,41,96,93,40,96,108,105,110,107,47,49,96,41,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,10,10,32,32,84,104,101,32,108,105,110,107,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,10,32,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,108,105,110,107,32,99,97,110,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,10,32,32,115,117,99,99,101,101,100,101,100,46,32,65,110,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,10,32,32,98,101,102,111,114,101,32,97,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,116,104,97,116,10,32,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,101,120,105,116,10,32,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,46,10,10,32,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,10,32,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,10,32,32,111,102,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,32,73,102,32,105,116,32,104,97,115,10,32,32,98,101,101,110,32,99,114,101,97,116,101,100,44,32,105,116,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,97,110,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,10,32,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,10,10,45,32,42,42,96,123,114,101,112,108,121,44,32,82,101,112,108,121,125,96,42,42,32,45,32,86,97,108,105,100,32,96,82,101,112,108,121,96,32,118,97,108,117,101,115,58,10,10,32,32,45,32,42,42,96,121,101,115,96,42,42,32,45,32,65,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,10,32,32,32,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,32,99,97,108,108,32,116,111,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,10,32,32,32,32,114,101,116,117,114,110,115,32,119,105,116,104,111,117,116,32,114,97,105,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,116,104,101,32,96,114,101,112,108,121,96,32,111,112,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32,96,121,101,115,96,44,10,32,32,32,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,101,105,116,104,101,114,32,97,10,32,32,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,111,114,32,97,110,10,32,32,32,32,91,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,46,32,84,104,101,32,96,114,101,112,108,121,96,10,32,32,32,32,111,112,116,105,111,110,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,115,101,116,32,116,111,32,96,121,101,115,96,46,10,10,32,32,45,32,42,42,96,110,111,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,10,32,32,32,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,115,46,32,84,104,105,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,10,32,32,32,32,110,111,116,46,10,10,32,32,45,32,42,42,96,101,114,114,111,114,95,111,110,108,121,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,10,32,32,32,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,97,110,10,32,32,32,32,91,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,10,32,32,32,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,46,10,10,32,32,45,32,42,42,96,115,117,99,99,101,115,115,95,111,110,108,121,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,10,32,32,32,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,98,117,116,32,97,10,32,32,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,119,105,108,108,32,98,101,32,115,101,110,116,10,32,32,32,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,46,10,10,45,32,42,42,96,123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,114,101,112,108,121,32,116,97,103,32,116,111,32,96,82,101,112,108,121,84,97,103,96,32,105,110,32,116,104,101,32,114,101,112,108,121,10,32,32,109,101,115,115,97,103,101,46,32,84,104,97,116,32,105,115,44,32,105,110,32,116,104,101,32,91,95,115,117,99,99,101,115,115,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,10,32,32,111,114,32,91,95,101,114,114,111,114,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,32,109,101,115,115,97,103,101,32,116,104,97,116,32,105,115,32,115,101,110,116,32,116,111,10,32,32,116,104,101,32,99,97,108,108,101,114,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,112,108,121,32,116,97,103,32,105,115,32,116,104,101,32,97,116,111,109,10,32,32,96,115,112,97,119,110,95,114,101,112,108,121,96,46,10,10,45,32,42,42,96,79,116,104,101,114,79,112,116,105,111,110,96,42,42,32,45,32,79,116,104,101,114,32,118,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,10,32,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,111,116,104,101,114,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,10,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,73,102,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,10,97,110,121,32,111,116,104,101,114,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,105,115,115,117,105,110,103,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,58,10,10,45,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,77,111,100,117,108,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,65,114,103,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46,10,45,32,96,79,112,116,105,111,110,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46,10,10,78,111,116,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,110,100,105,118,105,100,117,97,108,32,96,79,112,116,105,111,110,96,115,32,97,114,101,32,99,104,101,99,107,101,100,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,10,115,101,110,116,46,32,83,111,109,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,111,110,108,121,32,98,101,32,99,104,101,99,107,101,100,32,111,110,32,114,101,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,46,32,84,104,101,114,101,102,111,114,101,10,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,100,111,101,115,32,95,110,111,116,95,32,99,97,117,115,101,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,44,32,98,117,116,32,119,105,108,108,32,99,97,117,115,101,32,116,104,101,10,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32,96,98,97,100,111,112,116,96,46,10,10,65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,98,101,32,97,98,97,110,100,111,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{10687,2},spec,{{spawn_request,5},[{type,{10687,20},bounded_fun,[{type,{10687,20},'fun',[{type,{10687,20},product,[{var,{10687,21},'Node'},{var,{10687,27},'Module'},{var,{10687,35},'Function'},{var,{10687,45},'Args'},{var,{10687,51},'Options'}]},{var,{10688,28},'ReqId'}]},[{type,{10689,7},constraint,[{atom,{10689,7},is_subtype},[{var,{10689,7},'Node'},{type,{10689,15},node,[]}]]},{type,{10690,7},constraint,[{atom,{10690,7},is_subtype},[{var,{10690,7},'Module'},{type,{10690,17},module,[]}]]},{type,{10691,7},constraint,[{atom,{10691,7},is_subtype},[{var,{10691,7},'Function'},{type,{10691,19},atom,[]}]]},{type,{10692,7},constraint,[{atom,{10692,7},is_subtype},[{var,{10692,7},'Args'},{type,{10692,15},list,[{type,{10692,16},term,[]}]}]]},{type,{10693,7},constraint,[{atom,{10693,7},is_subtype},[{var,{10693,7},'Options'},{type,{10693,18},list,[{var,{10693,19},'Option'}]}]]},{type,{10694,7},constraint,[{atom,{10694,7},is_subtype},[{var,{10694,7},'Option'},{type,{10694,17},union,[{atom,{10694,17},monitor},{type,{10695,17},tuple,[{atom,{10695,18},monitor},{type,{10695,27},list,[{user_type,{10695,28},monitor_option,[]}]}]},{atom,{10696,17},link},{type,{10697,17},tuple,[{atom,{10697,18},reply_tag},{var,{10697,29},'ReplyTag'}]},{type,{10698,17},tuple,[{atom,{10698,18},reply},{var,{10698,25},'Reply'}]},{var,{10699,17},'OtherOption'}]}]]},{type,{10700,7},constraint,[{atom,{10700,7},is_subtype},[{var,{10700,7},'ReplyTag'},{type,{10700,19},term,[]}]]},{type,{10701,7},constraint,[{atom,{10701,7},is_subtype},[{var,{10701,7},'Reply'},{type,{10701,16},union,[{atom,{10701,16},yes},{atom,{10701,22},no},{atom,{10701,27},error_only},{atom,{10701,40},success_only}]}]]},{type,{10702,7},constraint,[{atom,{10702,7},is_subtype},[{var,{10702,7},'OtherOption'},{type,{10702,22},term,[]}]]},{type,{10703,7},constraint,[{atom,{10703,7},is_subtype},[{var,{10703,7},'ReqId'},{type,{10703,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},{10484,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,79,114,77,111,100,117,108,101,44,32,77,111,100,117,108,101,79,114,70,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,79,114,65,114,103,115,44,32,65,114,103,115,79,114,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,10,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>},#{group => processes,specification => [{attribute,{10498,2},spec,{{spawn_request,4},[{type,{10498,20},bounded_fun,[{type,{10498,20},'fun',[{type,{10498,20},product,[{var,{10498,21},'Node'},{var,{10498,27},'Module'},{var,{10498,35},'Function'},{var,{10498,45},'Args'}]},{var,{10499,28},'ReqId'}]},[{type,{10500,7},constraint,[{atom,{10500,7},is_subtype},[{var,{10500,7},'Node'},{type,{10500,15},node,[]}]]},{type,{10501,7},constraint,[{atom,{10501,7},is_subtype},[{var,{10501,7},'Module'},{type,{10501,17},module,[]}]]},{type,{10502,7},constraint,[{atom,{10502,7},is_subtype},[{var,{10502,7},'Function'},{type,{10502,19},atom,[]}]]},{type,{10503,7},constraint,[{atom,{10503,7},is_subtype},[{var,{10503,7},'Args'},{type,{10503,15},list,[{type,{10503,16},term,[]}]}]]},{type,{10504,7},constraint,[{atom,{10504,7},is_subtype},[{var,{10504,7},'ReqId'},{type,{10504,16},reference,[]}]]}]]},{type,{10505,20},bounded_fun,[{type,{10505,20},'fun',[{type,{10505,20},product,[{var,{10505,21},'Module'},{var,{10505,29},'Function'},{var,{10505,39},'Args'},{var,{10505,45},'Options'}]},{var,{10506,28},'ReqId'}]},[{type,{10507,7},constraint,[{atom,{10507,7},is_subtype},[{var,{10507,7},'Module'},{type,{10507,17},module,[]}]]},{type,{10508,7},constraint,[{atom,{10508,7},is_subtype},[{var,{10508,7},'Function'},{type,{10508,19},atom,[]}]]},{type,{10509,7},constraint,[{atom,{10509,7},is_subtype},[{var,{10509,7},'Args'},{type,{10509,15},list,[{type,{10509,16},term,[]}]}]]},{type,{10510,7},constraint,[{atom,{10510,7},is_subtype},[{var,{10510,7},'Option'},{type,{10510,17},union,[{type,{10510,17},tuple,[{atom,{10510,18},reply_tag},{var,{10510,29},'ReplyTag'}]},{type,{10511,17},tuple,[{atom,{10511,18},reply},{var,{10511,25},'Reply'}]},{user_type,{10512,17},spawn_opt_option,[]}]}]]},{type,{10513,7},constraint,[{atom,{10513,7},is_subtype},[{var,{10513,7},'ReplyTag'},{type,{10513,19},term,[]}]]},{type,{10514,7},constraint,[{atom,{10514,7},is_subtype},[{var,{10514,7},'Reply'},{type,{10514,16},union,[{atom,{10514,16},yes},{atom,{10514,22},no},{atom,{10514,27},error_only},{atom,{10514,40},success_only}]}]]},{type,{10515,7},constraint,[{atom,{10515,7},is_subtype},[{var,{10515,7},'Options'},{type,{10515,18},list,[{var,{10515,19},'Option'}]}]]},{type,{10516,7},constraint,[{atom,{10516,7},is_subtype},[{var,{10516,7},'ReqId'},{type,{10516,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},{10423,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,79,114,77,111,100,117,108,101,44,32,70,117,110,79,114,70,117,110,99,116,105,111,110,44,32,79,112,116,105,111,110,115,79,114,65,114,103,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,101,114,108,97,110,103,44,97,112,112,108,121,44,91,70,117,110,44,91,93,93,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,100,101,112,101,110,100,105,110,103,10,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,117,115,105,110,103,32,116,104,101,32,102,117,110,32,96,70,117,110,96,32,111,102,32,97,114,105,116,121,32,122,101,114,111,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,58,10,10,45,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,70,117,110,96,32,105,115,32,110,111,116,32,97,32,102,117,110,32,111,102,32,97,114,105,116,121,32,122,101,114,111,46,10,45,32,96,79,112,116,105,111,110,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>},#{group => processes,specification => [{attribute,{10444,2},spec,{{spawn_request,3},[{type,{10444,20},bounded_fun,[{type,{10444,20},'fun',[{type,{10444,20},product,[{var,{10444,21},'Node'},{var,{10444,27},'Fun'},{var,{10444,32},'Options'}]},{var,{10444,44},'ReqId'}]},[{type,{10445,7},constraint,[{atom,{10445,7},is_subtype},[{var,{10445,7},'Node'},{type,{10445,15},node,[]}]]},{type,{10446,7},constraint,[{atom,{10446,7},is_subtype},[{var,{10446,7},'Fun'},{type,{10446,14},function,[]}]]},{type,{10447,7},constraint,[{atom,{10447,7},is_subtype},[{var,{10447,7},'Options'},{type,{10447,18},list,[{var,{10447,19},'Option'}]}]]},{type,{10448,7},constraint,[{atom,{10448,7},is_subtype},[{var,{10448,7},'Option'},{type,{10448,17},union,[{atom,{10448,17},monitor},{type,{10449,17},tuple,[{atom,{10449,18},monitor},{type,{10449,27},list,[{user_type,{10449,28},monitor_option,[]}]}]},{atom,{10450,17},link},{type,{10451,17},tuple,[{atom,{10451,18},reply_tag},{var,{10451,29},'ReplyTag'}]},{type,{10452,17},tuple,[{atom,{10452,18},reply},{var,{10452,25},'Reply'}]},{var,{10453,17},'OtherOption'}]}]]},{type,{10454,7},constraint,[{atom,{10454,7},is_subtype},[{var,{10454,7},'ReplyTag'},{type,{10454,19},term,[]}]]},{type,{10455,7},constraint,[{atom,{10455,7},is_subtype},[{var,{10455,7},'Reply'},{type,{10455,16},union,[{atom,{10455,16},yes},{atom,{10455,22},no},{atom,{10455,27},error_only},{atom,{10455,40},success_only}]}]]},{type,{10456,7},constraint,[{atom,{10456,7},is_subtype},[{var,{10456,7},'OtherOption'},{type,{10456,22},term,[]}]]},{type,{10457,7},constraint,[{atom,{10457,7},is_subtype},[{var,{10457,7},'ReqId'},{type,{10457,16},reference,[]}]]}]]},{type,{10458,20},bounded_fun,[{type,{10458,20},'fun',[{type,{10458,20},product,[{var,{10458,21},'Module'},{var,{10458,29},'Function'},{var,{10458,39},'Args'}]},{var,{10459,28},'ReqId'}]},[{type,{10460,7},constraint,[{atom,{10460,7},is_subtype},[{var,{10460,7},'Module'},{type,{10460,17},module,[]}]]},{type,{10461,7},constraint,[{atom,{10461,7},is_subtype},[{var,{10461,7},'Function'},{type,{10461,19},atom,[]}]]},{type,{10462,7},constraint,[{atom,{10462,7},is_subtype},[{var,{10462,7},'Args'},{type,{10462,15},list,[{type,{10462,16},term,[]}]}]]},{type,{10463,7},constraint,[{atom,{10463,7},is_subtype},[{var,{10463,7},'ReqId'},{type,{10463,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},{10376,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,70,117,110,79,114,78,111,100,101,44,32,79,112,116,105,111,110,115,79,114,70,117,110,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,70,117,110,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{10388,2},spec,{{spawn_request,2},[{type,{10388,20},bounded_fun,[{type,{10388,20},'fun',[{type,{10388,20},product,[{var,{10388,21},'Fun'},{var,{10388,26},'Options'}]},{var,{10388,38},'ReqId'}]},[{type,{10389,7},constraint,[{atom,{10389,7},is_subtype},[{var,{10389,7},'Fun'},{type,{10389,14},function,[]}]]},{type,{10390,7},constraint,[{atom,{10390,7},is_subtype},[{var,{10390,7},'Option'},{type,{10390,17},union,[{type,{10390,17},tuple,[{atom,{10390,18},reply_tag},{var,{10390,29},'ReplyTag'}]},{type,{10391,17},tuple,[{atom,{10391,18},reply},{var,{10391,25},'Reply'}]},{user_type,{10392,17},spawn_opt_option,[]}]}]]},{type,{10393,7},constraint,[{atom,{10393,7},is_subtype},[{var,{10393,7},'ReplyTag'},{type,{10393,19},term,[]}]]},{type,{10394,7},constraint,[{atom,{10394,7},is_subtype},[{var,{10394,7},'Reply'},{type,{10394,16},union,[{atom,{10394,16},yes},{atom,{10394,22},no},{atom,{10394,27},error_only},{atom,{10394,40},success_only}]}]]},{type,{10395,7},constraint,[{atom,{10395,7},is_subtype},[{var,{10395,7},'Options'},{type,{10395,18},list,[{var,{10395,19},'Option'}]}]]},{type,{10396,7},constraint,[{atom,{10396,7},is_subtype},[{var,{10396,7},'ReqId'},{type,{10396,16},reference,[]}]]}]]},{type,{10397,20},bounded_fun,[{type,{10397,20},'fun',[{type,{10397,20},product,[{var,{10397,21},'Node'},{var,{10397,27},'Fun'}]},{var,{10397,35},'ReqId'}]},[{type,{10398,7},constraint,[{atom,{10398,7},is_subtype},[{var,{10398,7},'Node'},{type,{10398,15},node,[]}]]},{type,{10399,7},constraint,[{atom,{10399,7},is_subtype},[{var,{10399,7},'Fun'},{type,{10399,14},function,[]}]]},{type,{10400,7},constraint,[{atom,{10400,7},is_subtype},[{var,{10400,7},'ReqId'},{type,{10400,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,1},{10352,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,70,117,110,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,46,32,84,104,97,116,10,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{10358,2},spec,{{spawn_request,1},[{type,{10358,20},bounded_fun,[{type,{10358,20},'fun',[{type,{10358,20},product,[{var,{10358,21},'Fun'}]},{var,{10358,29},'ReqId'}]},[{type,{10359,7},constraint,[{atom,{10359,7},is_subtype},[{var,{10359,7},'Fun'},{type,{10359,14},function,[]}]]},{type,{10360,7},constraint,[{atom,{10360,7},is_subtype},[{var,{10360,7},'ReqId'},{type,{10360,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_opt,5},{10287,2},[<<115,112,97,119,110,95,111,112,116,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,10,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46>>},#{group => processes,specification => [{attribute,{10297,2},spec,{{spawn_opt,5},[{type,{10297,16},bounded_fun,[{type,{10297,16},'fun',[{type,{10297,16},product,[{var,{10297,17},'Node'},{var,{10297,23},'Module'},{var,{10297,31},'Function'},{var,{10297,41},'Args'},{var,{10297,47},'Options'}]},{type,{10298,24},union,[{type,{10298,24},pid,[]},{type,{10298,32},tuple,[{type,{10298,33},pid,[]},{type,{10298,40},reference,[]}]}]}]},[{type,{10299,7},constraint,[{atom,{10299,7},is_subtype},[{var,{10299,7},'Node'},{type,{10299,15},node,[]}]]},{type,{10300,7},constraint,[{atom,{10300,7},is_subtype},[{var,{10300,7},'Module'},{type,{10300,17},module,[]}]]},{type,{10301,7},constraint,[{atom,{10301,7},is_subtype},[{var,{10301,7},'Function'},{type,{10301,19},atom,[]}]]},{type,{10302,7},constraint,[{atom,{10302,7},is_subtype},[{var,{10302,7},'Args'},{type,{10302,15},list,[{type,{10302,16},term,[]}]}]]},{type,{10303,7},constraint,[{atom,{10303,7},is_subtype},[{var,{10303,7},'Options'},{type,{10303,18},list,[{type,{10303,19},union,[{atom,{10303,19},monitor},{type,{10304,19},tuple,[{atom,{10304,20},monitor},{type,{10304,29},list,[{user_type,{10304,30},monitor_option,[]}]}]},{atom,{10305,19},link},{var,{10306,19},'OtherOption'}]}]}]]},{type,{10307,7},constraint,[{atom,{10307,7},is_subtype},[{var,{10307,7},'OtherOption'},{type,{10307,22},term,[]}]]}]]}]}}]}},{{function,spawn_opt,4},{10184,2},[<<115,112,97,119,110,95,111,112,116,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<87,111,114,107,115,32,97,115,32,96,115,112,97,119,110,47,51,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,10,116,104,101,32,112,114,111,99,101,115,115,46,10,10,73,102,32,111,112,116,105,111,110,32,96,109,111,110,105,116,111,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,10,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,108,105,110,107,96,42,42,32,45,32,83,101,116,115,32,97,32,108,105,110,107,32,116,111,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32,96,115,112,97,119,110,95,108,105,110,107,47,51,96,32,100,111,101,115,41,46,10,10,45,32,42,42,96,109,111,110,105,116,111,114,96,42,42,32,45,32,77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,40,108,105,107,101,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,32,100,111,101,115,41,46,32,65,32,96,123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125,96,32,116,117,112,108,101,32,119,105,108,108,10,32,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125,96,42,42,32,45,32,77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,40,108,105,107,101,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41,96,93,40,96,109,111,110,105,116,111,114,47,51,96,41,32,100,111,101,115,41,46,32,65,10,32,32,96,123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125,96,32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,10,32,32,101,120,101,99,117,116,105,110,103,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,10,32,32,105,110,32,116,104,101,32,115,116,97,114,116,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,112,114,105,111,114,105,116,121,32,105,115,32,115,101,116,10,32,32,98,101,102,111,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,46,10,10,45,32,42,42,96,123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,78,117,109,98,101,114,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,10,32,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,84,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,115,32,97,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,99,104,101,109,101,44,32,117,115,105,110,103,10,32,32,97,110,32,34,111,108,100,32,104,101,97,112,34,32,102,111,114,32,100,97,116,97,32,116,104,97,116,32,104,97,115,32,115,117,114,118,105,118,101,100,32,97,116,32,108,101,97,115,116,32,111,110,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,10,32,32,116,104,101,114,101,32,105,115,32,110,111,32,109,111,114,101,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,44,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,10,10,32,32,79,112,116,105,111,110,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,44,32,101,118,101,110,32,105,102,32,116,104,101,114,101,32,105,115,32,114,111,111,109,32,111,110,10,32,32,116,104,101,32,111,108,100,32,104,101,97,112,46,32,83,101,116,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,116,111,32,122,101,114,111,32,100,105,115,97,98,108,101,115,32,116,104,101,32,103,101,110,101,114,97,108,32,99,111,108,108,101,99,116,105,111,110,10,32,32,97,108,103,111,114,105,116,104,109,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,99,111,112,105,101,100,32,97,116,32,101,118,101,114,121,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,10,10,32,32,65,32,102,101,119,32,99,97,115,101,115,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,116,111,32,99,104,97,110,103,101,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,58,10,10,32,32,45,32,73,102,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,110,111,32,108,111,110,103,101,114,32,117,115,101,100,32,97,114,101,32,116,111,32,98,101,32,116,104,114,111,119,110,32,97,119,97,121,32,97,115,32,115,111,111,110,32,97,115,10,32,32,32,32,112,111,115,115,105,98,108,101,46,32,40,83,101,116,32,96,78,117,109,98,101,114,96,32,116,111,32,122,101,114,111,46,41,10,32,32,45,32,65,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,111,115,116,108,121,32,104,97,118,101,32,115,104,111,114,116,45,108,105,118,101,100,32,100,97,116,97,32,105,115,32,102,117,108,108,115,119,101,101,112,101,100,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,44,10,32,32,32,32,116,104,97,116,32,105,115,44,32,116,104,101,32,111,108,100,32,104,101,97,112,32,99,111,110,116,97,105,110,115,32,109,111,115,116,108,121,32,103,97,114,98,97,103,101,46,32,84,111,32,101,110,115,117,114,101,32,97,32,102,117,108,108,115,119,101,101,112,10,32,32,32,32,111,99,99,97,115,105,111,110,97,108,108,121,44,32,115,101,116,32,96,78,117,109,98,101,114,96,32,116,111,32,97,32,115,117,105,116,97,98,108,101,32,118,97,108,117,101,44,32,115,117,99,104,32,97,115,32,49,48,32,111,114,32,50,48,46,10,32,32,45,32,73,110,32,101,109,98,101,100,100,101,100,32,115,121,115,116,101,109,115,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,97,109,111,117,110,116,32,111,102,32,82,65,77,32,97,110,100,32,110,111,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,44,32,121,111,117,10,32,32,32,32,109,105,103,104,116,32,119,97,110,116,32,116,111,32,112,114,101,115,101,114,118,101,32,109,101,109,111,114,121,32,98,121,32,115,101,116,116,105,110,103,32,96,78,117,109,98,101,114,96,32,116,111,32,122,101,114,111,46,32,40,84,104,101,32,118,97,108,117,101,32,99,97,110,32,98,101,10,32,32,32,32,115,101,116,32,103,108,111,98,97,108,108,121,44,32,115,101,101,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,41,10,10,45,32,42,42,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,10,32,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,10,32,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,10,32,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,32,97,110,100,32,115,108,111,119,32,100,111,119,110,32,116,104,101,32,115,121,115,116,101,109,10,32,32,98,101,99,97,117,115,101,32,111,102,32,119,111,114,115,101,32,100,97,116,97,32,108,111,99,97,108,105,116,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,10,32,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,10,32,32,96,83,105,122,101,96,32,118,97,108,117,101,115,46,10,10,45,32,42,42,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,86,83,105,122,101,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,10,32,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,10,32,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,46,10,32,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,10,32,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32,96,86,83,105,122,101,96,32,118,97,108,117,101,115,46,10,10,45,32,42,42,96,123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,84,104,101,10,32,32,100,101,102,97,117,108,116,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,104,109,97,120,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,10,32,32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,96,77,81,68,96,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,96,111,102,102,95,104,101,97,112,96,32,111,114,32,96,111,110,95,104,101,97,112,96,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,10,32,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,10,32,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,113,100,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,45,32,42,42,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,100,125,96,123,58,32,35,115,112,97,119,110,95,111,112,116,95,97,115,121,110,99,95,100,105,115,116,32,125,42,42,32,45,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,32,32,83,101,116,32,116,104,101,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,41,32,112,114,111,99,101,115,115,32,102,108,97,103,32,111,102,32,116,104,101,10,32,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,112,97,100,41,46>>},#{group => processes,specification => [{attribute,{10275,2},spec,{{spawn_opt,4},[{type,{10275,16},bounded_fun,[{type,{10275,16},'fun',[{type,{10275,16},product,[{var,{10275,17},'Module'},{var,{10275,25},'Function'},{var,{10275,35},'Args'},{var,{10275,41},'Options'}]},{type,{10276,11},union,[{var,{10276,11},'Pid'},{type,{10276,17},tuple,[{var,{10276,18},'Pid'},{var,{10276,23},'MonitorRef'}]}]}]},[{type,{10277,7},constraint,[{atom,{10277,7},is_subtype},[{var,{10277,7},'Module'},{type,{10277,17},module,[]}]]},{type,{10278,7},constraint,[{atom,{10278,7},is_subtype},[{var,{10278,7},'Function'},{type,{10278,19},atom,[]}]]},{type,{10279,7},constraint,[{atom,{10279,7},is_subtype},[{var,{10279,7},'Args'},{type,{10279,15},list,[{type,{10279,16},term,[]}]}]]},{type,{10280,7},constraint,[{atom,{10280,7},is_subtype},[{var,{10280,7},'Options'},{type,{10280,18},list,[{user_type,{10280,19},spawn_opt_option,[]}]}]]},{type,{10281,7},constraint,[{atom,{10281,7},is_subtype},[{var,{10281,7},'Pid'},{type,{10281,14},pid,[]}]]},{type,{10282,7},constraint,[{atom,{10282,7},is_subtype},[{var,{10282,7},'MonitorRef'},{type,{10282,21},reference,[]}]]}]]}]}}]}},{{function,spawn_monitor,4},{10129,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,10,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46,10,10,73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32,96,115,112,97,119,110,95,109,111,110,105,116,111,114,40,41,96,44,10,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,32,101,120,99,101,112,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{10139,2},spec,{{spawn_monitor,4},[{type,{10139,20},bounded_fun,[{type,{10139,20},'fun',[{type,{10139,20},product,[{var,{10139,21},'Node'},{var,{10139,27},'Module'},{var,{10139,35},'Function'},{var,{10139,45},'Args'}]},{type,{10139,54},tuple,[{type,{10139,55},pid,[]},{type,{10139,62},reference,[]}]}]},[{type,{10140,7},constraint,[{atom,{10140,7},is_subtype},[{var,{10140,7},'Node'},{type,{10140,15},node,[]}]]},{type,{10141,7},constraint,[{atom,{10141,7},is_subtype},[{var,{10141,7},'Module'},{type,{10141,17},module,[]}]]},{type,{10142,7},constraint,[{atom,{10142,7},is_subtype},[{var,{10142,7},'Function'},{type,{10142,19},atom,[]}]]},{type,{10143,7},constraint,[{atom,{10143,7},is_subtype},[{var,{10143,7},'Args'},{type,{10143,15},list,[{type,{10143,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_link,4},{10099,2},[<<115,112,97,119,110,95,108,105,110,107,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{10107,2},spec,{{spawn_link,4},[{type,{10107,17},bounded_fun,[{type,{10107,17},'fun',[{type,{10107,17},product,[{var,{10107,18},'Node'},{var,{10107,24},'Module'},{var,{10107,32},'Function'},{var,{10107,42},'Args'}]},{type,{10107,51},pid,[]}]},[{type,{10108,7},constraint,[{atom,{10108,7},is_subtype},[{var,{10108,7},'Node'},{type,{10108,15},node,[]}]]},{type,{10109,7},constraint,[{atom,{10109,7},is_subtype},[{var,{10109,7},'Module'},{type,{10109,17},module,[]}]]},{type,{10110,7},constraint,[{atom,{10110,7},is_subtype},[{var,{10110,7},'Function'},{type,{10110,19},atom,[]}]]},{type,{10111,7},constraint,[{atom,{10111,7},is_subtype},[{var,{10111,7},'Args'},{type,{10111,15},list,[{type,{10111,16},term,[]}]}]]}]]}]}}]}},{{function,spawn,4},{10071,2},[<<115,112,97,119,110,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{10077,2},spec,{{spawn,4},[{type,{10077,12},bounded_fun,[{type,{10077,12},'fun',[{type,{10077,12},product,[{var,{10077,13},'Node'},{var,{10077,19},'Module'},{var,{10077,27},'Function'},{var,{10077,37},'Args'}]},{type,{10077,46},pid,[]}]},[{type,{10078,7},constraint,[{atom,{10078,7},is_subtype},[{var,{10078,7},'Node'},{type,{10078,15},node,[]}]]},{type,{10079,7},constraint,[{atom,{10079,7},is_subtype},[{var,{10079,7},'Module'},{type,{10079,17},module,[]}]]},{type,{10080,7},constraint,[{atom,{10080,7},is_subtype},[{var,{10080,7},'Function'},{type,{10080,19},atom,[]}]]},{type,{10081,7},constraint,[{atom,{10081,7},is_subtype},[{var,{10081,7},'Args'},{type,{10081,15},list,[{type,{10081,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_opt,3},{10033,2},[<<115,112,97,119,110,95,111,112,116,40,78,111,100,101,44,32,70,117,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,10,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46>>},#{group => processes,specification => [{attribute,{10043,2},spec,{{spawn_opt,3},[{type,{10043,16},bounded_fun,[{type,{10043,16},'fun',[{type,{10043,16},product,[{var,{10043,17},'Node'},{var,{10043,23},'Fun'},{var,{10043,28},'Options'}]},{type,{10043,40},union,[{type,{10043,40},pid,[]},{type,{10043,48},tuple,[{type,{10043,49},pid,[]},{type,{10043,56},reference,[]}]}]}]},[{type,{10044,7},constraint,[{atom,{10044,7},is_subtype},[{var,{10044,7},'Node'},{type,{10044,15},node,[]}]]},{type,{10045,7},constraint,[{atom,{10045,7},is_subtype},[{var,{10045,7},'Fun'},{type,{10045,14},function,[]}]]},{type,{10046,7},constraint,[{atom,{10046,7},is_subtype},[{var,{10046,7},'Options'},{type,{10046,18},list,[{type,{10046,19},union,[{atom,{10046,19},monitor},{type,{10047,19},tuple,[{atom,{10047,20},monitor},{type,{10047,29},list,[{user_type,{10047,30},monitor_option,[]}]}]},{atom,{10048,19},link},{var,{10049,19},'OtherOption'}]}]}]]},{type,{10050,7},constraint,[{atom,{10050,7},is_subtype},[{var,{10050,7},'OtherOption'},{type,{10050,22},term,[]}]]}]]}]}}]}},{{function,spawn_opt,2},{10010,2},[<<115,112,97,119,110,95,111,112,116,40,70,117,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,73,102,32,111,112,116,105,111,110,32,96,109,111,110,105,116,111,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,10,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>},#{group => processes,specification => [{attribute,{10018,2},spec,{{spawn_opt,2},[{type,{10018,16},bounded_fun,[{type,{10018,16},'fun',[{type,{10018,16},product,[{var,{10018,17},'Fun'},{var,{10018,22},'Options'}]},{type,{10018,34},union,[{type,{10018,34},pid,[]},{type,{10018,42},tuple,[{type,{10018,43},pid,[]},{type,{10018,50},reference,[]}]}]}]},[{type,{10019,7},constraint,[{atom,{10019,7},is_subtype},[{var,{10019,7},'Fun'},{type,{10019,14},function,[]}]]},{type,{10020,7},constraint,[{atom,{10020,7},is_subtype},[{var,{10020,7},'Options'},{type,{10020,18},list,[{user_type,{10020,19},spawn_opt_option,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,3},{9967,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,32,84,104,101,10,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,10,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9973,2},spec,{{spawn_monitor,3},[{type,{9973,20},bounded_fun,[{type,{9973,20},'fun',[{type,{9973,20},product,[{var,{9973,21},'Module'},{var,{9973,29},'Function'},{var,{9973,39},'Args'}]},{type,{9973,48},tuple,[{type,{9973,49},pid,[]},{type,{9973,56},reference,[]}]}]},[{type,{9974,7},constraint,[{atom,{9974,7},is_subtype},[{var,{9974,7},'Module'},{type,{9974,17},module,[]}]]},{type,{9975,7},constraint,[{atom,{9975,7},is_subtype},[{var,{9975,7},'Function'},{type,{9975,19},atom,[]}]]},{type,{9976,7},constraint,[{atom,{9976,7},is_subtype},[{var,{9976,7},'Args'},{type,{9976,15},list,[{type,{9976,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,2},{9943,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,10,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46,10,10,73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32,96,115,112,97,119,110,95,109,111,110,105,116,111,114,40,41,96,44,10,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,32,101,120,99,101,112,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{9953,2},spec,{{spawn_monitor,2},[{type,{9953,20},bounded_fun,[{type,{9953,20},'fun',[{type,{9953,20},product,[{var,{9953,21},'Node'},{var,{9953,27},'Fun'}]},{type,{9953,35},tuple,[{type,{9953,36},pid,[]},{type,{9953,43},reference,[]}]}]},[{type,{9954,7},constraint,[{atom,{9954,7},is_subtype},[{var,{9954,7},'Node'},{type,{9954,15},node,[]}]]},{type,{9955,7},constraint,[{atom,{9955,7},is_subtype},[{var,{9955,7},'Fun'},{type,{9955,14},function,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_monitor,1},{9930,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9936,2},spec,{{spawn_monitor,1},[{type,{9936,20},bounded_fun,[{type,{9936,20},'fun',[{type,{9936,20},product,[{var,{9936,21},'Fun'}]},{type,{9936,29},tuple,[{type,{9936,30},pid,[]},{type,{9936,37},reference,[]}]}]},[{type,{9937,7},constraint,[{atom,{9937,7},is_subtype},[{var,{9937,7},'Fun'},{type,{9937,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,2},{9908,2},[<<115,112,97,119,110,95,108,105,110,107,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9916,2},spec,{{spawn_link,2},[{type,{9916,17},bounded_fun,[{type,{9916,17},'fun',[{type,{9916,17},product,[{var,{9916,18},'Node'},{var,{9916,24},'Fun'}]},{type,{9916,32},pid,[]}]},[{type,{9917,7},constraint,[{atom,{9917,7},is_subtype},[{var,{9917,7},'Node'},{type,{9917,15},node,[]}]]},{type,{9918,7},constraint,[{atom,{9918,7},is_subtype},[{var,{9918,7},'Fun'},{type,{9918,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,1},{9893,2},[<<115,112,97,119,110,95,108,105,110,107,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,10,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9899,2},spec,{{spawn_link,1},[{type,{9899,17},bounded_fun,[{type,{9899,17},'fun',[{type,{9899,17},product,[{var,{9899,18},'Fun'}]},{type,{9899,26},pid,[]}]},[{type,{9900,7},constraint,[{atom,{9900,7},is_subtype},[{var,{9900,7},'Fun'},{type,{9900,14},function,[]}]]}]]}]}}]}},{{function,spawn,2},{9875,2},[<<115,112,97,119,110,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9881,2},spec,{{spawn,2},[{type,{9881,12},bounded_fun,[{type,{9881,12},'fun',[{type,{9881,12},product,[{var,{9881,13},'Node'},{var,{9881,19},'Fun'}]},{type,{9881,27},pid,[]}]},[{type,{9882,7},constraint,[{atom,{9882,7},is_subtype},[{var,{9882,7},'Node'},{type,{9882,15},node,[]}]]},{type,{9883,7},constraint,[{atom,{9883,7},is_subtype},[{var,{9883,7},'Fun'},{type,{9883,14},function,[]}]]}]]}]}}]}},{{function,spawn,1},{9861,2},[<<115,112,97,119,110,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9866,2},spec,{{spawn,1},[{type,{9866,12},bounded_fun,[{type,{9866,12},'fun',[{type,{9866,12},product,[{var,{9866,13},'Fun'}]},{type,{9866,21},pid,[]}]},[{type,{9867,7},constraint,[{atom,{9867,7},is_subtype},[{var,{9867,7},'Fun'},{type,{9867,14},function,[]}]]}]]}]}}]}},{{function,apply,3},{9828,2},[<<97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32,96,70,117,110,99,116,105,111,110,96,32,105,110,32,96,77,111,100,117,108,101,96,32,116,111,32,96,65,114,103,115,96,46,32,84,104,101,32,97,112,112,108,105,101,100,10,102,117,110,99,116,105,111,110,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,102,114,111,109,32,96,77,111,100,117,108,101,96,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,108,101,110,103,116,104,10,111,102,32,96,65,114,103,115,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,112,112,108,121,40,108,105,115,116,115,44,32,114,101,118,101,114,115,101,44,32,91,91,97,44,32,98,44,32,99,93,93,41,46,10,91,99,44,98,44,97,93,10,62,32,97,112,112,108,121,40,101,114,108,97,110,103,44,32,97,116,111,109,95,116,111,95,108,105,115,116,44,32,91,39,69,114,108,97,110,103,39,93,41,46,10,34,69,114,108,97,110,103,34,10,96,96,96,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,10,97,115,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,44,32,65,114,103,78,41,96,46,10,10,70,97,105,108,117,114,101,58,32,96,101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51,96,32,105,115,32,99,97,108,108,101,100,32,105,102,32,116,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,10,105,115,32,110,111,116,32,101,120,112,111,114,116,101,100,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,46,32,73,102,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,105,102,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,115,111,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,109,111,100,117,108,101,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,32,101,114,114,111,114,32,119,105,116,104,32,114,101,97,115,111,110,10,96,117,110,100,101,102,96,32,105,115,32,103,101,110,101,114,97,116,101,100,46>>},#{group => processes,specification => [{attribute,{9852,2},spec,{{apply,3},[{type,{9852,12},bounded_fun,[{type,{9852,12},'fun',[{type,{9852,12},product,[{var,{9852,13},'Module'},{var,{9852,21},'Function'},{var,{9852,31},'Args'}]},{type,{9852,40},term,[]}]},[{type,{9853,7},constraint,[{atom,{9853,7},is_subtype},[{var,{9853,7},'Module'},{type,{9853,17},module,[]}]]},{type,{9854,7},constraint,[{atom,{9854,7},is_subtype},[{var,{9854,7},'Function'},{type,{9854,19},atom,[]}]]},{type,{9855,7},constraint,[{atom,{9855,7},is_subtype},[{var,{9855,7},'Args'},{type,{9855,15},list,[{type,{9855,16},term,[]}]}]]}]]}]}}]}},{{function,apply,2},{9808,2},[<<97,112,112,108,121,40,70,117,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<67,97,108,108,115,32,97,32,102,117,110,44,32,112,97,115,115,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32,96,65,114,103,115,96,32,97,115,32,97,114,103,117,109,101,110,116,115,46,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,10,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32,96,70,117,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,32,65,114,103,78,41,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,69,97,114,108,105,101,114,44,32,96,70,117,110,96,32,99,111,117,108,100,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,125,96,44,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,62,32,91,96,97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41,96,93,40,96,97,112,112,108,121,47,51,96,41,46,32,95,84,104,105,115,32,117,115,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,119,105,108,108,10,62,32,115,116,111,112,32,119,111,114,107,105,110,103,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,95>>},#{group => processes,specification => [{attribute,{9821,2},spec,{{apply,2},[{type,{9821,12},bounded_fun,[{type,{9821,12},'fun',[{type,{9821,12},product,[{var,{9821,13},'Fun'},{var,{9821,18},'Args'}]},{type,{9821,27},term,[]}]},[{type,{9822,7},constraint,[{atom,{9822,7},is_subtype},[{var,{9822,7},'Fun'},{type,{9822,14},function,[]}]]},{type,{9823,7},constraint,[{atom,{9823,7},is_subtype},[{var,{9823,7},'Args'},{type,{9823,15},list,[{type,{9823,16},term,[]}]}]]}]]}]}}]}},{{function,universaltime_to_localtime,1},{9779,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,85,110,105,118,101,114,115,97,108,116,105,109,101,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,10,105,110,32,116,104,101,32,102,111,114,109,32,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,10,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,44,32,97,110,100,32,96,85,110,105,118,101,114,115,97,108,116,105,109,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,55,125,44,123,49,53,44,49,56,44,52,51,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,85,110,105,118,101,114,115,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{9794,2},spec,{{universaltime_to_localtime,1},[{type,{9794,33},bounded_fun,[{type,{9794,33},'fun',[{type,{9794,33},product,[{var,{9794,34},'Universaltime'}]},{var,{9794,53},'Localtime'}]},[{type,{9795,7},constraint,[{atom,{9795,7},is_subtype},[{var,{9795,7},'Localtime'},{remote_type,{9795,20},[{atom,{9795,20},calendar},{atom,{9795,29},datetime},[]]}]]},{type,{9796,7},constraint,[{atom,{9796,7},is_subtype},[{var,{9796,7},'Universaltime'},{remote_type,{9796,24},[{atom,{9796,24},calendar},{atom,{9796,33},datetime},[]]}]]}]]}]}}]}},{{function,system_info,1},[{file,[46,46,47,46,46,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,95,115,121,115,116,101,109,95,105,110,102,111,46,109,100]},{location,{1,1}}],[<<115,121,115,116,101,109,95,105,110,102,111,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,10,10,84,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,98,114,111,107,101,110,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,105,110,10,111,114,100,101,114,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,111,32,110,97,118,105,103,97,116,101,46,10,10,45,32,91,96,77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,109,101,109,111,114,121,45,97,108,108,111,99,97,116,105,111,110,96,41,32,45,10,32,32,91,96,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,41,44,10,32,32,91,96,97,108,108,111,99,97,116,111,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,96,41,44,10,32,32,91,96,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,41,44,10,32,32,91,96,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,96,41,10,10,45,32,91,96,67,80,85,32,84,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,99,112,117,45,116,111,112,111,108,111,103,121,96,41,32,45,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,44,10,32,32,91,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,44,10,32,32,91,96,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,41,10,10,45,32,91,96,80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,112,114,111,99,101,115,115,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,41,44,10,32,32,91,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,41,44,10,32,32,91,96,104,101,97,112,95,115,105,122,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115,96,41,44,10,32,32,91,96,104,101,97,112,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101,96,41,44,10,32,32,91,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,41,44,10,32,32,91,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,112,114,111,99,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,76,105,109,105,116,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,108,105,109,105,116,115,96,41,32,45,10,32,32,91,96,97,116,111,109,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116,96,41,44,10,32,32,91,96,97,116,111,109,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116,96,41,44,10,32,32,91,96,101,116,115,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116,96,41,44,10,32,32,91,96,101,116,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,111,114,116,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116,96,41,44,10,32,32,91,96,112,111,114,116,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,114,111,99,101,115,115,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116,96,41,44,10,32,32,91,96,112,114,111,99,101,115,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,84,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,116,105,109,101,96,41,32,45,10,32,32,91,96,101,110,100,95,116,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,96,41,44,10,32,32,91,96,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,41,44,10,32,32,91,96,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,41,44,10,32,32,91,96,115,116,97,114,116,95,116,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,96,41,44,10,32,32,91,96,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,41,44,10,32,32,91,96,116,105,109,101,95,111,102,102,115,101,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,96,41,44,10,32,32,91,96,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,41,44,10,32,32,91,96,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,41,10,10,45,32,91,96,83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,99,104,101,100,117,108,101,114,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,105,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,115,109,112,95,115,117,112,112,111,114,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116,96,41,44,10,32,32,91,96,116,104,114,101,97,100,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115,96,41,44,10,32,32,91,96,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,41,10,10,45,32,91,96,68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,100,105,115,116,114,105,98,117,116,105,111,110,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,99,114,101,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,96,41,44,10,32,32,91,96,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,41,44,10,32,32,91,96,100,105,115,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,96,41,44,10,32,32,91,96,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,41,44,10,32,32,91,96,100,105,115,116,95,99,116,114,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,41,44,10,32,32,91,96,99,104,101,99,107,95,105,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111,96,41,44,10,32,32,91,96,99,111,109,112,97,116,95,114,101,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108,96,41,44,10,32,32,91,96,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,41,44,10,32,32,91,96,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,100,121,110,97,109,105,99,95,116,114,97,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,96,41,44,10,32,32,91,96,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,41,44,10,32,32,91,96,101,109,117,95,102,108,97,118,111,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114,96,41,44,10,32,32,91,96,101,109,117,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101,96,41,44,10,32,32,91,96,105,110,102,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111,96,41,44,10,32,32,91,96,107,101,114,110,101,108,95,112,111,108,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108,96,41,44,10,32,32,91,96,108,111,97,100,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100,96,41,44,10,32,32,91,96,109,97,99,104,105,110,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101,96,41,44,10,32,32,91,96,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,41,44,10,32,32,91,96,110,105,102,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,111,116,112,95,114,101,108,101,97,115,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101,96,41,44,10,32,32,91,96,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,41,44,10,32,32,91,96,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,119,111,114,100,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101,96,41,10,10,35,35,32,77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,111,114,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,42,32,95,95,96,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,95,95,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,32,125,32,45,32,82,101,116,117,114,110,115,32,96,91,116,117,112,108,101,40,41,93,96,32,119,105,116,104,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,97,114,101,97,115,46,10,10,32,32,69,97,99,104,32,116,117,112,108,101,32,99,111,110,116,97,105,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,116,121,112,101,32,111,102,32,109,101,109,111,114,121,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,97,110,100,10,32,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,87,104,101,110,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,97,98,111,117,116,32,97,108,108,111,99,97,116,101,100,32,97,110,100,32,117,115,101,100,32,109,101,109,111,114,121,32,105,115,32,112,114,101,115,101,110,116,44,32,97,108,115,111,32,97,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,112,114,101,115,101,110,116,44,10,32,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,117,115,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,46,10,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,41,96,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,97,110,100,32,116,104,101,32,99,111,110,116,101,110,116,10,32,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,115,32,116,104,101,114,101,102,111,114,101,10,32,32,99,104,97,110,103,101,115,32,119,104,101,110,32,110,101,101,100,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,32,105,115,32,95,110,111,116,95,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,10,32,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,111,109,101,32,118,97,108,117,101,115,32,97,114,101,32,112,97,114,116,32,111,102,32,111,116,104,101,114,32,118,97,108,117,101,115,44,32,97,110,100,32,115,111,109,101,10,32,32,109,101,109,111,114,121,32,97,114,101,97,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,10,32,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,44,49,96,93,40,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,41,46,10,10,45,32,96,97,108,108,111,99,97,116,111,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,96,96,10,32,32,123,65,108,108,111,99,97,116,111,114,32,58,58,32,117,110,100,101,102,105,110,101,100,32,124,32,103,108,105,98,99,44,10,32,32,32,86,101,114,115,105,111,110,32,58,58,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,44,10,32,32,32,70,101,97,116,117,114,101,115,32,58,58,32,91,97,116,111,109,40,41,93,44,10,32,32,32,83,101,116,116,105,110,103,115,32,58,58,32,91,123,83,117,98,115,121,115,116,101,109,32,58,58,32,97,116,111,109,40,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,80,97,114,97,109,101,116,101,114,32,58,58,32,97,116,111,109,40,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,86,97,108,117,101,32,58,58,32,116,101,114,109,40,41,125,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,93,10,32,32,125,10,32,32,96,96,96,10,10,32,32,119,104,101,114,101,10,10,32,32,45,32,96,65,108,108,111,99,97,116,111,114,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,32,73,102,10,32,32,32,32,96,65,108,108,111,99,97,116,111,114,96,32,101,113,117,97,108,115,32,96,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,32,99,97,110,110,111,116,32,98,101,10,32,32,32,32,105,100,101,110,116,105,102,105,101,100,46,32,96,103,108,105,98,99,96,32,99,97,110,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46,10,32,32,45,32,96,86,101,114,115,105,111,110,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,40,98,117,116,32,110,111,116,32,97,32,115,116,114,105,110,103,41,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,10,32,32,32,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,10,32,32,45,32,96,70,101,97,116,117,114,101,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,32,117,115,101,100,46,10,32,32,45,32,96,83,101,116,116,105,110,103,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,117,98,115,121,115,116,101,109,115,44,32,116,104,101,105,114,32,99,111,110,102,105,103,117,114,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,44,32,97,110,100,32,117,115,101,100,10,32,32,32,32,118,97,108,117,101,115,46,32,83,101,116,116,105,110,103,115,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,99,111,109,98,105,110,97,116,105,111,110,115,32,111,102,32,112,108,97,116,102,111,114,109,115,44,10,32,32,32,32,97,108,108,111,99,97,116,111,114,115,44,32,97,110,100,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,46,32,77,101,109,111,114,121,32,115,105,122,101,115,32,97,114,101,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,32,34,83,121,115,116,101,109,32,70,108,97,103,115,32,69,102,102,101,99,116,105,110,103,32,101,114,116,115,95,97,108,108,111,99,34,32,105,110,10,32,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,102,108,97,103,115,41,46,10,10,45,32,96,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,49,44,32,116,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,32,105,115,32,97,32,108,105,115,116,32,111,102,32,96,123,105,110,115,116,97,110,99,101,44,32,73,110,115,116,97,110,99,101,78,111,44,32,73,110,115,116,97,110,99,101,73,110,102,111,125,96,32,116,117,112,108,101,115,44,32,119,104,101,114,101,10,32,32,96,73,110,115,116,97,110,99,101,73,110,102,111,96,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,115,112,101,99,105,102,105,99,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,10,32,32,97,108,108,111,99,97,116,111,114,46,32,73,102,32,96,65,108,108,111,99,96,32,105,115,32,110,111,116,32,97,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46,32,73,102,32,96,65,108,108,111,99,96,32,105,115,32,100,105,115,97,98,108,101,100,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,97,110,100,10,32,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,116,32,119,97,115,32,105,110,105,116,105,97,108,108,121,10,32,32,105,110,116,101,110,100,101,100,32,97,115,32,97,32,116,111,111,108,32,119,104,101,110,32,100,101,118,101,108,111,112,105,110,103,32,110,101,119,32,97,108,108,111,99,97,116,111,114,115,44,32,98,117,116,32,97,115,32,105,116,32,99,97,110,32,98,101,32,111,102,10,32,32,105,110,116,101,114,101,115,116,32,102,111,114,32,111,116,104,101,114,115,32,105,116,32,104,97,115,32,98,101,101,110,32,98,114,105,101,102,108,121,32,100,111,99,117,109,101,110,116,101,100,46,10,10,32,32,84,104,101,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,108,105,115,116,101,100,32,105,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,46,10,32,32,73,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,117,112,101,114,32,99,97,114,114,105,101,114,115,32,99,97,110,32,98,101,32,111,98,116,97,105,110,101,100,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,119,105,116,104,10,32,32,96,123,97,108,108,111,99,97,116,111,114,44,32,101,114,116,115,95,109,109,97,112,125,96,32,111,114,32,102,114,111,109,32,69,82,84,83,32,53,46,49,48,46,52,59,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,119,104,101,110,32,99,97,108,108,105,110,103,10,32,32,119,105,116,104,32,96,123,97,108,108,111,99,97,116,111,114,44,32,109,115,101,103,95,97,108,108,111,99,125,96,32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,97,110,32,96,123,101,114,116,115,95,109,109,97,112,44,32,95,125,96,32,116,117,112,108,101,32,97,115,32,111,110,101,10,32,32,101,108,101,109,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46,10,10,32,32,65,102,116,101,114,32,114,101,97,100,105,110,103,32,116,104,101,32,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,109,111,114,101,10,32,32,111,114,32,108,101,115,115,32,115,112,101,97,107,115,32,102,111,114,32,105,116,115,101,108,102,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,119,111,114,116,104,32,101,120,112,108,97,105,110,105,110,103,32,115,111,109,101,32,116,104,105,110,103,115,46,32,67,97,108,108,10,32,32,99,111,117,110,116,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,44,32,116,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,103,105,103,97,32,99,97,108,108,115,44,32,97,110,100,32,116,104,101,10,32,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,99,97,108,108,115,46,32,96,109,98,99,115,96,32,97,110,100,32,96,115,98,99,115,96,32,100,101,110,111,116,101,32,109,117,108,116,105,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,97,110,100,10,32,32,115,105,110,103,108,101,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,83,105,122,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,98,121,116,101,115,46,32,87,104,101,110,32,97,10,32,32,115,105,122,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,101,100,44,32,105,116,32,105,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,111,109,101,116,104,105,110,103,46,32,83,105,122,101,115,32,97,110,100,32,97,109,111,117,110,116,115,32,97,114,101,10,32,32,111,102,116,101,110,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,114,101,101,32,118,97,108,117,101,115,58,10,10,32,32,45,32,84,104,101,32,102,105,114,115,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,10,32,32,45,32,84,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,99,97,108,108,32,116,111,10,32,32,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41,96,46,10,32,32,45,32,84,104,101,32,116,104,105,114,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,10,10,32,32,73,102,32,111,110,108,121,32,111,110,101,32,118,97,108,117,101,32,105,115,32,112,114,101,115,101,110,116,44,32,105,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,32,96,102,105,120,95,97,108,108,111,99,96,32,109,101,109,111,114,121,10,32,32,98,108,111,99,107,32,116,121,112,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,46,32,84,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,112,111,111,108,10,32,32,115,105,122,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,117,115,101,100,32,109,101,109,111,114,121,32,115,105,122,101,46,10,10,45,32,96,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,97,108,108,111,99,97,116,111,114,115,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,32,96,97,108,108,111,99,95,117,116,105,108,96,10,32,32,102,114,97,109,101,119,111,114,107,32,97,115,32,97,116,111,109,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,84,104,101,32,97,108,108,111,99,95,117,116,105,108,32,102,114,97,109,101,119,111,114,107,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,97,108,108,111,99,95,117,116,105,108,41,32,105,110,32,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,46,10,10,45,32,96,123,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,44,32,65,108,108,111,99,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,118,97,114,105,111,117,115,32,115,105,122,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,114,101,116,117,114,110,101,100,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101,96,41,46,10,10,35,35,32,67,80,85,32,84,111,112,111,108,111,103,121,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,99,112,117,95,116,111,112,111,108,111,103,121,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,10,32,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,117,115,101,100,32,105,115,32,116,104,101,10,32,32,91,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100,96,41,44,32,105,102,10,32,32,115,117,99,104,32,101,120,105,115,116,115,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,32,32,91,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,96,41,44,10,32,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,46,32,73,102,32,110,111,32,67,80,85,32,116,111,112,111,108,111,103,121,32,101,120,105,115,116,115,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,102,105,110,101,100,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,99,116,41,32,105,110,32,96,101,114,108,40,49,41,96,32,97,110,100,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,116,101,99,116,101,100,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,46,32,84,104,101,32,101,109,117,108,97,116,111,114,32,100,101,116,101,99,116,115,32,116,104,101,10,32,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,110,32,115,111,109,101,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,46,32,79,110,10,32,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,32,119,105,116,104,32,109,111,114,101,32,116,104,97,110,32,51,50,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,110,111,116,10,32,32,100,101,116,101,99,116,101,100,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,117,115,101,100,125,96,32,45,32,82,101,116,117,114,110,115,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,70,111,114,10,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,10,32,32,100,101,116,101,99,116,32,116,104,101,32,99,111,110,102,105,103,117,114,101,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,10,32,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,10,32,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,10,32,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,10,32,32,111,110,108,105,110,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,46,10,10,45,32,96,99,112,117,95,113,117,111,116,97,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,67,80,85,32,113,117,111,116,97,10,32,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,108,105,109,105,116,101,100,32,98,121,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,115,97,121,105,110,103,32,104,111,119,32,109,97,110,121,10,32,32,112,114,111,99,101,115,115,111,114,115,39,32,119,111,114,116,104,32,111,102,32,114,117,110,116,105,109,101,32,119,101,32,103,101,116,32,40,98,101,116,119,101,101,110,32,49,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,10,32,32,112,114,111,99,101,115,115,111,114,115,41,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,97,32,113,117,111,116,97,46,10,10,45,32,96,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,32,125,32,45,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,114,101,114,101,97,100,115,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,117,112,100,97,116,101,115,32,105,116,115,32,105,110,116,101,114,110,97,108,108,121,32,115,116,111,114,101,100,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,32,32,91,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,96,41,32,97,110,100,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,10,32,32,91,99,111,110,102,105,103,117,114,101,100,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,44,10,32,32,91,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,97,118,97,105,108,97,98,108,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,41,44,32,97,110,100,10,32,32,91,99,112,117,32,113,117,111,116,97,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97,96,41,46,10,10,32,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,114,101,97,100,44,32,116,104,101,32,97,116,111,109,10,32,32,96,99,104,97,110,103,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32,96,117,110,99,104,97,110,103,101,100,96,46,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,104,97,115,32,99,104,97,110,103,101,100,44,32,121,111,117,32,112,114,111,98,97,98,108,121,32,119,97,110,116,32,116,111,10,32,32,91,97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,89,111,117,32,116,121,112,105,99,97,108,108,121,32,119,97,110,116,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,97,115,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,52,66,10,10,35,35,32,80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,101,102,97,117,108,116,32,112,114,111,99,101,115,115,32,104,101,97,112,32,115,101,116,116,105,110,103,115,58,10,10,45,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,32,117,115,101,100,32,98,121,32,100,101,102,97,117,108,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,116,58,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,100,101,102,97,117,108,116,115,47,48,96,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,101,102,97,117,108,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,10,32,32,65,32,112,114,111,99,101,115,115,32,115,112,97,119,110,101,100,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,98,121,32,97,32,96,115,112,97,119,110,96,32,111,114,32,96,115,112,97,119,110,95,108,105,110,107,96,32,117,115,101,115,32,116,104,101,115,101,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,117,115,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,10,32,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,101,114,108,97,110,103,58,115,112,97,119,110,95,111,112,116,47,52,96,41,32,99,97,110,32,115,112,97,119,110,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,10,32,32,117,115,101,32,116,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,46,10,10,45,32,96,104,101,97,112,95,115,105,122,101,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,118,97,108,105,100,32,104,101,97,112,32,115,105,122,101,115,32,105,110,32,119,111,114,100,115,46,32,65,108,108,32,69,114,108,97,110,103,32,104,101,97,112,115,32,97,114,101,32,115,105,122,101,100,32,102,114,111,109,32,115,105,122,101,115,10,32,32,105,110,32,116,104,105,115,32,108,105,115,116,46,10,10,45,32,96,104,101,97,112,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,112,32,116,121,112,101,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,46,32,79,110,101,32,104,101,97,112,32,116,121,112,101,32,101,120,105,115,116,115,58,10,10,32,32,45,32,96,112,114,105,118,97,116,101,96,32,45,32,69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,104,101,97,112,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,116,115,32,117,115,101,32,97,110,100,32,110,111,10,32,32,32,32,114,101,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,32,104,101,97,112,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,77,101,115,115,97,103,101,115,10,32,32,32,32,112,97,115,115,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,99,111,112,105,101,100,32,98,101,116,119,101,101,110,32,104,101,97,112,115,46,10,10,45,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,97,120,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,115,121,115,116,101,109,45,119,105,100,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,115,101,116,116,105,110,103,10,32,32,99,97,110,32,98,101,32,115,101,116,32,117,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,104,109,97,120,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,41,44,10,32,32,91,96,43,104,109,97,120,107,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,107,41,44,32,91,96,43,104,109,97,120,101,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,101,108,41,32,97,110,100,10,32,32,91,96,43,104,109,97,120,105,98,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,105,98,41,32,105,110,32,96,101,114,108,40,49,41,96,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,116,105,109,101,10,32,32,117,115,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,46,10,32,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,10,32,32,96,111,102,102,95,104,101,97,112,96,32,111,114,32,96,111,110,95,104,101,97,112,96,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,10,32,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,113,100,41,32,105,110,32,96,101,114,108,40,49,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,105,110,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,112,114,111,99,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,112,114,111,99,101,115,115,32,97,110,100,32,112,111,114,116,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,35,35,32,83,121,115,116,101,109,32,76,105,109,105,116,115,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,108,105,109,105,116,115,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,97,116,111,109,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,48,46,48,10,10,45,32,96,97,116,111,109,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,97,116,111,109,115,32,97,108,108,111,119,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,105,110,99,114,101,97,115,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,116,95,115,105,122,101,41,32,116,111,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,48,46,48,10,10,45,32,96,101,116,115,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,49,46,49,10,10,45,32,96,101,116,115,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,102,111,114,32,110,117,109,98,101,114,32,111,102,10,32,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,91,112,97,114,116,105,97,108,108,121,32,111,98,115,111,108,101,116,101,93,40,96,109,58,101,116,115,35,109,97,120,95,101,116,115,95,116,97,98,108,101,115,96,41,32,97,110,100,10,32,32,110,117,109,98,101,114,32,111,102,32,116,97,98,108,101,115,32,97,114,101,32,111,110,108,121,32,108,105,109,105,116,101,100,32,98,121,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,48,51,10,10,45,32,96,112,111,114,116,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,10,32,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,108,101,110,103,116,104,40,101,114,108,97,110,103,58,112,111,114,116,115,40,41,41,96,44,32,98,117,116,32,109,111,114,101,10,32,32,101,102,102,105,99,105,101,110,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,10,45,32,96,112,111,114,116,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,10,32,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,81,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,81,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,32,79,84,80,32,82,49,54,66,10,10,45,32,96,112,114,111,99,101,115,115,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,10,32,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,108,101,110,103,116,104,40,112,114,111,99,101,115,115,101,115,40,41,41,96,44,32,98,117,116,10,32,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,45,32,96,112,114,111,99,101,115,115,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,10,32,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,10,32,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,80,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,80,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,35,35,32,83,121,115,116,101,109,32,84,105,109,101,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,116,105,109,101,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,101,110,100,95,116,105,109,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,32,125,32,45,32,84,104,101,32,108,97,115,116,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,32,105,110,32,96,110,97,116,105,118,101,96,10,32,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,105,110,116,101,114,110,97,108,108,121,32,105,110,10,32,32,116,104,101,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,91,115,116,97,114,116,32,116,105,109,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,96,41,32,97,110,100,32,116,104,101,32,101,110,100,32,116,105,109,101,32,105,115,32,97,116,32,108,101,97,115,116,32,97,10,32,32,113,117,97,114,116,101,114,32,111,102,32,97,32,109,105,108,108,101,110,110,105,117,109,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,10,32,32,91,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,73,102,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,110,111,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,10,32,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32,96,75,101,121,96,115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32,96,86,97,108,117,101,96,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,10,32,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58,10,10,32,32,45,32,96,123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125,96,32,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,10,32,32,32,32,84,104,105,115,32,116,117,112,108,101,32,97,108,119,97,121,115,32,101,120,105,115,116,115,32,105,102,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,32,32,115,121,115,116,101,109,46,10,10,32,32,45,32,96,123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125,96,32,45,32,84,104,105,115,32,116,117,112,108,101,32,111,110,108,121,32,101,120,105,115,116,115,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,99,97,110,32,98,101,32,117,115,101,100,10,32,32,32,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32,96,67,108,111,99,107,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,10,32,32,32,32,119,104,101,110,32,99,97,108,108,105,110,103,32,96,70,117,110,99,116,105,111,110,96,46,10,10,32,32,45,32,96,123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,10,32,32,32,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,10,32,32,32,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,10,32,32,32,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,10,32,32,32,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,96,70,117,110,99,116,105,111,110,96,115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,10,32,32,32,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,10,32,32,32,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,97,108,105,103,110,115,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,10,32,32,32,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,117,115,101,100,95,114,101,115,111,108,117,116,105,111,110,44,32,85,115,101,100,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,84,104,101,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,118,101,114,121,32,111,102,116,101,110,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,72,111,119,101,118,101,114,44,32,111,110,32,115,111,109,101,32,115,121,115,116,101,109,115,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,104,97,115,32,116,111,10,32,32,32,32,98,101,32,114,101,100,117,99,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,114,101,108,105,97,98,108,121,32,112,114,111,100,117,99,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,116,97,109,112,115,46,32,65,110,32,101,120,97,109,112,108,101,32,111,102,10,32,32,32,32,116,104,105,115,32,105,115,32,119,104,101,110,32,96,81,117,101,114,121,80,101,114,102,111,114,109,97,110,99,101,67,111,117,110,116,101,114,40,41,96,32,105,115,32,117,115,101,100,32,97,115,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,10,32,32,32,32,115,111,117,114,99,101,32,111,110,32,87,105,110,100,111,119,115,46,32,73,102,32,115,117,99,104,32,97,32,114,101,100,117,99,116,105,111,110,32,111,102,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,104,97,115,32,98,101,101,110,32,100,111,110,101,44,10,32,32,32,32,96,85,115,101,100,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,119,105,108,108,32,98,101,32,115,109,97,108,108,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,101,120,116,101,110,100,101,100,44,32,69,120,116,101,110,100,101,100,125,96,32,45,32,96,69,120,116,101,110,100,101,100,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,105,109,101,10,32,32,32,32,118,97,108,117,101,115,32,104,97,115,32,98,101,101,110,32,101,120,116,101,110,100,101,100,59,32,111,116,104,101,114,119,105,115,101,32,96,69,120,116,101,110,100,101,100,96,32,101,113,117,97,108,115,32,96,110,111,96,46,32,84,104,101,32,114,97,110,103,101,32,109,117,115,116,10,32,32,32,32,98,101,32,101,120,116,101,110,100,101,100,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,114,101,116,117,114,110,115,32,118,97,108,117,101,115,32,116,104,97,116,32,119,114,97,112,32,102,97,115,116,46,32,84,104,105,115,32,116,121,112,105,99,97,108,108,121,32,105,115,10,32,32,32,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,51,50,45,98,105,116,32,118,97,108,117,101,46,10,10,32,32,45,32,96,123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125,96,32,45,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,99,97,108,108,101,100,10,32,32,32,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,10,32,32,32,32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,110,111,96,46,10,10,32,32,45,32,96,123,116,105,109,101,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,125,96,32,45,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,96,32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,10,32,32,32,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,10,32,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32,96,75,101,121,96,115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32,96,86,97,108,117,101,96,115,32,97,115,10,32,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,10,32,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58,10,10,32,32,45,32,96,123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125,96,32,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,10,10,32,32,45,32,96,123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125,96,32,45,32,69,120,105,115,116,115,32,111,110,108,121,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,10,32,32,32,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32,96,67,108,111,99,107,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,10,32,32,32,32,99,97,108,108,105,110,103,32,96,70,117,110,99,116,105,111,110,96,46,10,10,32,32,45,32,96,123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,10,32,32,32,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,10,32,32,32,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,10,32,32,32,32,102,114,111,109,32,116,104,101,32,79,83,44,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,10,32,32,32,32,117,110,105,116,32,111,102,32,96,70,117,110,99,116,105,111,110,96,115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,10,32,32,32,32,108,111,119,101,114,32,116,104,97,110,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,10,32,32,32,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,114,10,32,32,32,32,119,104,101,116,104,101,114,32,116,104,101,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,100,111,32,97,108,105,103,110,32,119,105,116,104,32,116,104,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125,96,32,45,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,99,97,108,108,101,100,10,32,32,32,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,10,32,32,32,32,99,97,108,108,115,32,110,101,101,100,115,32,116,111,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,110,111,96,46,10,10,32,32,45,32,96,123,116,105,109,101,44,32,79,115,83,121,115,116,101,109,84,105,109,101,125,96,32,45,32,96,79,115,83,121,115,116,101,109,84,105,109,101,96,32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,105,110,10,32,32,32,32,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,115,116,97,114,116,95,116,105,109,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,32,125,32,45,32,84,104,101,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,32,105,110,32,96,110,97,116,105,118,101,96,10,32,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,32,97,116,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,115,116,97,114,116,101,100,46,10,10,32,32,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,101,110,100,95,116,105,109,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,96,116,58,98,111,111,108,101,97,110,40,41,96,10,32,32,118,97,108,117,101,32,105,110,100,105,99,97,116,105,110,103,32,119,104,101,116,104,101,114,32,91,116,105,109,101,32,99,111,114,114,101,99,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,99,111,114,114,101,99,116,105,111,110,41,10,32,32,105,115,32,101,110,97,98,108,101,100,32,111,114,32,110,111,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,111,102,102,115,101,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,116,105,109,101,10,32,32,111,102,102,115,101,116,58,10,10,32,32,45,32,96,112,114,101,108,105,109,105,110,97,114,121,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,112,114,101,108,105,109,105,110,97,114,121,44,32,97,110,100,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,97,110,100,10,32,32,32,32,102,105,110,97,108,105,122,101,100,32,108,97,116,101,114,46,32,84,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,112,114,101,108,105,109,105,110,97,114,121,10,32,32,32,32,112,104,97,115,101,32,111,102,32,116,104,101,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,46,10,10,32,32,45,32,96,102,105,110,97,108,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,102,105,110,97,108,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,10,32,32,32,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,44,32,111,114,10,32,32,32,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,104,97,118,101,32,98,101,101,110,32,102,105,110,97,108,105,122,101,100,32,119,104,101,110,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,118,111,108,97,116,105,108,101,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,118,111,108,97,116,105,108,101,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,99,104,97,110,103,101,32,97,116,32,97,110,121,10,32,32,32,32,116,105,109,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,118,97,108,117,101,10,32,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,101,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,116,104,97,116,32,105,115,10,32,32,117,115,101,100,58,10,10,32,32,45,32,96,110,111,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,115,105,110,103,108,101,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,109,117,108,116,105,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,32,125,32,45,32,82,101,116,117,114,110,115,32,119,104,101,116,104,101,114,10,32,32,97,32,112,114,101,32,69,82,84,83,32,55,46,48,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,108,101,32,99,111,109,112,101,110,115,97,116,105,111,110,32,102,111,114,32,115,117,100,100,101,110,32,99,104,97,110,103,101,115,32,111,102,32,115,121,115,116,101,109,10,32,32,116,105,109,101,32,105,115,32,96,101,110,97,98,108,101,100,96,32,111,114,32,96,100,105,115,97,98,108,101,100,96,46,32,83,117,99,104,32,99,111,109,112,101,110,115,97,116,105,111,110,32,105,115,32,96,101,110,97,98,108,101,100,96,32,119,104,101,110,32,116,104,101,10,32,32,91,116,105,109,101,32,111,102,102,115,101,116,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,96,41,32,105,115,32,96,102,105,110,97,108,96,44,32,97,110,100,10,32,32,91,116,105,109,101,32,99,111,114,114,101,99,116,105,111,110,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,41,32,105,115,32,101,110,97,98,108,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,49,10,10,35,35,32,83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,44,32,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,68,105,114,116,121,32,67,80,85,10,32,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,67,80,85,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,44,32,108,105,110,107,101,100,45,105,110,10,32,32,100,114,105,118,101,114,32,99,111,100,101,44,32,97,110,100,32,66,73,70,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,10,32,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,10,32,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,10,32,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,10,32,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,83,68,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,99,112,117,41,10,32,32,111,114,32,91,96,43,83,68,80,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,80,99,112,117,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,10,32,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,10,32,32,115,97,116,105,115,102,105,101,115,32,96,49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78,96,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,10,32,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,32,97,110,100,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,83,68,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,99,112,117,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,68,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,10,32,32,73,47,79,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,32,97,110,100,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,119,104,105,99,104,10,32,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,83,68,105,111,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,105,111,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,32,125,32,45,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,10,32,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,96,100,105,115,97,98,108,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,116,97,114,116,101,100,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,10,32,32,32,32,116,104,114,101,97,100,46,10,10,32,32,45,32,96,98,108,111,99,107,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,10,32,32,32,32,116,104,114,101,97,100,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,115,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,45,32,96,98,108,111,99,107,101,100,95,110,111,114,109,97,108,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,10,32,32,32,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,100,105,114,116,121,10,32,32,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,110,111,116,32,98,108,111,99,107,101,100,44,32,97,110,100,32,99,97,110,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,10,32,32,32,32,110,97,116,105,118,101,32,99,111,100,101,46,10,10,32,32,45,32,96,101,110,97,98,108,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,97,110,100,32,110,111,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,97,108,108,32,97,118,97,105,108,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,10,32,32,32,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,80,105,100,96,115,32,119,104,101,110,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,32,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,96,80,105,100,96,115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,10,32,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32,96,80,105,100,96,32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,10,32,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,123,58,10,32,32,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,80,105,100,96,115,10,32,32,119,104,101,110,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,32,40,116,104,97,116,32,105,115,44,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,10,32,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,41,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,96,80,105,100,96,115,32,105,110,32,116,104,101,10,32,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,10,32,32,65,32,96,80,105,100,96,32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,10,32,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,116,58,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,96,44,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,32,111,114,32,110,111,116,32,98,111,117,110,100,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,97,108,116,104,111,117,103,104,32,97,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,44,32,116,104,101,121,32,99,97,110,10,32,32,115,105,108,101,110,116,108,121,32,104,97,118,101,32,102,97,105,108,101,100,32,116,111,32,98,105,110,100,46,32,84,111,32,105,110,115,112,101,99,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,44,32,99,97,108,108,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,98,116,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,46,10,10,32,32,65,32,116,117,112,108,101,32,111,102,32,97,32,115,105,122,101,32,101,113,117,97,108,32,116,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,98,111,117,110,100,96,46,32,76,111,103,105,99,97,108,10,32,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,105,110,116,101,103,101,114,115,46,32,84,104,101,32,96,78,96,116,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,10,32,32,116,117,112,108,101,32,101,113,117,97,108,115,32,116,104,101,32,99,117,114,114,101,110,116,32,98,105,110,100,105,110,103,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,105,116,104,32,116,104,101,32,115,99,104,101,100,117,108,101,114,10,32,32,105,100,101,110,116,105,102,105,101,114,32,101,113,117,97,108,32,116,111,32,96,78,96,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,44,10,32,32,96,101,108,101,109,101,110,116,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,44,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,41,96,10,32,32,114,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,111,110,108,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,98,116,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,105,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,73,68,10,32,32,40,96,83,99,104,101,100,117,108,101,114,73,100,96,41,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,96,83,99,104,101,100,117,108,101,114,73,100,96,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,119,104,101,114,101,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,10,32,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,69,114,108,97,110,103,32,112,111,114,116,115,44,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,32,97,110,100,32,69,114,108,97,110,103,32,108,105,110,107,101,100,45,105,110,10,32,32,100,114,105,118,101,114,32,99,111,100,101,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,10,32,32,98,101,32,99,104,97,110,103,101,100,32,108,97,116,101,114,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,10,32,32,97,110,121,32,116,105,109,101,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,10,32,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,108,97,116,105,111,110,115,104,105,112,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,115,109,112,95,115,117,112,112,111,114,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,45,32,96,116,104,114,101,97,100,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,45,32,96,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,10,32,32,97,115,121,110,99,32,116,104,114,101,97,100,32,112,111,111,108,32,117,115,101,100,32,102,111,114,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,114,105,118,101,114,32,99,97,108,108,115,10,32,32,40,91,32,96,101,114,108,95,100,114,105,118,101,114,58,100,114,105,118,101,114,95,97,115,121,110,99,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,100,114,105,118,101,114,95,97,115,121,110,99,41,41,46,32,84,104,101,32,118,97,108,117,101,32,105,115,10,32,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,10,10,35,35,32,68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,97,115,121,110,99,95,100,105,115,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,43,112,97,100,32,60,98,111,111,108,101,97,110,62,93,40,101,114,108,95,99,109,100,46,109,100,35,43,112,97,100,41,32,119,104,105,99,104,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,46,32,84,104,105,115,32,118,97,108,117,101,10,32,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,96,41,10,32,32,118,97,108,117,101,32,102,111,114,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,45,32,96,99,114,101,97,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,34,99,114,101,97,116,105,111,110,34,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,46,10,32,32,84,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,111,100,101,32,105,115,32,115,116,111,114,101,100,32,105,110,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,10,32,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,105,115,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,105,100,101,110,116,105,102,105,101,114,115,32,102,114,111,109,10,32,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,46,32,67,114,101,97,116,105,111,110,32,118,97,108,117,101,115,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,51,50,45,98,105,116,10,32,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,44,32,98,117,116,32,116,104,105,115,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,10,32,32,97,108,105,118,101,44,32,96,48,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,105,110,32,115,101,99,111,110,100,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,110,32,101,110,116,114,121,32,105,110,32,97,32,110,111,100,101,32,116,97,98,108,101,10,32,32,105,115,32,100,101,108,97,121,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,111,110,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,10,32,32,91,96,43,122,100,110,116,103,99,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,100,110,116,103,99,41,32,116,111,32,96,101,114,108,40,49,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,100,105,115,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,118,97,108,117,101,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,10,32,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,122,100,98,98,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,100,98,98,108,41,32,116,111,10,32,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,52,66,48,49,10,10,45,32,96,100,105,115,116,95,99,116,114,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,10,32,32,96,123,78,111,100,101,32,58,58,32,110,111,100,101,40,41,44,32,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,32,58,58,32,112,111,114,116,40,41,32,124,32,112,105,100,40,41,125,96,44,32,111,110,101,32,101,110,116,114,121,32,102,111,114,32,101,97,99,104,10,32,32,99,111,110,110,101,99,116,101,100,32,114,101,109,111,116,101,32,110,111,100,101,46,32,96,78,111,100,101,96,32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,32,96,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,96,32,105,115,32,116,104,101,10,32,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,10,32,32,77,111,114,101,32,115,112,101,99,105,102,105,99,97,108,108,121,44,32,96,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,96,32,102,111,114,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,84,67,80,47,73,80,32,40,116,104,101,10,32,32,110,111,114,109,97,108,32,99,97,115,101,41,32,105,115,32,116,104,101,32,115,111,99,107,101,116,32,117,115,101,100,32,105,110,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,99,32,110,111,100,101,46,10,10,35,35,32,83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,116,119,111,45,116,117,112,108,101,10,32,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,67,32,99,111,109,112,105,108,101,114,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,105,108,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,102,105,114,115,116,10,32,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,10,32,32,117,110,107,110,111,119,110,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,101,114,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,10,32,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,117,110,107,110,111,119,110,46,10,10,45,32,96,99,104,101,99,107,95,105,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,109,117,108,97,116,111,114,115,32,105,110,116,101,114,110,97,108,32,73,47,79,32,99,104,101,99,107,105,110,103,46,32,78,111,116,105,99,101,10,32,32,116,104,97,116,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,118,97,114,121,32,98,101,116,119,101,101,110,32,112,108,97,116,102,111,114,109,115,32,97,110,100,32,111,118,101,114,10,32,32,116,105,109,101,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,99,111,109,112,97,116,95,114,101,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,10,32,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,10,32,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,101,116,32,116,111,32,98,101,32,98,97,99,107,119,97,114,100,10,32,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,46,32,84,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,82,96,93,40,101,114,108,95,99,109,100,46,109,100,35,99,111,109,112,97,116,95,114,101,108,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,45,32,96,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,98,117,103,45,99,111,109,112,105,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,45,32,96,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,10,32,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,118,101,114,115,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,104,97,115,32,116,104,101,10,32,32,102,111,114,109,32,91,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,118,101,114,115,105,111,110,95,109,97,110,97,103,101,109,101,110,116,41,46,10,10,45,32,96,100,121,110,97,109,105,99,95,116,114,97,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,10,32,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,102,114,97,109,101,119,111,114,107,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,46,32,73,116,10,32,32,99,97,110,32,98,101,32,96,100,116,114,97,99,101,96,44,32,96,115,121,115,116,101,109,116,97,112,96,44,32,111,114,32,96,110,111,110,101,96,46,32,70,111,114,32,97,32,99,111,109,109,101,114,99,105,97,108,32,111,114,32,115,116,97,110,100,97,114,100,32,98,117,105,108,100,44,10,32,32,105,116,32,105,115,32,97,108,119,97,121,115,32,96,110,111,110,101,96,46,32,84,104,101,32,111,116,104,101,114,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,105,110,100,105,99,97,116,101,32,97,32,99,117,115,116,111,109,32,99,111,110,102,105,103,117,114,97,116,105,111,110,10,32,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,96,46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,100,121,110,97,109,105,99,45,116,114,97,99,101,61,100,116,114,97,99,101,96,41,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,44,32,115,101,101,32,91,96,100,121,110,116,114,97,99,101,40,51,41,96,93,40,96,109,58,100,121,110,116,114,97,99,101,96,41,32,109,97,110,117,97,108,10,32,32,112,97,103,101,32,97,110,100,32,116,104,101,32,96,82,69,65,68,77,69,46,100,116,114,97,99,101,96,47,96,82,69,65,68,77,69,46,115,121,115,116,101,109,116,97,112,96,32,102,105,108,101,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,115,111,117,114,99,101,10,32,32,99,111,100,101,32,116,111,112,32,100,105,114,101,99,116,111,114,121,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,96,116,58,98,111,111,108,101,97,110,40,41,96,32,105,110,100,105,99,97,116,105,110,103,32,105,102,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,112,114,111,98,101,115,32,40,96,100,116,114,97,99,101,96,32,111,114,32,96,115,121,115,116,101,109,116,97,112,96,41,32,97,114,101,10,32,32,98,117,105,108,116,32,105,110,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,98,101,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,119,97,115,10,32,32,98,117,105,108,116,32,102,111,114,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,32,40,116,104,97,116,32,105,115,44,32,96,115,121,115,116,101,109,95,105,110,102,111,40,100,121,110,97,109,105,99,95,116,114,97,99,101,41,96,32,114,101,116,117,114,110,115,10,32,32,96,100,116,114,97,99,101,96,32,111,114,32,96,115,121,115,116,101,109,116,97,112,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,101,109,117,95,102,108,97,118,111,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,10,32,32,102,108,97,118,111,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,101,105,116,104,101,114,32,96,101,109,117,96,32,111,114,32,96,106,105,116,96,46,32,80,111,115,115,105,98,108,101,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,48,10,10,45,32,96,101,109,117,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,10,32,32,98,117,105,108,100,32,116,121,112,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,104,101,32,97,116,111,109,32,96,111,112,116,96,32,102,111,114,10,32,32,111,112,116,105,109,105,122,101,100,46,32,79,116,104,101,114,32,112,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32,96,100,101,98,117,103,96,44,32,96,103,99,111,118,96,44,32,96,118,97,108,103,114,105,110,100,96,44,10,32,32,96,103,112,114,111,102,96,44,32,97,110,100,32,96,108,99,110,116,96,46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,10,32,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,48,10,10,45,32,96,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,42,104,97,108,116,32,102,108,117,115,104,32,116,105,109,101,111,117,116,42,32,115,101,116,32,98,121,32,116,104,101,32,96,101,114,108,96,10,32,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,55,46,48,10,10,45,32,96,105,110,102,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,115,121,115,116,101,109,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,107,101,114,110,101,108,95,112,111,108,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,117,115,101,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,107,101,114,110,101,108,45,112,111,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,45,32,96,108,111,97,100,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,108,111,97,100,101,100,32,109,111,100,117,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,109,97,99,104,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,110,97,109,101,46,10,10,45,32,96,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,45,108,101,118,101,108,32,40,97,110,32,96,116,58,105,110,116,101,103,101,114,40,41,96,41,32,105,102,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,10,32,32,111,116,104,101,114,119,105,115,101,32,96,117,110,100,101,102,105,110,101,100,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,44,32,115,101,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,84,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,84,95,108,101,118,101,108,41,32,105,110,32,96,101,114,108,40,49,41,96,10,10,45,32,96,110,105,102,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,10,32,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,78,73,70,32,105,110,116,101,114,102,97,99,101,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,10,32,32,116,104,101,32,102,111,114,109,32,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,52,10,10,45,32,96,111,116,112,95,114,101,108,101,97,115,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,69,82,84,83,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,112,97,114,116,32,111,102,46,10,10,32,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,49,55,44,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,109,97,106,111,114,32,79,84,80,10,32,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,46,32,78,111,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,41,96,32,97,114,103,117,109,101,110,116,32,103,105,118,101,115,32,116,104,101,32,101,120,97,99,116,32,79,84,80,10,32,32,118,101,114,115,105,111,110,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,32,105,115,10,32,32,100,105,102,102,105,99,117,108,116,32,116,111,32,100,101,116,101,114,109,105,110,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,101,114,115,105,111,110,115,10,32,32,105,110,32,91,83,121,115,116,101,109,32,112,114,105,110,99,105,112,108,101,115,93,40,96,101,58,115,121,115,116,101,109,58,118,101,114,115,105,111,110,115,46,109,100,96,41,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,46,10,10,45,32,96,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,123,58,10,32,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,111,110,32,116,104,101,10,32,32,97,109,111,117,110,116,32,111,102,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,109,97,100,101,32,98,121,32,97,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,32,111,114,99,104,101,115,116,114,97,116,105,110,103,32,115,121,115,116,101,109,10,32,32,119,105,100,101,32,99,104,97,110,103,101,115,46,32,83,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,44,32,76,105,109,105,116,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,41,10,32,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,50,10,10,45,32,96,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,115,99,104,101,100,117,108,105,110,103,32,104,105,110,116,32,117,115,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,112,112,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,112,112,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,10,45,32,96,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,111,114,32,97,110,100,32,79,83,32,97,114,99,104,105,116,101,99,116,117,114,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,98,117,105,108,116,10,32,32,102,111,114,46,10,10,45,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,32,97,115,32,115,101,116,32,98,121,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,10,32,32,42,41,96,93,40,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,49,46,51,10,10,45,32,96,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,10,32,32,99,111,110,116,97,105,110,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,97,110,100,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,46,10,10,45,32,96,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,10,32,32,96,103,101,116,95,116,99,119,96,32,105,110,32,115,101,99,116,105,111,110,32,91,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,93,40,109,97,116,99,104,95,115,112,101,99,46,109,100,35,103,101,116,95,116,99,119,41,10,32,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,46,10,10,45,32,96,119,111,114,100,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101,32,125,32,45,32,83,97,109,101,32,97,115,32,96,123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125,96,46,10,10,45,32,96,123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125,96,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,105,122,101,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,32,119,111,114,100,115,32,105,110,32,98,121,116,101,115,32,97,115,10,32,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,97,110,100,32,56,32,105,115,10,32,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,46,10,10,45,32,96,123,119,111,114,100,115,105,122,101,44,32,101,120,116,101,114,110,97,108,125,96,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,116,114,117,101,32,119,111,114,100,32,115,105,122,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,116,104,97,116,10,32,32,105,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,97,32,112,111,105,110,116,101,114,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,79,110,32,97,10,32,32,112,117,114,101,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,56,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46>>},#{group => system,specification => [{attribute,{9676,2},spec,{{system_info,1},[{type,{9677,10},'fun',[{type,{9677,10},product,[{atom,{9677,11},allocated_areas}]},{type,{9677,31},list,[{type,{9677,33},tuple,any}]}]},{type,{9678,10},bounded_fun,[{type,{9678,10},'fun',[{type,{9678,10},product,[{atom,{9678,11},allocator}]},{type,{9679,18},tuple,[{var,{9679,19},'Allocator'},{var,{9679,30},'Version'},{var,{9679,39},'Features'},{var,{9679,49},'Settings'}]}]},[{type,{9680,7},constraint,[{atom,{9680,7},is_subtype},[{var,{9680,7},'Allocator'},{type,{9680,20},union,[{atom,{9680,20},undefined},{atom,{9680,32},glibc}]}]]},{type,{9681,7},constraint,[{atom,{9681,7},is_subtype},[{var,{9681,7},'Version'},{type,{9681,18},list,[{type,{9681,19},non_neg_integer,[]}]}]]},{type,{9682,7},constraint,[{atom,{9682,7},is_subtype},[{var,{9682,7},'Features'},{type,{9682,19},list,[{type,{9682,20},atom,[]}]}]]},{type,{9683,7},constraint,[{atom,{9683,7},is_subtype},[{var,{9683,7},'Settings'},{type,{9683,19},list,[{type,{9683,20},tuple,[{ann_type,{9683,21},[{var,{9683,21},'Subsystem'},{type,{9683,34},atom,[]}]},{type,{9684,21},list,[{type,{9684,22},tuple,[{ann_type,{9684,23},[{var,{9684,23},'Parameter'},{type,{9684,36},atom,[]}]},{ann_type,{9685,23},[{var,{9685,23},'Value'},{type,{9685,32},term,[]}]}]}]}]}]}]]}]]},{type,{9686,10},bounded_fun,[{type,{9686,10},'fun',[{type,{9686,10},product,[{type,{9686,11},tuple,[{atom,{9686,12},allocator},{var,{9686,23},'Alloc'}]}]},{type,{9686,34},list,[{var,{9686,35},'_'}]}]},[{type,{9687,7},constraint,[{atom,{9687,7},is_subtype},[{var,{9687,7},'Alloc'},{type,{9687,16},atom,[]}]]}]]},{type,{9688,10},bounded_fun,[{type,{9688,10},'fun',[{type,{9688,10},product,[{atom,{9688,11},alloc_util_allocators}]},{type,{9688,37},list,[{var,{9688,38},'Alloc'}]}]},[{type,{9689,7},constraint,[{atom,{9689,7},is_subtype},[{var,{9689,7},'Alloc'},{type,{9689,16},atom,[]}]]}]]},{type,{9690,10},bounded_fun,[{type,{9690,10},'fun',[{type,{9690,10},product,[{type,{9690,11},tuple,[{atom,{9690,12},allocator_sizes},{var,{9690,29},'Alloc'}]}]},{type,{9690,40},list,[{var,{9690,41},'_'}]}]},[{type,{9691,7},constraint,[{atom,{9691,7},is_subtype},[{var,{9691,7},'Alloc'},{type,{9691,16},atom,[]}]]}]]},{type,{9692,10},'fun',[{type,{9692,10},product,[{atom,{9692,11},atom_count}]},{type,{9692,26},pos_integer,[]}]},{type,{9693,10},'fun',[{type,{9693,10},product,[{atom,{9693,11},atom_limit}]},{type,{9693,26},pos_integer,[]}]},{type,{9694,10},'fun',[{type,{9694,10},product,[{atom,{9694,11},build_type}]},{type,{9694,26},union,[{atom,{9694,26},opt},{atom,{9694,32},debug},{atom,{9695,26},gcov},{atom,{9695,33},valgrind},{atom,{9695,44},gprof},{atom,{9695,52},lcnt},{atom,{9695,59},frmptr}]}]},{type,{9696,10},'fun',[{type,{9696,10},product,[{atom,{9696,11},c_compiler_used}]},{type,{9696,31},tuple,[{type,{9696,32},atom,[]},{type,{9696,40},term,[]}]}]},{type,{9697,10},'fun',[{type,{9697,10},product,[{atom,{9697,11},check_io}]},{type,{9697,24},list,[{var,{9697,25},'_'}]}]},{type,{9698,10},'fun',[{type,{9698,10},product,[{atom,{9698,11},compat_rel}]},{type,{9698,26},integer,[]}]},{type,{9699,10},bounded_fun,[{type,{9699,10},'fun',[{type,{9699,10},product,[{atom,{9699,11},cpu_topology}]},{var,{9699,29},'CpuTopology'}]},[{type,{9700,7},constraint,[{atom,{9700,7},is_subtype},[{var,{9700,7},'CpuTopology'},{user_type,{9700,22},cpu_topology,[]}]]}]]},{type,{9701,10},bounded_fun,[{type,{9701,10},'fun',[{type,{9701,10},product,[{type,{9701,11},tuple,[{atom,{9701,12},cpu_topology},{type,{9701,26},union,[{atom,{9701,26},defined},{atom,{9701,36},detected},{atom,{9701,47},used}]}]}]},{var,{9701,57},'CpuTopology'}]},[{type,{9702,7},constraint,[{atom,{9702,7},is_subtype},[{var,{9702,7},'CpuTopology'},{user_type,{9702,22},cpu_topology,[]}]]}]]},{type,{9703,10},'fun',[{type,{9703,10},product,[{atom,{9703,11},cpu_quota}]},{type,{9703,25},union,[{type,{9703,25},pos_integer,[]},{atom,{9703,41},unknown}]}]},{type,{9704,10},'fun',[{type,{9704,10},product,[{atom,{9704,11},creation}]},{type,{9704,24},integer,[]}]},{type,{9705,10},'fun',[{type,{9705,10},product,[{atom,{9705,11},debug_compiled}]},{type,{9705,30},boolean,[]}]},{type,{9706,10},'fun',[{type,{9706,10},product,[{atom,{9706,11},delayed_node_table_gc}]},{type,{9706,37},union,[{atom,{9706,37},infinity},{type,{9706,48},non_neg_integer,[]}]}]},{type,{9707,10},'fun',[{type,{9707,10},product,[{atom,{9707,11},dirty_cpu_schedulers}]},{type,{9707,36},non_neg_integer,[]}]},{type,{9708,10},'fun',[{type,{9708,10},product,[{atom,{9708,11},dirty_cpu_schedulers_online}]},{type,{9708,43},non_neg_integer,[]}]},{type,{9709,10},'fun',[{type,{9709,10},product,[{atom,{9709,11},dirty_io_schedulers}]},{type,{9709,35},non_neg_integer,[]}]},{type,{9710,10},'fun',[{type,{9710,10},product,[{atom,{9710,11},dist}]},{type,{9710,20},binary,[]}]},{type,{9711,10},'fun',[{type,{9711,10},product,[{atom,{9711,11},dist_buf_busy_limit}]},{type,{9711,35},non_neg_integer,[]}]},{type,{9712,10},'fun',[{type,{9712,10},product,[{atom,{9712,11},dist_ctrl}]},{type,{9712,25},list,[{type,{9712,26},tuple,[{ann_type,{9712,27},[{var,{9712,27},'Node'},{type,{9712,35},node,[]}]},{ann_type,{9713,27},[{var,{9713,27},'ControllingEntity'},{type,{9713,48},union,[{type,{9713,48},port,[]},{type,{9713,57},pid,[]}]}]}]}]}]},{type,{9714,10},'fun',[{type,{9714,10},product,[{atom,{9714,11},driver_version}]},{type,{9714,30},string,[]}]},{type,{9715,10},'fun',[{type,{9715,10},product,[{atom,{9715,11},dynamic_trace}]},{type,{9715,29},union,[{atom,{9715,29},none},{atom,{9715,36},dtrace},{atom,{9715,45},systemtap}]}]},{type,{9716,10},'fun',[{type,{9716,10},product,[{atom,{9716,11},dynamic_trace_probes}]},{type,{9716,36},boolean,[]}]},{type,{9717,10},'fun',[{type,{9717,10},product,[{atom,{9717,11},eager_check_io}]},{type,{9717,30},boolean,[]}]},{type,{9718,10},'fun',[{type,{9718,10},product,[{atom,{9718,11},emu_flavor}]},{type,{9718,26},union,[{atom,{9718,26},emu},{atom,{9718,32},jit}]}]},{type,{9719,10},'fun',[{type,{9719,10},product,[{atom,{9719,11},emu_type}]},{type,{9719,24},union,[{atom,{9719,24},opt},{atom,{9719,30},debug},{atom,{9719,38},gcov},{atom,{9719,45},valgrind},{atom,{9719,56},gprof},{atom,{9719,64},lcnt},{atom,{9719,71},frmptr}]}]},{type,{9720,10},'fun',[{type,{9720,10},product,[{atom,{9720,11},end_time}]},{type,{9720,24},non_neg_integer,[]}]},{type,{9721,10},'fun',[{type,{9721,10},product,[{atom,{9721,11},ets_count}]},{type,{9721,25},pos_integer,[]}]},{type,{9722,10},'fun',[{type,{9722,10},product,[{atom,{9722,11},ets_limit}]},{type,{9722,25},pos_integer,[]}]},{type,{9723,10},'fun',[{type,{9723,10},product,[{atom,{9723,11},fullsweep_after}]},{type,{9723,31},tuple,[{atom,{9723,32},fullsweep_after},{type,{9723,49},non_neg_integer,[]}]}]},{type,{9724,10},'fun',[{type,{9724,10},product,[{atom,{9724,11},garbage_collection}]},{user_type,{9724,34},garbage_collection_defaults,[]}]},{type,{9725,10},'fun',[{type,{9725,10},product,[{atom,{9725,11},heap_sizes}]},{type,{9725,26},list,[{type,{9725,27},non_neg_integer,[]}]}]},{type,{9726,10},'fun',[{type,{9726,10},product,[{atom,{9726,11},heap_type}]},{atom,{9726,25},private}]},{type,{9727,10},'fun',[{type,{9727,10},product,[{atom,{9727,11},info}]},{type,{9727,20},binary,[]}]},{type,{9728,10},'fun',[{type,{9728,10},product,[{atom,{9728,11},kernel_poll}]},{type,{9728,27},boolean,[]}]},{type,{9729,10},'fun',[{type,{9729,10},product,[{atom,{9729,11},loaded}]},{type,{9729,22},binary,[]}]},{type,{9730,10},'fun',[{type,{9730,10},product,[{type,{9730,11},union,[{atom,{9730,11},logical_processors},{atom,{9731,11},logical_processors_available},{atom,{9732,11},logical_processors_online}]}]},{type,{9732,41},union,[{atom,{9732,41},unknown},{type,{9732,51},pos_integer,[]}]}]},{type,{9733,10},'fun',[{type,{9733,10},product,[{atom,{9733,11},machine}]},{type,{9733,23},string,[]}]},{type,{9734,10},'fun',[{type,{9734,10},product,[{atom,{9734,11},max_heap_size}]},{type,{9734,29},tuple,[{atom,{9734,30},max_heap_size},{ann_type,{9734,45},[{var,{9734,45},'MaxHeapSize'},{user_type,{9734,60},max_heap_size,[]}]}]}]},{type,{9735,10},'fun',[{type,{9735,10},product,[{atom,{9735,11},message_queue_data}]},{user_type,{9735,34},message_queue_data,[]}]},{type,{9736,10},'fun',[{type,{9736,10},product,[{atom,{9736,11},min_heap_size}]},{type,{9736,29},tuple,[{atom,{9736,30},min_heap_size},{ann_type,{9736,45},[{var,{9736,45},'MinHeapSize'},{type,{9736,60},pos_integer,[]}]}]}]},{type,{9737,10},'fun',[{type,{9737,10},product,[{atom,{9737,11},min_bin_vheap_size}]},{type,{9737,34},tuple,[{atom,{9737,35},min_bin_vheap_size},{ann_type,{9738,35},[{var,{9738,35},'MinBinVHeapSize'},{type,{9738,54},pos_integer,[]}]}]}]},{type,{9739,10},'fun',[{type,{9739,10},product,[{atom,{9739,11},modified_timing_level}]},{type,{9739,37},union,[{type,{9739,37},integer,[]},{atom,{9739,49},undefined}]}]},{type,{9740,10},'fun',[{type,{9740,10},product,[{atom,{9740,11},multi_scheduling}]},{type,{9740,32},union,[{atom,{9740,32},disabled},{atom,{9740,43},blocked},{atom,{9740,53},blocked_normal},{atom,{9740,70},enabled}]}]},{type,{9741,10},'fun',[{type,{9741,10},product,[{atom,{9741,11},multi_scheduling_blockers}]},{type,{9741,41},list,[{ann_type,{9741,42},[{var,{9741,42},'Pid'},{type,{9741,49},pid,[]}]}]}]},{type,{9742,10},'fun',[{type,{9742,10},product,[{atom,{9742,11},nif_version}]},{type,{9742,27},string,[]}]},{type,{9743,10},'fun',[{type,{9743,10},product,[{atom,{9743,11},normal_multi_scheduling_blockers}]},{type,{9743,48},list,[{ann_type,{9743,49},[{var,{9743,49},'Pid'},{type,{9743,56},pid,[]}]}]}]},{type,{9744,10},'fun',[{type,{9744,10},product,[{atom,{9744,11},otp_release}]},{type,{9744,27},string,[]}]},{type,{9745,10},'fun',[{type,{9745,10},product,[{atom,{9745,11},os_monotonic_time_source}]},{type,{9745,40},list,[{type,{9745,41},tuple,[{type,{9745,42},atom,[]},{type,{9745,49},term,[]}]}]}]},{type,{9746,10},'fun',[{type,{9746,10},product,[{atom,{9746,11},os_system_time_source}]},{type,{9746,37},list,[{type,{9746,38},tuple,[{type,{9746,39},atom,[]},{type,{9746,46},term,[]}]}]}]},{type,{9747,10},'fun',[{type,{9747,10},product,[{atom,{9747,11},outstanding_system_requests_limit}]},{type,{9747,49},range,[{integer,{9747,49},1},{integer,{9747,52},134217727}]}]},{type,{9748,10},'fun',[{type,{9748,10},product,[{atom,{9748,11},port_parallelism}]},{type,{9748,32},boolean,[]}]},{type,{9749,10},'fun',[{type,{9749,10},product,[{atom,{9749,11},port_count}]},{type,{9749,26},non_neg_integer,[]}]},{type,{9750,10},'fun',[{type,{9750,10},product,[{atom,{9750,11},port_limit}]},{type,{9750,26},pos_integer,[]}]},{type,{9751,10},'fun',[{type,{9751,10},product,[{atom,{9751,11},process_count}]},{type,{9751,29},pos_integer,[]}]},{type,{9752,10},'fun',[{type,{9752,10},product,[{atom,{9752,11},process_limit}]},{type,{9752,29},pos_integer,[]}]},{type,{9753,10},'fun',[{type,{9753,10},product,[{atom,{9753,11},procs}]},{type,{9753,21},binary,[]}]},{type,{9754,10},'fun',[{type,{9754,10},product,[{atom,{9754,11},scheduler_bind_type}]},{user_type,{9754,35},scheduler_bind_type,[]}]},{type,{9755,10},'fun',[{type,{9755,10},product,[{atom,{9755,11},scheduler_bindings}]},{type,{9755,35},tuple,any}]},{type,{9756,10},'fun',[{type,{9756,10},product,[{atom,{9756,11},scheduler_id}]},{ann_type,{9756,28},[{var,{9756,28},'SchedulerId'},{type,{9756,43},pos_integer,[]}]}]},{type,{9757,10},'fun',[{type,{9757,10},product,[{type,{9757,11},union,[{atom,{9757,11},schedulers},{atom,{9757,24},schedulers_online}]}]},{type,{9757,46},pos_integer,[]}]},{type,{9758,10},'fun',[{type,{9758,10},product,[{atom,{9758,11},smp_support}]},{type,{9758,27},boolean,[]}]},{type,{9759,10},'fun',[{type,{9759,10},product,[{atom,{9759,11},start_time}]},{type,{9759,26},integer,[]}]},{type,{9760,10},'fun',[{type,{9760,10},product,[{atom,{9760,11},system_architecture}]},{type,{9760,35},string,[]}]},{type,{9761,10},'fun',[{type,{9761,10},product,[{atom,{9761,11},system_logger}]},{type,{9761,29},union,[{atom,{9761,29},logger},{atom,{9761,38},undefined},{type,{9761,50},pid,[]}]}]},{type,{9762,10},'fun',[{type,{9762,10},product,[{atom,{9762,11},system_version}]},{type,{9762,30},string,[]}]},{type,{9763,10},'fun',[{type,{9763,10},product,[{atom,{9763,11},threads}]},{type,{9763,23},boolean,[]}]},{type,{9764,10},'fun',[{type,{9764,10},product,[{atom,{9764,11},thread_pool_size}]},{type,{9764,32},non_neg_integer,[]}]},{type,{9765,10},'fun',[{type,{9765,10},product,[{atom,{9765,11},time_correction}]},{type,{9765,31},union,[{atom,{9765,31},true},{atom,{9765,38},false}]}]},{type,{9766,10},'fun',[{type,{9766,10},product,[{atom,{9766,11},time_offset}]},{type,{9766,27},union,[{atom,{9766,27},preliminary},{atom,{9766,41},final},{atom,{9766,49},volatile}]}]},{type,{9767,10},'fun',[{type,{9767,10},product,[{atom,{9767,11},time_warp_mode}]},{type,{9767,30},union,[{atom,{9767,30},no_time_warp},{atom,{9767,45},single_time_warp},{atom,{9767,64},multi_time_warp}]}]},{type,{9768,10},'fun',[{type,{9768,10},product,[{atom,{9768,11},tolerant_timeofday}]},{type,{9768,34},union,[{atom,{9768,34},enabled},{atom,{9768,44},disabled}]}]},{type,{9769,10},'fun',[{type,{9769,10},product,[{atom,{9769,11},trace_control_word}]},{type,{9769,34},non_neg_integer,[]}]},{type,{9770,10},'fun',[{type,{9770,10},product,[{atom,{9770,11},update_cpu_info}]},{type,{9770,31},union,[{atom,{9770,31},changed},{atom,{9770,41},unchanged}]}]},{type,{9771,10},'fun',[{type,{9771,10},product,[{atom,{9771,11},version}]},{type,{9771,23},string,[]}]},{type,{9772,10},'fun',[{type,{9772,10},product,[{type,{9772,11},union,[{atom,{9772,11},wordsize},{type,{9772,22},tuple,[{atom,{9772,23},wordsize},{atom,{9772,33},internal}]},{type,{9772,45},tuple,[{atom,{9772,46},wordsize},{atom,{9772,56},external}]}]}]},{type,{9772,70},union,[{integer,{9772,70},4},{integer,{9772,74},8}]}]},{type,{9773,10},'fun',[{type,{9773,10},product,[{atom,{9773,11},async_dist}]},{type,{9773,26},boolean,[]}]},{type,{9774,10},'fun',[{type,{9774,10},product,[{atom,{9774,11},halt_flush_timeout}]},{type,{9774,34},union,[{type,{9774,34},non_neg_integer,[]},{atom,{9774,54},infinity}]}]}]}}]}},{{function,tuple_to_list,1},{9618,2},[<<116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,117,112,108,101,96,46,32,96,84,117,112,108,101,96,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,117,112,108,101,95,116,111,95,108,105,115,116,40,123,115,104,97,114,101,44,32,123,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,125,125,41,46,10,91,115,104,97,114,101,44,123,39,69,114,105,99,115,115,111,110,95,66,39,44,49,54,51,125,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{9628,2},spec,{{tuple_to_list,1},[{type,{9628,20},bounded_fun,[{type,{9628,20},'fun',[{type,{9628,20},product,[{var,{9628,21},'Tuple'}]},{type,{9628,31},list,[{type,{9628,32},term,[]}]}]},[{type,{9629,7},constraint,[{atom,{9629,7},is_subtype},[{var,{9629,7},'Tuple'},{type,{9629,16},tuple,any}]]}]]}]}}]}},{{function,trace_pattern,3},{9575,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,40,77,70,65,44,32,77,97,116,99,104,83,112,101,99,44,32,70,108,97,103,76,105,115,116,41>>],#{<<101,110>> => <<83,101,116,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32,99,97,108,108,44,32,115,101,110,100,32,97,110,100,32,114,101,99,101,105,118,101,32,116,114,97,99,105,110,103,32,111,110,32,116,104,101,32,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,10,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,44,32,96,116,114,97,99,101,58,115,101,110,100,47,51,96,32,97,110,100,10,32,32,62,32,96,116,114,97,99,101,58,114,101,99,118,47,51,96,32,116,104,97,116,32,111,112,101,114,97,116,101,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,115,101,115,115,105,111,110,115,46,10,10,65,114,103,117,109,101,110,116,32,96,70,108,97,103,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,116,119,111,32,97,100,100,105,116,105,111,110,97,108,32,111,112,116,105,111,110,115,32,102,111,114,32,99,97,108,108,32,116,114,97,99,105,110,103,58,10,10,45,32,42,42,96,123,109,101,116,97,44,32,80,105,100,125,32,124,32,123,109,101,116,97,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125,96,42,42,32,45,32,84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,10,32,32,109,101,116,97,45,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,116,111,32,116,104,101,10,32,32,116,114,97,99,101,114,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,110,111,32,116,114,97,99,101,114,32,105,115,10,32,32,115,112,101,99,105,102,105,101,100,44,32,96,115,101,108,102,47,48,96,32,105,115,32,117,115,101,100,32,97,115,32,97,32,100,101,102,97,117,108,116,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,46,10,10,70,111,114,32,102,117,114,116,104,101,114,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,101,101,32,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,32,44,32,96,116,114,97,99,101,58,115,101,110,100,47,51,96,32,97,110,100,10,96,116,114,97,99,101,58,114,101,99,118,47,51,96,46>>},#{group => trace,specification => [{attribute,{9595,2},spec,{{trace_pattern,3},[{type,{9595,20},bounded_fun,[{type,{9595,20},'fun',[{type,{9595,20},product,[{atom,{9595,21},send},{var,{9595,27},'MatchSpec'},{type,{9595,38},nil,[]}]},{type,{9595,45},non_neg_integer,[]}]},[{type,{9596,7},constraint,[{atom,{9596,7},is_subtype},[{var,{9596,7},'MatchSpec'},{type,{9596,21},union,[{ann_type,{9596,21},[{var,{9596,21},'MatchSpecList'},{user_type,{9596,38},trace_match_spec,[]}]},{type,{9597,20},boolean,[]}]}]]}]]},{type,{9598,20},bounded_fun,[{type,{9598,20},'fun',[{type,{9598,20},product,[{atom,{9598,21},'receive'},{var,{9598,32},'MatchSpec'},{type,{9598,43},nil,[]}]},{type,{9598,50},non_neg_integer,[]}]},[{type,{9599,7},constraint,[{atom,{9599,7},is_subtype},[{var,{9599,7},'MatchSpec'},{type,{9599,21},union,[{ann_type,{9599,21},[{var,{9599,21},'MatchSpecList'},{user_type,{9599,38},trace_match_spec,[]}]},{type,{9600,20},boolean,[]}]}]]}]]},{type,{9601,20},bounded_fun,[{type,{9601,20},'fun',[{type,{9601,20},product,[{var,{9601,21},'MFA'},{var,{9601,26},'MatchSpec'},{var,{9601,37},'FlagList'}]},{type,{9601,50},non_neg_integer,[]}]},[{type,{9602,7},constraint,[{atom,{9602,7},is_subtype},[{var,{9602,7},'MFA'},{user_type,{9602,14},trace_pattern_mfa,[]}]]},{type,{9603,7},constraint,[{atom,{9603,7},is_subtype},[{var,{9603,7},'MatchSpec'},{type,{9603,21},union,[{ann_type,{9603,21},[{var,{9603,21},'MatchSpecList'},{user_type,{9603,38},trace_match_spec,[]}]},{type,{9604,20},boolean,[]},{atom,{9605,20},restart},{atom,{9606,20},pause}]}]]},{type,{9607,7},constraint,[{atom,{9607,7},is_subtype},[{var,{9607,7},'FlagList'},{type,{9607,19},list,[{user_type,{9607,21},trace_pattern_flag,[]}]}]]}]]}]}}]}},{{function,trace_pattern,2},{9549,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,40,77,70,65,44,32,77,97,116,99,104,83,112,101,99,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,69,118,101,110,116,44,32,77,97,116,99,104,83,112,101,99,44,32,91,93,41,96,93,40,96,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51,96,41,44,10,114,101,116,97,105,110,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>},#{group => trace,specification => [{attribute,{9554,2},spec,{{trace_pattern,2},[{type,{9554,20},bounded_fun,[{type,{9554,20},'fun',[{type,{9554,20},product,[{var,{9554,21},'MFA'},{var,{9554,26},'MatchSpec'}]},{type,{9554,40},non_neg_integer,[]}]},[{type,{9555,7},constraint,[{atom,{9555,7},is_subtype},[{var,{9555,7},'MFA'},{type,{9555,14},union,[{user_type,{9555,14},trace_pattern_mfa,[]},{atom,{9555,36},send},{atom,{9555,43},'receive'}]}]]},{type,{9556,7},constraint,[{atom,{9556,7},is_subtype},[{var,{9556,7},'MatchSpec'},{type,{9556,21},union,[{ann_type,{9556,21},[{var,{9556,21},'MatchSpecList'},{user_type,{9556,38},trace_match_spec,[]}]},{type,{9557,20},boolean,[]},{atom,{9558,20},restart},{atom,{9559,20},pause}]}]]}]]}]}}]}},{{function,tl,1},{9507,2},[<<116,108,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,116,97,105,108,32,111,102,32,96,76,105,115,116,96,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,108,105,115,116,32,109,105,110,117,115,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,10,10,73,116,32,119,111,114,107,115,32,119,105,116,104,32,105,109,112,114,111,112,101,114,32,108,105,115,116,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,93,41,46,10,91,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,105,109,112,114,111,112,101,114,95,101,110,100,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,105,115,116,96,32,105,115,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46>>},#{group => terms,specification => [{attribute,{9537,2},spec,{{tl,1},[{type,{9537,9},bounded_fun,[{type,{9537,9},'fun',[{type,{9537,9},product,[{var,{9537,10},'List'}]},{var,{9537,19},'Tail'}]},[{type,{9538,7},constraint,[{atom,{9538,7},is_subtype},[{var,{9538,7},'List'},{type,{9538,15},nonempty_maybe_improper_list,[]}]]},{type,{9539,7},constraint,[{atom,{9539,7},is_subtype},[{var,{9539,7},'Tail'},{type,{9539,15},term,[]}]]}]]}]}}]}},{{function,term_to_iovec,2},{9476,2},[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,10,96,116,58,101,120,116,95,105,111,118,101,99,47,48,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,10,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,10,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,115,41,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,32,119,105,108,108,10,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,10,91,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,115,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,41,46,10,10,67,117,114,114,101,110,116,108,121,32,114,101,99,111,103,110,105,115,101,100,32,111,112,116,105,111,110,115,32,97,114,101,32,97,108,108,32,111,112,116,105,111,110,115,32,114,101,99,111,103,110,105,115,101,100,32,98,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46,10,10,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41,96,10,112,114,111,118,105,100,101,46,32,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,10,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46>>},#{group => terms,specification => [{attribute,{9496,2},spec,{{term_to_iovec,2},[{type,{9496,20},bounded_fun,[{type,{9496,20},'fun',[{type,{9496,20},product,[{var,{9496,21},'Term'},{var,{9496,27},'Options'}]},{user_type,{9496,39},ext_iovec,[]}]},[{type,{9497,7},constraint,[{atom,{9497,7},is_subtype},[{var,{9497,7},'Term'},{type,{9497,15},term,[]}]]},{type,{9498,7},constraint,[{atom,{9498,7},is_subtype},[{var,{9498,7},'Options'},{type,{9498,18},list,[{type,{9498,19},union,[{atom,{9498,19},compressed},{type,{9499,10},tuple,[{atom,{9499,11},compressed},{ann_type,{9499,23},[{var,{9499,23},'Level'},{type,{9499,32},range,[{integer,{9499,32},0},{integer,{9499,35},9}]}]}]},{atom,{9500,10},deterministic},{type,{9501,10},tuple,[{atom,{9501,11},minor_version},{ann_type,{9501,26},[{var,{9501,26},'Version'},{type,{9501,37},range,[{integer,{9501,37},0},{integer,{9501,40},2}]}]}]},{atom,{9502,10},local}]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_iovec,1},{9453,2},[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,10,96,116,58,101,120,116,95,105,111,118,101,99,47,48,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,10,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,10,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,32,119,105,108,108,32,112,114,111,100,117,99,101,10,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,99,97,108,108,10,91,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,10,10,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41,96,10,112,114,111,118,105,100,101,46,32,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,10,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,46>>},#{group => terms,specification => [{attribute,{9471,2},spec,{{term_to_iovec,1},[{type,{9471,20},bounded_fun,[{type,{9471,20},'fun',[{type,{9471,20},product,[{var,{9471,21},'Term'}]},{user_type,{9471,30},ext_iovec,[]}]},[{type,{9472,7},constraint,[{atom,{9472,7},is_subtype},[{var,{9472,7},'Term'},{type,{9472,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_binary,2},{9315,2},[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,10,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,67,117,114,114,101,110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,99,111,109,112,114,101,115,115,101,100,96,42,42,32,45,32,67,111,109,112,114,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,99,111,109,112,114,101,115,115,101,100,32,102,111,114,109,97,116,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,32,97,115,32,102,114,111,109,10,32,32,69,114,108,97,110,103,47,79,84,80,32,82,55,66,46,10,10,45,32,42,42,96,123,99,111,109,112,114,101,115,115,101,100,44,32,76,101,118,101,108,125,96,42,42,32,45,32,67,111,109,112,114,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,116,111,32,97,32,103,105,118,101,110,10,32,32,108,101,118,101,108,46,32,84,104,101,32,99,111,109,112,114,101,115,115,105,111,110,32,108,101,118,101,108,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,76,101,118,101,108,96,32,119,104,105,99,104,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,105,110,10,32,32,116,104,101,32,114,97,110,103,101,32,48,46,46,57,44,32,119,104,101,114,101,58,10,10,32,32,45,32,42,42,96,48,96,42,42,32,45,32,78,111,32,99,111,109,112,114,101,115,115,105,111,110,32,105,115,32,100,111,110,101,32,40,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,103,105,118,105,110,103,32,110,111,32,96,99,111,109,112,114,101,115,115,101,100,96,10,32,32,32,32,111,112,116,105,111,110,41,46,10,10,32,32,45,32,42,42,96,49,96,42,42,32,45,32,84,97,107,101,115,32,108,101,97,115,116,32,116,105,109,101,32,98,117,116,32,109,97,121,32,110,111,116,32,99,111,109,112,114,101,115,115,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,104,105,103,104,101,114,10,32,32,32,32,108,101,118,101,108,115,46,10,10,32,32,45,32,42,42,96,54,96,42,42,32,45,32,68,101,102,97,117,108,116,32,108,101,118,101,108,32,119,104,101,110,32,111,112,116,105,111,110,32,96,99,111,109,112,114,101,115,115,101,100,96,32,105,115,32,112,114,111,118,105,100,101,100,46,10,10,32,32,45,32,42,42,96,57,96,42,42,32,45,32,84,97,107,101,115,32,109,111,115,116,32,116,105,109,101,32,97,110,100,32,116,114,105,101,115,32,116,111,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,46,32,78,111,116,105,99,101,10,32,32,32,32,34,116,114,105,101,115,34,32,105,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,101,110,116,101,110,99,101,59,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,105,110,112,117,116,32,116,101,114,109,44,32,108,101,118,101,108,32,57,10,32,32,32,32,99,111,109,112,114,101,115,115,105,111,110,32,101,105,116,104,101,114,32,100,111,101,115,32,111,114,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,32,116,104,97,110,32,108,101,118,101,108,32,49,10,32,32,32,32,99,111,109,112,114,101,115,115,105,111,110,46,10,10,45,32,42,42,96,123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125,96,42,42,40,83,105,110,99,101,32,82,49,49,66,45,52,41,32,32,10,32,32,84,104,101,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,111,110,116,114,111,108,32,115,111,109,101,32,101,110,99,111,100,105,110,103,32,100,101,116,97,105,108,115,46,32,86,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,10,32,32,96,86,101,114,115,105,111,110,96,32,97,114,101,58,10,10,32,32,45,32,42,42,96,48,96,42,42,32,45,32,70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,32,32,32,32,65,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,108,97,116,105,110,49,10,32,32,32,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,10,32,32,32,32,117,116,102,56,46,10,10,32,32,45,32,42,42,96,49,96,42,42,32,45,32,70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,97,32,109,111,114,101,32,115,112,97,99,101,45,101,102,102,105,99,105,101,110,116,32,97,110,100,32,101,120,97,99,116,32,119,97,121,32,40,110,97,109,101,108,121,10,32,32,32,32,105,110,32,116,104,101,32,54,52,45,98,105,116,32,73,69,69,69,32,102,111,114,109,97,116,44,32,114,97,116,104,101,114,32,116,104,97,110,32,99,111,110,118,101,114,116,101,100,32,116,111,32,97,32,116,101,120,116,117,97,108,10,32,32,32,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,41,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,44,10,32,32,32,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,32,32,32,32,65,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,108,97,116,105,110,49,10,32,32,32,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,10,32,32,32,32,117,116,102,56,46,10,10,32,32,45,32,42,42,96,50,96,42,42,32,45,32,84,104,105,115,32,105,115,32,97,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46,48,32,116,104,101,32,95,100,101,102,97,117,108,116,95,46,32,65,116,111,109,115,32,97,114,101,10,32,32,32,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46,32,69,114,108,97,110,103,47,79,84,80,32,115,121,115,116,101,109,115,32,97,115,32,111,102,32,82,49,54,66,32,99,97,110,32,100,101,99,111,100,101,10,32,32,32,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,45,32,42,42,96,100,101,116,101,114,109,105,110,105,115,116,105,99,96,42,42,40,83,105,110,99,101,32,79,84,80,32,50,52,46,49,41,32,32,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,44,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,109,97,106,111,114,32,114,101,108,101,97,115,101,32,111,102,10,32,32,69,114,108,97,110,103,47,79,84,80,44,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46,10,32,32,84,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,114,101,109,97,105,110,115,32,116,104,101,32,115,97,109,101,10,32,32,98,101,116,119,101,101,110,32,109,97,106,111,114,32,114,101,108,101,97,115,101,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,46,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,108,111,99,97,108,96,91,93,40,41,123,58,32,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,95,108,111,99,97,108,32,125,32,42,42,40,83,105,110,99,101,32,79,84,80,32,50,54,46,48,41,32,32,10,32,32,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,116,111,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,108,111,99,97,108,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,10,32,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,119,104,105,99,104,32,119,104,101,110,32,100,101,99,111,100,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,119,105,108,108,10,32,32,112,114,111,100,117,99,101,32,97,32,116,101,114,109,32,105,100,101,110,116,105,99,97,108,32,116,111,32,116,104,101,32,101,110,99,111,100,101,100,32,116,101,114,109,32,101,118,101,110,32,119,104,101,110,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,47,111,114,32,91,99,114,101,97,116,105,111,110,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,41,10,32,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,104,97,118,101,32,99,104,97,110,103,101,100,32,98,101,116,119,101,101,110,32,101,110,99,111,100,105,110,103,32,97,110,100,32,100,101,99,111,100,105,110,103,46,10,32,32,87,104,101,110,32,101,110,99,111,100,105,110,103,32,119,105,116,104,111,117,116,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,108,111,99,97,108,32,105,100,101,110,116,105,102,105,101,114,115,32,115,117,99,104,32,97,115,32,91,112,105,100,115,93,40,96,116,58,112,105,100,47,48,96,41,44,10,32,32,91,112,111,114,116,115,93,40,96,116,58,112,111,114,116,47,48,96,41,32,97,110,100,32,91,114,101,102,101,114,101,110,99,101,115,93,40,96,116,58,114,101,102,101,114,101,110,99,101,47,48,96,41,32,119,105,108,108,32,110,111,116,32,98,101,32,116,104,101,32,115,97,109,101,32,105,102,32,110,111,100,101,10,32,32,110,97,109,101,32,97,110,100,47,111,114,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,104,97,110,103,101,100,32,98,101,116,119,101,101,110,32,101,110,99,111,100,105,110,103,10,32,32,97,110,100,32,100,101,99,111,100,105,110,103,46,32,84,104,105,115,32,115,105,110,99,101,32,115,117,99,104,32,105,100,101,110,116,105,102,105,101,114,115,32,114,101,102,101,114,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,110,111,100,101,32,98,121,32,110,111,100,101,32,110,97,109,101,10,32,32,97,110,100,32,99,114,101,97,116,105,111,110,46,10,10,32,32,78,111,100,101,32,110,97,109,101,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,104,97,110,103,101,32,119,104,101,110,32,116,104,101,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,32,111,114,32,115,116,111,112,112,101,100,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32,116,104,101,32,91,96,45,110,97,109,101,96,93,40,101,114,108,95,99,109,100,46,109,100,35,110,97,109,101,41,32,111,114,10,32,32,91,96,45,115,110,97,109,101,96,93,40,101,114,108,95,99,109,100,46,109,100,35,115,110,97,109,101,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,97,99,116,117,97,108,10,32,32,115,116,97,114,116,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,104,97,112,112,101,110,115,32,97,102,116,101,114,32,111,116,104,101,114,32,99,111,100,101,32,105,110,32,116,104,101,32,115,116,97,114,116,117,112,32,112,104,97,115,101,32,104,97,115,10,32,32,98,101,103,117,110,32,101,120,101,99,117,116,105,110,103,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,116,97,114,116,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,96,110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,50,96,32,97,110,100,32,115,116,111,112,112,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,49,96,93,40,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48,96,41,32,105,102,32,105,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,97,114,116,101,100,32,118,105,97,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,46,10,10,32,32,84,104,101,32,100,101,99,111,100,105,110,103,32,111,102,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,119,105,116,104,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,117,115,105,110,103,32,102,111,114,32,101,120,97,109,112,108,101,10,32,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,41,44,32,119,105,108,108,32,116,114,121,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,116,101,114,109,10,32,32,97,99,116,117,97,108,108,121,32,119,97,115,32,101,110,99,111,100,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,44,32,97,110,100,32,119,105,108,108,32,105,110,32,116,104,101,32,118,97,115,116,10,32,32,109,97,106,111,114,105,116,121,32,111,102,32,99,97,115,101,115,32,102,97,105,108,32,105,102,32,116,104,101,32,101,110,99,111,100,105,110,103,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,98,121,32,97,110,111,116,104,101,114,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,105,110,115,116,97,110,99,101,46,32,89,111,117,32,115,104,111,117,108,100,32,104,111,119,101,118,101,114,32,95,110,111,116,95,32,116,114,117,115,116,32,116,104,97,116,32,116,104,105,115,32,118,101,114,105,102,105,99,97,116,105,111,110,32,119,105,108,108,32,119,111,114,107,32,105,110,10,32,32,97,108,108,32,99,97,115,101,115,46,32,89,111,117,32,95,115,104,111,117,108,100,95,32,109,97,107,101,32,115,117,114,101,32,116,111,32,95,111,110,108,121,95,32,100,101,99,111,100,101,32,116,101,114,109,115,32,101,110,99,111,100,101,100,32,119,105,116,104,32,116,104,101,10,32,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,115,32,116,104,101,32,111,110,101,32,116,104,97,116,10,32,32,101,110,99,111,100,101,100,32,116,104,101,32,116,101,114,109,115,46,10,10,32,32,83,105,110,99,101,32,105,116,32,105,115,32,111,110,108,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,104,97,116,32,101,110,99,111,100,101,100,32,97,32,116,101,114,109,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,10,32,32,111,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,100,101,99,111,100,101,32,105,116,44,32,116,104,101,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,105,115,32,116,121,112,105,99,97,108,108,121,32,112,105,101,99,101,100,32,116,111,103,101,116,104,101,114,10,32,32,119,105,116,104,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,111,32,112,114,111,100,117,99,101,32,97,32,114,101,112,108,121,32,116,111,32,119,104,101,114,101,32,116,104,101,32,96,108,111,99,97,108,96,32,101,110,99,111,100,105,110,103,10,32,32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,46,32,73,102,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,32,105,116,115,10,32,32,108,101,97,100,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,44,32,105,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,116,101,114,109,32,40,102,111,114,32,101,120,97,109,112,108,101,10,32,32,97,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32,97,32,116,117,112,108,101,41,32,119,104,101,110,32,101,110,99,111,100,105,110,103,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,117,115,105,110,103,44,32,102,111,114,10,32,32,101,120,97,109,112,108,101,44,32,91,101,105,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,96,41,46,32,73,110,32,116,104,101,32,96,101,105,96,32,99,97,115,101,44,32,121,111,117,32,119,111,117,108,100,32,115,116,114,105,112,32,105,116,10,32,32,111,102,32,116,104,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,117,115,105,110,103,10,32,32,91,96,101,105,95,100,101,99,111,100,101,95,118,101,114,115,105,111,110,40,41,96,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,35,101,105,95,100,101,99,111,100,101,95,118,101,114,115,105,111,110,96,41,32,97,110,100,32,116,104,101,110,10,32,32,97,100,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,116,111,32,119,104,97,116,32,121,111,117,32,97,114,101,32,101,110,99,111,100,105,110,103,32,117,115,105,110,103,32,102,111,114,32,101,120,97,109,112,108,101,10,32,32,91,96,101,105,95,120,95,97,112,112,101,110,100,95,98,117,102,40,41,96,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,35,101,105,95,120,95,97,112,112,101,110,100,95,98,117,102,96,41,46,10,10,32,32,65,32,103,111,111,100,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,105,115,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,109,97,107,101,32,97,32,114,101,113,117,101,115,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,116,111,32,97,32,112,111,114,116,32,91,100,114,105,118,101,114,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,41,32,97,110,100,32,117,116,105,108,105,122,101,10,32,32,116,104,101,10,32,32,91,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,102,102,95,103,117,105,100,101,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,45,109,101,115,115,97,103,101,115,96,41,10,32,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,116,104,101,32,114,101,112,108,121,46,32,73,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,121,111,117,32,119,97,110,116,32,116,111,32,99,114,101,97,116,101,32,97,32,114,101,102,101,114,101,110,99,101,44,10,32,32,115,101,114,105,97,108,105,122,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,10,32,32,112,97,115,115,32,116,104,105,115,32,116,111,32,116,104,101,32,100,114,105,118,101,114,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,44,32,97,110,100,32,116,104,101,110,32,119,97,105,116,32,102,111,114,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,110,10,32,32,97,32,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,109,97,116,99,104,105,110,103,32,111,110,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,84,104,101,32,100,114,105,118,101,114,32,115,104,111,117,108,100,32,115,101,110,100,32,116,104,101,10,32,32,114,101,112,108,121,32,117,115,105,110,103,32,101,105,116,104,101,114,10,32,32,91,96,101,114,108,95,100,114,118,95,111,117,116,112,117,116,95,116,101,114,109,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,111,117,116,112,117,116,95,116,101,114,109,41,32,111,114,10,32,32,91,96,101,114,108,95,100,114,118,95,115,101,110,100,95,116,101,114,109,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,115,101,110,100,95,116,101,114,109,41,32,117,115,105,110,103,32,116,104,101,32,116,101,114,109,32,116,121,112,101,10,32,32,91,96,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,41,32,102,111,114,32,116,104,101,44,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,44,10,32,32,112,114,101,118,105,111,117,115,108,121,32,114,101,99,101,105,118,101,100,32,114,101,102,101,114,101,110,99,101,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,78,111,116,101,32,116,104,97,116,32,121,111,117,10,32,32,115,104,111,117,108,100,32,110,111,116,32,115,116,114,105,112,32,116,104,101,32,108,101,97,100,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,119,104,101,110,32,117,115,105,110,103,10,32,32,116,104,101,32,116,101,114,109,32,116,121,112,101,32,96,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,96,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,97,108,105,116,121,46,32,73,102,32,121,111,117,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,10,32,32,100,111,32,110,111,116,32,101,110,99,111,100,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,97,110,100,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,10,32,32,115,116,97,114,116,101,100,32,111,114,32,115,116,111,112,112,101,100,32,119,104,105,108,101,32,116,104,101,32,114,101,113,117,101,115,116,32,105,115,32,111,110,103,111,105,110,103,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,97,100,101,32,116,104,101,10,32,32,114,101,113,117,101,115,116,32,119,105,108,108,32,104,97,110,103,32,105,110,100,101,102,105,110,105,116,101,108,121,32,115,105,110,99,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,10,32,32,110,101,118,101,114,32,109,97,116,99,104,46,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,96,100,101,116,101,114,109,105,110,105,115,116,105,99,96,32,111,112,116,105,111,110,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,91,96,76,79,67,65,76,95,69,88,84,96,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,35,108,111,99,97,108,95,101,120,116,41,32,116,97,103,32,105,110,10,32,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,83,101,101,32,97,108,115,111,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,46>>},#{group => terms,specification => [{attribute,{9443,2},spec,{{term_to_binary,2},[{type,{9443,21},bounded_fun,[{type,{9443,21},'fun',[{type,{9443,21},product,[{var,{9443,22},'Term'},{var,{9443,28},'Options'}]},{user_type,{9443,40},ext_binary,[]}]},[{type,{9444,7},constraint,[{atom,{9444,7},is_subtype},[{var,{9444,7},'Term'},{type,{9444,15},term,[]}]]},{type,{9445,7},constraint,[{atom,{9445,7},is_subtype},[{var,{9445,7},'Options'},{type,{9445,18},list,[{type,{9445,19},union,[{atom,{9445,19},compressed},{type,{9446,10},tuple,[{atom,{9446,11},compressed},{ann_type,{9446,23},[{var,{9446,23},'Level'},{type,{9446,32},range,[{integer,{9446,32},0},{integer,{9446,35},9}]}]}]},{atom,{9447,10},deterministic},{type,{9448,10},tuple,[{atom,{9448,11},minor_version},{ann_type,{9448,26},[{var,{9448,26},'Version'},{type,{9448,37},range,[{integer,{9448,37},0},{integer,{9448,40},2}]}]}]},{atom,{9449,10},local}]}]}]]}]]}]}}]}},{{function,term_to_binary,1},{9287,2},[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,10,116,104,101,32,91,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,41,10,10,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,112,117,114,112,111,115,101,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,119,114,105,116,105,110,103,32,97,32,116,101,114,109,32,116,111,32,97,32,102,105,108,101,32,105,110,10,97,110,32,101,102,102,105,99,105,101,110,116,32,119,97,121,44,32,111,114,32,115,101,110,100,105,110,103,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,111,32,115,111,109,101,32,116,121,112,101,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,115,10,99,104,97,110,110,101,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111,10,96,96,96,10,10,83,101,101,32,97,108,115,111,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46>>},#{group => terms,specification => [{attribute,{9310,2},spec,{{term_to_binary,1},[{type,{9310,21},bounded_fun,[{type,{9310,21},'fun',[{type,{9310,21},product,[{var,{9310,22},'Term'}]},{user_type,{9310,31},ext_binary,[]}]},[{type,{9311,7},constraint,[{atom,{9311,7},is_subtype},[{var,{9311,7},'Term'},{type,{9311,15},term,[]}]]}]]}]}}]}},{{function,system_flag,2},{8762,2},[<<115,121,115,116,101,109,95,102,108,97,103,40,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,97,32,115,121,115,116,101,109,32,102,108,97,103,32,116,111,32,116,104,101,32,103,105,118,101,110,32,118,97,108,117,101,46,10,10,84,104,101,32,112,111,115,115,105,98,108,101,32,102,108,97,103,115,32,116,111,32,115,101,116,32,97,114,101,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,98,97,99,107,116,114,97,99,101,95,100,101,112,116,104,115,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,32,83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,105,110,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,101,108,101,109,101,110,116,32,111,102,10,32,32,96,39,69,88,73,84,39,96,32,116,117,112,108,101,115,46,32,84,104,101,32,102,108,97,103,32,97,108,115,111,32,108,105,109,105,116,115,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,32,105,116,101,109,32,91,96,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,41,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,99,112,117,95,116,111,112,111,108,111,103,121,44,32,99,112,117,95,116,111,112,111,108,111,103,121,40,41,41,32,45,62,32,99,112,117,95,116,111,112,111,108,111,103,121,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,99,112,117,95,116,111,112,111,108,111,103,121,32,125,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,95,84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,10,32,32,62,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,32,32,62,10,32,32,62,32,87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,67,80,85,32,116,111,112,111,108,111,103,121,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,10,32,32,62,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46,10,10,32,32,83,101,116,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,96,67,112,117,84,111,112,111,108,111,103,121,96,46,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,118,101,114,114,105,100,101,115,32,97,110,121,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,46,32,66,121,32,112,97,115,115,105,110,103,32,96,117,110,100,101,102,105,110,101,100,96,32,97,115,32,96,67,112,117,84,111,112,111,108,111,103,121,96,44,10,32,32,116,104,101,32,115,121,115,116,101,109,32,114,101,118,101,114,116,115,32,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,10,32,32,118,97,108,117,101,32,101,113,117,97,108,115,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41,96,32,98,101,102,111,114,101,10,32,32,116,104,101,32,99,104,97,110,103,101,32,119,97,115,32,109,97,100,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,73,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,108,114,101,97,100,121,32,98,111,117,110,100,32,119,104,101,110,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,99,104,97,110,103,101,100,44,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,10,32,32,97,114,101,32,115,101,110,116,32,97,32,114,101,113,117,101,115,116,32,116,111,32,114,101,98,105,110,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,110,101,119,32,67,80,85,32,116,111,112,111,108,111,103,121,46,10,10,32,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,121,112,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,97,110,100,32,109,111,114,101,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,41,32,97,115,10,32,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,97,110,100,10,32,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,112,111,115,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,112,111,115,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,10,32,32,96,49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78,96,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,115,32,111,102,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,32,97,110,100,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,10,32,32,111,110,108,105,110,101,32,99,104,97,110,103,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,10,32,32,111,110,108,105,110,101,44,32,97,110,100,32,91,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,55,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,101,114,116,115,95,97,108,108,111,99,44,32,123,65,108,108,111,99,32,58,58,32,97,116,111,109,40,41,44,32,70,32,58,58,32,97,116,111,109,40,41,44,32,86,32,58,58,32,105,110,116,101,103,101,114,40,41,125,41,32,45,62,10,32,32,32,32,111,107,32,124,32,110,111,116,115,117,112,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,115,32,102,111,114,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,46,32,96,65,108,108,111,99,96,32,105,115,32,116,104,101,32,97,108,108,111,99,97,116,111,114,10,32,32,116,111,32,97,102,102,101,99,116,44,32,102,111,114,32,101,120,97,109,112,108,101,32,96,98,105,110,97,114,121,95,97,108,108,111,99,96,46,32,96,70,96,32,105,115,32,116,104,101,32,102,108,97,103,32,116,111,32,99,104,97,110,103,101,32,97,110,100,32,96,86,96,32,105,115,32,116,104,101,10,32,32,110,101,119,32,118,97,108,117,101,46,10,10,32,32,79,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,97,108,108,32,96,101,114,116,115,95,97,108,108,111,99,96,32,102,108,97,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,32,116,105,109,101,46,32,84,104,105,115,32,115,117,98,115,101,116,10,32,32,105,115,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,116,104,101,32,102,108,97,103,32,91,96,115,98,99,116,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,77,95,115,98,99,116,41,46,10,10,32,32,82,101,116,117,114,110,115,32,96,111,107,96,32,105,102,32,116,104,101,32,102,108,97,103,32,119,97,115,32,115,101,116,32,111,114,32,96,110,111,116,115,117,112,96,32,105,102,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,96,101,114,116,115,95,97,108,108,111,99,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,50,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,46,32,96,78,117,109,98,101,114,96,32,105,115,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,10,32,32,105,110,100,105,99,97,116,105,110,103,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,100,111,110,101,32,119,105,116,104,111,117,116,10,32,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,32,99,111,108,108,101,99,116,105,111,110,46,32,84,104,101,32,118,97,108,117,101,32,97,112,112,108,105,101,115,32,116,111,32,110,101,119,32,112,114,111,99,101,115,115,101,115,44,32,119,104,105,108,101,10,32,32,112,114,111,99,101,115,115,101,115,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,73,110,32,108,111,119,45,109,101,109,111,114,121,32,115,121,115,116,101,109,115,32,40,101,115,112,101,99,105,97,108,108,121,32,119,105,116,104,111,117,116,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,41,44,32,115,101,116,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,116,111,10,32,32,96,48,96,32,99,97,110,32,104,101,108,112,32,116,111,32,99,111,110,115,101,114,118,101,32,109,101,109,111,114,121,46,10,10,32,32,84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,116,104,114,111,117,103,104,32,40,79,83,41,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,10,32,32,96,69,82,76,95,70,85,76,76,83,87,69,69,80,95,65,70,84,69,82,96,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,44,32,116,114,117,101,32,124,32,102,97,108,115,101,32,124,32,114,101,115,101,116,41,32,45,62,32,98,111,111,108,101,97,110,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,32,125,10,10,32,32,84,117,114,110,115,32,111,110,47,111,102,102,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,109,101,97,115,117,114,101,109,101,110,116,115,46,32,87,104,101,110,32,112,97,115,115,105,110,103,32,114,101,115,101,116,44,32,97,108,108,10,32,32,99,111,117,110,116,101,114,115,32,97,114,101,32,114,101,115,101,116,32,116,111,32,48,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,10,32,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,10,32,32,111,102,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,10,32,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32,96,115,112,97,119,110,95,111,112,116,47,52,96,32,111,114,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,10,32,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,105,110,95,98,105,110,95,118,104,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,10,32,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,32,99,97,110,10,32,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,111,114,10,32,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,41,32,45,62,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,10,32,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,10,32,32,99,104,97,110,103,101,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,10,32,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,111,114,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,70,111,114,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,101,32,104,101,97,112,32,103,114,111,119,115,44,32,115,101,101,10,32,32,91,83,105,122,105,110,103,32,116,104,101,32,104,101,97,112,93,40,71,97,114,98,97,103,101,67,111,108,108,101,99,116,105,111,110,46,109,100,35,115,105,122,105,110,103,45,116,104,101,45,104,101,97,112,41,32,105,110,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,32,45,62,32,79,108,100,66,108,111,99,107,83,116,97,116,101,32,119,104,101,110,10,32,32,32,32,66,108,111,99,107,83,116,97,116,101,32,58,58,32,98,108,111,99,107,32,124,32,117,110,98,108,111,99,107,32,124,32,98,108,111,99,107,95,110,111,114,109,97,108,32,124,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108,44,10,32,32,32,32,79,108,100,66,108,111,99,107,83,116,97,116,101,32,58,58,32,98,108,111,99,107,101,100,32,124,32,100,105,115,97,98,108,101,100,32,124,32,101,110,97,98,108,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,32,125,10,10,32,32,73,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,46,32,77,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,99,97,110,32,98,101,32,98,108,111,99,107,101,100,32,105,110,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,69,105,116,104,101,114,32,97,108,108,10,32,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,44,32,111,114,32,97,108,108,32,95,110,111,114,109,97,108,95,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,46,10,32,32,87,104,101,110,32,111,110,108,121,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,108,111,99,107,101,100,44,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,102,114,101,101,32,116,111,32,99,111,110,116,105,110,117,101,10,32,32,116,111,32,115,99,104,101,100,117,108,101,32,112,114,111,99,101,115,115,101,115,46,10,10,32,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,96,44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,101,32,97,110,100,32,111,110,108,121,10,32,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,46,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,96,32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,10,32,32,98,108,111,99,107,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46,10,10,32,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,95,110,111,114,109,97,108,96,44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,10,32,32,111,110,108,121,32,111,110,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,98,117,116,32,109,117,108,116,105,112,108,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,10,32,32,101,120,101,99,117,116,101,46,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108,96,32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46,10,10,32,32,79,110,101,32,112,114,111,99,101,115,115,32,99,97,110,32,98,108,111,99,107,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,109,117,108,116,105,112,108,101,10,32,32,116,105,109,101,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,44,32,105,116,32,109,117,115,116,32,117,110,98,108,111,99,107,32,101,120,97,99,116,108,121,32,97,115,32,109,97,110,121,10,32,32,116,105,109,101,115,32,97,115,32,105,116,32,104,97,115,32,98,108,111,99,107,101,100,32,98,101,102,111,114,101,32,105,116,32,104,97,115,32,114,101,108,101,97,115,101,100,32,105,116,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,98,108,111,99,107,46,32,73,102,32,97,10,32,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,111,114,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,101,120,105,116,115,44,32,105,116,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,108,101,97,115,101,115,32,105,116,115,32,98,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32,96,100,105,115,97,98,108,101,100,96,44,32,96,98,108,111,99,107,101,100,96,44,32,96,98,108,111,99,107,101,100,95,110,111,114,109,97,108,96,44,32,111,114,32,96,101,110,97,98,108,101,100,96,46,32,84,104,101,10,32,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,115,116,97,116,101,32,106,117,115,116,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,70,111,114,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,110,111,114,109,97,108,108,121,32,110,111,116,10,32,32,62,32,110,101,101,100,101,100,46,32,73,102,32,121,111,117,32,102,101,101,108,32,116,104,97,116,32,121,111,117,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,101,115,101,32,102,101,97,116,117,114,101,115,44,32,99,111,110,115,105,100,101,114,32,105,116,32,97,32,102,101,119,10,32,32,62,32,109,111,114,101,32,116,105,109,101,115,32,97,103,97,105,110,46,32,66,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,97,115,32,97,32,108,97,115,116,10,32,32,62,32,114,101,115,111,114,116,44,32,97,115,32,105,116,32,105,115,32,109,111,115,116,32,108,105,107,101,108,121,32,97,32,95,118,101,114,121,32,105,110,101,102,102,105,99,105,101,110,116,95,32,119,97,121,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,114,111,98,108,101,109,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,44,32,49,46,46,49,51,52,50,49,55,55,50,55,41,32,45,62,32,49,46,46,49,51,52,50,49,55,55,50,55,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,32,125,10,10,32,32,83,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,109,97,100,101,32,98,121,32,97,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,10,32,32,111,114,99,104,101,115,116,114,97,116,105,110,103,32,115,121,115,116,101,109,32,119,105,100,101,32,99,104,97,110,103,101,115,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,114,101,32,97,114,101,32,116,119,111,32,115,117,99,104,32,112,114,111,99,101,115,115,101,115,58,10,10,32,32,45,32,42,42,84,104,101,32,67,111,100,101,32,80,117,114,103,101,114,42,42,32,45,32,84,104,101,32,99,111,100,101,32,112,117,114,103,101,114,32,111,114,99,104,101,115,116,114,97,116,101,115,32,99,104,101,99,107,105,110,103,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,10,32,32,32,32,111,108,100,32,99,111,100,101,32,98,101,102,111,114,101,32,111,108,100,32,99,111,100,101,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,45,32,42,42,84,104,101,32,76,105,116,101,114,97,108,32,65,114,101,97,32,67,111,108,108,101,99,116,111,114,42,42,32,45,32,84,104,101,32,108,105,116,101,114,97,108,32,97,114,101,97,32,99,111,108,108,101,99,116,111,114,32,111,114,99,104,101,115,116,114,97,116,101,115,10,32,32,32,32,99,111,112,121,105,110,103,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,102,114,111,109,32,111,108,100,32,108,105,116,101,114,97,108,32,97,114,101,97,115,32,98,101,102,111,114,101,32,114,101,109,111,118,97,108,32,111,102,32,115,117,99,104,32,97,114,101,97,115,32,102,114,111,109,10,32,32,32,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,69,97,99,104,32,111,102,32,116,104,101,115,101,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,97,115,32,116,104,105,115,10,32,32,108,105,109,105,116,32,105,115,32,115,101,116,32,116,111,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,105,115,32,108,105,109,105,116,32,105,115,32,115,101,116,32,116,111,32,116,119,105,99,101,32,116,104,101,32,97,109,111,117,110,116,32,111,102,10,32,32,91,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,101,110,115,117,114,101,10,32,32,116,104,97,116,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,101,110,111,117,103,104,32,119,111,114,107,32,115,99,104,101,100,117,108,101,100,32,116,111,32,112,101,114,102,111,114,109,32,116,104,101,115,101,32,111,112,101,114,97,116,105,111,110,115,32,97,115,10,32,32,113,117,105,99,107,108,121,32,97,115,32,112,111,115,115,105,98,108,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,111,116,104,101,114,32,119,111,114,107,32,119,105,108,108,32,98,101,32,105,110,116,101,114,108,101,97,118,101,100,32,119,105,116,104,32,116,104,105,115,10,32,32,119,111,114,107,46,32,67,117,114,114,101,110,116,108,121,32,117,115,101,100,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,104,101,99,107,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,41,46,10,10,32,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,122,111,115,114,108,32,60,76,105,109,105,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,122,111,115,114,108,41,32,116,111,32,96,101,114,108,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,52,46,50,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,32,124,32,100,101,102,97,117,108,116,95,98,105,110,100,41,32,45,62,10,32,32,32,32,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,32,125,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,95,84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,10,32,32,62,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,87,104,101,110,10,32,32,62,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,10,32,32,62,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46,10,10,32,32,67,111,110,116,114,111,108,115,32,105,102,32,97,110,100,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,87,104,101,110,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,72,111,119,41,96,32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,10,32,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,44,32,99,97,117,115,105,110,103,32,116,104,101,109,32,116,111,32,116,114,121,32,116,111,32,98,105,110,100,32,111,114,32,117,110,98,105,110,100,10,32,32,97,115,32,114,101,113,117,101,115,116,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,102,97,105,108,115,32,116,111,32,98,105,110,100,44,32,116,104,105,115,32,105,115,32,111,102,116,101,110,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,44,32,97,115,32,105,116,32,105,115,32,110,111,116,10,32,32,62,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,32,116,111,32,118,101,114,105,102,121,32,118,97,108,105,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,46,32,73,102,32,97,110,32,101,114,114,111,114,32,105,115,10,32,32,62,32,114,101,112,111,114,116,101,100,44,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,105,115,32,108,111,103,103,101,100,46,32,84,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,111,117,110,100,10,32,32,62,32,97,115,32,114,101,113,117,101,115,116,101,100,44,32,99,97,108,108,10,32,32,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,46,10,10,32,32,83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,111,110,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,44,10,32,32,98,117,116,32,109,111,114,101,32,115,121,115,116,101,109,115,32,119,105,108,108,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46,10,10,32,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,98,101,32,97,98,108,101,32,116,111,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,10,32,32,109,117,115,116,32,98,101,32,107,110,111,119,110,46,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,102,97,105,108,115,32,116,111,32,100,101,116,101,99,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,105,116,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,67,80,85,10,32,32,116,111,112,111,108,111,103,121,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,10,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,32,98,121,32,100,101,102,97,117,108,116,32,95,110,111,116,95,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,102,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,116,104,101,32,111,110,108,121,32,79,83,32,112,114,111,99,101,115,115,32,98,105,110,100,105,110,103,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,10,32,32,62,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,105,109,112,114,111,118,101,115,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,111,119,101,118,101,114,44,32,105,102,10,32,32,62,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,101,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,110,111,116,104,101,114,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,108,115,111,32,98,105,110,100,10,32,32,62,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,105,110,115,116,101,97,100,46,10,32,32,62,32,83,111,109,101,116,105,109,101,115,32,116,104,105,115,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,99,97,110,32,98,101,32,115,101,118,101,114,101,46,32,73,102,32,115,111,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,10,32,32,62,32,110,111,116,32,98,105,110,100,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,105,110,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,65,114,103,117,109,101,110,116,32,96,72,111,119,96,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,97,110,100,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,42,42,96,117,110,98,111,117,110,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,10,32,32,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,110,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,10,32,32,32,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,116,104,114,101,97,100,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,116,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,10,32,32,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,110,111,100,101,95,116,104,114,101,97,100,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,110,110,116,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,110,110,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,116,104,114,101,97,100,95,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,116,110,110,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,100,101,102,97,117,108,116,95,98,105,110,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,100,98,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32,96,72,111,119,96,32,98,101,102,111,114,101,32,102,108,97,103,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,32,119,97,115,32,99,104,97,110,103,101,100,46,10,10,32,32,70,97,105,108,117,114,101,115,58,10,10,32,32,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,98,105,110,100,105,110,103,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,10,10,32,32,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,72,111,119,96,32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,46,10,10,32,32,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,46,10,10,32,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,44,10,32,32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,97,110,100,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,98,111,111,108,101,97,110,40,41,41,32,45,62,32,98,111,111,108,101,97,110,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,32,125,10,10,32,32,84,114,121,32,101,110,97,98,108,101,32,111,114,32,100,105,115,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,98,121,32,112,97,115,115,105,110,103,32,96,66,111,111,108,101,97,110,96,32,97,115,10,32,32,101,105,116,104,101,114,32,96,116,114,117,101,96,32,111,114,32,96,102,97,108,115,101,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,111,32,117,115,101,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,44,32,115,101,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,10,32,32,83,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,104,97,115,32,97,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,46,32,73,116,32,105,115,32,101,105,116,104,101,114,32,101,110,97,98,108,101,100,10,32,32,102,111,114,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,111,110,32,116,104,101,32,110,111,100,101,32,111,114,32,100,105,115,97,98,108,101,100,32,102,111,114,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46,32,69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,10,32,32,108,111,103,105,99,97,108,32,99,111,117,110,116,101,114,32,105,110,105,116,105,97,108,105,122,101,100,32,97,115,32,122,101,114,111,46,32,65,32,99,97,108,108,32,119,105,116,104,32,96,66,111,111,108,101,97,110,96,32,97,115,32,96,116,114,117,101,96,32,119,105,108,108,10,32,32,105,110,99,114,101,97,115,101,32,116,104,97,116,32,99,111,117,110,116,101,114,32,111,110,101,32,115,116,101,112,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,65,32,99,97,108,108,32,119,105,116,104,32,96,102,97,108,115,101,96,32,119,105,108,108,10,32,32,100,101,99,114,101,97,115,101,32,105,116,32,111,110,101,32,115,116,101,112,32,117,110,108,101,115,115,32,105,116,32,97,108,114,101,97,100,121,32,105,115,32,122,101,114,111,46,32,84,104,101,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,32,102,111,114,10,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,119,105,108,108,32,98,101,32,101,110,97,98,108,101,100,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,114,101,32,105,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,112,114,111,99,101,115,115,10,32,32,97,108,105,118,101,32,119,105,116,104,32,97,32,99,111,117,110,116,101,114,32,118,97,108,117,101,32,108,97,114,103,101,114,32,116,104,97,110,32,122,101,114,111,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,44,32,105,116,115,10,32,32,99,111,117,110,116,101,114,32,119,105,108,108,32,97,108,115,111,32,100,105,115,97,112,112,101,97,114,46,32,84,111,32,101,110,115,117,114,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,107,101,112,116,32,101,110,97,98,108,101,100,44,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,101,110,97,98,108,101,100,32,105,116,32,109,117,115,116,32,116,104,101,114,101,102,111,114,101,32,98,101,32,107,101,112,116,32,97,108,105,118,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,44,32,96,116,114,117,101,96,32,105,102,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,10,32,32,109,101,97,115,117,114,101,109,101,110,116,115,32,119,101,114,101,32,101,110,97,98,108,101,100,44,32,96,102,97,108,115,101,96,32,105,102,32,105,116,32,119,101,114,101,32,100,105,115,97,98,108,101,100,46,10,10,32,32,83,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,100,111,32,99,111,110,115,117,109,101,32,115,111,109,101,32,99,112,117,32,111,118,101,114,104,101,97,100,32,97,110,100,32,115,104,111,117,108,100,32,110,111,116,32,98,101,10,32,32,108,101,102,116,32,116,117,114,110,101,100,32,111,110,32,117,110,108,101,115,115,32,117,115,101,100,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,112,111,115,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,112,111,115,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,73,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,32,115,117,112,112,111,114,116,32,102,111,114,10,32,32,91,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,44,32,99,104,97,110,103,105,110,103,10,32,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,97,108,115,111,32,99,104,97,110,103,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,10,32,32,111,110,108,105,110,101,44,32,97,110,100,32,91,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,32,108,111,103,103,101,114,32,124,32,117,110,100,101,102,105,110,101,100,32,124,32,112,105,100,40,41,41,32,45,62,32,108,111,103,103,101,114,32,124,32,117,110,100,101,102,105,110,101,100,32,124,32,112,105,100,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,119,105,108,108,32,114,101,99,101,105,118,101,32,116,104,101,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,46,32,73,102,10,32,32,115,101,116,32,116,111,32,96,117,110,100,101,102,105,110,101,100,96,44,32,97,108,108,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,84,104,101,10,32,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,105,110,32,116,104,101,32,102,111,114,109,97,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,108,111,103,44,76,101,118,101,108,44,70,111,114,109,97,116,44,65,114,103,76,105,115,116,44,77,101,116,97,100,97,116,97,125,32,119,104,101,114,101,10,10,32,32,76,101,118,101,108,32,61,32,97,116,111,109,40,41,44,10,32,32,70,111,114,109,97,116,32,61,32,115,116,114,105,110,103,40,41,44,10,32,32,65,114,103,76,105,115,116,32,61,32,108,105,115,116,40,116,101,114,109,40,41,41,44,10,32,32,77,101,116,97,100,97,116,97,32,61,32,35,123,32,112,105,100,32,61,62,32,112,105,100,40,41,44,10,32,32,32,32,32,103,114,111,117,112,95,108,101,97,100,101,114,32,61,62,32,112,105,100,40,41,44,10,32,32,32,32,32,116,105,109,101,32,58,61,32,108,111,103,103,101,114,58,116,105,109,101,115,116,97,109,112,40,41,44,10,32,32,32,32,32,101,114,114,111,114,95,108,111,103,103,101,114,32,58,61,32,35,123,32,101,109,117,108,97,116,111,114,32,58,61,32,116,114,117,101,44,32,116,97,103,32,58,61,32,97,116,111,109,40,41,32,125,10,32,32,96,96,96,10,10,32,32,73,102,32,116,104,101,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,32,112,114,111,99,101,115,115,32,100,105,101,115,44,32,116,104,105,115,32,102,108,97,103,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,96,108,111,103,103,101,114,96,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,97,109,101,100,32,96,108,111,103,103,101,114,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,116,104,101,32,75,69,82,78,69,76,32,96,109,58,108,111,103,103,101,114,96,46,32,66,101,32,99,97,114,101,102,117,108,32,105,102,10,32,32,62,32,121,111,117,32,99,104,97,110,103,101,32,105,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,97,115,32,108,111,103,32,109,101,115,115,97,103,101,115,32,109,97,121,32,98,101,32,108,111,115,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,62,32,105,110,116,101,114,99,101,112,116,32,101,109,117,108,97,116,111,114,32,108,111,103,32,109,101,115,115,97,103,101,115,44,32,100,111,32,105,116,32,98,121,32,97,100,100,105,110,103,32,97,32,115,112,101,99,105,97,108,105,122,101,100,32,104,97,110,100,108,101,114,32,116,111,32,116,104,101,10,32,32,62,32,75,69,82,78,69,76,32,108,111,103,103,101,114,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,49,46,50,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,32,116,111,32,96,84,67,87,96,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,97,110,10,32,32,117,110,115,105,103,110,101,100,32,105,110,116,101,103,101,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,115,101,116,95,116,99,119,96,93,40,109,97,116,99,104,95,115,112,101,99,46,109,100,35,115,101,116,95,116,99,119,41,32,105,110,32,115,101,99,116,105,111,110,32,34,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,34,10,32,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41,32,45,62,32,112,114,101,108,105,109,105,110,97,114,121,32,124,32,102,105,110,97,108,32,124,32,118,111,108,97,116,105,108,101,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116,32,125,10,10,32,32,70,105,110,97,108,105,122,101,115,32,116,104,101,32,91,116,105,109,101,32,111,102,102,115,101,116,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,32,119,104,101,110,10,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,32,73,102,10,32,32,97,110,111,116,104,101,114,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,32,105,115,32,117,115,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,115,116,97,116,101,32,105,115,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,115,116,97,116,101,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,73,102,32,96,112,114,101,108,105,109,105,110,97,114,121,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,105,110,97,108,105,122,97,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,97,110,100,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,10,32,32,32,32,105,115,32,110,111,119,32,102,105,110,97,108,46,10,32,32,45,32,73,102,32,96,102,105,110,97,108,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,116,104,101,32,102,105,110,97,108,32,115,116,97,116,101,46,32,84,104,105,115,10,32,32,32,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,97,110,111,116,104,101,114,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41,96,32,99,97,108,108,32,111,114,10,32,32,32,32,98,101,99,97,117,115,101,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,45,32,73,102,32,96,118,111,108,97,116,105,108,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,110,111,116,32,98,101,32,102,105,110,97,108,105,122,101,100,32,98,101,99,97,117,115,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,48>>},#{group => system,specification => [{attribute,{9222,2},spec,{{system_flag,2},[{type,{9222,18},bounded_fun,[{type,{9222,18},'fun',[{type,{9222,18},product,[{atom,{9222,19},backtrace_depth},{var,{9222,36},'Depth'}]},{var,{9222,46},'OldDepth'}]},[{type,{9223,7},constraint,[{atom,{9223,7},is_subtype},[{var,{9223,7},'Depth'},{type,{9223,16},non_neg_integer,[]}]]},{type,{9224,7},constraint,[{atom,{9224,7},is_subtype},[{var,{9224,7},'OldDepth'},{type,{9224,19},non_neg_integer,[]}]]}]]},{type,{9225,25},bounded_fun,[{type,{9225,25},'fun',[{type,{9225,25},product,[{atom,{9225,26},cpu_topology},{var,{9225,40},'CpuTopology'}]},{var,{9225,56},'OldCpuTopology'}]},[{type,{9226,7},constraint,[{atom,{9226,7},is_subtype},[{var,{9226,7},'CpuTopology'},{user_type,{9226,22},cpu_topology,[]}]]},{type,{9227,7},constraint,[{atom,{9227,7},is_subtype},[{var,{9227,7},'OldCpuTopology'},{user_type,{9227,25},cpu_topology,[]}]]}]]},{type,{9228,25},bounded_fun,[{type,{9228,25},'fun',[{type,{9228,25},product,[{atom,{9228,26},dirty_cpu_schedulers_online},{var,{9228,55},'DirtyCPUSchedulersOnline'}]},{var,{9229,33},'OldDirtyCPUSchedulersOnline'}]},[{type,{9230,7},constraint,[{atom,{9230,7},is_subtype},[{var,{9230,7},'DirtyCPUSchedulersOnline'},{type,{9230,35},pos_integer,[]}]]},{type,{9231,7},constraint,[{atom,{9231,7},is_subtype},[{var,{9231,7},'OldDirtyCPUSchedulersOnline'},{type,{9231,38},pos_integer,[]}]]}]]},{type,{9232,25},bounded_fun,[{type,{9232,25},'fun',[{type,{9232,25},product,[{atom,{9232,26},erts_alloc},{type,{9232,38},tuple,[{var,{9232,39},'Alloc'},{var,{9232,46},'F'},{var,{9232,49},'V'}]}]},{type,{9232,56},union,[{atom,{9232,56},ok},{atom,{9232,61},notsup}]}]},[{type,{9233,7},constraint,[{atom,{9233,7},is_subtype},[{var,{9233,7},'Alloc'},{type,{9233,16},atom,[]}]]},{type,{9234,7},constraint,[{atom,{9234,7},is_subtype},[{var,{9234,7},'F'},{type,{9234,12},atom,[]}]]},{type,{9235,7},constraint,[{atom,{9235,7},is_subtype},[{var,{9235,7},'V'},{type,{9235,12},integer,[]}]]}]]},{type,{9236,25},bounded_fun,[{type,{9236,25},'fun',[{type,{9236,25},product,[{atom,{9236,26},fullsweep_after},{var,{9236,43},'Number'}]},{var,{9236,54},'OldNumber'}]},[{type,{9237,7},constraint,[{atom,{9237,7},is_subtype},[{var,{9237,7},'Number'},{type,{9237,17},non_neg_integer,[]}]]},{type,{9238,7},constraint,[{atom,{9238,7},is_subtype},[{var,{9238,7},'OldNumber'},{type,{9238,20},non_neg_integer,[]}]]}]]},{type,{9239,25},bounded_fun,[{type,{9239,25},'fun',[{type,{9239,25},product,[{atom,{9239,26},microstate_accounting},{var,{9239,49},'Action'}]},{var,{9239,60},'OldState'}]},[{type,{9240,7},constraint,[{atom,{9240,7},is_subtype},[{var,{9240,7},'Action'},{type,{9240,17},union,[{atom,{9240,17},true},{atom,{9240,24},false},{atom,{9240,32},reset}]}]]},{type,{9241,7},constraint,[{atom,{9241,7},is_subtype},[{var,{9241,7},'OldState'},{type,{9241,19},union,[{atom,{9241,19},true},{atom,{9241,26},false}]}]]}]]},{type,{9242,25},bounded_fun,[{type,{9242,25},'fun',[{type,{9242,25},product,[{atom,{9242,26},min_heap_size},{var,{9242,41},'MinHeapSize'}]},{var,{9242,57},'OldMinHeapSize'}]},[{type,{9243,7},constraint,[{atom,{9243,7},is_subtype},[{var,{9243,7},'MinHeapSize'},{type,{9243,22},non_neg_integer,[]}]]},{type,{9244,7},constraint,[{atom,{9244,7},is_subtype},[{var,{9244,7},'OldMinHeapSize'},{type,{9244,25},non_neg_integer,[]}]]}]]},{type,{9245,25},bounded_fun,[{type,{9245,25},'fun',[{type,{9245,25},product,[{atom,{9245,26},min_bin_vheap_size},{var,{9245,46},'MinBinVHeapSize'}]},{var,{9246,33},'OldMinBinVHeapSize'}]},[{type,{9247,7},constraint,[{atom,{9247,7},is_subtype},[{var,{9247,7},'MinBinVHeapSize'},{type,{9247,26},non_neg_integer,[]}]]},{type,{9248,7},constraint,[{atom,{9248,7},is_subtype},[{var,{9248,7},'OldMinBinVHeapSize'},{type,{9248,29},non_neg_integer,[]}]]}]]},{type,{9249,25},bounded_fun,[{type,{9249,25},'fun',[{type,{9249,25},product,[{atom,{9249,26},max_heap_size},{var,{9249,41},'MaxHeapSize'}]},{var,{9249,57},'OldMaxHeapSize'}]},[{type,{9250,7},constraint,[{atom,{9250,7},is_subtype},[{var,{9250,7},'MaxHeapSize'},{user_type,{9250,22},max_heap_size,[]}]]},{type,{9251,7},constraint,[{atom,{9251,7},is_subtype},[{var,{9251,7},'OldMaxHeapSize'},{user_type,{9251,25},max_heap_size,[]}]]}]]},{type,{9252,25},bounded_fun,[{type,{9252,25},'fun',[{type,{9252,25},product,[{atom,{9252,26},multi_scheduling},{var,{9252,44},'BlockState'}]},{var,{9252,59},'OldBlockState'}]},[{type,{9253,7},constraint,[{atom,{9253,7},is_subtype},[{var,{9253,7},'BlockState'},{type,{9253,21},union,[{atom,{9253,21},block},{atom,{9253,29},unblock},{atom,{9253,39},block_normal},{atom,{9253,54},unblock_normal}]}]]},{type,{9254,7},constraint,[{atom,{9254,7},is_subtype},[{var,{9254,7},'OldBlockState'},{type,{9254,24},union,[{atom,{9254,24},blocked},{atom,{9254,34},disabled},{atom,{9254,45},enabled}]}]]}]]},{type,{9255,25},bounded_fun,[{type,{9255,25},'fun',[{type,{9255,25},product,[{atom,{9255,26},outstanding_system_requests_limit},{var,{9255,61},'NewLimit'}]},{var,{9256,11},'OldLimit'}]},[{type,{9257,7},constraint,[{atom,{9257,7},is_subtype},[{var,{9257,7},'NewLimit'},{type,{9257,19},range,[{integer,{9257,19},1},{integer,{9257,22},134217727}]}]]},{type,{9258,7},constraint,[{atom,{9258,7},is_subtype},[{var,{9258,7},'OldLimit'},{type,{9258,19},range,[{integer,{9258,19},1},{integer,{9258,22},134217727}]}]]}]]},{type,{9259,25},bounded_fun,[{type,{9259,25},'fun',[{type,{9259,25},product,[{atom,{9259,26},scheduler_bind_type},{var,{9259,47},'How'}]},{var,{9259,55},'OldBindType'}]},[{type,{9260,7},constraint,[{atom,{9260,7},is_subtype},[{var,{9260,7},'How'},{type,{9260,14},union,[{user_type,{9260,14},scheduler_bind_type,[]},{atom,{9260,38},default_bind}]}]]},{type,{9261,7},constraint,[{atom,{9261,7},is_subtype},[{var,{9261,7},'OldBindType'},{user_type,{9261,22},scheduler_bind_type,[]}]]}]]},{type,{9262,25},bounded_fun,[{type,{9262,25},'fun',[{type,{9262,25},product,[{atom,{9262,26},scheduler_wall_time},{var,{9262,47},'Boolean'}]},{var,{9262,60},'OldBoolean'}]},[{type,{9263,7},constraint,[{atom,{9263,7},is_subtype},[{var,{9263,7},'Boolean'},{type,{9263,18},boolean,[]}]]},{type,{9264,7},constraint,[{atom,{9264,7},is_subtype},[{var,{9264,7},'OldBoolean'},{type,{9264,21},boolean,[]}]]}]]},{type,{9265,25},bounded_fun,[{type,{9265,25},'fun',[{type,{9265,25},product,[{atom,{9265,26},schedulers_online},{var,{9265,45},'SchedulersOnline'}]},{var,{9266,33},'OldSchedulersOnline'}]},[{type,{9267,7},constraint,[{atom,{9267,7},is_subtype},[{var,{9267,7},'SchedulersOnline'},{type,{9267,27},pos_integer,[]}]]},{type,{9268,7},constraint,[{atom,{9268,7},is_subtype},[{var,{9268,7},'OldSchedulersOnline'},{type,{9268,30},pos_integer,[]}]]}]]},{type,{9269,25},bounded_fun,[{type,{9269,25},'fun',[{type,{9269,25},product,[{atom,{9269,26},system_logger},{var,{9269,41},'Logger'}]},{var,{9269,52},'PrevLogger'}]},[{type,{9270,7},constraint,[{atom,{9270,7},is_subtype},[{var,{9270,7},'Logger'},{type,{9270,17},union,[{atom,{9270,17},logger},{atom,{9270,26},undefined},{type,{9270,38},pid,[]}]}]]},{type,{9271,7},constraint,[{atom,{9271,7},is_subtype},[{var,{9271,7},'PrevLogger'},{type,{9271,21},union,[{atom,{9271,21},logger},{atom,{9271,30},undefined},{type,{9271,42},pid,[]}]}]]}]]},{type,{9272,25},bounded_fun,[{type,{9272,25},'fun',[{type,{9272,25},product,[{atom,{9272,26},trace_control_word},{var,{9272,46},'TCW'}]},{var,{9272,54},'OldTCW'}]},[{type,{9273,7},constraint,[{atom,{9273,7},is_subtype},[{var,{9273,7},'TCW'},{type,{9273,14},non_neg_integer,[]}]]},{type,{9274,7},constraint,[{atom,{9274,7},is_subtype},[{var,{9274,7},'OldTCW'},{type,{9274,17},non_neg_integer,[]}]]}]]},{type,{9275,4},bounded_fun,[{type,{9275,4},'fun',[{type,{9275,4},product,[{atom,{9275,5},time_offset},{atom,{9275,18},finalize}]},{var,{9275,31},'OldState'}]},[{type,{9276,7},constraint,[{atom,{9276,7},is_subtype},[{var,{9276,7},'OldState'},{type,{9276,19},union,[{atom,{9276,19},preliminary},{atom,{9276,33},final},{atom,{9276,41},volatile}]}]]}]]},{type,{9278,4},'fun',[{type,{9278,4},product,[{atom,{9278,5},internal_cpu_topology},{type,{9278,28},term,[]}]},{type,{9278,39},term,[]}]},{type,{9279,25},bounded_fun,[{type,{9279,25},'fun',[{type,{9279,25},product,[{atom,{9279,26},sequential_tracer},{var,{9279,45},'Tracer'}]},{type,{9279,56},union,[{var,{9279,56},'PrevTracer'},{atom,{9279,69},false}]}]},[{type,{9280,7},constraint,[{atom,{9280,7},is_subtype},[{var,{9280,7},'Tracer'},{type,{9280,17},union,[{type,{9280,17},pid,[]},{type,{9280,25},port,[]},{type,{9280,34},tuple,[{type,{9280,35},module,[]},{type,{9280,45},term,[]}]},{atom,{9280,55},false}]}]]},{type,{9281,7},constraint,[{atom,{9281,7},is_subtype},[{var,{9281,7},'PrevTracer'},{type,{9281,21},union,[{type,{9281,21},pid,[]},{type,{9281,29},port,[]},{type,{9281,38},tuple,[{type,{9281,39},module,[]},{type,{9281,49},term,[]}]},{atom,{9281,59},false}]}]]}]]},{type,{9282,25},'fun',[{type,{9282,25},product,[{atom,{9282,26},reset_seq_trace},{atom,{9282,42},true}]},{atom,{9282,51},true}]}]}}]}},{{function,subtract,2},{8746,2},[<<115,117,98,116,114,97,99,116,47,50>>],hidden,#{}},{{function,statistics,1},{8127,2},[<<115,116,97,116,105,115,116,105,99,115,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,115,116,97,116,105,115,116,105,99,115,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,10,10,84,104,101,32,112,111,115,115,105,98,108,101,32,102,108,97,103,115,32,97,114,101,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,119,105,116,104,10,32,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,10,32,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,97,115,107,115,32,116,104,97,116,32,97,114,101,10,32,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,32,125,10,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,99,116,105,118,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,10,32,32,112,111,114,116,115,32,111,110,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,97,114,101,32,114,101,97,100,121,32,116,111,32,114,117,110,44,32,111,114,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,114,117,110,110,105,110,103,46,32,86,97,108,117,101,115,32,102,111,114,10,32,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,110,100,32,116,104,101,105,114,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,10,32,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,10,32,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,97,110,32,101,108,101,109,101,110,116,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,10,32,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,32,97,110,100,32,116,104,101,110,32,97,115,32,108,97,115,116,10,32,32,101,108,101,109,101,110,116,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,73,79,10,32,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,10,32,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,10,32,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,10,32,32,62,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,10,32,32,62,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32,95,110,111,116,95,32,109,105,103,114,97,116,101,10,32,32,62,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,10,32,32,62,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,10,32,32,62,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,97,110,100,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,99,111,110,116,101,120,116,95,115,119,105,116,99,104,101,115,41,32,45,62,32,123,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,48,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,99,111,110,116,101,120,116,95,115,119,105,116,99,104,101,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,101,115,32,115,105,110,99,101,32,116,104,101,32,115,121,115,116,101,109,32,115,116,97,114,116,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,120,97,99,116,32,114,101,100,117,99,116,105,111,110,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,91,96,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,96,93,40,96,115,116,97,116,105,115,116,105,99,115,47,49,96,41,32,105,115,32,97,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,111,112,101,114,97,116,105,111,110,10,32,32,62,32,116,104,97,110,32,91,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,32,45,62,10,32,32,32,32,123,32,78,117,109,101,114,79,102,71,67,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,87,111,114,100,115,82,101,99,108,97,105,109,101,100,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,48,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,46,10,32,32,123,56,53,44,50,51,57,54,49,44,48,125,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,102,111,114,32,115,111,109,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,105,111,41,32,45,62,32,123,123,105,110,112,117,116,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,44,32,123,111,117,116,112,117,116,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,96,73,110,112,117,116,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,99,101,105,118,101,100,32,116,104,114,111,117,103,104,32,112,111,114,116,115,44,32,97,110,100,10,32,32,96,79,117,116,112,117,116,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,111,117,116,112,117,116,32,116,111,32,112,111,114,116,115,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,32,45,62,32,91,77,83,65,99,99,95,84,104,114,101,97,100,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,32,125,10,10,32,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,101,97,115,117,114,101,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,115,112,101,110,100,115,32,100,111,105,110,103,32,118,97,114,105,111,117,115,32,116,97,115,107,115,46,32,73,116,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,97,115,32,108,105,103,104,116,119,101,105,103,104,116,32,97,115,10,32,32,112,111,115,115,105,98,108,101,44,32,98,117,116,32,115,111,109,101,32,111,118,101,114,104,101,97,100,32,101,120,105,115,116,115,32,119,104,101,110,32,116,104,105,115,32,105,115,32,101,110,97,98,108,101,100,46,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,10,32,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,97,32,112,114,111,102,105,108,105,110,103,32,116,111,111,108,32,116,111,32,104,101,108,112,32,102,105,110,100,105,110,103,32,112,101,114,102,111,114,109,97,110,99,101,32,98,111,116,116,108,101,110,101,99,107,115,46,32,84,111,10,32,32,96,115,116,97,114,116,96,47,96,115,116,111,112,96,47,96,114,101,115,101,116,96,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,44,32,117,115,101,32,115,121,115,116,101,109,32,102,108,97,103,10,32,32,91,96,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,96,93,40,96,115,116,97,116,105,115,116,105,99,115,47,49,96,41,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,109,97,112,115,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115,111,109,101,32,111,102,32,116,104,101,32,79,83,32,116,104,114,101,97,100,115,32,119,105,116,104,105,110,32,69,82,84,83,46,32,69,97,99,104,32,109,97,112,32,99,111,110,116,97,105,110,115,32,96,116,121,112,101,96,32,97,110,100,10,32,32,96,105,100,96,32,102,105,101,108,100,115,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,119,104,97,116,32,116,104,114,101,97,100,32,105,116,32,105,115,44,32,97,110,100,32,97,108,115,111,32,97,32,99,111,117,110,116,101,114,115,10,32,32,102,105,101,108,100,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,100,97,116,97,32,97,98,111,117,116,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,104,97,115,32,98,101,101,110,32,115,112,101,110,116,32,105,110,32,116,104,101,32,118,97,114,105,111,117,115,10,32,32,115,116,97,116,101,115,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,32,32,91,35,123,99,111,117,110,116,101,114,115,32,61,62,32,35,123,97,117,120,32,61,62,32,49,56,57,57,49,56,50,57,49,52,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,104,101,99,107,95,105,111,32,61,62,32,50,54,48,53,56,54,51,54,48,50,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,109,117,108,97,116,111,114,32,61,62,32,52,53,55,51,49,56,56,48,52,54,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,99,32,61,62,32,49,53,49,50,50,48,54,57,49,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,116,104,101,114,32,61,62,32,53,52,50,49,51,51,56,52,53,54,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,111,114,116,32,61,62,32,50,50,49,54,51,49,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,108,101,101,112,32,61,62,32,53,49,53,48,50,57,52,49,48,48,125,44,10,32,32,32,32,32,105,100,32,61,62,32,49,44,10,32,32,32,32,32,116,121,112,101,32,61,62,32,115,99,104,101,100,117,108,101,114,125,124,46,46,46,93,10,32,32,96,96,96,10,10,32,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48,96,46,32,83,111,44,32,116,111,32,99,111,110,118,101,114,116,32,105,116,10,32,32,116,111,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,121,111,117,32,99,97,110,32,100,111,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,116,104,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,108,105,115,116,115,58,109,97,112,40,10,32,32,32,32,102,117,110,40,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,67,110,116,32,125,32,61,32,77,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,77,115,67,110,116,32,61,32,109,97,112,115,58,109,97,112,40,102,117,110,40,95,75,44,32,80,101,114,102,67,111,117,110,116,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,80,101,114,102,67,111,117,110,116,44,32,112,101,114,102,95,99,111,117,110,116,101,114,44,32,49,48,48,48,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,32,67,110,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,77,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,77,115,67,110,116,32,125,10,32,32,32,32,101,110,100,44,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,41,46,10,32,32,96,96,96,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,118,97,108,117,101,115,32,97,114,101,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,116,104,101,32,101,120,97,99,116,32,116,105,109,101,32,115,112,101,110,116,32,105,110,32,101,97,99,104,10,32,32,115,116,97,116,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,118,97,114,105,111,117,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,100,111,110,101,32,116,111,32,107,101,101,112,32,116,104,101,32,111,118,101,114,104,101,97,100,32,97,115,10,32,32,115,109,97,108,108,32,97,115,32,112,111,115,115,105,98,108,101,46,10,10,32,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,84,121,112,101,96,115,58,10,10,32,32,45,32,42,42,96,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,109,97,105,110,32,101,120,101,99,117,116,105,111,110,32,116,104,114,101,97,100,115,32,116,104,97,116,32,100,111,32,109,111,115,116,32,111,102,32,116,104,101,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,83,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,99,112,117,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,10,32,32,32,32,83,101,101,32,91,101,114,108,32,43,83,68,99,112,117,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,68,99,112,117,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,73,47,79,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,83,68,105,111,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,68,105,111,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,97,115,121,110,99,96,42,42,32,45,32,65,115,121,110,99,32,116,104,114,101,97,100,115,32,97,114,101,32,117,115,101,100,32,98,121,32,118,97,114,105,111,117,115,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,115,32,40,109,97,105,110,108,121,32,116,104,101,10,32,32,32,32,102,105,108,101,32,100,114,105,118,101,114,115,41,32,100,111,32,111,102,102,108,111,97,100,32,110,111,110,45,67,80,85,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,65,93,40,101,114,108,95,99,109,100,46,109,100,35,97,115,121,110,99,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,97,117,120,96,42,42,32,45,32,84,97,107,101,115,32,99,97,114,101,32,111,102,32,97,110,121,32,119,111,114,107,32,116,104,97,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,99,97,108,108,121,32,97,115,115,105,103,110,101,100,32,116,111,32,97,10,32,32,32,32,115,99,104,101,100,117,108,101,114,46,10,10,32,32,45,32,42,42,96,112,111,108,108,96,42,42,32,45,32,68,111,101,115,32,116,104,101,32,73,79,32,112,111,108,108,105,110,103,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,73,79,116,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,73,79,116,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101,96,115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,65,108,108,32,115,116,97,116,101,115,32,97,114,101,32,101,120,99,108,117,115,105,118,101,44,10,32,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,116,104,114,101,97,100,32,99,97,110,110,111,116,32,98,101,32,105,110,32,116,119,111,32,115,116,97,116,101,115,32,97,116,32,111,110,99,101,46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,116,104,101,10,32,32,110,117,109,98,101,114,115,32,111,102,32,97,108,108,32,99,111,117,110,116,101,114,115,32,105,110,32,97,32,116,104,114,101,97,100,44,32,121,111,117,32,103,101,116,32,116,104,101,32,116,111,116,97,108,32,114,117,110,116,105,109,101,32,102,111,114,32,116,104,97,116,32,116,104,114,101,97,100,46,10,10,32,32,45,32,42,42,96,97,117,120,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,104,97,110,100,108,105,110,103,32,97,117,120,105,108,105,97,114,121,32,106,111,98,115,46,10,10,32,32,45,32,42,42,96,99,104,101,99,107,95,105,111,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,99,104,101,99,107,105,110,103,32,102,111,114,32,110,101,119,32,73,47,79,32,101,118,101,110,116,115,46,10,10,32,32,45,32,42,42,96,101,109,117,108,97,116,111,114,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,10,10,32,32,45,32,42,42,96,103,99,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,101,120,116,114,97,32,115,116,97,116,101,115,32,97,114,101,32,101,110,97,98,108,101,100,10,32,32,32,32,116,104,105,115,32,105,115,32,116,104,101,32,116,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,110,111,110,45,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,46,10,10,32,32,45,32,42,42,96,111,116,104,101,114,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,117,110,97,99,99,111,117,110,116,101,100,32,116,104,105,110,103,115,46,10,10,32,32,45,32,42,42,96,112,111,114,116,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,112,111,114,116,115,46,10,10,32,32,45,32,42,42,96,115,108,101,101,112,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,115,108,101,101,112,105,110,103,46,10,10,32,32,77,111,114,101,32,102,105,110,101,45,103,114,97,105,110,101,100,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,104,114,111,117,103,104,32,99,111,110,102,105,103,117,114,101,32,40,115,117,99,104,32,97,115,10,32,32,96,46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,109,105,99,114,111,115,116,97,116,101,45,97,99,99,111,117,110,116,105,110,103,61,101,120,116,114,97,96,41,46,32,69,110,97,98,108,105,110,103,32,116,104,101,115,101,32,115,116,97,116,101,115,32,99,97,117,115,101,115,10,32,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,32,119,104,101,110,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,32,97,110,100,32,105,110,99,114,101,97,115,101,115,10,32,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,104,101,110,32,105,116,32,105,115,32,116,117,114,110,101,100,32,111,110,46,10,10,32,32,45,32,42,42,96,97,108,108,111,99,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,109,101,109,111,114,121,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,115,112,114,101,97,100,32,111,117,116,32,111,118,101,114,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,46,10,10,32,32,45,32,42,42,96,98,105,102,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,98,117,115,121,95,119,97,105,116,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,98,117,115,121,32,119,97,105,116,105,110,103,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,97,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,110,111,32,108,111,110,103,101,114,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,105,115,32,97,99,116,105,118,101,32,119,104,101,110,32,117,115,105,110,103,10,32,32,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,32,32,32,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,32,98,117,116,32,116,104,105,115,32,97,110,100,32,115,108,101,101,112,44,32,97,110,100,32,116,104,101,110,32,100,105,118,105,100,101,32,116,104,97,116,32,98,121,10,32,32,32,32,97,108,108,32,116,105,109,101,32,105,110,32,116,104,101,32,116,104,114,101,97,100,44,32,121,111,117,32,115,104,111,117,108,100,32,103,101,116,32,115,111,109,101,116,104,105,110,103,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,116,104,101,10,32,32,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,102,114,97,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,111,116,104,101,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,101,116,115,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,84,83,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,112,97,114,116,32,111,102,32,116,104,101,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,103,99,95,102,117,108,108,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,10,32,32,32,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,96,103,99,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,110,105,102,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,78,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,115,101,110,100,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,40,112,114,111,99,101,115,115,101,115,32,111,110,108,121,41,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,10,32,32,32,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,116,105,109,101,114,115,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,116,105,109,101,114,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,112,97,114,116,32,111,102,32,116,104,101,32,96,111,116,104,101,114,96,32,115,116,97,116,101,46,10,10,32,32,84,104,101,32,117,116,105,108,105,116,121,32,109,111,100,117,108,101,32,96,109,58,109,115,97,99,99,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,114,101,32,101,97,115,105,108,121,32,97,110,97,108,121,115,101,32,116,104,101,115,101,10,32,32,115,116,97,116,105,115,116,105,99,115,46,10,10,32,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,115,121,115,116,101,109,32,102,108,97,103,10,32,32,91,96,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,32,105,115,10,32,32,116,117,114,110,101,100,32,111,102,102,46,10,10,32,32,84,104,101,32,108,105,115,116,32,111,102,32,116,104,114,101,97,100,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,10,32,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,116,104,114,101,97,100,115,32,97,110,100,32,115,116,97,116,101,115,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,119,105,116,104,111,117,116,32,97,110,121,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,32,45,62,32,123,82,101,100,117,99,116,105,111,110,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,101,100,117,99,116,105,111,110,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,46,10,32,32,123,50,48,52,54,44,49,49,125,10,32,32,96,96,96,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,53,32,40,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,41,44,32,116,104,105,115,32,118,97,108,117,101,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,114,101,100,117,99,116,105,111,110,115,10,32,32,62,32,112,101,114,102,111,114,109,101,100,32,105,110,32,99,117,114,114,101,110,116,32,116,105,109,101,32,115,108,105,99,101,115,32,111,102,32,99,117,114,114,101,110,116,108,121,32,115,99,104,101,100,117,108,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,102,32,97,110,32,101,120,97,99,116,10,32,32,62,32,118,97,108,117,101,32,105,115,32,119,97,110,116,101,100,44,32,117,115,101,10,32,32,62,32,91,96,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,108,101,110,103,116,104,32,111,102,32,97,108,108,32,110,111,114,109,97,108,32,97,110,100,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,97,116,32,105,115,44,32,113,117,101,117,101,100,10,32,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,10,32,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,105,115,10,32,32,109,117,99,104,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,99,111,109,112,97,114,101,100,32,116,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,97,32,108,97,114,103,101,32,97,109,111,117,110,116,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,117,115,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,10,32,32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,105,115,32,112,97,114,116,32,111,102,10,32,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,114,117,110,32,113,117,101,117,101,115,32,119,105,116,104,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,10,32,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,32,125,10,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,10,32,32,114,101,97,100,121,32,116,111,32,114,117,110,32,102,111,114,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,10,32,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,118,97,108,117,101,115,32,102,111,114,10,32,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,102,111,108,108,111,119,32,40,105,110,32,116,104,97,116,32,111,114,100,101,114,41,32,97,116,32,116,104,101,10,32,32,101,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,10,32,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,10,32,32,103,97,116,104,101,114,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,10,32,32,62,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,10,32,32,62,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32,95,110,111,116,95,32,109,105,103,114,97,116,101,10,32,32,62,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,10,32,32,62,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,10,32,32,62,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,44,32,97,110,100,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,117,110,116,105,109,101,44,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,32,32,84,104,105,115,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,102,111,114,32,97,108,108,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,10,32,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,118,97,108,117,101,32,109,105,103,104,116,32,119,114,97,112,32,100,117,101,32,116,111,32,108,105,109,105,116,97,116,105,111,110,115,32,105,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,10,32,32,62,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,104,97,116,32,105,115,32,117,115,101,100,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,46,10,32,32,123,49,54,57,48,44,49,54,50,48,125,10,32,32,96,96,96,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,45,62,10,32,32,32,32,91,123,73,100,32,58,58,32,112,111,115,95,105,110,116,101,103,101,114,44,10,32,32,32,32,32,32,65,99,116,105,118,101,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,10,32,32,32,32,32,32,84,111,116,97,108,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,93,32,124,10,32,32,32,32,117,110,100,101,102,105,110,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,100,101,115,99,114,105,98,105,110,103,32,104,111,119,32,109,117,99,104,32,116,105,109,101,10,32,32,91,110,111,114,109,97,108,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,97,110,100,10,32,32,91,100,105,114,116,121,32,67,80,85,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,115,99,104,101,100,117,108,101,114,115,32,105,110,32,116,104,101,10,32,32,115,121,115,116,101,109,32,104,97,118,101,32,98,101,101,110,32,98,117,115,121,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,114,109,97,108,108,121,32,97,32,98,101,116,116,101,114,32,105,110,100,105,99,97,116,111,114,32,111,102,32,104,111,119,32,109,117,99,104,10,32,32,108,111,97,100,32,97,110,32,69,114,108,97,110,103,32,110,111,100,101,32,105,115,32,117,110,100,101,114,32,105,110,115,116,101,97,100,32,111,102,32,108,111,111,107,105,110,103,32,97,116,32,116,104,101,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,112,114,111,118,105,100,101,100,10,32,32,98,121,32,116,111,111,108,115,32,115,117,99,104,32,97,115,32,96,116,111,112,96,32,111,114,32,96,115,121,115,115,116,97,116,96,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,97,108,115,111,10,32,32,105,110,99,108,117,100,101,115,32,116,105,109,101,32,119,104,101,114,101,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,97,105,116,105,110,103,32,102,111,114,32,115,111,109,101,32,111,116,104,101,114,32,114,101,97,115,111,117,114,99,101,32,40,115,117,99,104,32,97,115,10,32,32,97,110,32,105,110,116,101,114,110,97,108,32,109,117,116,101,120,41,32,116,111,32,98,101,32,97,118,97,105,108,97,98,108,101,32,98,117,116,32,100,111,101,115,32,110,111,116,32,117,115,101,32,116,104,101,32,67,80,85,46,32,73,110,32,111,114,100,101,114,32,116,111,32,98,101,116,116,101,114,10,32,32,117,110,100,101,114,115,116,97,110,100,32,119,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,98,117,115,121,32,100,111,105,110,103,32,121,111,117,32,99,97,110,32,117,115,101,10,32,32,91,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,93,40,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,84,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,98,117,115,121,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,104,101,110,32,105,116,32,105,115,32,110,111,116,32,105,100,108,101,32,97,110,100,32,110,111,116,10,32,32,91,98,117,115,121,32,119,97,105,116,105,110,103,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,119,116,41,32,102,111,114,32,110,101,119,32,119,111,114,107,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,32,99,111,100,101,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,111,114,32,78,73,70,32,99,111,100,101,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,66,73,70,115,44,32,111,114,32,97,110,121,32,111,116,104,101,114,32,114,117,110,116,105,109,101,32,104,97,110,100,108,105,110,103,10,32,32,45,32,71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,10,32,32,45,32,72,97,110,100,108,105,110,103,32,97,110,121,32,111,116,104,101,114,32,109,101,109,111,114,121,32,109,97,110,97,103,101,109,101,110,116,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,99,97,110,32,97,108,115,111,32,98,101,32,98,117,115,121,32,101,118,101,110,32,105,102,32,116,104,101,32,79,83,32,104,97,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,116,104,101,10,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,117,115,101,32,116,104,101,32,109,111,100,117,108,101,32,96,109,58,115,99,104,101,100,117,108,101,114,96,32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,10,32,32,62,32,100,105,114,101,99,116,108,121,32,97,115,32,105,116,32,112,114,111,118,105,100,101,115,32,97,110,32,101,97,115,105,101,114,32,119,97,121,32,116,111,32,103,101,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,116,32,121,111,117,32,117,115,117,97,108,108,121,10,32,32,62,32,119,97,110,116,46,10,10,32,32,73,102,32,91,101,110,97,98,108,101,100,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32,96,123,83,99,104,101,100,117,108,101,114,73,100,44,32,65,99,116,105,118,101,84,105,109,101,44,32,84,111,116,97,108,84,105,109,101,125,96,44,32,119,104,101,114,101,32,96,83,99,104,101,100,117,108,101,114,73,100,96,10,32,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,73,68,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,44,32,96,65,99,116,105,118,101,84,105,109,101,96,32,105,115,32,116,104,101,32,100,117,114,97,116,105,111,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,10,32,32,104,97,115,32,98,101,101,110,32,98,117,115,121,44,32,97,110,100,32,96,84,111,116,97,108,84,105,109,101,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,116,105,109,101,32,100,117,114,97,116,105,111,110,32,115,105,110,99,101,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,97,99,116,105,118,97,116,105,111,110,10,32,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,46,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,116,117,114,110,101,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,99,97,110,32,98,101,10,32,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,114,101,108,101,97,115,101,115,44,32,79,83,115,44,32,97,110,100,32,115,121,115,116,101,109,32,114,101,115,116,97,114,116,115,46,10,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,97,108,99,117,108,97,116,101,32,114,101,108,97,116,105,118,101,32,118,97,108,117,101,115,32,102,111,114,10,32,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,84,104,101,32,96,65,99,116,105,118,101,84,105,109,101,96,32,99,97,110,32,110,101,118,101,114,32,101,120,99,101,101,100,32,96,84,111,116,97,108,84,105,109,101,96,46,32,84,104,101,32,108,105,115,116,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,10,32,32,99,97,108,108,115,46,10,10,32,32,84,104,101,32,91,100,105,115,97,98,108,101,100,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,10,32,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,32,32,84,104,101,32,97,99,116,105,118,97,116,105,111,110,32,116,105,109,101,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,100,105,114,116,121,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,32,119,104,105,108,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,10,32,32,115,111,109,101,32,116,105,109,101,32,97,102,116,101,114,32,116,104,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,110,97,98,108,101,100,46,10,10,32,32,79,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,104,97,110,100,108,101,32,67,80,85,32,98,111,117,110,100,32,119,111,114,107,32,105,115,10,32,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,102,32,121,111,117,32,97,108,115,111,32,119,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,97,98,111,117,116,32,91,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,44,32,117,115,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,10,32,32,105,110,115,116,101,97,100,46,10,10,32,32,78,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,96,49,32,61,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,32,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,104,97,110,100,108,101,32,115,112,101,99,105,102,105,99,32,116,121,112,101,115,32,111,102,32,106,111,98,115,46,32,69,118,101,114,121,32,106,111,98,32,105,115,10,32,32,62,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,32,116,121,112,101,46,32,74,111,98,115,32,99,97,110,32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,44,32,98,117,116,32,110,101,118,101,114,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,46,10,32,32,62,32,84,104,105,115,32,102,97,99,116,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,117,110,100,101,114,32,99,111,110,115,105,100,101,114,97,116,105,111,110,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,10,32,32,62,32,114,101,116,117,114,110,101,100,46,10,10,32,32,89,111,117,32,99,97,110,32,117,115,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,116,111,32,99,97,108,99,117,108,97,116,101,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,70,105,114,115,116,32,121,111,117,10,32,32,116,97,107,101,32,97,32,115,97,109,112,108,101,32,111,102,32,116,104,101,32,118,97,108,117,101,115,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,46,10,32,32,102,97,108,115,101,10,32,32,62,32,84,115,48,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,32,32,111,107,10,32,32,96,96,96,10,10,32,32,83,111,109,101,32,116,105,109,101,32,108,97,116,101,114,32,116,104,101,32,117,115,101,114,32,116,97,107,101,115,32,97,110,111,116,104,101,114,32,115,110,97,112,115,104,111,116,32,97,110,100,32,99,97,108,99,117,108,97,116,101,115,32,115,99,104,101,100,117,108,101,114,10,32,32,117,116,105,108,105,122,97,116,105,111,110,32,112,101,114,32,115,99,104,101,100,117,108,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,84,115,49,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,32,32,111,107,10,32,32,62,32,108,105,115,116,115,58,109,97,112,40,102,117,110,40,123,123,73,44,32,65,48,44,32,84,48,125,44,32,123,73,44,32,65,49,44,32,84,49,125,125,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,123,73,44,32,40,65,49,32,45,32,65,48,41,47,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,46,10,32,32,91,123,49,44,48,46,57,55,52,51,52,55,52,55,51,48,49,55,55,53,52,56,125,44,10,32,32,32,123,50,44,48,46,57,55,52,52,56,52,51,55,56,50,55,53,49,52,52,52,125,44,10,32,32,32,123,51,44,48,46,57,57,57,53,57,48,50,51,54,49,54,54,57,48,52,53,125,44,10,32,32,32,123,52,44,48,46,57,55,51,56,48,49,50,53,57,54,53,55,50,49,54,49,125,44,10,32,32,32,123,53,44,48,46,57,55,49,55,57,53,54,54,54,55,48,49,56,49,48,51,125,44,10,32,32,32,123,54,44,48,46,57,55,51,57,50,51,53,56,52,54,52,50,48,55,52,49,125,44,10,32,32,32,123,55,44,48,46,57,55,51,50,51,55,48,51,51,48,55,55,56,55,54,125,44,10,32,32,32,123,56,44,48,46,57,55,52,49,50,57,55,50,57,51,50,52,56,54,53,54,125,93,10,32,32,96,96,96,10,10,32,32,85,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,110,97,112,115,104,111,116,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,97,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,123,65,44,32,84,125,32,61,32,108,105,115,116,115,58,102,111,108,100,108,40,102,117,110,40,123,123,95,44,32,65,48,44,32,84,48,125,44,32,123,95,44,32,65,49,44,32,84,49,125,125,44,32,123,65,105,44,84,105,125,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,123,65,105,32,43,32,40,65,49,32,45,32,65,48,41,44,32,84,105,32,43,32,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,123,48,44,32,48,125,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,44,10,32,32,32,32,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,65,47,84,46,10,32,32,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53,10,32,32,96,96,96,10,10,32,32,84,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,101,113,117,97,108,32,96,49,46,48,96,32,119,104,101,110,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,101,101,110,10,32,32,97,99,116,105,118,101,32,97,108,108,32,116,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32,116,119,111,32,109,101,97,115,117,114,101,109,101,110,116,115,46,10,10,32,32,65,110,111,116,104,101,114,32,40,112,114,111,98,97,98,108,121,32,109,111,114,101,41,32,117,115,101,102,117,108,32,118,97,108,117,101,32,105,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,10,32,32,119,101,105,103,104,116,101,100,32,97,103,97,105,110,115,116,32,109,97,120,105,109,117,109,32,97,109,111,117,110,116,32,111,102,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,87,101,105,103,104,116,101,100,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,40,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,41,46,10,32,32,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,119,101,105,103,104,116,101,100,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,114,101,97,99,104,32,96,49,46,48,96,32,119,104,101,110,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,101,10,32,32,116,104,101,32,115,97,109,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,97,115,32,109,97,120,105,109,117,109,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,46,32,73,102,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,10,32,32,116,104,97,110,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,118,97,108,117,101,32,109,97,121,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,96,49,46,48,96,46,10,10,32,32,65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,97,115,32,100,101,102,97,117,108,116,32,104,97,118,101,32,109,111,114,101,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,110,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,105,115,32,100,117,101,32,116,111,32,116,104,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,100,105,115,97,98,108,101,100,46,32,84,111,32,101,110,97,98,108,101,32,105,116,44,32,117,115,101,10,32,32,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,32,45,62,10,32,32,32,32,91,123,73,100,32,58,58,32,112,111,115,95,105,110,116,101,103,101,114,44,10,32,32,32,32,32,32,65,99,116,105,118,101,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,10,32,32,32,32,32,32,84,111,116,97,108,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,93,32,124,10,32,32,32,32,117,110,100,101,102,105,110,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,44,10,32,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,115,111,32,105,110,99,108,117,100,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,68,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,96,43,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,43,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,78,111,116,101,32,116,104,97,116,32,119,111,114,107,32,101,120,101,99,117,116,105,110,103,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,109,97,105,110,108,121,32,119,97,105,116,10,32,32,62,32,102,111,114,32,73,47,79,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,121,111,117,32,103,101,116,32,104,105,103,104,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,111,110,32,100,105,114,116,121,32,73,47,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,44,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,104,105,103,104,32,100,117,101,32,116,111,32,116,104,105,115,32,119,111,114,107,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,119,97,108,108,95,99,108,111,99,107,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,119,97,108,108,95,99,108,111,99,107,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,119,97,108,108,32,99,108,111,99,107,46,32,96,119,97,108,108,95,99,108,111,99,107,96,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,115,97,109,101,10,32,32,109,97,110,110,101,114,32,97,115,32,96,114,117,110,116,105,109,101,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,114,101,97,108,32,116,105,109,101,32,105,115,32,109,101,97,115,117,114,101,100,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,114,117,110,116,105,109,101,32,111,114,10,32,32,67,80,85,32,116,105,109,101,46>>},#{group => system,specification => [{attribute,{8682,2},spec,{{statistics,1},[{type,{8682,17},bounded_fun,[{type,{8682,17},'fun',[{type,{8682,17},product,[{atom,{8682,18},active_tasks}]},{type,{8682,35},list,[{var,{8682,36},'ActiveTasks'}]}]},[{type,{8683,7},constraint,[{atom,{8683,7},is_subtype},[{var,{8683,7},'ActiveTasks'},{type,{8683,22},non_neg_integer,[]}]]}]]},{type,{8684,3},bounded_fun,[{type,{8684,3},'fun',[{type,{8684,3},product,[{atom,{8684,4},active_tasks_all}]},{type,{8684,25},list,[{var,{8684,26},'ActiveTasks'}]}]},[{type,{8685,7},constraint,[{atom,{8685,7},is_subtype},[{var,{8685,7},'ActiveTasks'},{type,{8685,22},non_neg_integer,[]}]]}]]},{type,{8686,3},bounded_fun,[{type,{8686,3},'fun',[{type,{8686,3},product,[{atom,{8686,4},context_switches}]},{type,{8686,25},tuple,[{var,{8686,26},'ContextSwitches'},{integer,{8686,42},0}]}]},[{type,{8687,7},constraint,[{atom,{8687,7},is_subtype},[{var,{8687,7},'ContextSwitches'},{type,{8687,26},non_neg_integer,[]}]]}]]},{type,{8688,17},bounded_fun,[{type,{8688,17},'fun',[{type,{8688,17},product,[{atom,{8688,18},exact_reductions}]},{type,{8688,39},tuple,[{var,{8688,40},'Total_Exact_Reductions'},{var,{8689,40},'Exact_Reductions_Since_Last_Call'}]}]},[{type,{8690,7},constraint,[{atom,{8690,7},is_subtype},[{var,{8690,7},'Total_Exact_Reductions'},{type,{8690,33},non_neg_integer,[]}]]},{type,{8691,7},constraint,[{atom,{8691,7},is_subtype},[{var,{8691,7},'Exact_Reductions_Since_Last_Call'},{type,{8691,43},non_neg_integer,[]}]]}]]},{type,{8692,17},bounded_fun,[{type,{8692,17},'fun',[{type,{8692,17},product,[{atom,{8692,18},garbage_collection}]},{type,{8692,41},tuple,[{var,{8692,42},'Number_of_GCs'},{var,{8692,57},'Words_Reclaimed'},{integer,{8692,74},0}]}]},[{type,{8693,7},constraint,[{atom,{8693,7},is_subtype},[{var,{8693,7},'Number_of_GCs'},{type,{8693,24},non_neg_integer,[]}]]},{type,{8694,7},constraint,[{atom,{8694,7},is_subtype},[{var,{8694,7},'Words_Reclaimed'},{type,{8694,26},non_neg_integer,[]}]]}]]},{type,{8695,17},bounded_fun,[{type,{8695,17},'fun',[{type,{8695,17},product,[{atom,{8695,18},io}]},{type,{8695,25},tuple,[{type,{8695,26},tuple,[{atom,{8695,27},input},{var,{8695,34},'Input'}]},{type,{8695,42},tuple,[{atom,{8695,43},output},{var,{8695,51},'Output'}]}]}]},[{type,{8696,7},constraint,[{atom,{8696,7},is_subtype},[{var,{8696,7},'Input'},{type,{8696,16},non_neg_integer,[]}]]},{type,{8697,7},constraint,[{atom,{8697,7},is_subtype},[{var,{8697,7},'Output'},{type,{8697,17},non_neg_integer,[]}]]}]]},{type,{8698,17},bounded_fun,[{type,{8698,17},'fun',[{type,{8698,17},product,[{atom,{8698,18},microstate_accounting}]},{type,{8698,44},union,[{type,{8698,44},list,[{var,{8698,45},'MSAcc_Thread'}]},{atom,{8698,61},undefined}]}]},[{type,{8699,7},constraint,[{atom,{8699,7},is_subtype},[{var,{8699,7},'MSAcc_Thread'},{type,{8699,23},map,[{type,{8699,31},map_field_exact,[{atom,{8699,26},type},{var,{8699,34},'MSAcc_Thread_Type'}]},{type,{8700,28},map_field_exact,[{atom,{8700,25},id},{var,{8700,31},'MSAcc_Thread_Id'}]},{type,{8701,34},map_field_exact,[{atom,{8701,25},counters},{var,{8701,37},'MSAcc_Counters'}]}]}]]},{type,{8702,7},constraint,[{atom,{8702,7},is_subtype},[{var,{8702,7},'MSAcc_Thread_Type'},{type,{8702,28},union,[{atom,{8702,28},async},{atom,{8702,36},aux},{atom,{8702,42},dirty_io_scheduler},{atom,{8703,28},dirty_cpu_scheduler},{atom,{8703,50},poll},{atom,{8703,57},scheduler}]}]]},{type,{8704,7},constraint,[{atom,{8704,7},is_subtype},[{var,{8704,7},'MSAcc_Thread_Id'},{type,{8704,26},non_neg_integer,[]}]]},{type,{8705,7},constraint,[{atom,{8705,7},is_subtype},[{var,{8705,7},'MSAcc_Counters'},{type,{8705,25},map,[{type,{8705,47},map_field_assoc,[{var,{8705,28},'MSAcc_Thread_State'},{type,{8705,50},non_neg_integer,[]}]}]}]]},{type,{8706,7},constraint,[{atom,{8706,7},is_subtype},[{var,{8706,7},'MSAcc_Thread_State'},{type,{8706,29},union,[{atom,{8706,29},alloc},{atom,{8706,37},aux},{atom,{8706,43},bif},{atom,{8706,49},busy_wait},{atom,{8706,61},check_io},{atom,{8707,29},emulator},{atom,{8707,40},ets},{atom,{8707,46},gc},{atom,{8707,51},gc_fullsweep},{atom,{8707,66},nif},{atom,{8708,29},other},{atom,{8708,37},port},{atom,{8708,44},send},{atom,{8708,51},sleep},{atom,{8708,59},timers}]}]]}]]},{type,{8709,17},bounded_fun,[{type,{8709,17},'fun',[{type,{8709,17},product,[{atom,{8709,18},reductions}]},{type,{8709,33},tuple,[{var,{8709,34},'Total_Reductions'},{var,{8710,34},'Reductions_Since_Last_Call'}]}]},[{type,{8711,7},constraint,[{atom,{8711,7},is_subtype},[{var,{8711,7},'Total_Reductions'},{type,{8711,27},non_neg_integer,[]}]]},{type,{8712,7},constraint,[{atom,{8712,7},is_subtype},[{var,{8712,7},'Reductions_Since_Last_Call'},{type,{8712,37},non_neg_integer,[]}]]}]]},{type,{8713,17},'fun',[{type,{8713,17},product,[{atom,{8713,18},run_queue}]},{type,{8713,32},non_neg_integer,[]}]},{type,{8714,17},bounded_fun,[{type,{8714,17},'fun',[{type,{8714,17},product,[{atom,{8714,18},run_queue_lengths}]},{type,{8714,40},list,[{var,{8714,41},'RunQueueLength'}]}]},[{type,{8715,7},constraint,[{atom,{8715,7},is_subtype},[{var,{8715,7},'RunQueueLength'},{type,{8715,25},non_neg_integer,[]}]]}]]},{type,{8716,17},bounded_fun,[{type,{8716,17},'fun',[{type,{8716,17},product,[{atom,{8716,18},run_queue_lengths_all}]},{type,{8716,44},list,[{var,{8716,45},'RunQueueLength'}]}]},[{type,{8717,7},constraint,[{atom,{8717,7},is_subtype},[{var,{8717,7},'RunQueueLength'},{type,{8717,25},non_neg_integer,[]}]]}]]},{type,{8718,17},bounded_fun,[{type,{8718,17},'fun',[{type,{8718,17},product,[{atom,{8718,18},runtime}]},{type,{8718,30},tuple,[{var,{8718,31},'Total_Run_Time'},{var,{8718,47},'Time_Since_Last_Call'}]}]},[{type,{8719,7},constraint,[{atom,{8719,7},is_subtype},[{var,{8719,7},'Total_Run_Time'},{type,{8719,25},non_neg_integer,[]}]]},{type,{8720,7},constraint,[{atom,{8720,7},is_subtype},[{var,{8720,7},'Time_Since_Last_Call'},{type,{8720,31},non_neg_integer,[]}]]}]]},{type,{8721,17},bounded_fun,[{type,{8721,17},'fun',[{type,{8721,17},product,[{atom,{8721,18},scheduler_wall_time}]},{type,{8721,42},union,[{type,{8721,42},list,[{type,{8721,43},tuple,[{var,{8721,44},'SchedulerId'},{var,{8721,57},'ActiveTime'},{var,{8721,69},'TotalTime'}]}]},{atom,{8721,83},undefined}]}]},[{type,{8722,7},constraint,[{atom,{8722,7},is_subtype},[{var,{8722,7},'SchedulerId'},{type,{8722,22},pos_integer,[]}]]},{type,{8723,7},constraint,[{atom,{8723,7},is_subtype},[{var,{8723,7},'ActiveTime'},{type,{8723,22},non_neg_integer,[]}]]},{type,{8724,7},constraint,[{atom,{8724,7},is_subtype},[{var,{8724,7},'TotalTime'},{type,{8724,22},non_neg_integer,[]}]]}]]},{type,{8725,17},bounded_fun,[{type,{8725,17},'fun',[{type,{8725,17},product,[{atom,{8725,18},scheduler_wall_time_all}]},{type,{8725,46},union,[{type,{8725,46},list,[{type,{8725,47},tuple,[{var,{8725,48},'SchedulerId'},{var,{8725,61},'ActiveTime'},{var,{8725,73},'TotalTime'}]}]},{atom,{8725,87},undefined}]}]},[{type,{8726,7},constraint,[{atom,{8726,7},is_subtype},[{var,{8726,7},'SchedulerId'},{type,{8726,22},pos_integer,[]}]]},{type,{8727,7},constraint,[{atom,{8727,7},is_subtype},[{var,{8727,7},'ActiveTime'},{type,{8727,22},non_neg_integer,[]}]]},{type,{8728,7},constraint,[{atom,{8728,7},is_subtype},[{var,{8728,7},'TotalTime'},{type,{8728,22},non_neg_integer,[]}]]}]]},{type,{8729,3},bounded_fun,[{type,{8729,3},'fun',[{type,{8729,3},product,[{atom,{8729,4},total_active_tasks}]},{var,{8729,27},'ActiveTasks'}]},[{type,{8730,7},constraint,[{atom,{8730,7},is_subtype},[{var,{8730,7},'ActiveTasks'},{type,{8730,22},non_neg_integer,[]}]]}]]},{type,{8731,3},bounded_fun,[{type,{8731,3},'fun',[{type,{8731,3},product,[{atom,{8731,4},total_active_tasks_all}]},{var,{8731,31},'ActiveTasks'}]},[{type,{8732,7},constraint,[{atom,{8732,7},is_subtype},[{var,{8732,7},'ActiveTasks'},{type,{8732,22},non_neg_integer,[]}]]}]]},{type,{8733,17},bounded_fun,[{type,{8733,17},'fun',[{type,{8733,17},product,[{atom,{8733,18},total_run_queue_lengths}]},{var,{8733,46},'TotalRunQueueLengths'}]},[{type,{8734,7},constraint,[{atom,{8734,7},is_subtype},[{var,{8734,7},'TotalRunQueueLengths'},{type,{8734,31},non_neg_integer,[]}]]}]]},{type,{8735,17},bounded_fun,[{type,{8735,17},'fun',[{type,{8735,17},product,[{atom,{8735,18},total_run_queue_lengths_all}]},{var,{8735,50},'TotalRunQueueLengths'}]},[{type,{8736,7},constraint,[{atom,{8736,7},is_subtype},[{var,{8736,7},'TotalRunQueueLengths'},{type,{8736,31},non_neg_integer,[]}]]}]]},{type,{8737,17},bounded_fun,[{type,{8737,17},'fun',[{type,{8737,17},product,[{atom,{8737,18},wall_clock}]},{type,{8737,33},tuple,[{var,{8737,34},'Total_Wallclock_Time'},{var,{8738,34},'Wallclock_Time_Since_Last_Call'}]}]},[{type,{8739,7},constraint,[{atom,{8739,7},is_subtype},[{var,{8739,7},'Total_Wallclock_Time'},{type,{8739,31},non_neg_integer,[]}]]},{type,{8740,7},constraint,[{atom,{8740,7},is_subtype},[{var,{8740,7},'Wallclock_Time_Since_Last_Call'},{type,{8740,41},non_neg_integer,[]}]]}]]}]}}]}},{{function,setelement,3},{8106,2},[<<115,101,116,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,116,104,97,116,32,105,115,32,97,32,99,111,112,121,32,111,102,32,97,114,103,117,109,101,110,116,32,96,84,117,112,108,101,49,96,32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,115,112,101,99,105,102,105,101,100,10,98,121,32,105,110,116,101,103,101,114,32,97,114,103,117,109,101,110,116,32,96,73,110,100,101,120,96,32,40,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,101,108,101,109,101,110,116,32,119,105,116,104,32,105,110,100,101,120,32,49,41,10,114,101,112,108,97,99,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32,96,86,97,108,117,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,101,116,101,108,101,109,101,110,116,40,50,44,32,123,49,48,44,32,103,114,101,101,110,44,32,98,111,116,116,108,101,115,125,44,32,114,101,100,41,46,10,123,49,48,44,114,101,100,44,98,111,116,116,108,101,115,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{8119,2},spec,{{setelement,3},[{type,{8119,17},bounded_fun,[{type,{8119,17},'fun',[{type,{8119,17},product,[{var,{8119,18},'Index'},{var,{8119,25},'Tuple1'},{var,{8119,33},'Value'}]},{var,{8119,43},'Tuple2'}]},[{type,{8120,7},constraint,[{atom,{8120,7},is_subtype},[{var,{8120,7},'Index'},{type,{8120,16},pos_integer,[]}]]},{type,{8121,7},constraint,[{atom,{8121,7},is_subtype},[{var,{8121,7},'Tuple1'},{type,{8121,17},tuple,any}]]},{type,{8122,7},constraint,[{atom,{8122,7},is_subtype},[{var,{8122,7},'Tuple2'},{type,{8122,17},tuple,any}]]},{type,{8123,7},constraint,[{atom,{8123,7},is_subtype},[{var,{8123,7},'Value'},{type,{8123,16},term,[]}]]}]]}]}}]}},{{function,seq_trace_info,1},{8093,2},[<<115,101,113,95,116,114,97,99,101,95,105,110,102,111,40,87,104,97,116,41>>],hidden,#{}},{{function,send,3},{8058,2},[<<115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,105,116,104,101,114,32,115,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,111,107,96,44,32,111,114,32,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,32,98,117,116,10,114,101,116,117,114,110,115,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,40,115,101,101,32,98,101,108,111,119,41,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,115,97,109,101,32,97,115,10,91,96,101,114,108,97,110,103,58,115,101,110,100,47,50,96,93,40,96,115,101,110,100,47,50,96,41,46,10,10,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,101,120,112,108,97,110,97,116,105,111,110,32,97,110,100,32,119,97,114,110,105,110,103,115,44,32,115,101,101,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51,96,93,40,96,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,41,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,110,111,115,117,115,112,101,110,100,96,42,42,32,45,32,73,102,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,10,32,32,96,110,111,115,117,115,112,101,110,100,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46,10,10,45,32,42,42,96,110,111,99,111,110,110,101,99,116,96,42,42,32,45,32,73,102,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,110,111,100,101,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,97,117,116,111,45,99,111,110,110,101,99,116,101,100,32,116,111,10,32,32,100,111,32,116,104,101,32,115,101,110,100,44,32,96,110,111,99,111,110,110,101,99,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,65,115,32,119,105,116,104,32,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51,96,58,32,117,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{8084,2},spec,{{send,3},[{type,{8084,11},bounded_fun,[{type,{8084,11},'fun',[{type,{8084,11},product,[{var,{8084,12},'Dest'},{var,{8084,18},'Msg'},{var,{8084,23},'Options'}]},{var,{8084,35},'Res'}]},[{type,{8085,7},constraint,[{atom,{8085,7},is_subtype},[{var,{8085,7},'Dest'},{user_type,{8085,15},send_destination,[]}]]},{type,{8086,7},constraint,[{atom,{8086,7},is_subtype},[{var,{8086,7},'Msg'},{type,{8086,14},term,[]}]]},{type,{8087,7},constraint,[{atom,{8087,7},is_subtype},[{var,{8087,7},'Options'},{type,{8087,18},list,[{type,{8087,19},union,[{atom,{8087,19},nosuspend},{atom,{8087,31},noconnect}]}]}]]},{type,{8088,7},constraint,[{atom,{8088,7},is_subtype},[{var,{8088,7},'Res'},{type,{8088,14},union,[{atom,{8088,14},ok},{atom,{8088,19},nosuspend},{atom,{8088,31},noconnect}]}]]}]]}]}}]}},{{function,send,2},{8033,2},[<<115,101,110,100,40,68,101,115,116,44,32,77,115,103,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,77,115,103,96,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,117,115,105,110,103,32,116,104,101,10,91,115,101,110,100,32,111,112,101,114,97,116,111,114,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,115,101,110,100,96,41,58,32,96,68,101,115,116,32,33,32,77,115,103,96,46,10,10,96,68,101,115,116,96,32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,32,97,108,105,97,115,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,10,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,10,97,110,111,116,104,101,114,32,110,111,100,101,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,114,117,110,45,116,105,109,101,32,101,114,114,111,114,32,105,102,32,96,68,101,115,116,96,32,105,115,32,97,110,32,97,116,111,109,32,110,97,109,101,44,32,98,117,116,10,116,104,105,115,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,111,110,108,121,32,99,97,115,101,32,119,104,101,110,32,96,115,101,110,100,96,32,102,97,105,108,115,32,102,111,114,32,97,110,10,117,110,114,101,97,99,104,97,98,108,101,32,100,101,115,116,105,110,97,116,105,111,110,32,96,68,101,115,116,96,32,40,111,102,32,99,111,114,114,101,99,116,32,116,121,112,101,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{8052,2},spec,{{send,2},[{type,{8052,11},bounded_fun,[{type,{8052,11},'fun',[{type,{8052,11},product,[{var,{8052,12},'Dest'},{var,{8052,18},'Msg'}]},{var,{8052,26},'Msg'}]},[{type,{8053,7},constraint,[{atom,{8053,7},is_subtype},[{var,{8053,7},'Dest'},{user_type,{8053,15},send_destination,[]}]]},{type,{8054,7},constraint,[{atom,{8054,7},is_subtype},[{var,{8054,7},'Msg'},{type,{8054,14},term,[]}]]}]]}]}}]}},{{function,process_info,2},{7800,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,73,116,101,109,83,112,101,99,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,10,96,73,116,101,109,96,32,111,114,32,96,73,116,101,109,76,105,115,116,96,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,108,105,118,101,32,97,110,100,32,97,32,115,105,110,103,108,101,32,96,73,116,101,109,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,10,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,110,102,111,84,117,112,108,101,96,44,32,117,110,108,101,115,115,32,96,73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,10,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,115,116,114,97,110,103,101,32,98,101,104,97,118,105,111,114,32,105,115,10,98,101,99,97,117,115,101,32,111,102,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,97,110,100,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,73,102,32,96,73,116,101,109,76,105,115,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,46,32,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,105,110,10,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,32,97,114,101,32,105,110,99,108,117,100,101,100,32,119,105,116,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,116,101,109,96,115,32,105,110,32,116,104,101,32,115,97,109,101,32,111,114,100,101,114,32,97,115,10,116,104,101,32,96,73,116,101,109,96,115,32,119,101,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32,96,73,116,101,109,76,105,115,116,96,46,32,86,97,108,105,100,32,96,73,116,101,109,96,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,109,117,108,116,105,112,108,101,10,116,105,109,101,115,32,105,110,32,96,73,116,101,109,76,105,115,116,96,46,10,10,71,101,116,116,105,110,103,32,112,114,111,99,101,115,115,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,10,116,104,101,32,91,80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,112,97,114,116,32,111,102,32,96,73,116,101,109,76,105,115,116,96,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,110,97,109,101,10,62,32,114,101,103,105,115,116,101,114,101,100,44,32,97,32,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,91,93,125,96,44,32,96,73,110,102,111,84,117,112,108,101,96,32,95,119,105,108,108,95,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,10,62,32,114,101,115,117,108,116,105,110,103,32,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,97,32,115,105,110,103,108,101,10,62,32,96,73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,119,104,101,110,10,62,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,96,93,40,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,96,41,32,105,115,32,117,115,101,100,46,10,10,86,97,108,105,100,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,116,101,109,96,115,58,10,10,45,32,42,42,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,100,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,32,125,42,42,32,45,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,32,32,67,117,114,114,101,110,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,41,10,32,32,112,114,111,99,101,115,115,32,102,108,97,103,46,10,10,45,32,42,42,96,123,98,97,99,107,116,114,97,99,101,44,32,66,105,110,125,96,42,42,32,45,32,66,105,110,97,114,121,32,96,66,105,110,96,32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,116,104,101,10,32,32,111,117,116,112,117,116,32,102,114,111,109,32,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,98,97,99,107,116,114,97,99,101,41,96,46,32,85,115,101,10,32,32,91,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,111,98,116,97,105,110,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,32,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,46,10,10,45,32,42,42,96,123,98,105,110,97,114,121,44,32,66,105,110,73,110,102,111,125,96,42,42,32,45,32,96,66,105,110,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,98,105,110,97,114,105,101,115,32,111,110,32,116,104,101,32,104,101,97,112,32,111,102,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,10,32,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,110,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,10,32,32,96,66,105,110,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,46,32,84,104,101,32,116,117,112,108,101,115,32,99,111,110,116,97,105,110,59,32,96,66,105,110,97,114,121,73,100,96,44,32,96,66,105,110,97,114,121,83,105,122,101,96,44,10,32,32,96,66,105,110,97,114,121,82,101,102,99,67,111,117,110,116,96,46,10,10,32,32,68,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,91,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,32,112,114,111,99,101,115,115,10,32,32,102,108,97,103,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,109,97,121,32,98,101,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,46,10,10,45,32,42,42,96,123,99,97,116,99,104,108,101,118,101,108,44,32,67,97,116,99,104,76,101,118,101,108,125,96,42,42,32,45,32,96,67,97,116,99,104,76,101,118,101,108,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,99,117,114,114,101,110,116,108,121,10,32,32,97,99,116,105,118,101,32,99,97,116,99,104,101,115,32,105,110,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,10,32,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,32,124,32,117,110,100,101,102,105,110,101,100,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,10,32,32,96,70,117,110,99,116,105,111,110,96,44,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,118,97,108,117,101,10,32,32,96,117,110,100,101,102,105,110,101,100,96,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,110,97,116,105,118,101,10,32,32,99,111,109,112,105,108,101,100,32,99,111,100,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,108,111,99,97,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,44,32,76,111,99,97,116,105,111,110,125,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,10,32,32,96,70,117,110,99,116,105,111,110,96,44,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,96,76,111,99,97,116,105,111,110,96,32,105,115,10,32,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,108,111,99,97,116,105,111,110,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,44,32,83,116,97,99,107,125,96,42,42,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,10,32,32,40,95,115,116,97,99,107,116,114,97,99,101,95,41,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,116,97,99,107,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,115,32,105,110,32,116,104,101,32,96,99,97,116,99,104,96,10,32,32,112,97,114,116,32,111,102,32,97,32,96,116,114,121,96,46,32,83,101,101,10,32,32,91,84,104,101,32,99,97,108,108,45,115,116,97,99,107,32,98,97,99,107,32,116,114,97,99,101,32,40,115,116,97,99,107,116,114,97,99,101,41,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,115,116,97,99,107,116,114,97,99,101,96,41,46,32,84,104,101,10,32,32,100,101,112,116,104,32,111,102,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,96,98,97,99,107,116,114,97,99,101,95,100,101,112,116,104,96,32,115,121,115,116,101,109,10,32,32,102,108,97,103,32,115,101,116,116,105,110,103,46,10,10,45,32,42,42,96,123,100,105,99,116,105,111,110,97,114,121,44,32,68,105,99,116,105,111,110,97,114,121,125,96,42,42,32,45,32,96,68,105,99,116,105,111,110,97,114,121,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,45,32,42,42,96,123,123,100,105,99,116,105,111,110,97,114,121,44,32,75,101,121,125,44,32,86,97,108,117,101,125,96,42,42,32,45,32,96,86,97,108,117,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,110,32,116,104,101,10,32,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,45,32,42,42,96,123,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,77,111,100,117,108,101,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,96,109,58,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,109,111,100,117,108,101,32,117,115,101,100,32,98,121,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,40,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46,10,10,45,32,42,42,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,44,32,71,67,73,110,102,111,125,96,42,42,32,45,32,96,71,67,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,10,32,32,99,111,110,116,101,110,116,32,111,102,32,96,71,67,73,110,102,111,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,44,32,71,67,73,110,102,111,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,32,125,42,42,32,45,10,32,32,96,71,67,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,100,101,116,97,105,108,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,96,71,67,73,110,102,111,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,10,32,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,101,97,99,104,32,105,116,101,109,44,32,115,101,101,10,32,32,91,96,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,93,40,96,109,58,116,114,97,99,101,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,41,32,105,110,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,46,10,10,45,32,42,42,96,123,103,114,111,117,112,95,108,101,97,100,101,114,44,32,71,114,111,117,112,76,101,97,100,101,114,125,96,42,42,32,45,32,96,71,114,111,117,112,76,101,97,100,101,114,96,32,105,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,10,32,32,73,47,79,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,121,111,117,110,103,101,115,116,32,104,101,97,112,10,32,32,103,101,110,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,103,101,110,101,114,97,116,105,111,110,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,105,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,10,32,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,99,104,97,110,103,101,115,46,10,10,45,32,42,42,96,123,105,110,105,116,105,97,108,95,99,97,108,108,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,32,96,70,117,110,99,116,105,111,110,96,44,10,32,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,105,110,105,116,105,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,97,119,110,101,100,46,10,10,45,32,42,42,96,123,108,105,110,107,115,44,32,80,105,100,115,65,110,100,80,111,114,116,115,125,96,42,42,32,45,32,96,80,105,100,115,65,110,100,80,111,114,116,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,10,32,32,97,110,100,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,116,111,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,108,105,110,107,46,10,10,45,32,42,42,96,123,108,97,115,116,95,99,97,108,108,115,44,32,102,97,108,115,101,124,67,97,108,108,115,125,96,42,42,32,45,32,84,104,101,32,118,97,108,117,101,32,105,115,32,96,102,97,108,115,101,96,32,105,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,110,111,116,10,32,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,51,96,41,46,32,73,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,97,99,116,105,118,101,44,32,97,10,32,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,32,119,104,105,99,104,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,99,97,108,108,101,100,46,10,10,45,32,42,42,96,123,109,101,109,111,114,121,44,32,83,105,122,101,125,96,42,42,32,45,32,91,93,40,41,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,109,101,109,111,114,121,32,125,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,10,32,32,98,121,116,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,99,97,108,108,32,115,116,97,99,107,44,32,104,101,97,112,44,32,97,110,100,32,105,110,116,101,114,110,97,108,32,115,116,114,117,99,116,117,114,101,115,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,44,32,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,125,96,42,42,32,45,32,96,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,109,101,115,115,97,103,101,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,116,104,101,32,108,101,110,103,116,104,10,32,32,111,102,32,116,104,101,32,108,105,115,116,32,96,77,101,115,115,97,103,101,81,117,101,117,101,96,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,116,101,109,32,96,109,101,115,115,97,103,101,115,96,32,40,115,101,101,10,32,32,98,101,108,111,119,41,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,115,44,32,77,101,115,115,97,103,101,81,117,101,117,101,125,96,42,42,32,45,32,96,77,101,115,115,97,103,101,81,117,101,117,101,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,109,101,115,115,97,103,101,115,32,116,111,10,32,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,104,97,118,101,32,110,111,116,32,121,101,116,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46,10,10,45,32,42,42,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125,96,42,42,32,45,32,96,77,105,110,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,10,32,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125,96,42,42,32,45,32,96,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,10,32,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125,96,42,42,32,45,32,65,32,108,105,115,116,32,111,102,32,105,100,101,110,116,105,102,105,101,114,115,32,102,111,114,32,97,108,108,32,116,104,101,10,32,32,112,114,111,99,101,115,115,101,115,44,32,112,111,114,116,115,32,97,110,100,32,78,73,70,32,114,101,115,111,117,114,99,101,115,44,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125,96,42,42,32,45,32,65,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,115,32,40,115,116,97,114,116,101,100,32,98,121,10,32,32,91,96,109,111,110,105,116,111,114,47,50,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,41,32,116,104,97,116,32,97,114,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,97,32,108,111,99,97,108,10,32,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,111,114,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,98,121,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,108,105,115,116,10,32,32,99,111,110,115,105,115,116,115,32,111,102,58,10,10,32,32,45,32,42,42,96,123,112,114,111,99,101,115,115,44,32,80,105,100,125,96,42,42,32,45,32,80,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,105,100,46,10,10,32,32,45,32,42,42,96,123,112,114,111,99,101,115,115,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125,96,42,42,32,45,32,76,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,10,32,32,32,32,110,97,109,101,46,10,10,32,32,45,32,42,42,96,123,112,111,114,116,44,32,80,111,114,116,73,100,125,96,42,42,32,45,32,76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,111,114,116,32,105,100,46,10,10,32,32,45,32,42,42,96,123,112,111,114,116,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125,96,42,42,32,45,32,76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46,32,80,108,101,97,115,101,10,32,32,32,32,110,111,116,101,44,32,116,104,97,116,32,114,101,109,111,116,101,32,112,111,114,116,32,109,111,110,105,116,111,114,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,115,111,32,96,78,111,100,101,96,32,119,105,108,108,32,97,108,119,97,121,115,32,98,101,10,32,32,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125,96,42,42,32,45,32,96,77,81,68,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,96,111,102,102,95,104,101,97,112,96,32,111,114,10,32,32,96,111,110,95,104,101,97,112,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,45,32,42,42,96,123,112,97,114,101,110,116,44,32,80,105,100,125,96,42,42,32,45,32,96,80,105,100,96,32,105,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,44,32,116,104,101,32,111,110,101,10,32,32,116,104,97,116,32,115,112,97,119,110,101,100,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,97,32,112,97,114,101,110,116,10,32,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,108,121,32,116,104,101,32,105,110,105,116,105,97,108,32,112,114,111,99,101,115,115,32,40,96,105,110,105,116,96,41,32,111,110,32,97,32,110,111,100,101,32,108,97,99,107,115,32,97,10,32,32,112,97,114,101,110,116,44,32,116,104,111,117,103,104,46,10,10,45,32,42,42,96,123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125,96,42,42,32,45,32,96,76,101,118,101,108,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,32,102,111,114,32,116,104,101,10,32,32,112,114,111,99,101,115,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,46,10,10,45,32,42,42,96,123,114,101,100,117,99,116,105,111,110,115,44,32,78,117,109,98,101,114,125,96,42,42,32,45,32,96,78,117,109,98,101,114,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,101,120,101,99,117,116,101,100,32,98,121,10,32,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,65,116,111,109,125,96,42,42,32,45,32,96,65,116,111,109,96,32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,110,97,109,101,46,32,73,102,32,116,104,101,10,32,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,116,104,105,115,32,116,117,112,108,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46,10,10,45,32,42,42,96,123,115,101,113,117,101,110,116,105,97,108,95,116,114,97,99,101,95,116,111,107,101,110,44,32,91,93,32,124,32,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,125,96,42,42,32,45,10,32,32,96,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,10,32,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,115,116,97,99,107,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,116,97,99,107,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,115,116,97,116,117,115,44,32,83,116,97,116,117,115,125,96,42,42,32,45,32,96,83,116,97,116,117,115,96,32,105,115,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,110,100,32,105,115,32,111,110,101,32,111,102,10,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,96,101,120,105,116,105,110,103,96,10,32,32,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,110,103,96,10,32,32,45,32,96,119,97,105,116,105,110,103,96,32,40,102,111,114,32,97,32,109,101,115,115,97,103,101,41,10,32,32,45,32,96,114,117,110,110,105,110,103,96,10,32,32,45,32,96,114,117,110,110,97,98,108,101,96,32,40,114,101,97,100,121,32,116,111,32,114,117,110,44,32,98,117,116,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,115,32,114,117,110,110,105,110,103,41,10,32,32,45,32,96,115,117,115,112,101,110,100,101,100,96,32,40,115,117,115,112,101,110,100,101,100,32,111,110,32,97,32,34,98,117,115,121,34,32,112,111,114,116,32,111,114,32,98,121,32,116,104,101,32,66,73,70,10,32,32,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,44,50,96,41,10,10,45,32,42,42,96,123,115,117,115,112,101,110,100,105,110,103,44,32,83,117,115,112,101,110,100,101,101,76,105,115,116,125,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,76,105,115,116,96,32,105,115,32,97,32,108,105,115,116,32,111,102,10,32,32,96,123,83,117,115,112,101,110,100,101,101,44,32,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,44,32,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,125,96,32,116,117,112,108,101,115,46,32,96,83,117,115,112,101,110,100,101,101,96,10,32,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,101,101,110,44,32,111,114,32,105,115,32,116,111,32,98,101,44,32,115,117,115,112,101,110,100,101,100,10,32,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,116,104,114,111,117,103,104,32,116,104,101,32,66,73,70,10,32,32,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,32,111,114,10,32,32,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,41,46,10,10,32,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,10,32,32,96,80,105,100,96,46,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,110,111,116,32,121,101,116,32,99,111,109,112,108,101,116,101,100,32,115,117,115,112,101,110,100,10,32,32,114,101,113,117,101,115,116,115,32,115,101,110,116,32,98,121,32,96,80,105,100,96,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,73,102,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48,96,44,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,10,32,32,32,32,115,116,97,116,101,46,10,32,32,45,32,73,102,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48,96,44,32,111,112,116,105,111,110,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,102,10,32,32,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,101,101,32,104,97,115,32,110,111,116,32,121,101,116,32,98,101,101,110,10,32,32,32,32,115,117,115,112,101,110,100,101,100,32,98,121,32,96,80,105,100,96,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,96,32,97,110,100,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,96,32,97,114,101,32,110,111,116,32,116,104,101,10,32,32,116,111,116,97,108,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,44,32,111,110,108,121,32,116,104,101,32,112,97,114,116,115,32,99,111,110,116,114,105,98,117,116,101,100,32,98,121,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,32,125,42,42,32,45,32,96,83,105,122,101,96,32,105,115,10,32,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,97,108,108,32,104,101,97,112,32,102,114,97,103,109,101,110,116,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,32,97,110,100,32,97,110,121,32,117,110,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,10,32,32,111,102,32,116,104,101,32,104,101,97,112,46,10,10,45,32,42,42,96,123,116,114,97,99,101,44,32,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,125,96,42,42,32,45,32,96,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,105,110,116,101,114,110,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,10,32,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,116,114,97,112,95,101,120,105,116,44,32,66,111,111,108,101,97,110,125,96,42,42,32,45,32,96,66,111,111,108,101,97,110,96,32,105,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,116,114,97,112,112,105,110,103,10,32,32,101,120,105,116,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,115,117,112,112,111,114,116,32,97,108,108,32,116,104,101,115,101,32,96,73,116,101,109,96,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,73,116,101,109,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,105,116,101,109,46>>},#{group => processes,specification => [{attribute,{8019,2},spec,{{process_info,2},[{type,{8019,19},bounded_fun,[{type,{8019,19},'fun',[{type,{8019,19},product,[{var,{8019,20},'Pid'},{var,{8019,25},'Item'}]},{type,{8020,27},union,[{var,{8020,27},'InfoTuple'},{type,{8020,39},nil,[]},{atom,{8020,44},undefined}]}]},[{type,{8021,7},constraint,[{atom,{8021,7},is_subtype},[{var,{8021,7},'Pid'},{type,{8021,14},pid,[]}]]},{type,{8022,7},constraint,[{atom,{8022,7},is_subtype},[{var,{8022,7},'Item'},{user_type,{8022,15},process_info_item,[]}]]},{type,{8023,7},constraint,[{atom,{8023,7},is_subtype},[{var,{8023,7},'InfoTuple'},{user_type,{8023,20},process_info_result_item,[]}]]}]]},{type,{8024,19},bounded_fun,[{type,{8024,19},'fun',[{type,{8024,19},product,[{var,{8024,20},'Pid'},{var,{8024,25},'ItemList'}]},{type,{8024,38},union,[{var,{8024,38},'InfoTupleList'},{type,{8024,54},nil,[]},{atom,{8024,59},undefined}]}]},[{type,{8025,7},constraint,[{atom,{8025,7},is_subtype},[{var,{8025,7},'Pid'},{type,{8025,14},pid,[]}]]},{type,{8026,7},constraint,[{atom,{8026,7},is_subtype},[{var,{8026,7},'ItemList'},{type,{8026,19},list,[{var,{8026,20},'Item'}]}]]},{type,{8027,7},constraint,[{atom,{8027,7},is_subtype},[{var,{8027,7},'Item'},{user_type,{8027,15},process_info_item,[]}]]},{type,{8028,7},constraint,[{atom,{8028,7},is_subtype},[{var,{8028,7},'InfoTupleList'},{type,{8028,24},list,[{var,{8028,25},'InfoTuple'}]}]]},{type,{8029,7},constraint,[{atom,{8029,7},is_subtype},[{var,{8029,7},'InfoTuple'},{user_type,{8029,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,process_flag,2},{7369,2},[<<112,114,111,99,101,115,115,95,102,108,97,103,40,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,110,100,105,99,97,116,101,100,32,116,111,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,118,97,108,117,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,10,111,102,32,116,104,101,32,102,108,97,103,46,10,10,96,70,108,97,103,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,97,115,121,110,99,95,100,105,115,116,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,32,125,10,32,32,10,32,32,69,110,97,98,108,101,32,111,114,32,100,105,115,97,98,108,101,32,95,102,117,108,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,105,110,103,95,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,100,105,115,97,98,108,101,100,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,101,110,100,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,101,100,10,32,32,115,105,103,110,97,108,32,119,105,108,108,32,98,108,111,99,107,32,105,110,32,116,104,101,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,32,105,102,32,116,104,101,32,98,117,102,102,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,32,32,99,104,97,110,110,101,108,32,114,101,97,99,104,32,116,104,101,32,91,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,122,100,98,98,108,41,46,32,84,104,101,10,32,32,112,114,111,99,101,115,115,32,119,105,108,108,32,114,101,109,97,105,110,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,98,117,102,102,101,114,32,115,104,114,105,110,107,115,32,101,110,111,117,103,104,46,32,84,104,105,115,32,109,105,103,104,116,32,105,110,32,115,111,109,101,10,32,32,99,97,115,101,115,32,116,97,107,101,32,97,32,115,117,98,115,116,97,110,116,105,97,108,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,46,32,87,104,101,110,32,96,97,115,121,110,99,95,100,105,115,116,96,32,105,115,32,101,110,97,98,108,101,100,44,32,115,101,110,100,10,32,32,111,112,101,114,97,116,105,111,110,115,32,111,102,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,32,119,105,108,108,32,97,108,119,97,121,115,32,98,117,102,102,101,114,32,116,104,101,32,115,105,103,110,97,108,32,111,110,32,116,104,101,32,111,117,116,103,111,105,110,103,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,97,110,100,32,116,104,101,110,32,105,109,109,101,100,105,97,116,101,108,121,32,114,101,116,117,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,115,101,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,10,32,32,119,105,108,108,32,95,110,101,118,101,114,95,32,98,108,111,99,107,32,116,104,101,32,115,101,110,100,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,83,105,110,99,101,32,110,111,32,102,108,111,119,32,99,111,110,116,114,111,108,32,105,115,32,101,110,102,111,114,99,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,104,101,110,32,96,97,115,121,110,99,95,100,105,115,116,96,10,32,32,62,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,101,110,97,98,108,101,100,44,32,121,111,117,32,110,101,101,100,32,116,111,32,109,97,107,101,32,115,117,114,101,32,116,104,97,116,32,102,108,111,119,32,99,111,110,116,114,111,108,32,102,111,114,32,115,117,99,104,32,100,97,116,97,10,32,32,62,32,105,115,32,105,109,112,108,101,109,101,110,116,101,100,44,32,111,114,32,116,104,97,116,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,117,99,104,32,100,97,116,97,32,105,115,32,107,110,111,119,110,32,116,111,32,97,108,119,97,121,115,32,98,101,32,108,105,109,105,116,101,100,46,10,32,32,62,32,85,110,108,105,109,105,116,101,100,32,115,105,103,110,97,108,105,110,103,32,119,105,116,104,32,96,97,115,121,110,99,95,100,105,115,116,96,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,102,108,111,119,32,99,111,110,116,114,111,108,10,32,32,62,32,119,105,108,108,32,116,121,112,105,99,97,108,108,121,32,99,97,117,115,101,32,116,104,101,32,115,101,110,100,105,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,99,114,97,115,104,32,111,110,32,97,110,32,111,117,116,32,111,102,32,109,101,109,111,114,121,10,32,32,62,32,99,111,110,100,105,116,105,111,110,46,10,32,32,10,32,32,66,108,111,99,107,105,110,103,32,100,117,101,32,116,111,32,100,105,115,97,98,108,101,100,32,96,97,115,121,110,99,95,100,105,115,116,96,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,98,121,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,41,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,32,117,115,105,110,103,32,116,104,101,10,32,32,91,96,98,117,115,121,95,100,105,115,116,95,112,111,114,116,96,93,40,35,98,117,115,121,95,100,105,115,116,95,112,111,114,116,41,32,111,112,116,105,111,110,46,32,79,110,108,121,32,100,97,116,97,32,98,117,102,102,101,114,101,100,32,98,121,10,32,32,112,114,111,99,101,115,115,101,115,32,119,104,105,99,104,32,40,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,115,101,110,100,105,110,103,32,97,32,115,105,103,110,97,108,41,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,96,97,115,121,110,99,95,100,105,115,116,96,10,32,32,119,105,108,108,32,98,101,32,99,111,117,110,116,101,100,32,119,104,101,110,32,100,101,116,101,114,109,105,110,105,110,103,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,97,110,32,111,112,101,114,97,116,105,111,110,32,115,104,111,117,108,100,32,98,108,111,99,107,32,116,104,101,10,32,32,99,97,108,108,101,114,46,10,32,32,10,32,32,84,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,111,110,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,105,116,32,117,115,105,110,103,10,32,32,116,104,101,32,91,96,115,112,97,119,110,95,111,112,116,40,41,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,66,73,70,32,119,105,116,104,32,116,104,101,32,111,112,116,105,111,110,10,32,32,91,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,125,96,93,40,35,115,112,97,119,110,95,111,112,116,95,97,115,121,110,99,95,100,105,115,116,41,46,32,84,104,101,32,100,101,102,97,117,108,116,10,32,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,116,111,32,117,115,101,32,111,110,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,112,97,100,41,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,102,32,116,104,101,32,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,112,97,115,115,101,100,44,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,119,105,108,108,32,98,101,32,96,102,97,108,115,101,96,46,10,32,32,10,32,32,89,111,117,32,99,97,110,32,105,110,115,112,101,99,116,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,111,102,32,97,32,112,114,111,99,101,115,115,32,98,121,10,32,32,99,97,108,108,105,110,103,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,97,115,121,110,99,95,100,105,115,116,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,41,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,116,114,97,112,95,101,120,105,116,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,32,125,10,32,32,10,32,32,87,104,101,110,32,96,116,114,97,112,95,101,120,105,116,96,32,105,115,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,114,105,118,105,110,103,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,114,101,10,32,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,99,101,105,118,101,100,32,97,115,10,32,32,111,114,100,105,110,97,114,121,32,109,101,115,115,97,103,101,115,46,32,73,102,32,96,116,114,97,112,95,101,120,105,116,96,32,105,115,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,105,102,32,105,116,10,32,32,114,101,99,101,105,118,101,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,111,116,104,101,114,32,116,104,97,110,32,96,110,111,114,109,97,108,96,32,97,110,100,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,116,111,10,32,32,105,116,115,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,65,112,112,108,105,99,97,116,105,111,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,116,111,32,116,114,97,112,32,101,120,105,116,115,46,10,32,32,10,32,32,83,101,101,32,97,108,115,111,32,96,101,120,105,116,47,50,96,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,109,111,100,117,108,101,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,101,114,114,111,114,95,104,97,110,100,108,101,114,32,125,10,32,32,10,32,32,85,115,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,116,111,32,114,101,100,101,102,105,110,101,32,116,104,101,32,96,109,58,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,110,100,10,32,32,117,110,100,101,102,105,110,101,100,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,101,115,46,32,85,115,101,32,116,104,105,115,32,102,108,97,103,32,119,105,116,104,32,115,117,98,115,116,97,110,116,105,97,108,32,99,97,117,116,105,111,110,44,32,97,115,32,99,111,100,101,10,32,32,97,117,116,111,45,108,111,97,100,105,110,103,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,99,111,114,114,101,99,116,32,111,112,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,109,111,100,117,108,101,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,10,32,32,102,117,108,108,115,119,101,101,112,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101,32,125,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,10,32,32,10,32,32,84,104,105,115,32,102,108,97,103,32,115,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,102,32,96,77,97,120,72,101,97,112,83,105,122,101,96,10,32,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32,96,107,105,108,108,96,32,97,110,100,32,96,101,114,114,111,114,95,108,111,103,103,101,114,96,32,97,114,101,32,117,115,101,100,46,10,32,32,10,32,32,70,111,114,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,101,32,104,101,97,112,32,103,114,111,119,115,44,32,115,101,101,10,32,32,91,83,105,122,105,110,103,32,116,104,101,32,104,101,97,112,93,40,71,97,114,98,97,103,101,67,111,108,108,101,99,116,105,111,110,46,109,100,35,115,105,122,105,110,103,45,116,104,101,45,104,101,97,112,41,32,105,110,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,10,32,32,10,32,32,45,32,42,42,96,115,105,122,101,96,42,42,32,45,32,84,104,101,32,109,97,120,105,109,117,109,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,115,101,116,32,116,111,32,122,101,114,111,44,32,116,104,101,10,32,32,32,32,104,101,97,112,32,115,105,122,101,32,108,105,109,105,116,32,105,115,32,100,105,115,97,98,108,101,100,46,32,96,98,97,100,97,114,103,96,32,105,115,32,98,101,32,116,104,114,111,119,110,32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,115,32,115,109,97,108,108,101,114,10,32,32,32,32,116,104,97,110,32,91,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101,41,46,32,84,104,101,32,115,105,122,101,32,99,104,101,99,107,10,32,32,32,32,105,115,32,111,110,108,121,32,100,111,110,101,32,119,104,101,110,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,10,32,32,10,32,32,32,32,96,115,105,122,101,96,32,105,115,32,116,104,101,32,101,110,116,105,114,101,32,104,101,97,112,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,10,32,32,32,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,97,108,108,32,103,101,110,101,114,97,116,105,111,110,97,108,32,104,101,97,112,115,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,44,32,97,110,121,10,32,32,32,32,91,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,44,10,32,32,32,32,97,110,100,32,97,110,121,32,101,120,116,114,97,32,109,101,109,111,114,121,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,111,114,32,110,101,101,100,115,32,100,117,114,105,110,103,32,99,111,108,108,101,99,116,105,111,110,46,10,32,32,10,32,32,32,32,96,115,105,122,101,96,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,117,115,105,110,103,10,32,32,32,32,91,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41,44,10,32,32,32,32,111,114,32,98,121,32,97,100,100,105,110,103,32,96,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,44,32,96,111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,32,97,110,100,32,96,109,98,117,102,95,115,105,122,101,96,32,102,114,111,109,10,32,32,32,32,91,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41,46,10,32,32,10,32,32,45,32,42,42,96,107,105,108,108,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,101,110,100,115,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,10,32,32,32,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,10,32,32,32,32,84,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,96,107,105,108,108,96,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,100,44,32,105,110,115,116,101,97,100,32,116,104,101,10,32,32,32,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,87,104,101,110,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,10,32,32,32,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,105,110,115,116,101,97,100,32,105,116,32,99,111,110,116,105,110,117,101,115,32,101,120,101,99,117,116,105,110,103,46,10,32,32,10,32,32,32,32,73,102,32,96,107,105,108,108,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,119,105,108,108,32,98,101,32,117,115,101,100,46,32,84,104,101,10,32,32,32,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,116,114,117,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,111,112,116,105,111,110,10,32,32,32,32,91,92,43,104,109,97,120,107,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,107,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,45,32,42,42,96,101,114,114,111,114,95,108,111,103,103,101,114,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,108,111,103,115,32,97,110,32,101,114,114,111,114,10,32,32,32,32,101,118,101,110,116,32,118,105,97,32,96,109,58,108,111,103,103,101,114,96,44,32,99,111,110,116,97,105,110,105,110,103,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,116,104,101,32,109,97,120,105,109,117,109,10,32,32,32,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,79,110,101,32,108,111,103,32,101,118,101,110,116,32,105,115,32,115,101,110,116,32,101,97,99,104,32,116,105,109,101,32,116,104,101,32,108,105,109,105,116,32,105,115,32,114,101,97,99,104,101,100,46,10,32,32,10,32,32,32,32,73,102,32,96,101,114,114,111,114,95,108,111,103,103,101,114,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,117,115,101,100,46,32,84,104,101,10,32,32,32,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,116,114,117,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,32,111,112,116,105,111,110,10,32,32,32,32,91,92,43,104,109,97,120,101,108,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,101,108,41,32,105,110,116,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,45,32,42,42,96,105,110,99,108,117,100,101,95,115,104,97,114,101,100,95,98,105,110,97,114,105,101,115,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,97,114,101,10,32,32,32,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,116,111,116,97,108,32,115,117,109,32,99,111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,96,115,105,122,101,96,32,108,105,109,105,116,46,32,79,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,10,32,32,32,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,108,97,114,103,101,114,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,109,97,121,32,98,101,32,115,104,97,114,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,10,32,32,32,32,111,102,32,97,32,115,104,97,114,101,100,32,98,105,110,97,114,121,32,105,115,32,105,110,99,108,117,100,101,100,32,98,121,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,114,105,110,103,32,105,116,46,32,65,108,115,111,44,10,32,32,32,32,116,104,101,32,101,110,116,105,114,101,32,115,105,122,101,32,111,102,32,97,32,108,97,114,103,101,32,98,105,110,97,114,121,32,109,97,121,32,98,101,32,105,110,99,108,117,100,101,100,32,101,118,101,110,32,105,102,32,111,110,108,121,32,97,32,115,109,97,108,108,101,114,32,112,97,114,116,10,32,32,32,32,111,102,32,105,116,32,105,115,32,114,101,102,101,114,114,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,32,32,73,102,32,96,105,110,99,108,117,100,101,95,115,104,97,114,101,100,95,98,105,110,97,114,105,101,115,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,10,32,32,32,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,102,97,108,115,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,10,32,32,32,32,111,112,116,105,111,110,32,91,92,43,104,109,97,120,105,98,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,105,98,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,84,104,101,32,104,101,97,112,32,115,105,122,101,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,113,117,105,116,101,32,104,97,114,100,32,116,111,32,112,114,101,100,105,99,116,44,32,101,115,112,101,99,105,97,108,108,121,32,116,104,101,32,97,109,111,117,110,116,32,111,102,10,32,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,99,111,110,116,101,109,112,108,97,116,105,110,103,32,117,115,105,110,103,32,116,104,105,115,10,32,32,111,112,116,105,111,110,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,102,105,114,115,116,32,114,117,110,32,105,116,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,119,105,116,104,32,96,107,105,108,108,96,32,115,101,116,32,116,111,10,32,32,96,102,97,108,115,101,96,32,97,110,100,32,105,110,115,112,101,99,116,32,116,104,101,32,108,111,103,32,101,118,101,110,116,115,32,116,111,32,115,101,101,32,119,104,97,116,32,116,104,101,32,110,111,114,109,97,108,32,112,101,97,107,32,115,105,122,101,115,32,111,102,32,116,104,101,10,32,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,97,110,100,32,116,104,101,110,32,116,117,110,101,32,116,104,101,32,118,97,108,117,101,32,97,99,99,111,114,100,105,110,103,108,121,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,32,125,10,32,32,10,32,32,68,101,116,101,114,109,105,110,101,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,114,101,32,115,116,111,114,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58,10,32,32,10,32,32,45,32,42,42,96,111,102,102,95,104,101,97,112,96,42,42,32,45,32,95,65,108,108,95,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,115,116,111,114,101,100,32,111,117,116,115,105,100,101,10,32,32,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32,95,110,111,95,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,10,32,32,32,32,112,97,114,116,32,111,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,45,32,42,42,96,111,110,95,104,101,97,112,96,42,42,32,45,32,65,108,108,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,98,101,32,112,108,97,99,101,100,32,111,110,10,32,32,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,101,121,32,99,97,110,44,32,104,111,119,101,118,101,114,44,32,98,101,32,116,101,109,112,111,114,97,114,105,108,121,32,115,116,111,114,101,100,32,111,102,102,32,116,104,101,32,104,101,97,112,46,32,84,104,105,115,10,32,32,32,32,105,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,97,108,119,97,121,115,32,98,101,101,110,32,115,116,111,114,101,100,32,117,112,32,117,110,116,105,108,32,69,82,84,83,32,56,46,48,46,10,32,32,10,32,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,113,100,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,32,32,10,32,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,109,97,121,32,112,111,116,101,110,116,105,97,108,108,121,32,97,99,99,117,109,117,108,97,116,101,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,105,110,32,105,116,115,10,32,32,113,117,101,117,101,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,115,101,116,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,116,111,32,96,111,102,102,95,104,101,97,112,96,46,32,84,104,105,115,32,105,115,32,100,117,101,32,116,111,32,116,104,101,10,32,32,102,97,99,116,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,10,32,32,109,101,115,115,97,103,101,115,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,32,99,97,110,32,98,101,99,111,109,101,32,101,120,116,114,101,109,101,108,121,32,101,120,112,101,110,115,105,118,101,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,110,10,32,32,99,111,110,115,117,109,101,32,108,97,114,103,101,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,46,32,84,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,10,32,32,105,115,44,32,104,111,119,101,118,101,114,44,32,103,101,110,101,114,97,108,108,121,32,98,101,116,116,101,114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,105,115,32,96,111,110,95,104,101,97,112,96,46,10,32,32,10,32,32,67,104,97,110,103,105,110,103,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,99,97,117,115,101,115,32,97,110,121,32,101,120,105,115,116,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,98,101,32,109,111,118,101,100,46,32,84,104,101,32,109,111,118,101,10,32,32,111,112,101,114,97,116,105,111,110,32,105,115,32,105,110,105,116,105,97,116,101,100,44,32,98,117,116,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,99,111,109,112,108,101,116,101,100,44,32,98,121,32,116,104,101,32,116,105,109,101,32,116,104,101,32,102,117,110,99,116,105,111,110,10,32,32,114,101,116,117,114,110,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,32,125,10,32,32,10,32,32,83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,46,32,96,76,101,118,101,108,96,32,105,115,32,97,110,32,97,116,111,109,46,32,70,111,117,114,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,115,32,101,120,105,115,116,58,10,32,32,96,108,111,119,96,44,32,96,110,111,114,109,97,108,96,44,32,96,104,105,103,104,96,44,32,97,110,100,32,96,109,97,120,96,46,32,68,101,102,97,117,108,116,32,105,115,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,80,114,105,111,114,105,116,121,32,108,101,118,101,108,32,96,109,97,120,96,32,105,115,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,110,116,101,114,110,97,108,32,117,115,101,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,62,32,115,121,115,116,101,109,44,32,97,110,100,32,105,115,32,95,110,111,116,95,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,111,116,104,101,114,115,46,10,32,32,10,32,32,73,110,116,101,114,110,97,108,108,121,32,105,110,32,101,97,99,104,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,44,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,115,99,104,101,100,117,108,101,100,32,105,110,32,97,32,114,111,117,110,100,32,114,111,98,105,110,10,32,32,102,97,115,104,105,111,110,46,10,32,32,10,32,32,69,120,101,99,117,116,105,111,110,32,111,102,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,32,97,110,100,32,96,108,111,119,96,32,97,114,101,32,105,110,116,101,114,108,101,97,118,101,100,46,32,80,114,111,99,101,115,115,101,115,10,32,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,108,101,115,115,32,102,114,101,113,117,101,110,116,108,121,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,10,32,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,10,32,32,111,114,32,96,110,111,114,109,97,108,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,116,104,105,115,32,100,111,101,115,32,95,110,111,116,95,32,109,101,97,110,10,32,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,32,111,114,32,96,110,111,114,109,97,108,96,32,99,97,110,32,114,117,110,32,119,104,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,10,32,32,114,117,110,110,105,110,103,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,87,104,101,110,32,117,115,105,110,103,32,109,117,108,116,105,112,108,101,32,115,99,104,101,100,117,108,101,114,115,44,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,99,97,110,10,32,32,98,101,32,114,117,110,110,105,110,103,32,105,110,32,112,97,114,97,108,108,101,108,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,84,104,97,116,32,105,115,44,32,97,32,96,108,111,119,96,32,97,110,100,32,97,10,32,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,110,32,101,120,101,99,117,116,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,10,32,32,10,32,32,87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,109,97,120,96,32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,44,10,32,32,96,110,111,114,109,97,108,96,44,32,111,114,32,96,104,105,103,104,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,65,115,32,119,105,116,104,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,44,10,32,32,112,114,111,99,101,115,115,101,115,32,111,110,32,108,111,119,101,114,32,112,114,105,111,114,105,116,105,101,115,32,99,97,110,32,101,120,101,99,117,116,101,32,105,110,32,112,97,114,97,108,108,101,108,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,10,32,32,96,109,97,120,96,46,10,32,32,10,32,32,83,99,104,101,100,117,108,105,110,103,32,105,115,32,112,114,101,45,101,109,112,116,105,118,101,46,32,82,101,103,97,114,100,108,101,115,115,32,111,102,32,112,114,105,111,114,105,116,121,44,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,114,101,45,101,109,112,116,101,100,32,119,104,101,110,10,32,32,105,116,32,104,97,115,32,99,111,110,115,117,109,101,100,32,109,111,114,101,32,116,104,97,110,32,97,32,99,101,114,116,97,105,110,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,10,32,32,119,97,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,115,99,104,101,100,117,108,105,110,103,32,116,111,32,114,101,109,97,105,110,32,101,120,97,99,116,108,121,32,97,115,32,105,116,32,105,115,32,116,111,100,97,121,46,32,83,99,104,101,100,117,108,105,110,103,10,32,32,62,32,105,115,32,108,105,107,101,108,121,32,116,111,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,32,116,111,32,117,115,101,32,97,118,97,105,108,97,98,108,101,32,112,114,111,99,101,115,115,111,114,32,99,111,114,101,115,10,32,32,62,32,98,101,116,116,101,114,46,10,32,32,10,32,32,84,104,101,114,101,32,105,115,32,95,110,111,95,32,97,117,116,111,109,97,116,105,99,32,109,101,99,104,97,110,105,115,109,32,102,111,114,32,97,118,111,105,100,105,110,103,32,112,114,105,111,114,105,116,121,32,105,110,118,101,114,115,105,111,110,44,32,115,117,99,104,32,97,115,10,32,32,112,114,105,111,114,105,116,121,32,105,110,104,101,114,105,116,97,110,99,101,32,111,114,32,112,114,105,111,114,105,116,121,32,99,101,105,108,105,110,103,115,46,32,87,104,101,110,32,117,115,105,110,103,32,112,114,105,111,114,105,116,105,101,115,44,32,116,97,107,101,32,116,104,105,115,32,105,110,116,111,10,32,32,97,99,99,111,117,110,116,32,97,110,100,32,104,97,110,100,108,101,32,115,117,99,104,32,115,99,101,110,97,114,105,111,115,32,98,121,32,121,111,117,114,115,101,108,102,46,10,32,32,10,32,32,77,97,107,105,110,103,32,99,97,108,108,115,32,102,114,111,109,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,105,110,116,111,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,115,32,110,111,32,99,111,110,116,114,111,108,10,32,32,111,118,101,114,32,99,97,110,32,99,97,117,115,101,32,116,104,101,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,111,32,119,97,105,116,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,119,105,116,104,32,108,111,119,101,114,10,32,32,112,114,105,111,114,105,116,121,46,32,84,104,97,116,32,105,115,44,32,101,102,102,101,99,116,105,118,101,108,121,32,100,101,99,114,101,97,115,105,110,103,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,10,32,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,46,32,69,118,101,110,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,32,119,105,116,104,32,111,110,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,10,32,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,118,101,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,44,32,105,116,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,10,32,32,105,116,46,32,84,104,105,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,111,99,99,117,114,32,105,102,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,114,105,103,103,101,114,115,32,99,111,100,101,10,32,32,108,111,97,100,105,110,103,44,32,97,115,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,114,117,110,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,79,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,116,104,97,110,32,96,110,111,114,109,97,108,96,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,87,104,101,110,32,111,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,10,32,32,97,114,101,32,117,115,101,100,44,32,117,115,101,32,116,104,101,109,32,119,105,116,104,32,99,97,114,101,44,32,95,101,115,112,101,99,105,97,108,108,121,95,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,65,32,112,114,111,99,101,115,115,32,111,110,10,32,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,32,105,115,32,111,110,108,121,32,116,111,32,112,101,114,102,111,114,109,32,119,111,114,107,32,102,111,114,32,115,104,111,114,116,32,112,101,114,105,111,100,115,46,32,66,117,115,121,32,108,111,111,112,105,110,103,32,102,111,114,32,108,111,110,103,10,32,32,112,101,114,105,111,100,115,32,105,110,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,117,115,101,115,32,109,111,115,116,32,108,105,107,101,108,121,32,112,114,111,98,108,101,109,115,44,32,97,115,32,105,109,112,111,114,116,97,110,116,10,32,32,79,84,80,32,115,101,114,118,101,114,115,32,114,117,110,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,115,97,118,101,95,99,97,108,108,115,44,32,48,46,46,49,48,48,48,48,41,10,32,32,96,96,96,10,32,32,10,32,32,96,78,96,32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32,48,46,46,49,48,48,48,48,46,32,73,102,32,96,78,96,32,62,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,109,97,100,101,10,32,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,78,96,32,109,111,115,116,32,114,101,99,101,110,116,10,32,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,66,73,70,32,99,97,108,108,115,44,32,115,101,110,100,115,44,32,97,110,100,32,114,101,99,101,105,118,101,115,32,109,97,100,101,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,10,32,32,115,97,118,101,100,32,105,110,32,97,32,108,105,115,116,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,10,32,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,108,97,115,116,95,99,97,108,108,115,41,96,93,40,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,41,46,32,65,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,105,115,10,32,32,111,110,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,109,111,100,117,108,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,109,101,110,116,105,111,110,101,100,46,32,79,110,108,121,32,97,32,102,105,120,101,100,10,32,32,97,109,111,117,110,116,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,115,97,118,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58,10,32,32,10,32,32,45,32,65,32,116,117,112,108,101,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,96,32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,10,32,32,45,32,84,104,101,32,97,116,111,109,115,32,96,115,101,110,100,96,44,32,96,39,114,101,99,101,105,118,101,39,96,44,32,97,110,100,32,96,116,105,109,101,111,117,116,96,32,102,111,114,32,115,101,110,100,115,32,97,110,100,32,114,101,99,101,105,118,101,115,10,32,32,32,32,40,96,39,114,101,99,101,105,118,101,39,96,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,97,110,100,32,96,116,105,109,101,111,117,116,96,32,119,104,101,110,32,97,32,114,101,99,101,105,118,101,32,116,105,109,101,115,10,32,32,32,32,111,117,116,41,10,32,32,10,32,32,73,102,32,96,78,96,32,61,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,32,32,87,104,101,110,101,118,101,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,115,101,116,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,114,101,115,101,116,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,83,101,116,115,32,111,114,32,99,108,101,97,114,115,32,102,108,97,103,32,96,115,101,110,115,105,116,105,118,101,96,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,10,32,32,109,97,114,107,101,100,32,97,115,32,115,101,110,115,105,116,105,118,101,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,116,114,117,101,41,96,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,102,101,97,116,117,114,101,115,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,101,120,97,109,105,110,105,110,103,32,116,104,101,32,100,97,116,97,32,111,114,32,105,110,110,101,114,32,119,111,114,107,105,110,103,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,97,114,101,32,115,105,108,101,110,116,108,121,32,100,105,115,97,98,108,101,100,46,10,32,32,10,32,32,70,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,100,105,115,97,98,108,101,100,32,105,110,99,108,117,100,101,32,40,98,117,116,32,97,114,101,32,110,111,116,32,108,105,109,105,116,101,100,32,116,111,41,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,32,32,10,32,32,45,32,84,114,97,99,105,110,103,46,32,84,114,97,99,101,32,102,108,97,103,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,98,117,116,32,110,111,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,10,32,32,32,32,111,102,32,97,110,121,32,107,105,110,100,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,32,40,73,102,32,102,108,97,103,32,96,115,101,110,115,105,116,105,118,101,96,32,105,115,32,116,117,114,110,101,100,32,111,102,102,44,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,10,32,32,32,32,97,114,101,32,97,103,97,105,110,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,110,121,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,115,101,116,46,41,10,32,32,45,32,83,101,113,117,101,110,116,105,97,108,32,116,114,97,99,105,110,103,46,32,84,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,110,111,10,32,32,32,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,10,32,32,10,32,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,44,50,96,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,32,116,111,32,114,101,97,100,32,111,117,116,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,100,105,99,116,105,111,110,97,114,121,32,40,98,111,116,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,101,109,112,116,121,32,108,105,115,116,115,41,46,10,32,32,10,32,32,83,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,99,97,110,110,111,116,32,98,101,32,100,105,115,112,108,97,121,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,73,110,32,99,114,97,115,104,32,100,117,109,112,115,44,32,116,104,101,32,115,116,97,99,107,44,32,109,101,115,115,97,103,101,115,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,114,101,32,111,109,105,116,116,101,100,46,10,32,32,10,32,32,73,102,32,96,123,115,97,118,101,95,99,97,108,108,115,44,78,125,96,32,104,97,115,32,98,101,101,110,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,110,111,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,115,97,118,101,100,32,116,111,10,32,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,46,32,40,84,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,110,111,116,32,99,108,101,97,114,101,100,46,32,65,108,115,111,44,32,115,101,110,100,44,32,114,101,99,101,105,118,101,44,10,32,32,97,110,100,32,116,105,109,101,45,111,117,116,32,101,118,101,110,116,115,32,97,114,101,32,115,116,105,108,108,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,46,41>>},#{group => processes,specification => [{attribute,{7665,2},spec,{{process_flag,2},[{type,{7665,19},bounded_fun,[{type,{7665,19},'fun',[{type,{7665,19},product,[{atom,{7665,20},async_dist},{var,{7665,32},'Boolean'}]},{var,{7665,44},'OldBoolean'}]},[{type,{7666,7},constraint,[{atom,{7666,7},is_subtype},[{var,{7666,7},'Boolean'},{type,{7666,18},boolean,[]}]]},{type,{7667,7},constraint,[{atom,{7667,7},is_subtype},[{var,{7667,7},'OldBoolean'},{type,{7667,21},boolean,[]}]]}]]},{type,{7668,19},bounded_fun,[{type,{7668,19},'fun',[{type,{7668,19},product,[{atom,{7668,20},trap_exit},{var,{7668,31},'Boolean'}]},{var,{7668,43},'OldBoolean'}]},[{type,{7669,7},constraint,[{atom,{7669,7},is_subtype},[{var,{7669,7},'Boolean'},{type,{7669,18},boolean,[]}]]},{type,{7670,7},constraint,[{atom,{7670,7},is_subtype},[{var,{7670,7},'OldBoolean'},{type,{7670,21},boolean,[]}]]}]]},{type,{7671,19},bounded_fun,[{type,{7671,19},'fun',[{type,{7671,19},product,[{atom,{7671,20},error_handler},{var,{7671,35},'Module'}]},{var,{7671,46},'OldModule'}]},[{type,{7672,7},constraint,[{atom,{7672,7},is_subtype},[{var,{7672,7},'Module'},{type,{7672,17},atom,[]}]]},{type,{7673,7},constraint,[{atom,{7673,7},is_subtype},[{var,{7673,7},'OldModule'},{type,{7673,20},atom,[]}]]}]]},{type,{7674,19},bounded_fun,[{type,{7674,19},'fun',[{type,{7674,19},product,[{atom,{7674,20},fullsweep_after},{var,{7674,37},'FullsweepAfter'}]},{var,{7674,56},'OldFullsweepAfter'}]},[{type,{7675,7},constraint,[{atom,{7675,7},is_subtype},[{var,{7675,7},'FullsweepAfter'},{type,{7675,25},non_neg_integer,[]}]]},{type,{7676,7},constraint,[{atom,{7676,7},is_subtype},[{var,{7676,7},'OldFullsweepAfter'},{type,{7676,28},non_neg_integer,[]}]]}]]},{type,{7677,19},bounded_fun,[{type,{7677,19},'fun',[{type,{7677,19},product,[{atom,{7677,20},min_heap_size},{var,{7677,35},'MinHeapSize'}]},{var,{7677,51},'OldMinHeapSize'}]},[{type,{7678,7},constraint,[{atom,{7678,7},is_subtype},[{var,{7678,7},'MinHeapSize'},{type,{7678,22},non_neg_integer,[]}]]},{type,{7679,7},constraint,[{atom,{7679,7},is_subtype},[{var,{7679,7},'OldMinHeapSize'},{type,{7679,25},non_neg_integer,[]}]]}]]},{type,{7680,19},bounded_fun,[{type,{7680,19},'fun',[{type,{7680,19},product,[{atom,{7680,20},min_bin_vheap_size},{var,{7680,40},'MinBinVHeapSize'}]},{var,{7680,60},'OldMinBinVHeapSize'}]},[{type,{7681,7},constraint,[{atom,{7681,7},is_subtype},[{var,{7681,7},'MinBinVHeapSize'},{type,{7681,26},non_neg_integer,[]}]]},{type,{7682,7},constraint,[{atom,{7682,7},is_subtype},[{var,{7682,7},'OldMinBinVHeapSize'},{type,{7682,29},non_neg_integer,[]}]]}]]},{type,{7683,19},bounded_fun,[{type,{7683,19},'fun',[{type,{7683,19},product,[{atom,{7683,20},max_heap_size},{var,{7683,35},'MaxHeapSize'}]},{var,{7683,51},'OldMaxHeapSize'}]},[{type,{7684,7},constraint,[{atom,{7684,7},is_subtype},[{var,{7684,7},'MaxHeapSize'},{user_type,{7684,22},max_heap_size,[]}]]},{type,{7685,7},constraint,[{atom,{7685,7},is_subtype},[{var,{7685,7},'OldMaxHeapSize'},{user_type,{7685,25},max_heap_size,[]}]]}]]},{type,{7686,19},bounded_fun,[{type,{7686,19},'fun',[{type,{7686,19},product,[{atom,{7686,20},message_queue_data},{var,{7686,40},'MQD'}]},{var,{7686,48},'OldMQD'}]},[{type,{7687,7},constraint,[{atom,{7687,7},is_subtype},[{var,{7687,7},'MQD'},{user_type,{7687,14},message_queue_data,[]}]]},{type,{7688,7},constraint,[{atom,{7688,7},is_subtype},[{var,{7688,7},'OldMQD'},{user_type,{7688,17},message_queue_data,[]}]]}]]},{type,{7689,19},bounded_fun,[{type,{7689,19},'fun',[{type,{7689,19},product,[{atom,{7689,20},priority},{var,{7689,30},'Level'}]},{var,{7689,40},'OldLevel'}]},[{type,{7690,7},constraint,[{atom,{7690,7},is_subtype},[{var,{7690,7},'Level'},{user_type,{7690,16},priority_level,[]}]]},{type,{7691,7},constraint,[{atom,{7691,7},is_subtype},[{var,{7691,7},'OldLevel'},{user_type,{7691,19},priority_level,[]}]]}]]},{type,{7692,19},bounded_fun,[{type,{7692,19},'fun',[{type,{7692,19},product,[{atom,{7692,20},save_calls},{var,{7692,32},'N'}]},{var,{7692,38},'OldN'}]},[{type,{7693,7},constraint,[{atom,{7693,7},is_subtype},[{var,{7693,7},'N'},{type,{7693,12},range,[{integer,{7693,12},0},{integer,{7693,15},10000}]}]]},{type,{7694,7},constraint,[{atom,{7694,7},is_subtype},[{var,{7694,7},'OldN'},{type,{7694,15},range,[{integer,{7694,15},0},{integer,{7694,18},10000}]}]]}]]},{type,{7695,19},bounded_fun,[{type,{7695,19},'fun',[{type,{7695,19},product,[{atom,{7695,20},sensitive},{var,{7695,31},'Boolean'}]},{var,{7695,43},'OldBoolean'}]},[{type,{7696,7},constraint,[{atom,{7696,7},is_subtype},[{var,{7696,7},'Boolean'},{type,{7696,18},boolean,[]}]]},{type,{7697,7},constraint,[{atom,{7697,7},is_subtype},[{var,{7697,7},'OldBoolean'},{type,{7697,21},boolean,[]}]]}]]},{type,{7699,19},'fun',[{type,{7699,19},product,[{type,{7699,20},tuple,[{atom,{7699,21},monitor_nodes},{type,{7699,36},term,[]}]},{type,{7699,45},term,[]}]},{type,{7699,56},term,[]}]},{type,{7700,19},'fun',[{type,{7700,19},product,[{atom,{7700,20},monitor_nodes},{type,{7700,35},term,[]}]},{type,{7700,46},term,[]}]}]}}]}},{{function,open_port,2},{7025,2},[<<111,112,101,110,95,112,111,114,116,40,80,111,114,116,78,97,109,101,44,32,80,111,114,116,83,101,116,116,105,110,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,111,112,101,110,105,110,103,32,97,32,110,101,119,32,69,114,108,97,110,103,32,112,111,114,116,46,32,65,32,112,111,114,116,32,99,97,110,10,98,101,32,115,101,101,110,32,97,115,32,97,110,32,101,120,116,101,114,110,97,108,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,99,100,96,44,32,96,101,110,118,96,44,10,96,97,114,103,115,96,44,32,97,110,100,32,96,97,114,103,48,96,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,105,102,32,116,104,101,32,115,121,115,116,101,109,32,105,115,10,114,117,110,110,105,110,103,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,46,32,84,111,32,97,118,111,105,100,32,116,114,97,110,115,108,97,116,105,111,110,32,111,114,32,116,111,32,102,111,114,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,10,85,84,70,45,56,44,32,115,117,112,112,108,121,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,110,100,47,111,114,32,97,114,103,117,109,101,110,116,115,32,97,115,32,97,32,98,105,110,97,114,121,32,105,110,32,116,104,101,32,99,111,114,114,101,99,116,10,101,110,99,111,100,105,110,103,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32,116,104,101,32,109,111,100,117,108,101,32,96,109,58,102,105,108,101,96,44,32,116,104,101,32,102,117,110,99,116,105,111,110,10,96,102,105,108,101,58,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48,96,32,105,110,32,75,101,114,110,101,108,44,32,97,110,100,32,116,104,101,10,91,96,85,115,105,110,103,32,85,110,105,99,111,100,101,32,105,110,32,69,114,108,97,110,103,96,93,40,96,101,58,115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101,46,109,100,96,41,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,110,97,109,101,32,40,105,102,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,41,32,99,97,110,32,111,110,108,121,32,98,101,32,62,32,50,53,53,32,105,102,32,116,104,101,10,62,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,109,111,100,101,46,10,62,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,105,115,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,10,62,32,115,101,116,46,10,10,96,80,111,114,116,78,97,109,101,96,115,58,10,10,45,32,42,42,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,42,42,32,45,32,83,116,97,114,116,115,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,46,32,96,67,111,109,109,97,110,100,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,10,32,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,116,111,32,98,101,32,114,117,110,46,32,96,67,111,109,109,97,110,100,96,32,114,117,110,115,32,111,117,116,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,10,32,32,117,110,108,101,115,115,32,97,110,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,96,67,111,109,109,97,110,100,96,32,105,115,32,102,111,117,110,100,46,32,73,102,32,102,111,117,110,100,44,32,116,104,97,116,10,32,32,100,114,105,118,101,114,32,105,115,32,115,116,97,114,116,101,100,46,32,65,32,100,114,105,118,101,114,32,114,117,110,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,97,116,32,105,116,10,32,32,105,115,32,108,105,110,107,101,100,32,119,105,116,104,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,70,111,114,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,44,32,96,80,65,84,72,96,32,105,115,32,115,101,97,114,99,104,101,100,32,40,111,114,32,97,110,32,101,113,117,105,118,97,108,101,110,116,32,109,101,116,104,111,100,32,105,115,32,117,115,101,100,32,116,111,10,32,32,102,105,110,100,32,112,114,111,103,114,97,109,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,79,83,41,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,98,121,32,105,110,118,111,107,105,110,103,32,116,104,101,32,115,104,101,108,108,32,111,110,10,32,32,99,101,114,116,97,105,110,32,112,108,97,116,102,111,114,109,115,46,32,84,104,101,32,102,105,114,115,116,32,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,105,115,10,32,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,40,111,114,32,100,114,105,118,101,114,41,46,32,84,104,105,115,32,40,97,109,111,110,103,32,111,116,104,101,114,10,32,32,116,104,105,110,103,115,41,32,109,97,107,101,115,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,115,117,105,116,97,98,108,101,32,102,111,114,32,114,117,110,110,105,110,103,32,112,114,111,103,114,97,109,115,32,119,105,116,104,32,115,112,97,99,101,115,32,105,110,10,32,32,102,105,108,101,110,97,109,101,115,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,46,32,73,102,32,115,112,97,99,101,115,32,105,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,100,101,115,105,114,101,100,44,10,32,32,117,115,101,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,96,32,105,110,115,116,101,97,100,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,79,110,32,85,110,105,120,32,115,121,115,116,101,109,115,44,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,112,97,115,115,101,100,32,116,111,32,97,32,110,101,119,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,32,97,115,10,32,32,62,32,97,110,32,97,114,114,97,121,32,111,102,32,115,116,114,105,110,103,115,32,98,117,116,32,111,110,32,87,105,110,100,111,119,115,32,105,116,32,105,115,32,117,112,32,116,111,32,116,104,101,32,99,104,105,108,100,32,112,114,111,99,101,115,115,32,116,111,32,112,97,114,115,101,10,32,32,62,32,116,104,101,109,32,97,110,100,32,115,111,109,101,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,115,32,109,97,121,32,97,112,112,108,121,32,116,104,101,105,114,32,111,119,110,32,114,117,108,101,115,44,32,119,104,105,99,104,32,97,114,101,10,32,32,62,32,105,110,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,32,116,104,101,32,115,116,97,110,100,97,114,100,32,67,32,114,117,110,116,105,109,101,32,96,97,114,103,118,96,32,112,97,114,115,105,110,103,46,10,32,32,62,10,32,32,62,32,84,104,105,115,32,105,115,32,112,97,114,116,105,99,117,108,97,114,108,121,32,116,114,111,117,98,108,101,115,111,109,101,32,119,104,101,110,32,105,110,118,111,107,105,110,103,32,96,46,98,97,116,96,44,32,96,46,99,109,100,96,44,32,111,114,32,96,46,99,111,109,96,10,32,32,62,32,102,105,108,101,115,32,97,115,32,116,104,101,115,101,32,114,117,110,32,105,109,112,108,105,99,105,116,108,121,32,116,104,114,111,117,103,104,32,96,99,109,100,46,101,120,101,96,44,32,119,104,111,115,101,32,97,114,103,117,109,101,110,116,32,112,97,114,115,105,110,103,32,105,115,10,32,32,62,32,118,117,108,110,101,114,97,98,108,101,32,116,111,32,109,97,108,105,99,105,111,117,115,32,105,110,112,117,116,32,97,110,100,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,114,117,110,32,97,114,98,105,116,114,97,114,121,32,115,104,101,108,108,10,32,32,62,32,99,111,109,109,97,110,100,115,46,10,32,32,62,10,32,32,62,32,84,104,101,114,101,102,111,114,101,44,32,105,102,32,121,111,117,32,97,114,101,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,32,97,110,100,32,121,111,117,32,101,120,101,99,117,116,101,32,98,97,116,99,104,32,102,105,108,101,115,32,111,114,10,32,32,62,32,96,46,99,111,109,96,32,97,112,112,108,105,99,97,116,105,111,110,115,44,32,121,111,117,32,109,117,115,116,32,110,111,116,32,112,97,115,115,32,117,110,116,114,117,115,116,101,100,32,105,110,112,117,116,32,97,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,10,32,32,62,32,112,114,111,103,114,97,109,46,32,84,104,105,115,32,97,102,102,101,99,116,115,32,98,111,116,104,32,96,115,112,97,119,110,96,32,97,110,100,32,96,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,96,46,10,10,45,32,42,42,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,42,42,32,45,32,87,111,114,107,115,32,108,105,107,101,32,96,123,115,112,97,119,110,44,32,70,105,108,101,78,97,109,101,125,96,44,32,98,117,116,32,111,110,108,121,10,32,32,114,117,110,115,32,101,120,116,101,114,110,97,108,32,101,120,101,99,117,116,97,98,108,101,115,46,32,96,70,105,108,101,78,97,109,101,96,32,105,110,32,105,116,115,32,119,104,111,108,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,101,120,101,99,117,116,97,98,108,101,44,32,105,110,99,108,117,100,105,110,103,32,97,110,121,32,115,112,97,99,101,115,46,32,73,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,116,111,32,98,101,32,112,97,115,115,101,100,44,32,116,104,101,10,32,32,96,80,111,114,116,83,101,116,116,105,110,103,115,96,32,96,97,114,103,115,96,32,97,110,100,32,96,97,114,103,48,96,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,32,32,84,104,101,32,115,104,101,108,108,32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32,105,110,118,111,107,101,100,32,116,111,32,115,116,97,114,116,32,116,104,101,32,112,114,111,103,114,97,109,44,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,10,32,32,100,105,114,101,99,116,108,121,46,32,96,80,65,84,72,96,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,105,115,32,110,111,116,32,115,101,97,114,99,104,101,100,46,32,84,111,32,102,105,110,100,32,97,32,112,114,111,103,114,97,109,32,105,110,32,96,80,65,84,72,96,10,32,32,116,111,32,101,120,101,99,117,116,101,44,32,117,115,101,32,96,111,115,58,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49,96,46,10,10,32,32,79,110,108,121,32,105,102,32,97,32,115,104,101,108,108,32,115,99,114,105,112,116,32,111,114,32,96,46,98,97,116,96,32,102,105,108,101,32,105,115,32,101,120,101,99,117,116,101,100,44,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,109,109,97,110,100,10,32,32,105,110,116,101,114,112,114,101,116,101,114,32,105,115,32,105,110,118,111,107,101,100,32,105,109,112,108,105,99,105,116,108,121,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,99,111,109,109,97,110,100,45,97,114,103,117,109,101,110,116,10,32,32,101,120,112,97,110,115,105,111,110,32,111,114,32,105,109,112,108,105,99,105,116,32,96,80,65,84,72,96,32,115,101,97,114,99,104,46,10,10,32,32,73,102,32,96,70,105,108,101,78,97,109,101,96,32,99,97,110,110,111,116,32,98,101,32,114,117,110,44,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105,115,101,100,44,32,119,105,116,104,32,116,104,101,32,80,79,83,73,88,10,32,32,101,114,114,111,114,32,99,111,100,101,32,97,115,32,116,104,101,32,114,101,97,115,111,110,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,79,83,115,46,32,84,121,112,105,99,97,108,108,121,10,32,32,116,104,101,32,101,114,114,111,114,32,96,101,110,111,101,110,116,96,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,114,117,110,32,97,32,112,114,111,103,114,97,109,32,116,104,97,116,32,105,115,10,32,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,96,101,97,99,99,101,115,96,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,105,108,101,32,105,115,32,110,111,116,32,101,120,101,99,117,116,97,98,108,101,46,10,10,45,32,42,42,96,123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,67,111,109,109,97,110,100,125,96,42,42,32,45,32,87,111,114,107,115,32,108,105,107,101,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,98,117,116,32,100,101,109,97,110,100,115,32,116,104,101,10,32,32,102,105,114,115,116,32,40,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,41,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,116,111,32,98,101,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,97,100,101,100,10,32,32,100,114,105,118,101,114,46,32,73,102,32,110,111,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,97,116,32,110,97,109,101,32,105,115,32,108,111,97,100,101,100,44,32,97,32,96,98,97,100,97,114,103,96,32,101,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,45,32,42,42,96,123,102,100,44,32,73,110,44,32,79,117,116,125,96,42,42,32,45,32,65,108,108,111,119,115,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,111,32,97,99,99,101,115,115,32,97,110,121,32,99,117,114,114,101,110,116,108,121,32,111,112,101,110,101,100,10,32,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,117,115,101,100,32,98,121,32,69,114,108,97,110,103,46,32,84,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,96,73,110,96,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,10,32,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,44,32,97,110,100,32,116,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,96,79,117,116,96,32,102,111,114,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,32,73,116,32,105,115,32,111,110,108,121,10,32,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,115,101,114,118,101,114,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,79,83,32,40,96,115,104,101,108,108,96,32,97,110,100,32,96,117,115,101,114,96,41,46,32,72,101,110,99,101,44,32,105,116,115,32,117,115,101,10,32,32,105,115,32,108,105,109,105,116,101,100,46,10,10,96,80,111,114,116,83,101,116,116,105,110,103,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,101,116,116,105,110,103,115,32,102,111,114,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,118,97,108,105,100,32,115,101,116,116,105,110,103,115,32,97,114,101,32,97,115,10,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,123,112,97,99,107,101,116,44,32,78,125,96,42,42,32,45,32,77,101,115,115,97,103,101,115,32,97,114,101,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,101,105,114,32,108,101,110,103,116,104,44,32,115,101,110,116,32,105,110,32,96,78,96,32,98,121,116,101,115,44,10,32,32,119,105,116,104,32,116,104,101,32,109,111,115,116,32,115,105,103,110,105,102,105,99,97,110,116,32,98,121,116,101,32,102,105,114,115,116,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32,96,78,96,32,97,114,101,32,49,44,32,50,44,10,32,32,97,110,100,32,52,46,10,10,45,32,42,42,96,115,116,114,101,97,109,96,42,42,32,45,32,79,117,116,112,117,116,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,105,116,104,111,117,116,32,112,97,99,107,101,116,32,108,101,110,103,116,104,115,46,32,65,32,117,115,101,114,45,100,101,102,105,110,101,100,10,32,32,112,114,111,116,111,99,111,108,32,109,117,115,116,32,98,101,32,117,115,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,111,98,106,101,99,116,46,10,10,45,32,42,42,96,123,108,105,110,101,44,32,76,125,96,42,42,32,45,32,77,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,111,110,32,97,32,112,101,114,32,108,105,110,101,32,98,97,115,105,115,46,32,69,97,99,104,32,108,105,110,101,10,32,32,40,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,32,105,115,32,100,101,108,105,118,101,114,101,100,32,105,110,32,97,32,115,105,110,103,108,101,10,32,32,109,101,115,115,97,103,101,46,32,84,104,101,32,109,101,115,115,97,103,101,32,100,97,116,97,32,102,111,114,109,97,116,32,105,115,32,96,123,70,108,97,103,44,32,76,105,110,101,125,96,44,32,119,104,101,114,101,32,96,70,108,97,103,96,32,105,115,32,96,101,111,108,96,32,111,114,10,32,32,96,110,111,101,111,108,96,44,32,97,110,100,32,96,76,105,110,101,96,32,105,115,32,116,104,101,32,100,97,116,97,32,100,101,108,105,118,101,114,101,100,32,40,119,105,116,104,111,117,116,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,46,10,10,32,32,96,76,96,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,108,105,110,101,32,108,101,110,103,116,104,32,105,110,32,98,121,116,101,115,46,32,76,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,105,115,32,97,114,101,10,32,32,100,101,108,105,118,101,114,101,100,32,105,110,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,109,101,115,115,97,103,101,44,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,32,116,111,32,96,110,111,101,111,108,96,32,102,111,114,32,97,108,108,32,98,117,116,32,116,104,101,10,32,32,108,97,115,116,32,109,101,115,115,97,103,101,46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,97,110,121,119,104,101,114,101,32,101,108,115,101,32,116,104,97,110,32,105,109,109,101,100,105,97,116,101,108,121,10,32,32,102,111,108,108,111,119,105,110,103,32,97,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,116,104,101,32,108,97,115,116,32,108,105,110,101,32,105,115,32,97,108,115,111,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,10,32,32,116,111,32,96,110,111,101,111,108,96,46,32,79,116,104,101,114,119,105,115,101,32,108,105,110,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,32,116,111,32,96,101,111,108,96,46,10,10,32,32,84,104,101,32,96,123,112,97,99,107,101,116,44,32,78,125,96,32,97,110,100,32,96,123,108,105,110,101,44,32,76,125,96,32,115,101,116,116,105,110,103,115,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46,10,10,45,32,42,42,96,123,99,100,44,32,68,105,114,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,32,97,110,100,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,32,84,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,115,116,97,114,116,115,32,117,115,105,110,103,32,96,68,105,114,96,32,97,115,32,105,116,115,10,32,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,46,32,96,68,105,114,96,32,109,117,115,116,32,98,101,32,97,32,115,116,114,105,110,103,46,10,10,45,32,42,42,96,123,101,110,118,44,32,69,110,118,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,97,110,100,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,10,32,32,84,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,116,104,101,32,115,116,97,114,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,101,120,116,101,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,10,32,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,96,69,110,118,96,46,10,10,32,32,96,69,110,118,96,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,96,123,78,97,109,101,44,32,86,97,108,125,96,44,32,119,104,101,114,101,32,96,78,97,109,101,96,32,105,115,32,97,32,96,116,58,111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,47,48,96,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,97,110,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,44,32,97,110,100,32,96,86,97,108,96,32,105,115,32,97,32,96,116,58,111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,47,48,96,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,105,116,32,105,115,32,116,111,32,104,97,118,101,32,105,110,32,116,104,101,32,115,112,97,119,110,101,100,32,112,111,114,116,32,112,114,111,99,101,115,115,46,32,66,111,116,104,32,96,78,97,109,101,96,32,97,110,100,32,96,86,97,108,96,32,109,117,115,116,10,32,32,98,101,32,115,116,114,105,110,103,115,46,10,10,32,32,73,102,32,96,86,97,108,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,97,116,111,109,32,96,102,97,108,115,101,96,32,111,114,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,40,116,104,97,116,32,105,115,32,96,34,34,96,32,111,114,32,96,91,93,96,41,44,32,111,112,101,110,95,112,111,114,116,10,32,32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,116,104,111,115,101,32,118,97,114,105,97,98,108,101,115,32,117,110,115,101,116,32,106,117,115,116,32,97,115,32,105,102,32,96,111,115,58,117,110,115,101,116,101,110,118,47,49,96,32,104,97,100,32,98,101,101,110,32,99,97,108,108,101,100,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,110,99,111,100,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,115,44,32,115,101,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,121,112,101,115,10,32,32,102,111,114,32,96,78,97,109,101,96,32,97,110,100,32,96,86,97,108,96,46,10,10,45,32,42,42,96,123,97,114,103,115,44,32,91,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,32,93,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,97,110,100,32,115,112,101,99,105,102,105,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,69,97,99,104,10,32,32,97,114,103,117,109,101,110,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,115,116,114,105,110,103,32,97,110,100,32,40,111,110,32,85,110,105,120,41,32,101,118,101,110,116,117,97,108,108,121,32,101,110,100,115,32,117,112,32,97,115,10,32,32,111,110,101,32,101,108,101,109,101,110,116,32,101,97,99,104,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,46,32,79,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,97,32,115,105,109,105,108,97,114,10,32,32,98,101,104,97,118,105,111,114,32,105,115,32,109,105,109,105,99,107,101,100,46,10,10,32,32,84,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,101,120,112,97,110,100,101,100,32,98,121,32,116,104,101,32,115,104,101,108,108,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,10,32,32,101,120,101,99,117,116,97,98,108,101,46,32,77,111,115,116,32,110,111,116,97,98,108,121,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,102,105,108,101,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,10,32,32,111,99,99,117,114,46,32,84,111,32,101,120,112,97,110,100,32,119,105,108,100,99,97,114,100,115,32,102,111,114,32,116,104,101,32,97,114,103,117,109,101,110,116,115,44,32,117,115,101,32,96,102,105,108,101,108,105,98,58,119,105,108,100,99,97,114,100,47,49,96,46,32,78,111,116,105,99,101,10,32,32,116,104,97,116,32,101,118,101,110,32,105,102,32,116,104,101,32,112,114,111,103,114,97,109,32,105,115,32,97,32,85,110,105,120,32,115,104,101,108,108,32,115,99,114,105,112,116,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,115,104,101,108,108,10,32,32,117,108,116,105,109,97,116,101,108,121,32,105,115,32,105,110,118,111,107,101,100,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,44,32,97,110,100,32,116,104,101,32,115,99,114,105,112,116,32,105,115,10,32,32,112,114,111,118,105,100,101,100,32,119,105,116,104,32,116,104,101,32,117,110,116,111,117,99,104,101,100,32,97,114,103,117,109,101,110,116,115,46,32,79,110,32,87,105,110,100,111,119,115,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,105,115,10,32,32,97,108,119,97,121,115,32,117,112,32,116,111,32,116,104,101,32,112,114,111,103,114,97,109,32,105,116,115,101,108,102,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,105,115,32,110,111,116,32,97,110,32,105,115,115,117,101,46,10,10,32,32,84,104,101,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,40,97,108,115,111,32,107,110,111,119,110,32,97,115,32,96,97,114,103,118,91,48,93,96,41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,105,115,10,32,32,108,105,115,116,46,32,84,104,101,32,112,114,111,112,101,114,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,115,101,100,32,97,115,32,96,97,114,103,118,91,48,93,96,44,32,119,104,101,114,101,10,32,32,97,112,112,108,105,99,97,98,108,101,46,10,10,32,32,73,102,32,121,111,117,32,101,120,112,108,105,99,105,116,108,121,32,119,97,110,116,32,116,111,32,115,101,116,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,44,32,111,112,116,105,111,110,10,32,32,96,97,114,103,48,96,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,45,32,42,42,96,123,97,114,103,48,44,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,97,110,100,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,10,32,32,97,114,103,117,109,101,110,116,32,119,104,101,110,32,114,117,110,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,46,32,84,104,105,115,32,99,97,110,32,105,110,32,115,111,109,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,111,110,32,115,111,109,101,10,32,32,79,83,115,44,32,98,101,32,100,101,115,105,114,97,98,108,101,46,32,72,111,119,32,116,104,101,32,112,114,111,103,114,97,109,32,114,101,115,112,111,110,100,115,32,116,111,32,116,104,105,115,32,105,115,32,104,105,103,104,108,121,32,115,121,115,116,101,109,45,100,101,112,101,110,100,101,110,116,10,32,32,97,110,100,32,110,111,32,115,112,101,99,105,102,105,99,32,101,102,102,101,99,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,46,10,10,45,32,42,42,96,101,120,105,116,95,115,116,97,116,117,115,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,119,104,101,114,101,32,96,67,111,109,109,97,110,100,96,32,114,101,102,101,114,115,10,32,32,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,44,32,97,110,100,32,102,111,114,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,10,10,32,32,87,104,101,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,101,120,105,116,115,44,32,97,32,109,101,115,115,97,103,101,32,111,102,32,116,104,101,32,102,111,114,109,10,32,32,96,123,80,111,114,116,44,123,101,120,105,116,95,115,116,97,116,117,115,44,83,116,97,116,117,115,125,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,44,32,119,104,101,114,101,32,96,83,116,97,116,117,115,96,10,32,32,105,115,32,116,104,101,32,101,120,105,116,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,112,114,111,103,114,97,109,32,97,98,111,114,116,115,32,111,110,32,85,110,105,120,44,32,116,104,101,10,32,32,115,97,109,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,104,101,108,108,115,32,100,111,32,40,116,104,97,116,32,105,115,44,32,49,50,56,43,115,105,103,110,97,108,41,46,10,10,32,32,73,102,32,111,112,116,105,111,110,32,96,101,111,102,96,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,108,115,111,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,96,101,111,102,96,32,97,110,100,32,96,101,120,105,116,95,115,116,97,116,117,115,96,32,97,112,112,101,97,114,10,32,32,105,110,32,97,110,32,117,110,115,112,101,99,105,102,105,101,100,32,111,114,100,101,114,46,10,10,45,32,42,42,96,117,115,101,95,115,116,100,105,111,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,32,97,110,100,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,32,73,116,32,97,108,108,111,119,115,32,116,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,111,117,116,112,117,116,32,40,102,105,108,101,10,32,32,100,101,115,99,114,105,112,116,111,114,115,32,48,32,97,110,100,32,49,41,32,111,102,32,116,104,101,32,115,112,97,119,110,101,100,32,40,85,110,105,120,41,32,112,114,111,99,101,115,115,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,10,32,32,69,114,108,97,110,103,46,10,10,45,32,42,42,96,110,111,117,115,101,95,115,116,100,105,111,96,42,42,32,45,32,84,104,101,32,111,112,112,111,115,105,116,101,32,111,102,32,96,117,115,101,95,115,116,100,105,111,96,46,32,73,116,32,117,115,101,115,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,51,10,32,32,97,110,100,32,52,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46,10,10,45,32,42,42,96,115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116,96,42,42,32,45,32,65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,46,32,84,104,101,32,101,120,101,99,117,116,101,100,10,32,32,112,114,111,103,114,97,109,32,103,101,116,115,32,105,116,115,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,32,102,105,108,101,32,114,101,100,105,114,101,99,116,101,100,32,116,111,32,105,116,115,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,102,105,108,101,46,10,32,32,96,115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116,96,32,97,110,100,32,96,110,111,117,115,101,95,115,116,100,105,111,96,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46,10,10,45,32,42,42,96,111,118,101,114,108,97,112,112,101,100,95,105,111,96,42,42,32,45,32,65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,32,111,110,32,87,105,110,100,111,119,115,32,111,110,108,121,46,32,84,104,101,10,32,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,104,97,110,100,108,101,115,32,111,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,97,114,101,44,32,105,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,115,117,112,112,108,105,101,100,44,32,111,112,101,110,101,100,32,119,105,116,104,32,102,108,97,103,32,96,70,73,76,69,95,70,76,65,71,95,79,86,69,82,76,65,80,80,69,68,96,44,32,115,111,32,116,104,97,116,32,116,104,101,32,112,111,114,116,10,32,32,112,114,111,103,114,97,109,32,99,97,110,32,40,97,110,100,32,109,117,115,116,41,32,100,111,32,111,118,101,114,108,97,112,112,101,100,32,73,47,79,32,111,110,32,105,116,115,32,115,116,97,110,100,97,114,100,32,104,97,110,100,108,101,115,46,32,84,104,105,115,32,105,115,32,110,111,116,10,32,32,110,111,114,109,97,108,108,121,32,116,104,101,32,99,97,115,101,32,102,111,114,32,115,105,109,112,108,101,32,112,111,114,116,32,112,114,111,103,114,97,109,115,44,32,98,117,116,32,97,110,32,111,112,116,105,111,110,32,111,102,32,118,97,108,117,101,32,102,111,114,32,116,104,101,10,32,32,101,120,112,101,114,105,101,110,99,101,100,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,109,101,114,46,32,95,79,110,32,97,108,108,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,10,32,32,115,105,108,101,110,116,108,121,32,100,105,115,99,97,114,100,101,100,46,95,10,10,45,32,42,42,96,105,110,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,105,110,112,117,116,46,10,10,45,32,42,42,96,111,117,116,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,111,117,116,112,117,116,46,10,10,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,115,32,97,115,32,111,112,112,111,115,101,100,32,116,111,10,32,32,108,105,115,116,115,32,111,102,32,98,121,116,101,115,46,10,10,45,32,42,42,96,101,111,102,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,10,32,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,46,32,73,110,115,116,101,97,100,44,32,105,116,32,114,101,109,97,105,110,115,32,111,112,101,110,32,97,110,100,32,97,32,96,123,80,111,114,116,44,32,101,111,102,125,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,10,32,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,104,111,108,100,105,110,103,32,116,104,101,32,112,111,114,116,46,10,10,45,32,42,42,96,104,105,100,101,96,42,42,32,45,32,87,104,101,110,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,44,32,115,117,112,112,114,101,115,115,101,115,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,99,111,110,115,111,108,101,10,32,32,119,105,110,100,111,119,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,46,32,40,84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,111,116,104,101,114,10,32,32,112,108,97,116,102,111,114,109,115,46,41,10,10,45,32,42,42,96,123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125,96,42,42,32,45,32,91,93,40,41,123,58,32,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,32,125,32,83,101,116,115,32,115,99,104,101,100,117,108,101,114,10,32,32,104,105,110,116,32,102,111,114,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,46,32,73,102,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,115,99,104,101,100,117,108,101,115,10,32,32,112,111,114,116,32,116,97,115,107,115,59,32,119,104,101,110,32,100,111,105,110,103,32,115,111,44,32,105,116,32,105,109,112,114,111,118,101,115,32,112,97,114,97,108,108,101,108,105,115,109,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,115,101,116,32,116,111,10,32,32,96,102,97,108,115,101,96,44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,116,114,105,101,115,32,116,111,32,112,101,114,102,111,114,109,32,112,111,114,116,32,116,97,115,107,115,32,105,109,109,101,100,105,97,116,101,108,121,44,10,32,32,105,109,112,114,111,118,105,110,103,32,108,97,116,101,110,99,121,32,97,116,32,116,104,101,32,101,120,112,101,110,115,101,32,111,102,32,112,97,114,97,108,108,101,108,105,115,109,46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,10,32,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,112,112,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,112,112,41,32,116,111,10,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,42,42,96,123,98,117,115,121,95,108,105,109,105,116,115,95,112,111,114,116,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125,96,42,42,32,45,32,83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,10,32,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,46,10,10,32,32,87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,105,110,116,101,114,110,97,108,32,111,117,116,112,117,116,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,10,32,32,96,72,105,103,104,96,32,98,121,116,101,115,44,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32,96,76,111,119,96,32,98,121,116,101,115,10,32,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,10,32,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,32,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,114,10,32,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93,96,46,10,10,32,32,84,104,101,32,96,76,111,119,96,32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32,96,72,105,103,104,96,32,105,102,32,105,116,32,105,115,32,115,101,116,10,32,32,108,97,114,103,101,114,32,116,104,101,110,32,96,72,105,103,104,96,46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32,96,76,111,119,96,32,97,110,100,32,96,72,105,103,104,96,32,105,115,10,32,32,96,91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93,96,46,32,73,102,32,116,104,101,32,97,116,111,109,32,96,100,105,115,97,98,108,101,100,96,32,105,115,10,32,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32,96,76,111,119,32,61,32,52,48,57,54,96,32,97,110,100,32,96,72,105,103,104,32,61,32,56,49,57,50,96,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,40,112,111,114,116,10,32,32,112,114,111,103,114,97,109,41,32,98,121,32,111,112,101,110,105,110,103,32,116,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,97,110,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,96,102,100,96,32,100,114,105,118,101,114,46,32,84,104,105,115,10,32,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,111,112,101,110,105,110,103,32,111,116,104,101,114,10,32,32,100,114,105,118,101,114,115,46,10,10,45,32,42,42,96,123,98,117,115,121,95,108,105,109,105,116,115,95,109,115,103,113,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125,96,42,42,32,45,32,83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,10,32,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,10,32,32,87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,96,72,105,103,104,96,32,98,121,116,101,115,10,32,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32,96,76,111,119,96,32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,10,32,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,10,32,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,97,118,101,115,10,32,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,10,32,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,114,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93,96,46,10,10,32,32,84,104,101,32,96,76,111,119,96,32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32,96,72,105,103,104,96,32,105,102,32,105,116,32,105,115,32,115,101,116,10,32,32,108,97,114,103,101,114,32,116,104,101,110,32,96,72,105,103,104,96,46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32,96,76,111,119,96,32,97,110,100,32,96,72,105,103,104,96,32,105,115,10,32,32,96,91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93,96,46,32,73,102,32,116,104,101,32,97,116,111,109,32,96,100,105,115,97,98,108,101,100,96,32,105,115,10,32,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,115,116,97,116,105,99,97,108,108,121,32,104,97,115,32,100,105,115,97,98,108,101,100,32,116,104,101,32,117,115,101,32,111,102,32,116,104,105,115,32,102,101,97,116,117,114,101,44,32,97,10,32,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,110,108,101,115,115,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,115,10,32,32,115,101,116,32,116,111,32,96,100,105,115,97,98,108,101,96,32,111,114,32,110,111,116,32,112,97,115,115,101,100,32,97,116,32,97,108,108,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32,96,76,111,119,32,61,32,52,48,57,54,96,32,97,110,100,32,96,72,105,103,104,32,61,32,56,49,57,50,96,32,117,110,108,101,115,115,32,116,104,101,32,100,114,105,118,101,114,32,105,116,115,101,108,102,32,100,111,101,115,10,32,32,109,111,100,105,102,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,116,104,101,32,100,114,105,118,101,114,32,109,105,103,104,116,32,102,97,105,108,32,105,102,32,105,116,32,97,108,115,111,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,105,116,115,101,108,102,32,97,110,100,10,32,32,121,111,117,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,116,104,105,115,32,102,101,97,116,117,114,101,46,10,10,32,32,84,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,40,117,115,101,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,41,32,97,110,100,32,116,104,101,32,96,102,100,96,32,100,114,105,118,101,114,32,100,111,32,110,111,116,10,32,32,100,105,115,97,98,108,101,32,116,104,105,115,32,102,101,97,116,117,114,101,32,97,110,100,32,100,111,32,110,111,116,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,116,104,101,109,115,101,108,118,101,115,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,10,32,32,91,96,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,41,46,10,10,68,101,102,97,117,108,116,32,105,115,32,96,115,116,114,101,97,109,96,32,102,111,114,32,97,108,108,32,112,111,114,116,32,116,121,112,101,115,32,97,110,100,32,96,117,115,101,95,115,116,100,105,111,96,32,102,111,114,32,115,112,97,119,110,101,100,32,112,111,114,116,115,46,10,10,70,97,105,108,117,114,101,58,32,105,102,32,116,104,101,32,112,111,114,116,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,44,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32,96,98,97,100,97,114,103,96,44,10,96,115,121,115,116,101,109,95,108,105,109,105,116,96,44,32,111,114,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,116,104,97,116,32,109,111,115,116,32,99,108,111,115,101,108,121,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,101,114,114,111,114,44,10,111,114,32,96,101,105,110,118,97,108,96,32,105,102,32,110,111,32,80,79,83,73,88,32,99,111,100,101,32,105,115,32,97,112,112,114,111,112,114,105,97,116,101,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,66,97,100,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,116,111,32,96,111,112,101,110,95,112,111,114,116,96,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,65,108,108,32,97,118,97,105,108,97,98,108,101,32,112,111,114,116,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,97,114,101,32,105,110,32,117,115,101,46,10,10,45,32,42,42,96,101,110,111,109,101,109,96,42,42,32,45,32,78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,111,114,116,46,10,10,45,32,42,42,96,101,97,103,97,105,110,96,42,42,32,45,32,78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,79,83,32,112,114,111,99,101,115,115,101,115,46,10,10,45,32,42,42,96,101,110,97,109,101,116,111,111,108,111,110,103,96,42,42,32,45,32,84,111,111,32,108,111,110,103,32,101,120,116,101,114,110,97,108,32,99,111,109,109,97,110,100,46,10,10,45,32,42,42,96,101,109,102,105,108,101,96,42,42,32,45,32,78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,40,102,111,114,32,116,104,101,32,79,83,32,112,114,111,99,101,115,115,32,116,104,97,116,32,116,104,101,10,32,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,114,117,110,115,32,105,110,41,46,10,10,45,32,42,42,96,101,110,102,105,108,101,96,42,42,32,45,32,70,117,108,108,32,102,105,108,101,32,116,97,98,108,101,32,40,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,79,83,41,46,10,10,45,32,42,42,96,101,97,99,99,101,115,96,42,42,32,45,32,96,67,111,109,109,97,110,100,96,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,96,32,100,111,101,115,32,110,111,116,10,32,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,46,10,10,45,32,42,42,96,101,110,111,101,110,116,96,42,42,32,45,32,96,70,105,108,101,78,97,109,101,96,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,100,111,101,115,32,110,111,116,10,32,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,46,10,10,68,117,114,105,110,103,32,117,115,101,32,111,102,32,97,32,112,111,114,116,32,111,112,101,110,101,100,32,117,115,105,110,103,32,96,123,115,112,97,119,110,44,32,78,97,109,101,125,96,44,32,96,123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,78,97,109,101,125,96,44,32,111,114,10,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,78,97,109,101,125,96,44,32,101,114,114,111,114,115,32,97,114,105,115,105,110,103,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,105,116,32,97,114,101,10,114,101,112,111,114,116,101,100,32,116,111,32,116,104,101,32,111,119,110,105,110,103,32,112,114,111,99,101,115,115,32,117,115,105,110,103,32,115,105,103,110,97,108,115,32,111,102,32,116,104,101,32,102,111,114,109,10,96,123,39,69,88,73,84,39,44,32,80,111,114,116,44,32,80,111,115,105,120,67,111,100,101,125,96,46,32,70,111,114,32,116,104,101,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,111,102,32,96,80,111,115,105,120,67,111,100,101,96,44,32,115,101,101,10,96,109,58,102,105,108,101,96,46,10,10,84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,116,104,97,116,32,99,97,110,32,98,101,32,111,112,101,110,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,10,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,81,96,93,40,101,114,108,95,99,109,100,46,109,100,35,109,97,120,95,112,111,114,116,115,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46>>},#{group => ports,specification => [{attribute,{7317,2},spec,{{open_port,2},[{type,{7317,16},bounded_fun,[{type,{7317,16},'fun',[{type,{7317,16},product,[{var,{7317,17},'PortName'},{var,{7317,27},'PortSettings'}]},{type,{7317,44},port,[]}]},[{type,{7318,7},constraint,[{atom,{7318,7},is_subtype},[{var,{7318,7},'PortName'},{type,{7318,19},union,[{type,{7318,19},tuple,[{atom,{7318,20},spawn},{ann_type,{7318,27},[{var,{7318,27},'Command'},{type,{7318,38},union,[{type,{7318,38},string,[]},{type,{7318,49},binary,[]}]}]}]},{type,{7319,19},tuple,[{atom,{7319,20},spawn_driver},{ann_type,{7319,34},[{var,{7319,34},'Command'},{type,{7319,45},union,[{type,{7319,45},string,[]},{type,{7319,56},binary,[]}]}]}]},{type,{7320,19},tuple,[{atom,{7320,20},spawn_executable},{ann_type,{7320,38},[{var,{7320,38},'FileName'},{remote_type,{7320,50},[{atom,{7320,50},file},{atom,{7320,55},name_all},[]]}]}]},{type,{7321,19},tuple,[{atom,{7321,20},fd},{ann_type,{7321,24},[{var,{7321,24},'In'},{type,{7321,30},non_neg_integer,[]}]},{ann_type,{7321,49},[{var,{7321,49},'Out'},{type,{7321,56},non_neg_integer,[]}]}]}]}]]},{type,{7322,7},constraint,[{atom,{7322,7},is_subtype},[{var,{7322,7},'PortSettings'},{type,{7322,23},list,[{var,{7322,24},'Opt'}]}]]},{type,{7323,7},constraint,[{atom,{7323,7},is_subtype},[{var,{7323,7},'Opt'},{type,{7323,14},union,[{type,{7323,14},tuple,[{atom,{7323,15},packet},{ann_type,{7323,23},[{var,{7323,23},'N'},{type,{7323,28},union,[{integer,{7323,28},1},{integer,{7323,32},2},{integer,{7323,36},4}]}]}]},{atom,{7324,14},stream},{type,{7325,14},tuple,[{atom,{7325,15},line},{ann_type,{7325,21},[{var,{7325,21},'L'},{type,{7325,26},non_neg_integer,[]}]}]},{type,{7326,14},tuple,[{atom,{7326,15},cd},{ann_type,{7326,19},[{var,{7326,19},'Dir'},{type,{7326,26},union,[{type,{7326,26},string,[]},{type,{7326,37},binary,[]}]}]}]},{type,{7327,14},tuple,[{atom,{7327,15},env},{ann_type,{7327,20},[{var,{7327,20},'Env'},{type,{7327,27},list,[{type,{7327,28},tuple,[{ann_type,{7327,29},[{var,{7327,29},'Name'},{remote_type,{7327,37},[{atom,{7327,37},os},{atom,{7327,40},env_var_name},[]]}]},{ann_type,{7327,56},[{var,{7327,56},'Val'},{type,{7327,63},union,[{remote_type,{7327,63},[{atom,{7327,63},os},{atom,{7327,66},env_var_value},[]]},{type,{7327,84},nil,[]},{atom,{7327,89},false}]}]}]}]}]}]},{type,{7328,14},tuple,[{atom,{7328,15},args},{type,{7328,21},list,[{type,{7328,22},union,[{type,{7328,22},string,[]},{type,{7328,33},binary,[]}]}]}]},{type,{7329,14},tuple,[{atom,{7329,15},arg0},{type,{7329,21},union,[{type,{7329,21},string,[]},{type,{7329,32},binary,[]}]}]},{atom,{7330,14},exit_status},{atom,{7331,14},use_stdio},{atom,{7332,14},nouse_stdio},{atom,{7333,14},stderr_to_stdout},{atom,{7334,14},in},{atom,{7335,14},out},{atom,{7336,14},binary},{atom,{7337,14},eof},{type,{7338,7},tuple,[{atom,{7338,8},parallelism},{ann_type,{7338,21},[{var,{7338,21},'Boolean'},{type,{7338,32},boolean,[]}]}]},{atom,{7339,7},hide},{type,{7340,14},tuple,[{atom,{7340,15},busy_limits_port},{type,{7340,33},union,[{type,{7340,33},tuple,[{type,{7340,34},non_neg_integer,[]},{type,{7340,53},non_neg_integer,[]}]},{atom,{7340,74},disabled}]}]},{type,{7341,14},tuple,[{atom,{7341,15},busy_limits_msgq},{type,{7341,33},union,[{type,{7341,33},tuple,[{type,{7341,34},non_neg_integer,[]},{type,{7341,53},non_neg_integer,[]}]},{atom,{7341,74},disabled}]}]}]}]]}]]}]}}]}},{{function,make_tuple,3},{7001,2},[<<109,97,107,101,95,116,117,112,108,101,40,65,114,105,116,121,44,32,68,101,102,97,117,108,116,86,97,108,117,101,44,32,73,110,105,116,76,105,115,116,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,32,116,117,112,108,101,32,111,102,32,115,105,122,101,32,96,65,114,105,116,121,96,44,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,104,97,115,32,118,97,108,117,101,32,96,68,101,102,97,117,108,116,86,97,108,117,101,96,44,10,97,110,100,32,116,104,101,110,32,102,105,108,108,115,32,105,110,32,118,97,108,117,101,115,32,102,114,111,109,32,96,73,110,105,116,76,105,115,116,96,46,10,10,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,110,32,96,73,110,105,116,76,105,115,116,96,32,109,117,115,116,32,98,101,32,97,32,116,119,111,45,116,117,112,108,101,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,10,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,116,117,112,108,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,121,32,116,101,114,109,46,32,73,102,32,97,10,112,111,115,105,116,105,111,110,32,111,99,99,117,114,115,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,116,104,101,32,116,101,114,109,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,108,97,115,116,10,111,99,99,117,114,114,101,110,99,101,32,105,115,32,117,115,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,53,44,32,91,93,44,32,91,123,50,44,105,103,110,111,114,101,100,125,44,123,53,44,122,122,125,44,123,50,44,97,97,125,93,41,46,10,123,91,93,44,97,97,44,91,93,44,91,93,44,122,122,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{7018,2},spec,{{make_tuple,3},[{type,{7018,17},bounded_fun,[{type,{7018,17},'fun',[{type,{7018,17},product,[{var,{7018,18},'Arity'},{var,{7018,25},'DefaultValue'},{var,{7018,39},'InitList'}]},{type,{7018,52},tuple,any}]},[{type,{7019,7},constraint,[{atom,{7019,7},is_subtype},[{var,{7019,7},'Arity'},{type,{7019,16},arity,[]}]]},{type,{7020,7},constraint,[{atom,{7020,7},is_subtype},[{var,{7020,7},'DefaultValue'},{type,{7020,23},term,[]}]]},{type,{7021,7},constraint,[{atom,{7021,7},is_subtype},[{var,{7021,7},'InitList'},{type,{7021,19},list,[{type,{7021,20},tuple,[{ann_type,{7021,21},[{var,{7021,21},'Position'},{type,{7021,33},pos_integer,[]}]},{type,{7021,48},term,[]}]}]}]]}]]}]}}]}},{{function,make_tuple,2},{6982,2},[<<109,97,107,101,95,116,117,112,108,101,40,65,114,105,116,121,44,32,73,110,105,116,105,97,108,86,97,108,117,101,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,32,110,101,119,32,116,117,112,108,101,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,96,65,114,105,116,121,96,44,32,119,104,101,114,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,97,114,101,10,96,73,110,105,116,105,97,108,86,97,108,117,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,52,44,32,91,93,41,46,10,123,91,93,44,91,93,44,91,93,44,91,93,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{6994,2},spec,{{make_tuple,2},[{type,{6994,17},bounded_fun,[{type,{6994,17},'fun',[{type,{6994,17},product,[{var,{6994,18},'Arity'},{var,{6994,25},'InitialValue'}]},{type,{6994,42},tuple,any}]},[{type,{6995,7},constraint,[{atom,{6995,7},is_subtype},[{var,{6995,7},'Arity'},{type,{6995,16},arity,[]}]]},{type,{6996,7},constraint,[{atom,{6996,7},is_subtype},[{var,{6996,7},'InitialValue'},{type,{6996,23},term,[]}]]}]]}]}}]}},{{function,make_fun,3},{6973,2},[<<109,97,107,101,95,102,117,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],hidden,#{}},{{function,localtime_to_universaltime,2},{6938,2},[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,44,32,73,115,68,115,116,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,97,115,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49,96,44,32,98,117,116,32,116,104,101,32,99,97,108,108,101,114,32,100,101,99,105,100,101,115,32,105,102,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,10,84,105,109,101,32,105,115,32,97,99,116,105,118,101,46,10,10,73,102,32,96,73,115,68,115,116,32,61,61,32,116,114,117,101,96,44,32,96,76,111,99,97,108,116,105,109,101,96,32,105,115,32,100,117,114,105,110,103,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,44,32,105,102,10,96,73,115,68,115,116,32,61,61,32,102,97,108,115,101,96,32,105,116,32,105,115,32,110,111,116,46,32,73,102,32,96,73,115,68,115,116,32,61,61,32,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,99,97,110,10,103,117,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,116,114,117,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,50,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,102,97,108,115,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,117,110,100,101,102,105,110,101,100,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,111,99,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{6962,2},spec,{{localtime_to_universaltime,2},[{type,{6962,33},bounded_fun,[{type,{6962,33},'fun',[{type,{6962,33},product,[{var,{6962,34},'Localtime'},{var,{6962,45},'IsDst'}]},{var,{6962,55},'Universaltime'}]},[{type,{6963,7},constraint,[{atom,{6963,7},is_subtype},[{var,{6963,7},'Localtime'},{remote_type,{6963,20},[{atom,{6963,20},calendar},{atom,{6963,29},datetime},[]]}]]},{type,{6964,7},constraint,[{atom,{6964,7},is_subtype},[{var,{6964,7},'Universaltime'},{remote_type,{6964,24},[{atom,{6964,24},calendar},{atom,{6964,33},datetime},[]]}]]},{type,{6965,7},constraint,[{atom,{6965,7},is_subtype},[{var,{6965,7},'IsDst'},{type,{6965,16},union,[{atom,{6965,16},true},{atom,{6965,23},false},{atom,{6965,31},undefined}]}]]}]]}]}}]}},{{function,load_nif,2},{6887,2},[<<108,111,97,100,95,110,105,102,40,80,97,116,104,44,32,76,111,97,100,73,110,102,111,41>>],#{<<101,110>> => <<76,111,97,100,115,32,97,110,100,32,108,105,110,107,115,32,97,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,101,100,32,102,117,110,99,116,105,111,110,115,32,40,78,73,70,115,41,10,102,111,114,32,97,32,109,111,100,117,108,101,46,10,10,96,80,97,116,104,96,32,105,115,32,97,32,102,105,108,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,104,97,114,101,97,98,108,101,32,111,98,106,101,99,116,47,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,102,105,108,101,10,109,105,110,117,115,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,102,105,108,101,32,101,120,116,101,110,115,105,111,110,32,40,96,46,115,111,96,32,102,111,114,32,85,110,105,120,32,97,110,100,32,96,46,100,108,108,96,32,102,111,114,32,87,105,110,100,111,119,115,41,46,10,78,111,116,105,99,101,32,116,104,97,116,32,111,110,32,109,111,115,116,32,79,83,115,32,116,104,101,32,108,105,98,114,97,114,121,32,104,97,115,32,116,111,32,104,97,118,101,32,97,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,32,111,110,32,100,105,115,99,32,119,104,101,110,32,97,110,10,117,112,103,114,97,100,101,32,111,102,32,116,104,101,32,110,105,102,32,105,115,32,100,111,110,101,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,116,104,101,32,115,97,109,101,44,32,98,117,116,32,116,104,101,32,99,111,110,116,101,110,116,115,32,100,105,102,102,101,114,44,10,116,104,101,32,111,108,100,32,108,105,98,114,97,114,121,32,109,97,121,32,98,101,32,108,111,97,100,101,100,32,105,110,115,116,101,97,100,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,32,78,73,70,10,108,105,98,114,97,114,121,44,32,115,101,101,32,91,96,101,114,108,95,110,105,102,40,51,41,96,93,40,101,114,108,95,110,105,102,46,109,100,41,46,10,10,96,76,111,97,100,73,110,102,111,96,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,32,73,116,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,108,105,98,114,97,114,121,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,10,105,110,105,116,105,97,108,105,122,97,116,105,111,110,46,32,65,32,103,111,111,100,32,112,114,97,99,116,105,99,101,32,105,115,32,116,111,32,105,110,99,108,117,100,101,32,97,32,109,111,100,117,108,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,116,111,32,115,117,112,112,111,114,116,10,102,117,116,117,114,101,32,99,111,100,101,32,117,112,103,114,97,100,101,32,115,99,101,110,97,114,105,111,115,46,10,10,84,104,101,32,99,97,108,108,32,116,111,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,109,117,115,116,32,98,101,32,109,97,100,101,32,95,100,105,114,101,99,116,108,121,95,32,102,114,111,109,32,116,104,101,32,69,114,108,97,110,103,10,99,111,100,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,98,101,108,111,110,103,115,32,116,111,46,32,73,116,32,114,101,116,117,114,110,115,32,101,105,116,104,101,114,32,96,111,107,96,44,32,111,114,10,96,123,101,114,114,111,114,44,123,82,101,97,115,111,110,44,84,101,120,116,125,125,96,32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32,96,82,101,97,115,111,110,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,10,119,104,105,108,101,32,96,84,101,120,116,96,32,105,115,32,97,32,104,117,109,97,110,32,114,101,97,100,97,98,108,101,32,115,116,114,105,110,103,32,116,104,97,116,32,99,97,110,32,103,105,118,101,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,102,97,105,108,117,114,101,58,10,10,45,32,42,42,96,108,111,97,100,95,102,97,105,108,101,100,96,42,42,32,45,32,84,104,101,32,79,83,32,102,97,105,108,101,100,32,116,111,32,108,111,97,100,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,46,10,10,45,32,42,42,96,98,97,100,95,108,105,98,96,42,42,32,45,32,84,104,101,32,108,105,98,114,97,114,121,32,100,105,100,32,110,111,116,32,102,117,108,102,105,108,108,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,97,115,32,97,32,78,73,70,32,108,105,98,114,97,114,121,10,32,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,108,111,97,100,32,124,32,117,112,103,114,97,100,101,96,42,42,32,45,32,84,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,98,114,97,114,121,32,99,97,108,108,98,97,99,107,32,119,97,115,32,117,110,115,117,99,99,101,115,115,102,117,108,46,10,10,45,32,42,42,96,114,101,108,111,97,100,96,42,42,32,45,32,65,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,97,108,114,101,97,100,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,105,110,115,116,97,110,99,101,46,32,84,104,101,10,32,32,112,114,101,118,105,111,117,115,108,121,32,100,101,112,114,101,99,97,116,101,100,32,96,114,101,108,111,97,100,96,32,102,101,97,116,117,114,101,32,119,97,115,32,114,101,109,111,118,101,100,32,105,110,32,79,84,80,32,50,48,46,10,10,45,32,42,42,96,111,108,100,95,99,111,100,101,96,42,42,32,45,32,84,104,101,32,99,97,108,108,32,116,111,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,119,97,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,10,32,32,111,108,100,32,99,111,100,101,32,111,102,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,117,112,103,114,97,100,101,100,59,32,116,104,105,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,10,10,73,102,32,116,104,101,32,91,96,45,110,105,102,115,40,41,96,93,40,96,101,58,115,121,115,116,101,109,58,109,111,100,117,108,101,115,46,109,100,35,110,105,102,115,95,97,116,116,114,105,98,117,116,101,96,41,32,97,116,116,114,105,98,117,116,101,32,105,115,32,117,115,101,100,10,40,119,104,105,99,104,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,41,44,32,97,108,108,32,78,73,70,115,32,105,110,32,116,104,101,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,109,117,115,116,32,98,101,32,100,101,99,108,97,114,101,100,32,97,115,32,115,117,99,104,10,102,111,114,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,116,111,32,115,117,99,99,101,101,100,46,32,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,32,97,108,108,32,102,117,110,99,116,105,111,110,115,10,100,101,99,108,97,114,101,100,32,119,105,116,104,32,116,104,101,32,96,45,110,105,102,115,40,41,96,32,97,116,116,114,105,98,117,116,101,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,98,121,32,116,104,101,10,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,46,32,84,104,105,115,32,97,108,108,111,119,115,32,97,32,116,97,114,103,101,116,32,105,110,100,101,112,101,110,100,101,110,116,32,69,114,108,97,110,103,32,102,105,108,101,32,116,111,32,99,111,110,116,97,105,110,10,102,97,108,108,98,97,99,107,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,109,97,121,32,108,97,99,107,32,78,73,70,32,115,117,112,112,111,114,116,32,100,101,112,101,110,100,105,110,103,32,111,110,10,116,97,114,103,101,116,32,79,83,47,104,97,114,100,119,97,114,101,32,112,108,97,116,102,111,114,109,46>>},#{group => code,specification => [{attribute,{6930,2},spec,{{load_nif,2},[{type,{6930,15},bounded_fun,[{type,{6930,15},'fun',[{type,{6930,15},product,[{var,{6930,16},'Path'},{var,{6930,22},'LoadInfo'}]},{type,{6930,36},union,[{atom,{6930,36},ok},{var,{6930,41},'Error'}]}]},[{type,{6931,7},constraint,[{atom,{6931,7},is_subtype},[{var,{6931,7},'Path'},{type,{6931,15},string,[]}]]},{type,{6932,7},constraint,[{atom,{6932,7},is_subtype},[{var,{6932,7},'LoadInfo'},{type,{6932,19},term,[]}]]},{type,{6933,7},constraint,[{atom,{6933,7},is_subtype},[{var,{6933,7},'Error'},{type,{6933,16},tuple,[{atom,{6933,17},error},{type,{6933,24},tuple,[{var,{6933,25},'Reason'},{ann_type,{6933,33},[{var,{6933,33},'Text'},{type,{6933,41},string,[]}]}]}]}]]},{type,{6934,7},constraint,[{atom,{6934,7},is_subtype},[{var,{6934,7},'Reason'},{type,{6934,17},union,[{atom,{6934,17},load_failed},{atom,{6934,31},bad_lib},{atom,{6934,41},load},{atom,{6934,48},reload},{atom,{6934,57},upgrade},{atom,{6934,67},old_code}]}]]}]]}]}}]}},{{function,load_module,2},{6835,2},[<<108,111,97,100,95,109,111,100,117,108,101,40,77,111,100,117,108,101,44,32,66,105,110,97,114,121,41>>],#{<<101,110>> => <<76,111,97,100,115,32,96,77,111,100,117,108,101,96,32,100,101,115,99,114,105,98,101,100,32,98,121,32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,101,100,32,119,105,116,104,105,110,32,96,66,105,110,97,114,121,96,46,10,10,73,102,32,116,104,101,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,44,32,97,108,108,32,101,120,112,111,114,116,10,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,114,101,112,108,97,99,101,100,32,115,111,32,116,104,101,121,32,112,111,105,110,116,32,116,111,32,116,104,101,32,110,101,119,108,121,32,108,111,97,100,101,100,32,99,111,100,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,10,108,111,97,100,101,100,32,99,111,100,101,32,105,115,32,107,101,112,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,97,115,32,111,108,100,32,99,111,100,101,44,32,97,115,32,116,104,101,114,101,32,99,97,110,32,115,116,105,108,108,32,98,101,32,112,114,111,99,101,115,115,101,115,10,101,120,101,99,117,116,105,110,103,32,116,104,97,116,32,99,111,100,101,46,10,10,82,101,116,117,114,110,115,32,101,105,116,104,101,114,32,96,123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125,96,44,32,111,114,32,96,123,101,114,114,111,114,44,32,82,101,97,115,111,110,125,96,32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,10,96,82,101,97,115,111,110,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,42,42,96,98,97,100,102,105,108,101,96,42,42,32,45,32,84,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,102,111,114,109,97,116,32,95,111,114,95,32,116,104,101,10,32,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,115,32,99,111,100,101,32,102,111,114,32,97,110,111,116,104,101,114,32,109,111,100,117,108,101,32,116,104,97,110,32,96,77,111,100,117,108,101,96,46,10,10,45,32,42,42,96,110,111,116,95,112,117,114,103,101,100,96,42,42,32,45,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,108,111,97,100,101,100,32,98,101,99,97,117,115,101,10,32,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46,10,10,45,32,42,42,96,111,110,95,108,111,97,100,96,42,42,32,45,32,84,104,101,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,110,32,96,111,110,95,108,111,97,100,96,32,100,101,99,108,97,114,97,116,105,111,110,32,116,104,97,116,10,32,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,101,100,32,98,101,102,111,114,101,32,96,66,105,110,97,114,121,96,32,99,97,110,32,98,101,99,111,109,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,46,32,65,110,121,32,112,114,101,118,105,111,117,115,10,32,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,32,119,105,108,108,32,114,101,109,97,105,110,32,117,110,116,105,108,32,116,104,101,32,96,111,110,95,108,111,97,100,96,32,99,97,108,108,32,104,97,115,32,102,105,110,105,115,104,101,100,46,10,10,45,32,42,42,110,111,116,95,97,108,108,111,119,101,100,42,42,32,45,32,84,104,101,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,102,101,97,116,117,114,101,115,32,116,104,97,116,10,32,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46>>},#{group => code,specification => [{attribute,{6865,2},spec,{{load_module,2},[{type,{6865,18},bounded_fun,[{type,{6865,18},'fun',[{type,{6865,18},product,[{var,{6865,19},'Module'},{var,{6865,27},'Binary'}]},{type,{6865,38},union,[{type,{6865,38},tuple,[{atom,{6865,39},module},{var,{6865,47},'Module'}]},{type,{6865,57},tuple,[{atom,{6865,58},error},{var,{6865,65},'Reason'}]}]}]},[{type,{6866,7},constraint,[{atom,{6866,7},is_subtype},[{var,{6866,7},'Module'},{type,{6866,17},module,[]}]]},{type,{6867,7},constraint,[{atom,{6867,7},is_subtype},[{var,{6867,7},'Binary'},{type,{6867,17},binary,[]}]]},{type,{6868,7},constraint,[{atom,{6868,7},is_subtype},[{var,{6868,7},'Reason'},{type,{6868,17},union,[{atom,{6868,17},badfile},{atom,{6868,27},not_purged},{atom,{6868,40},on_load},{type,{6869,17},tuple,[{atom,{6869,18},features_not_allowed},{type,{6869,40},list,[{type,{6869,41},atom,[]}]}]}]}]]}]]}]}}]}},{{function,is_tuple,1},{6826,2},[<<105,115,95,116,117,112,108,101,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6830,2},spec,{{is_tuple,1},[{type,{6830,15},bounded_fun,[{type,{6830,15},'fun',[{type,{6830,15},product,[{var,{6830,16},'Term'}]},{type,{6830,25},boolean,[]}]},[{type,{6831,7},constraint,[{atom,{6831,7},is_subtype},[{var,{6831,7},'Term'},{type,{6831,15},term,[]}]]}]]}]}}]}},{{function,is_reference,1},{6816,2},[<<105,115,95,114,101,102,101,114,101,110,99,101,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6820,2},spec,{{is_reference,1},[{type,{6820,19},bounded_fun,[{type,{6820,19},'fun',[{type,{6820,19},product,[{var,{6820,20},'Term'}]},{type,{6820,29},boolean,[]}]},[{type,{6821,7},constraint,[{atom,{6821,7},is_subtype},[{var,{6821,7},'Term'},{type,{6821,15},term,[]}]]}]]}]}}]}},{{function,is_record,3},{6793,2},[<<105,115,95,114,101,99,111,114,100,40,84,101,114,109,44,32,82,101,99,111,114,100,84,97,103,44,32,83,105,122,101,41>>],#{<<101,110>> => <<96,82,101,99,111,114,100,84,97,103,96,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,44,32,97,110,100,32,105,116,115,10,115,105,122,101,32,105,115,32,96,83,105,122,101,96,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,32,97,110,100,32,96,83,105,122,101,96,32,105,115,32,97,32,108,105,116,101,114,97,108,10,105,110,116,101,103,101,114,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,100,111,99,117,109,101,110,116,101,100,32,102,111,114,32,99,111,109,112,108,101,116,101,110,101,115,115,46,32,85,115,117,97,108,108,121,10,62,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,32,105,115,32,116,111,32,98,101,32,117,115,101,100,46>>},#{group => terms,specification => [{attribute,{6808,2},spec,{{is_record,3},[{type,{6808,16},bounded_fun,[{type,{6808,16},'fun',[{type,{6808,16},product,[{var,{6808,17},'Term'},{var,{6808,22},'RecordTag'},{var,{6808,32},'Size'}]},{type,{6808,41},boolean,[]}]},[{type,{6809,7},constraint,[{atom,{6809,7},is_subtype},[{var,{6809,7},'Term'},{type,{6809,15},term,[]}]]},{type,{6810,7},constraint,[{atom,{6810,7},is_subtype},[{var,{6810,7},'RecordTag'},{type,{6810,20},atom,[]}]]},{type,{6811,7},constraint,[{atom,{6811,7},is_subtype},[{var,{6811,7},'Size'},{type,{6811,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,is_record,2},{6771,2},[<<105,115,95,114,101,99,111,114,100,40,84,101,114,109,44,32,82,101,99,111,114,100,84,97,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,32,97,110,100,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,46,10,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,114,109,97,108,108,121,32,116,104,101,32,99,111,109,112,105,108,101,114,32,116,114,101,97,116,115,32,99,97,108,108,115,32,116,111,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,10,62,32,101,115,112,101,99,105,97,108,108,121,46,32,73,116,32,101,109,105,116,115,32,99,111,100,101,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,116,104,97,116,32,105,116,115,32,102,105,114,115,116,10,62,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,115,105,122,101,32,105,115,32,99,111,114,114,101,99,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,10,62,32,105,115,32,110,111,116,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,44,32,116,104,101,32,66,73,70,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,32,105,115,32,99,97,108,108,101,100,10,62,32,105,110,115,116,101,97,100,32,97,110,100,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,116,117,112,108,101,32,105,115,32,110,111,116,32,118,101,114,105,102,105,101,100,46,10,10,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,44,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,46>>},#{group => terms,specification => [{attribute,{6786,2},spec,{{is_record,2},[{type,{6786,16},bounded_fun,[{type,{6786,16},'fun',[{type,{6786,16},product,[{var,{6786,17},'Term'},{var,{6786,22},'RecordTag'}]},{type,{6786,36},boolean,[]}]},[{type,{6787,7},constraint,[{atom,{6787,7},is_subtype},[{var,{6787,7},'Term'},{type,{6787,15},term,[]}]]},{type,{6788,7},constraint,[{atom,{6788,7},is_subtype},[{var,{6788,7},'RecordTag'},{type,{6788,20},atom,[]}]]}]]}]}}]}},{{function,is_port,1},{6761,2},[<<105,115,95,112,111,114,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6765,2},spec,{{is_port,1},[{type,{6765,14},bounded_fun,[{type,{6765,14},'fun',[{type,{6765,14},product,[{var,{6765,15},'Term'}]},{type,{6765,24},boolean,[]}]},[{type,{6766,7},constraint,[{atom,{6766,7},is_subtype},[{var,{6766,7},'Term'},{type,{6766,15},term,[]}]]}]]}]}}]}},{{function,is_map,1},{6750,2},[<<105,115,95,109,97,112,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,109,97,112,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6755,2},spec,{{is_map,1},[{type,{6755,13},bounded_fun,[{type,{6755,13},'fun',[{type,{6755,13},product,[{var,{6755,14},'Term'}]},{type,{6755,23},boolean,[]}]},[{type,{6756,7},constraint,[{atom,{6756,7},is_subtype},[{var,{6756,7},'Term'},{type,{6756,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,is_pid,1},{6740,2},[<<105,115,95,112,105,100,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6744,2},spec,{{is_pid,1},[{type,{6744,13},bounded_fun,[{type,{6744,13},'fun',[{type,{6744,13},product,[{var,{6744,14},'Term'}]},{type,{6744,23},boolean,[]}]},[{type,{6745,7},constraint,[{atom,{6745,7},is_subtype},[{var,{6745,7},'Term'},{type,{6745,15},term,[]}]]}]]}]}}]}},{{function,is_number,1},{6729,2},[<<105,115,95,110,117,109,98,101,114,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,46,32,79,116,104,101,114,119,105,115,101,10,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6734,2},spec,{{is_number,1},[{type,{6734,16},bounded_fun,[{type,{6734,16},'fun',[{type,{6734,16},product,[{var,{6734,17},'Term'}]},{type,{6734,26},boolean,[]}]},[{type,{6735,7},constraint,[{atom,{6735,7},is_subtype},[{var,{6735,7},'Term'},{type,{6735,15},term,[]}]]}]]}]}}]}},{{function,is_list,1},{6718,2},[<<105,115,95,108,105,115,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,108,105,115,116,32,119,105,116,104,32,122,101,114,111,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,10,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6723,2},spec,{{is_list,1},[{type,{6723,14},bounded_fun,[{type,{6723,14},'fun',[{type,{6723,14},product,[{var,{6723,15},'Term'}]},{type,{6723,24},boolean,[]}]},[{type,{6724,7},constraint,[{atom,{6724,7},is_subtype},[{var,{6724,7},'Term'},{type,{6724,15},term,[]}]]}]]}]}}]}},{{function,is_integer,1},{6708,2},[<<105,115,95,105,110,116,101,103,101,114,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6712,2},spec,{{is_integer,1},[{type,{6712,17},bounded_fun,[{type,{6712,17},'fun',[{type,{6712,17},product,[{var,{6712,18},'Term'}]},{type,{6712,27},boolean,[]}]},[{type,{6713,7},constraint,[{atom,{6713,7},is_subtype},[{var,{6713,7},'Term'},{type,{6713,15},term,[]}]]}]]}]}}]}},{{function,is_function,2},{6696,2},[<<105,115,95,102,117,110,99,116,105,111,110,40,84,101,114,109,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,117,110,32,116,104,97,116,32,99,97,110,32,98,101,32,97,112,112,108,105,101,100,32,119,105,116,104,32,96,65,114,105,116,121,96,32,110,117,109,98,101,114,32,111,102,10,97,114,103,117,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6701,2},spec,{{is_function,2},[{type,{6701,18},bounded_fun,[{type,{6701,18},'fun',[{type,{6701,18},product,[{var,{6701,19},'Term'},{var,{6701,25},'Arity'}]},{type,{6701,35},boolean,[]}]},[{type,{6702,7},constraint,[{atom,{6702,7},is_subtype},[{var,{6702,7},'Term'},{type,{6702,15},term,[]}]]},{type,{6703,7},constraint,[{atom,{6703,7},is_subtype},[{var,{6703,7},'Arity'},{type,{6703,16},arity,[]}]]}]]}]}}]}},{{function,is_function,1},{6686,2},[<<105,115,95,102,117,110,99,116,105,111,110,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,117,110,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6690,2},spec,{{is_function,1},[{type,{6690,18},bounded_fun,[{type,{6690,18},'fun',[{type,{6690,18},product,[{var,{6690,19},'Term'}]},{type,{6690,28},boolean,[]}]},[{type,{6691,7},constraint,[{atom,{6691,7},is_subtype},[{var,{6691,7},'Term'},{type,{6691,15},term,[]}]]}]]}]}}]}},{{function,is_float,1},{6676,2},[<<105,115,95,102,108,111,97,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6680,2},spec,{{is_float,1},[{type,{6680,15},bounded_fun,[{type,{6680,15},'fun',[{type,{6680,15},product,[{var,{6680,16},'Term'}]},{type,{6680,25},boolean,[]}]},[{type,{6681,7},constraint,[{atom,{6681,7},is_subtype},[{var,{6681,7},'Term'},{type,{6681,15},term,[]}]]}]]}]}}]}},{{function,is_boolean,1},{6665,2},[<<105,115,95,98,111,111,108,101,97,110,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,116,114,117,101,96,32,111,114,32,116,104,101,32,97,116,111,109,32,96,102,97,108,115,101,96,32,40,116,104,97,116,32,105,115,44,32,97,10,98,111,111,108,101,97,110,41,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6670,2},spec,{{is_boolean,1},[{type,{6670,17},bounded_fun,[{type,{6670,17},'fun',[{type,{6670,17},product,[{var,{6670,18},'Term'}]},{type,{6670,27},boolean,[]}]},[{type,{6671,7},constraint,[{atom,{6671,7},is_subtype},[{var,{6671,7},'Term'},{type,{6671,15},term,[]}]]}]]}]}}]}},{{function,is_bitstring,1},{6655,2},[<<105,115,95,98,105,116,115,116,114,105,110,103,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,40,105,110,99,108,117,100,105,110,103,32,97,32,98,105,110,97,114,121,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6659,2},spec,{{is_bitstring,1},[{type,{6659,19},bounded_fun,[{type,{6659,19},'fun',[{type,{6659,19},product,[{var,{6659,20},'Term'}]},{type,{6659,29},boolean,[]}]},[{type,{6660,7},constraint,[{atom,{6660,7},is_subtype},[{var,{6660,7},'Term'},{type,{6660,15},term,[]}]]}]]}]}}]}},{{function,is_binary,1},{6643,2},[<<105,115,95,98,105,110,97,114,121,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,65,32,98,105,110,97,114,121,32,97,108,119,97,121,115,32,99,111,110,116,97,105,110,115,32,97,32,99,111,109,112,108,101,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>},#{group => terms,specification => [{attribute,{6649,2},spec,{{is_binary,1},[{type,{6649,16},bounded_fun,[{type,{6649,16},'fun',[{type,{6649,16},product,[{var,{6649,17},'Term'}]},{type,{6649,26},boolean,[]}]},[{type,{6650,7},constraint,[{atom,{6650,7},is_subtype},[{var,{6650,7},'Term'},{type,{6650,15},term,[]}]]}]]}]}}]}},{{function,is_atom,1},{6633,2},[<<105,115,95,97,116,111,109,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,97,116,111,109,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6637,2},spec,{{is_atom,1},[{type,{6637,14},bounded_fun,[{type,{6637,14},'fun',[{type,{6637,14},product,[{var,{6637,15},'Term'}]},{type,{6637,24},boolean,[]}]},[{type,{6638,7},constraint,[{atom,{6638,7},is_subtype},[{var,{6638,7},'Term'},{type,{6638,15},term,[]}]]}]]}]}}]}},{{function,hd,1},{6604,2},[<<104,100,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,100,32,111,102,32,96,76,105,115,116,96,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,46,10,10,73,116,32,119,111,114,107,115,32,119,105,116,104,32,105,109,112,114,111,112,101,114,32,108,105,115,116,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,100,40,91,49,44,50,44,51,44,52,44,53,93,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,100,40,91,102,105,114,115,116,44,32,115,101,99,111,110,100,44,32,116,104,105,114,100,44,32,115,111,95,111,110,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,102,105,114,115,116,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,105,115,116,96,32,105,115,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46>>},#{group => terms,specification => [{attribute,{6624,2},spec,{{hd,1},[{type,{6624,9},bounded_fun,[{type,{6624,9},'fun',[{type,{6624,9},product,[{var,{6624,10},'List'}]},{var,{6624,19},'Head'}]},[{type,{6625,7},constraint,[{atom,{6625,7},is_subtype},[{var,{6625,7},'List'},{type,{6625,15},nonempty_maybe_improper_list,[]}]]},{type,{6626,7},constraint,[{atom,{6626,7},is_subtype},[{var,{6626,7},'Head'},{type,{6626,15},term,[]}]]}]]}]}}]}},{{function,get_module_info,2},{6595,2},[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,40,77,111,100,117,108,101,44,32,73,116,101,109,41>>],hidden,#{}},{{function,element,2},{6575,2},[<<101,108,101,109,101,110,116,40,78,44,32,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,96,78,96,116,104,32,101,108,101,109,101,110,116,32,40,110,117,109,98,101,114,105,110,103,32,102,114,111,109,32,49,41,32,111,102,32,96,84,117,112,108,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,108,101,109,101,110,116,40,50,44,32,123,97,44,32,98,44,32,99,125,41,46,10,98,10,96,96,96>>},#{group => terms,specification => [{attribute,{6586,2},spec,{{element,2},[{type,{6586,14},bounded_fun,[{type,{6586,14},'fun',[{type,{6586,14},product,[{var,{6586,15},'N'},{var,{6586,18},'Tuple'}]},{type,{6586,28},term,[]}]},[{type,{6587,5},constraint,[{atom,{6587,5},is_subtype},[{var,{6587,5},'N'},{type,{6587,10},pos_integer,[]}]]},{type,{6588,5},constraint,[{atom,{6588,5},is_subtype},[{var,{6588,5},'Tuple'},{type,{6588,14},tuple,any}]]}]]}]}}]}},{{function,append,2},{6567,2},[<<97,112,112,101,110,100,40,76,105,115,116,44,32,84,97,105,108,41>>],hidden,#{}},{{function,abs,1},{6544,2},[<<97,98,115,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,102,108,111,97,116,32,116,104,97,116,32,105,115,32,116,104,101,32,97,114,105,116,104,109,101,116,105,99,97,108,32,97,98,115,111,108,117,116,101,32,118,97,108,117,101,32,111,102,32,96,70,108,111,97,116,96,10,111,114,32,96,73,110,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,98,115,40,45,51,46,51,51,41,46,10,51,46,51,51,10,62,32,97,98,115,40,45,51,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{6558,2},spec,{{abs,1},[{type,{6558,10},bounded_fun,[{type,{6558,10},'fun',[{type,{6558,10},product,[{var,{6558,11},'Float'}]},{type,{6558,21},float,[]}]},[{type,{6559,7},constraint,[{atom,{6559,7},is_subtype},[{var,{6559,7},'Float'},{type,{6559,16},float,[]}]]}]]},{type,{6560,10},bounded_fun,[{type,{6560,10},'fun',[{type,{6560,10},product,[{var,{6560,11},'Int'}]},{type,{6560,19},non_neg_integer,[]}]},[{type,{6561,7},constraint,[{atom,{6561,7},is_subtype},[{var,{6561,7},'Int'},{type,{6561,14},integer,[]}]]}]]}]}}]}},{{function,whereis,1},{6516,2},[<<119,104,101,114,101,105,115,40,82,101,103,78,97,109,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,105,116,104,32,116,104,101,10,91,96,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,96,93,40,96,114,101,103,105,115,116,101,114,47,50,96,41,32,96,82,101,103,78,97,109,101,96,32,102,114,111,109,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,32,82,101,116,117,114,110,115,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,119,104,101,114,101,105,115,40,100,98,41,46,10,60,48,46,52,51,46,48,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{6530,2},spec,{{whereis,1},[{type,{6530,14},bounded_fun,[{type,{6530,14},'fun',[{type,{6530,14},product,[{var,{6530,15},'RegName'}]},{type,{6530,27},union,[{type,{6530,27},pid,[]},{type,{6530,35},port,[]},{atom,{6530,44},undefined}]}]},[{type,{6531,7},constraint,[{atom,{6531,7},is_subtype},[{var,{6531,7},'RegName'},{type,{6531,18},atom,[]}]]}]]}]}}]}},{{function,unregister,1},{6489,2},[<<117,110,114,101,103,105,115,116,101,114,40,82,101,103,78,97,109,101,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,116,104,101,32,91,96,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,96,93,40,96,114,101,103,105,115,116,101,114,47,50,96,41,32,96,82,101,103,78,97,109,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,97,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,102,114,111,109,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,117,110,114,101,103,105,115,116,101,114,40,100,98,41,46,10,116,114,117,101,10,96,96,96,10,10,75,101,101,112,32,105,110,32,109,105,110,100,32,116,104,97,116,32,121,111,117,32,99,97,110,32,115,116,105,108,108,32,114,101,99,101,105,118,101,32,115,105,103,110,97,108,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,10,110,97,109,101,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,117,110,114,101,103,105,115,116,101,114,101,100,32,97,115,32,116,104,101,32,115,101,110,100,101,114,32,109,97,121,32,104,97,118,101,32,108,111,111,107,101,100,32,117,112,32,116,104,101,32,110,97,109,101,10,98,101,102,111,114,101,32,115,101,110,100,105,110,103,32,116,111,32,105,116,46,10,10,85,115,101,114,115,32,97,114,101,32,97,100,118,105,115,101,100,32,110,111,116,32,116,111,32,117,110,114,101,103,105,115,116,101,114,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,101,115,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,110,111,116,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46>>},#{group => processes,specification => [{attribute,{6510,2},spec,{{unregister,1},[{type,{6510,17},bounded_fun,[{type,{6510,17},'fun',[{type,{6510,17},product,[{var,{6510,18},'RegName'}]},{atom,{6510,30},true}]},[{type,{6511,7},constraint,[{atom,{6511,7},is_subtype},[{var,{6511,7},'RegName'},{type,{6511,18},atom,[]}]]}]]}]}}]}},{{function,unlink,1},{6433,2},[<<117,110,108,105,110,107,40,73,100,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,100,96,46,10,10,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,117,110,108,105,110,107,101,101,46,10,10,65,32,108,105,110,107,32,99,97,110,32,98,101,32,115,101,116,32,117,112,32,117,115,105,110,103,32,116,104,101,32,96,108,105,110,107,47,49,96,32,66,73,70,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,108,105,110,107,115,32,97,110,100,10,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,10,77,97,110,117,97,108,95,58,10,10,45,32,91,76,105,110,107,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,115,96,41,10,45,32,91,83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,45,32,91,82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,10,79,110,99,101,32,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,108,105,110,107,10,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,101,114,32,97,110,100,32,116,104,101,32,117,110,108,105,110,107,101,101,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,99,97,108,108,101,114,32,105,110,32,116,104,101,32,102,117,116,117,114,101,10,40,117,110,108,101,115,115,32,116,104,101,32,108,105,110,107,32,105,115,32,115,101,116,117,112,32,97,103,97,105,110,41,46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,105,115,10,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,41,44,32,97,110,10,96,123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,109,97,121,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,10,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,99,97,108,108,101,114,32,98,101,102,111,114,101,32,116,104,101,32,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,99,97,108,108,10,99,111,109,112,108,101,116,101,100,46,32,65,108,115,111,32,110,111,116,101,32,116,104,97,116,32,116,104,101,32,96,123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,32,109,97,121,32,98,101,32,116,104,101,10,114,101,115,117,108,116,32,111,102,32,116,104,101,32,108,105,110,107,44,32,98,117,116,32,109,97,121,32,97,108,115,111,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,117,110,108,105,107,101,101,32,115,101,110,100,105,110,103,32,116,104,101,32,99,97,108,108,101,114,10,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,98,121,32,99,97,108,108,105,110,103,32,116,104,101,32,96,101,120,105,116,47,50,96,32,66,73,70,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,10,97,112,112,114,111,112,114,105,97,116,101,32,116,111,32,99,108,101,97,110,32,117,112,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,97,32,99,97,108,108,32,116,111,10,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,97,115,32,102,111,108,108,111,119,115,44,32,119,104,101,110,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,58,10,10,96,96,96,101,114,108,97,110,103,10,117,110,108,105,110,107,40,73,100,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,39,69,88,73,84,39,44,32,73,100,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100,10,96,96,96,10,10,84,104,101,32,108,105,110,107,32,114,101,109,111,118,97,108,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,115,117,99,104,32,97,32,108,105,110,107,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,10,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,10,91,108,105,110,107,32,112,114,111,116,111,99,111,108,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,35,108,105,110,107,95,112,114,111,116,111,99,111,108,41,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,95,68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,73,100,96,32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46>>},#{group => processes,specification => [{attribute,{6483,2},spec,{{unlink,1},[{type,{6483,13},bounded_fun,[{type,{6483,13},'fun',[{type,{6483,13},product,[{var,{6483,14},'Id'}]},{atom,{6483,21},true}]},[{type,{6484,7},constraint,[{atom,{6484,7},is_subtype},[{var,{6484,7},'Id'},{type,{6484,13},union,[{type,{6484,13},pid,[]},{type,{6484,21},port,[]}]}]]}]]}]}}]}},{{function,universaltime_to_posixtime,1},{6426,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,112,111,115,105,120,116,105,109,101,40,80,49,41>>],hidden,#{}},{{function,universaltime,0},{6405,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,10,105,110,32,116,104,101,32,102,111,114,109,32,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,10,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,96,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,96,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,10,96,96,96>>},#{group => time,specification => [{attribute,{6420,2},spec,{{universaltime,0},[{type,{6420,20},bounded_fun,[{type,{6420,20},'fun',[{type,{6420,20},product,[]},{var,{6420,26},'DateTime'}]},[{type,{6421,7},constraint,[{atom,{6421,7},is_subtype},[{var,{6421,7},'DateTime'},{remote_type,{6421,19},[{atom,{6421,19},calendar},{atom,{6421,28},datetime},[]]}]]}]]}]}}]}},{{function,tuple_size,1},{6388,2},[<<116,117,112,108,101,95,115,105,122,101,40,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,96,84,117,112,108,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,117,112,108,101,95,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{6399,2},spec,{{tuple_size,1},[{type,{6399,17},bounded_fun,[{type,{6399,17},'fun',[{type,{6399,17},product,[{var,{6399,18},'Tuple'}]},{type,{6399,28},non_neg_integer,[]}]},[{type,{6400,7},constraint,[{atom,{6400,7},is_subtype},[{var,{6400,7},'Tuple'},{type,{6400,16},tuple,any}]]}]]}]}}]}},{{function,trunc,1},{6347,2},[<<116,114,117,110,99,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<84,114,117,110,99,97,116,101,115,32,116,104,101,32,100,101,99,105,109,97,108,115,32,111,102,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,53,46,55,41,46,10,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,45,53,46,55,41,46,10,45,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,53,41,46,10,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,96,93,40,96,116,114,117,110,99,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,96,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,10,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,10,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,10,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{6381,2},spec,{{trunc,1},[{type,{6381,12},bounded_fun,[{type,{6381,12},'fun',[{type,{6381,12},product,[{var,{6381,13},'Number'}]},{type,{6381,24},integer,[]}]},[{type,{6382,7},constraint,[{atom,{6382,7},is_subtype},[{var,{6382,7},'Number'},{type,{6382,17},number,[]}]]}]]}]}}]}},{{function,trace_info,2},{6323,2},[<<116,114,97,99,101,95,105,110,102,111,40,80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,114,97,99,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,44,32,112,114,111,99,101,115,115,44,32,102,117,110,99,116,105,111,110,44,32,111,114,32,101,118,101,110,116,32,102,111,114,32,116,104,101,10,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,105,110,102,111,47,51,96,32,116,104,97,116,32,111,112,101,114,97,116,101,115,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,10,32,32,62,32,115,101,115,115,105,111,110,115,46>>},#{group => trace,specification => [{attribute,{6333,2},spec,{{trace_info,2},[{type,{6333,17},bounded_fun,[{type,{6333,17},'fun',[{type,{6333,17},product,[{var,{6333,18},'PidPortFuncEvent'},{var,{6333,36},'Item'}]},{var,{6333,45},'Res'}]},[{type,{6334,7},constraint,[{atom,{6334,7},is_subtype},[{var,{6334,7},'PidPortFuncEvent'},{type,{6334,27},union,[{type,{6334,27},pid,[]},{type,{6334,35},port,[]},{atom,{6334,44},new},{atom,{6334,50},new_processes},{atom,{6334,66},new_ports},{type,{6335,24},tuple,[{var,{6335,25},'Module'},{var,{6335,33},'Function'},{var,{6335,43},'Arity'}]},{atom,{6335,52},on_load},{atom,{6335,62},send},{atom,{6335,69},'receive'}]}]]},{type,{6336,7},constraint,[{atom,{6336,7},is_subtype},[{var,{6336,7},'Module'},{type,{6336,17},module,[]}]]},{type,{6337,7},constraint,[{atom,{6337,7},is_subtype},[{var,{6337,7},'Function'},{type,{6337,19},atom,[]}]]},{type,{6338,7},constraint,[{atom,{6338,7},is_subtype},[{var,{6338,7},'Arity'},{type,{6338,16},arity,[]}]]},{type,{6339,7},constraint,[{atom,{6339,7},is_subtype},[{var,{6339,7},'Item'},{type,{6339,15},union,[{atom,{6339,15},flags},{atom,{6339,23},tracer},{atom,{6339,32},traced},{atom,{6339,41},match_spec},{atom,{6340,15},meta},{atom,{6340,22},meta_match_spec},{atom,{6340,40},call_count},{atom,{6340,53},call_time},{atom,{6340,65},call_memory},{atom,{6340,79},all}]}]]},{type,{6341,7},constraint,[{atom,{6341,7},is_subtype},[{var,{6341,7},'Res'},{user_type,{6341,14},trace_info_return,[]}]]}]]}]}}]}},{{function,trace_delivered,1},{6277,2},[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>],#{<<101,110>> => <<67,97,108,108,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,107,101,115,32,115,117,114,101,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,10,10,84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,40,103,101,110,101,114,97,116,101,100,32,98,121,32,91,96,101,114,108,97,110,103,58,116,114,97,99,101,47,51,96,93,40,96,116,114,97,99,101,47,51,96,41,44,10,96,109,58,115,101,113,95,116,114,97,99,101,96,44,32,111,114,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,93,40,96,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,41,41,32,105,115,32,100,105,115,108,111,99,97,116,101,100,10,111,110,32,116,104,101,32,116,105,109,101,45,108,105,110,101,32,99,111,109,112,97,114,101,100,32,116,111,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,121,111,117,32,107,110,111,119,32,116,104,97,116,10,96,84,114,97,99,101,101,96,32,104,97,115,32,112,97,115,115,101,100,32,115,111,109,101,32,115,112,101,99,105,102,105,99,32,112,111,105,110,116,32,105,110,32,105,116,115,32,101,120,101,99,117,116,105,111,110,44,32,97,110,100,32,121,111,117,32,119,97,110,116,32,116,111,32,107,110,111,119,10,119,104,101,110,32,97,116,32,108,101,97,115,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,101,118,101,110,116,115,32,117,112,32,116,111,32,116,104,105,115,32,112,111,105,110,116,32,104,97,118,101,10,114,101,97,99,104,101,100,32,116,104,101,32,116,114,97,99,101,114,44,32,117,115,101,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,46,10,10,87,104,101,110,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,117,112,32,116,111,10,116,104,101,32,112,111,105,110,116,32,116,104,97,116,32,96,84,114,97,99,101,101,96,32,114,101,97,99,104,101,100,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,99,97,108,108,32,116,111,10,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,44,32,116,104,101,110,32,97,32,96,123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,84,114,97,99,101,101,44,32,82,101,102,125,96,10,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,109,101,115,115,97,103,101,32,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,100,111,101,115,32,95,110,111,116,95,32,105,109,112,108,121,32,116,104,97,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,10,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,110,115,116,101,97,100,32,105,116,32,105,109,112,108,105,101,115,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,95,97,114,101,32,116,111,32,98,101,10,100,101,108,105,118,101,114,101,100,95,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,116,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,32,105,102,32,96,84,114,97,99,101,101,96,32,105,115,32,110,111,116,44,32,97,110,100,32,104,97,115,10,110,111,116,32,98,101,101,110,32,116,114,97,99,101,100,32,98,121,32,115,111,109,101,111,110,101,44,32,98,117,116,32,105,102,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,95,110,111,95,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,10,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,109,101,115,115,97,103,101,32,97,114,114,105,118,101,115,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,96,84,114,97,99,101,101,96,32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,99,117,114,114,101,110,116,108,121,32,111,114,32,112,114,101,118,105,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,111,110,10,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,114,101,115,105,100,101,115,32,111,110,46,32,84,104,101,10,115,112,101,99,105,97,108,32,96,84,114,97,99,101,101,96,32,97,116,111,109,32,96,97,108,108,96,32,100,101,110,111,116,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,99,117,114,114,101,110,116,108,121,32,97,114,101,32,116,114,97,99,101,100,32,105,110,10,116,104,101,32,110,111,100,101,46,10,10,87,104,101,110,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,91,84,114,97,99,101,114,32,77,111,100,117,108,101,93,40,96,109,58,101,114,108,95,116,114,97,99,101,114,96,41,44,32,97,110,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,105,110,10,116,104,101,32,116,114,97,99,101,32,99,97,108,108,98,97,99,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,104,97,118,101,32,114,101,97,99,104,101,100,32,105,116,115,32,114,101,99,105,112,105,101,110,116,32,98,101,102,111,114,101,32,116,104,101,10,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46,10,10,69,120,97,109,112,108,101,58,32,80,114,111,99,101,115,115,32,96,65,96,32,105,115,32,96,84,114,97,99,101,101,96,44,32,112,111,114,116,32,96,66,96,32,105,115,32,116,114,97,99,101,114,44,32,97,110,100,32,112,114,111,99,101,115,115,32,96,67,96,32,105,115,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,111,102,32,96,66,96,46,32,96,67,96,32,119,97,110,116,115,32,116,111,32,99,108,111,115,101,32,96,66,96,32,119,104,101,110,32,96,65,96,32,101,120,105,116,115,46,32,84,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,10,116,114,97,99,101,32,105,115,32,110,111,116,32,116,114,117,110,99,97,116,101,100,44,32,96,67,96,32,99,97,110,32,99,97,108,108,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,65,41,96,32,119,104,101,110,32,96,65,96,32,101,120,105,116,115,44,10,97,110,100,32,119,97,105,116,32,102,111,114,32,109,101,115,115,97,103,101,32,96,123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,65,44,32,82,101,102,125,96,32,98,101,102,111,114,101,32,99,108,111,115,105,110,103,32,96,66,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,84,114,97,99,101,101,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,40,100,101,97,100,32,111,114,32,97,108,105,118,101,41,32,111,110,32,116,104,101,10,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,114,101,115,105,100,101,115,32,111,110,46>>},#{group => trace,specification => [{attribute,{6316,2},spec,{{trace_delivered,1},[{type,{6316,22},bounded_fun,[{type,{6316,22},'fun',[{type,{6316,22},product,[{var,{6316,23},'Tracee'}]},{var,{6316,34},'Ref'}]},[{type,{6317,7},constraint,[{atom,{6317,7},is_subtype},[{var,{6317,7},'Tracee'},{type,{6317,17},union,[{type,{6317,17},pid,[]},{atom,{6317,25},all}]}]]},{type,{6318,7},constraint,[{atom,{6318,7},is_subtype},[{var,{6318,7},'Ref'},{type,{6318,14},reference,[]}]]}]]}]}}]}},{{function,trace,3},{6235,2},[<<116,114,97,99,101,40,80,105,100,80,111,114,116,83,112,101,99,44,32,72,111,119,44,32,70,108,97,103,76,105,115,116,41>>],#{<<101,110>> => <<84,117,114,110,32,111,110,32,111,114,32,111,102,102,32,116,114,97,99,101,32,102,108,97,103,115,32,111,110,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,102,111,114,32,116,104,101,32,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,32,97,110,100,32,96,116,114,97,99,101,58,112,111,114,116,47,52,96,32,116,104,97,116,10,32,32,62,32,111,112,101,114,97,116,101,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,115,101,115,115,105,111,110,115,46,10,10,65,114,103,117,109,101,110,116,32,96,70,108,97,103,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,116,119,111,32,97,100,100,105,116,105,111,110,97,108,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,101,114,101,32,116,111,32,115,101,110,100,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,96,84,114,97,99,101,114,96,10,32,32,109,117,115,116,32,98,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,10,32,32,108,111,99,97,108,32,112,111,114,116,46,10,10,45,32,42,42,96,123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,105,115,10,32,32,116,111,32,98,101,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,111,102,32,115,101,110,100,105,110,103,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,99,97,110,32,116,104,101,110,10,32,32,105,103,110,111,114,101,32,111,114,32,99,104,97,110,103,101,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,111,32,119,114,105,116,101,32,97,32,116,114,97,99,101,114,10,32,32,109,111,100,117,108,101,44,32,115,101,101,32,96,109,58,101,114,108,95,116,114,97,99,101,114,96,46,10,10,73,102,32,110,111,32,96,116,114,97,99,101,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,97,108,108,32,116,104,101,32,116,114,97,99,101,10,109,101,115,115,97,103,101,115,46,32,84,104,101,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,32,104,97,115,32,110,111,32,115,112,101,99,105,102,105,101,100,32,116,114,97,99,101,114,46,10,10,70,111,114,32,102,117,114,116,104,101,114,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,101,101,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,32,97,110,100,32,96,116,114,97,99,101,58,112,111,114,116,47,52,96,46>>},#{group => trace,specification => [{attribute,{6260,2},spec,{{trace,3},[{type,{6260,12},bounded_fun,[{type,{6260,12},'fun',[{type,{6260,12},product,[{var,{6260,13},'PidPortSpec'},{var,{6260,26},'How'},{var,{6260,31},'FlagList'}]},{type,{6260,44},integer,[]}]},[{type,{6261,7},constraint,[{atom,{6261,7},is_subtype},[{var,{6261,7},'PidPortSpec'},{type,{6261,22},union,[{type,{6261,22},pid,[]},{type,{6261,30},port,[]},{atom,{6262,22},all},{atom,{6262,28},processes},{atom,{6262,40},ports},{atom,{6263,22},existing},{atom,{6263,33},existing_processes},{atom,{6263,54},existing_ports},{atom,{6264,22},new},{atom,{6264,28},new_processes},{atom,{6264,44},new_ports}]}]]},{type,{6265,7},constraint,[{atom,{6265,7},is_subtype},[{var,{6265,7},'How'},{type,{6265,14},boolean,[]}]]},{type,{6266,7},constraint,[{atom,{6266,7},is_subtype},[{var,{6266,7},'FlagList'},{type,{6266,19},list,[{user_type,{6266,20},trace_flag,[]}]}]]}]]}]}}]}},{{function,time,0},{6214,2},[<<116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,97,115,32,96,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,96,46,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,105,109,101,40,41,46,10,123,57,44,52,50,44,52,52,125,10,96,96,96>>},#{group => time,specification => [{attribute,{6229,2},spec,{{time,0},[{type,{6229,11},bounded_fun,[{type,{6229,11},'fun',[{type,{6229,11},product,[]},{var,{6229,17},'Time'}]},[{type,{6230,7},constraint,[{atom,{6230,7},is_subtype},[{var,{6230,7},'Time'},{remote_type,{6230,15},[{atom,{6230,15},calendar},{atom,{6230,24},time},[]]}]]}]]}]}}]}},{{function,throw,1},{6173,2},[<<116,104,114,111,119,40,65,110,121,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,116,104,114,111,119,96,46,32,73,110,116,101,110,100,101,100,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,100,111,32,110,111,110,45,108,111,99,97,108,10,114,101,116,117,114,110,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,46,10,10,73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32,91,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,99,97,116,99,104,45,97,110,100,45,116,104,114,111,119,96,41,44,32,116,104,101,10,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,32,114,101,116,117,114,110,115,32,118,97,108,117,101,32,96,65,110,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,97,116,99,104,32,116,104,114,111,119,40,123,104,101,108,108,111,44,32,116,104,101,114,101,125,41,46,10,32,32,32,32,32,32,32,32,123,104,101,108,108,111,44,116,104,101,114,101,125,10,96,96,96,10,10,73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32,96,116,114,121,96,92,45,98,108,111,99,107,32,111,102,32,97,10,91,116,114,121,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,114,121,96,41,44,32,116,104,101,32,118,97,108,117,101,32,96,65,110,121,96,32,99,97,110,32,98,101,32,99,97,117,103,104,116,10,119,105,116,104,105,110,32,116,104,101,32,99,97,116,99,104,32,98,108,111,99,107,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,116,114,121,10,32,32,32,32,116,104,114,111,119,40,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,34,83,111,109,101,116,104,105,110,103,32,104,97,112,112,101,110,101,100,34,125,41,10,99,97,116,99,104,10,32,32,32,32,116,104,114,111,119,58,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,68,101,115,99,125,32,45,62,10,32,32,32,32,32,32,32,32,105,111,58,102,111,114,109,97,116,40,115,116,97,110,100,97,114,100,95,101,114,114,111,114,44,32,34,69,114,114,111,114,58,32,126,115,126,110,34,44,32,91,68,101,115,99,93,41,10,101,110,100,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,110,111,99,97,116,99,104,96,32,105,102,32,110,111,116,32,99,97,117,103,104,116,32,98,121,32,97,110,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,46,10,10,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,10,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{6208,2},spec,{{throw,1},[{type,{6208,12},bounded_fun,[{type,{6208,12},'fun',[{type,{6208,12},product,[{var,{6208,13},'Any'}]},{type,{6208,21},no_return,[]}]},[{type,{6209,7},constraint,[{atom,{6209,7},is_subtype},[{var,{6209,7},'Any'},{type,{6209,14},term,[]}]]}]]}]}}]}},{{function,system_profile,2},{6121,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,40,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,101,116,115,32,115,121,115,116,101,109,32,112,114,111,102,105,108,101,114,32,111,112,116,105,111,110,115,46,32,96,80,114,111,102,105,108,101,114,80,105,100,96,32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,10,111,114,32,112,111,114,116,32,114,101,99,101,105,118,105,110,103,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,114,101,99,101,105,118,101,114,32,105,115,32,101,120,99,108,117,100,101,100,32,102,114,111,109,32,97,108,108,10,112,114,111,102,105,108,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,102,105,108,105,110,103,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,101,120,99,108,117,115,105,118,101,96,42,42,32,45,32,73,102,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,105,115,32,100,111,110,101,44,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,110,111,116,32,114,117,110,110,97,98,108,101,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,32,114,117,110,116,105,109,101,32,116,111,32,116,104,101,10,32,32,112,111,114,116,46,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,105,102,105,101,100,32,97,115,32,96,105,110,97,99,116,105,118,101,96,44,32,97,110,100,32,108,97,116,101,114,32,96,97,99,116,105,118,101,96,32,119,104,101,110,10,32,32,116,104,101,32,112,111,114,116,32,99,97,108,108,98,97,99,107,32,114,101,116,117,114,110,115,46,10,10,45,32,42,42,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,117,115,101,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,46,32,84,104,101,32,116,105,109,101,10,32,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,10,32,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,96,46,10,10,45,32,42,42,96,114,117,110,110,97,98,108,101,95,112,114,111,99,115,96,42,42,32,45,32,73,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,10,32,32,97,32,109,101,115,115,97,103,101,44,32,96,123,112,114,111,102,105,108,101,44,32,80,105,100,44,32,83,116,97,116,101,44,32,77,102,97,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,32,82,117,110,110,105,110,103,10,32,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,114,117,110,32,113,117,101,117,101,32,97,102,116,101,114,32,104,97,118,105,110,103,32,98,101,101,110,32,112,114,101,45,101,109,112,116,101,100,10,32,32,100,111,32,110,111,116,32,116,114,105,103,103,101,114,32,116,104,105,115,32,109,101,115,115,97,103,101,46,10,10,45,32,42,42,96,114,117,110,110,97,98,108,101,95,112,111,114,116,115,96,42,42,32,45,32,73,102,32,97,32,112,111,114,116,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,10,32,32,109,101,115,115,97,103,101,44,32,96,123,112,114,111,102,105,108,101,44,32,80,111,114,116,44,32,83,116,97,116,101,44,32,48,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,10,10,45,32,42,42,96,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,112,117,116,32,116,111,32,115,108,101,101,112,32,111,114,32,97,119,111,107,101,110,44,32,97,32,109,101,115,115,97,103,101,44,10,32,32,96,123,112,114,111,102,105,108,101,44,32,115,99,104,101,100,117,108,101,114,44,32,73,100,44,32,83,116,97,116,101,44,32,78,111,83,99,104,101,100,115,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,10,10,45,32,42,42,96,115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,99,111,110,115,105,115,116,32,111,102,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,32,97,10,32,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,10,32,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,10,32,32,96,123,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,44,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,125,96,46,10,10,45,32,42,42,96,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,105,110,99,108,117,100,101,32,97,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,10,32,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,110,111,119,40,41,96,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,105,102,32,110,111,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,96,99,112,117,95,116,105,109,101,115,116,97,109,112,96,32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,10,32,32,116,104,114,111,117,103,104,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,44,32,116,104,105,115,32,97,108,115,111,32,101,102,102,101,99,116,115,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,10,32,32,112,114,111,100,117,99,101,100,32,105,110,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,102,108,97,103,32,96,116,105,109,101,115,116,97,109,112,96,32,105,115,32,101,110,97,98,108,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,96,32,98,101,104,97,118,105,111,114,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>},#{group => system,specification => [{attribute,{6164,2},spec,{{system_profile,2},[{type,{6164,21},bounded_fun,[{type,{6164,21},'fun',[{type,{6164,21},product,[{var,{6164,22},'ProfilerPid'},{var,{6164,35},'Options'}]},{var,{6164,47},'ProfilerSettings'}]},[{type,{6165,7},constraint,[{atom,{6165,7},is_subtype},[{var,{6165,7},'ProfilerPid'},{type,{6165,22},union,[{type,{6165,22},pid,[]},{type,{6165,30},port,[]},{atom,{6165,39},undefined}]}]]},{type,{6166,7},constraint,[{atom,{6166,7},is_subtype},[{var,{6166,7},'Options'},{type,{6166,18},list,[{user_type,{6166,20},system_profile_option,[]}]}]]},{type,{6167,7},constraint,[{atom,{6167,7},is_subtype},[{var,{6167,7},'ProfilerSettings'},{type,{6167,27},union,[{atom,{6167,27},undefined},{type,{6167,39},tuple,[{type,{6167,41},union,[{type,{6167,41},pid,[]},{type,{6167,49},port,[]}]},{type,{6167,57},list,[{user_type,{6167,59},system_profile_option,[]}]}]}]}]]}]]}]}}]}},{{function,system_profile,0},{6106,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,112,114,111,102,105,108,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,93,40,96,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,41,32,97,115,32,96,123,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,10,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>},#{group => system,specification => [{attribute,{6113,2},spec,{{system_profile,0},[{type,{6113,21},bounded_fun,[{type,{6113,21},'fun',[{type,{6113,21},product,[]},{var,{6113,27},'ProfilerSettings'}]},[{type,{6114,7},constraint,[{atom,{6114,7},is_subtype},[{var,{6114,7},'ProfilerSettings'},{type,{6114,27},union,[{atom,{6114,27},undefined},{type,{6114,39},tuple,[{var,{6114,41},'ProfilerPid'},{var,{6114,54},'Options'}]}]}]]},{type,{6115,7},constraint,[{atom,{6115,7},is_subtype},[{var,{6115,7},'ProfilerPid'},{type,{6115,22},union,[{type,{6115,22},pid,[]},{type,{6115,30},port,[]}]}]]},{type,{6116,7},constraint,[{atom,{6116,7},is_subtype},[{var,{6116,7},'Options'},{type,{6116,18},list,[{user_type,{6116,20},system_profile_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,2},{5967,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,46,32,96,77,111,110,105,116,111,114,80,105,100,96,32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,114,101,99,101,105,118,105,110,103,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,10,10,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,108,111,110,103,95,103,99,44,32,84,105,109,101,125,96,42,42,32,45,32,73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,116,97,107,101,115,32,97,116,32,108,101,97,115,116,10,32,32,96,84,105,109,101,96,32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,32,96,123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,111,110,103,95,103,99,44,32,73,110,102,111,125,96,32,105,115,10,32,32,115,101,110,116,32,116,111,32,96,77,111,110,105,116,111,114,80,105,100,96,46,32,96,71,99,80,105,100,96,32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,119,97,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,96,73,110,102,111,96,32,105,115,10,32,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,10,10,32,32,79,110,101,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,96,123,116,105,109,101,111,117,116,44,32,71,99,84,105,109,101,125,96,44,32,119,104,101,114,101,32,96,71,99,84,105,109,101,96,32,105,115,32,116,104,101,32,116,105,109,101,32,102,111,114,32,116,104,101,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,32,84,104,101,32,111,116,104,101,114,32,116,117,112,108,101,115,32,97,114,101,32,116,97,103,103,101,100,32,119,105,116,104,10,32,32,96,104,101,97,112,95,115,105,122,101,96,44,32,96,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,44,32,96,115,116,97,99,107,95,115,105,122,101,96,44,32,96,109,98,117,102,95,115,105,122,101,96,44,32,96,111,108,100,95,104,101,97,112,95,115,105,122,101,96,44,10,32,32,97,110,100,32,96,111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,46,32,84,104,101,115,101,32,116,117,112,108,101,115,32,97,114,101,32,101,120,112,108,97,105,110,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,10,32,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,91,96,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,93,40,96,109,58,116,114,97,99,101,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,41,32,40,115,101,101,10,32,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,41,46,32,78,101,119,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,44,32,97,110,100,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,10,32,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,96,73,110,102,111,96,32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,44,32,123,68,105,115,97,98,108,101,44,32,69,110,97,98,108,101,125,125,96,42,42,32,45,32,73,102,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,110,103,116,104,32,111,102,10,32,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,101,97,99,104,32,96,69,110,97,98,108,101,96,32,108,101,110,103,116,104,44,32,97,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,10,32,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,77,111,110,105,116,111,114,80,105,100,96,46,32,84,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,10,32,32,119,105,108,108,32,98,101,32,111,110,32,116,104,101,32,102,111,114,109,32,96,123,109,111,110,105,116,111,114,44,32,80,105,100,44,32,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,44,32,76,111,110,103,125,96,44,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,103,111,116,32,97,32,108,111,110,103,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,110,100,32,96,76,111,110,103,96,10,32,32,119,105,108,108,32,101,113,117,97,108,32,96,116,114,117,101,96,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,105,116,32,105,115,32,105,110,32,97,32,95,108,111,110,103,32,109,101,115,115,97,103,101,32,113,117,101,117,101,95,32,115,116,97,116,101,46,32,78,111,10,32,32,109,111,114,101,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,115,101,110,116,32,100,117,101,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,117,110,116,105,108,32,105,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,110,103,116,104,32,102,97,108,108,115,32,100,111,119,110,32,116,111,32,97,32,108,101,110,103,116,104,32,111,102,10,32,32,96,68,105,115,97,98,108,101,96,32,108,101,110,103,116,104,46,32,87,104,101,110,32,116,104,105,115,32,104,97,112,112,101,110,115,44,32,97,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,10,32,32,119,105,116,104,32,96,76,111,110,103,96,32,101,113,117,97,108,32,116,111,32,96,102,97,108,115,101,96,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,77,111,110,105,116,111,114,80,105,100,96,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,32,108,111,110,103,101,114,32,105,110,32,97,32,95,108,111,110,103,32,109,101,115,115,97,103,101,10,32,32,113,117,101,117,101,95,32,115,116,97,116,101,46,32,65,115,32,111,102,32,116,104,105,115,44,32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,110,103,116,104,32,115,104,111,117,108,100,32,97,103,97,105,110,32,114,101,97,99,104,10,32,32,96,69,110,97,98,108,101,96,32,108,101,110,103,116,104,44,32,97,32,110,101,119,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,119,105,116,104,32,96,76,111,110,103,96,32,115,101,116,32,116,111,10,32,32,96,116,114,117,101,96,32,119,105,108,108,32,97,103,97,105,110,32,98,101,32,115,101,110,116,46,32,84,104,97,116,32,105,115,44,32,97,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,105,115,10,32,32,115,101,110,116,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,101,110,116,101,114,115,32,111,114,32,108,101,97,118,101,115,32,97,32,95,108,111,110,103,32,109,101,115,115,97,103,101,32,113,117,101,117,101,95,32,115,116,97,116,101,32,119,104,101,114,101,32,116,104,101,115,101,10,32,32,115,116,97,116,101,32,99,104,97,110,103,101,115,32,97,114,101,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,96,69,110,97,98,108,101,96,32,97,110,100,32,96,68,105,115,97,98,108,101,96,32,112,97,114,97,109,101,116,101,114,115,46,10,10,32,32,96,69,110,97,98,108,101,96,32,108,101,110,103,116,104,32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,108,97,114,103,101,114,32,116,104,97,110,32,122,101,114,111,32,97,110,100,32,96,68,105,115,97,98,108,101,96,32,108,101,110,103,116,104,32,109,117,115,116,10,32,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,122,101,114,111,46,32,96,68,105,115,97,98,108,101,96,32,108,101,110,103,116,104,32,109,117,115,116,32,97,108,115,111,32,98,101,10,32,32,115,109,97,108,108,101,114,32,116,104,97,110,32,96,69,110,97,98,108,101,96,32,108,101,110,103,116,104,46,32,73,102,32,116,104,101,32,97,98,111,118,101,32,105,115,32,110,111,116,32,115,97,116,105,115,102,105,101,100,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,10,32,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,46,32,89,111,117,32,97,114,101,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,117,115,101,32,97,32,109,117,99,104,10,32,32,115,109,97,108,108,101,114,32,118,97,108,117,101,32,102,111,114,32,96,68,105,115,97,98,108,101,96,32,108,101,110,103,116,104,32,116,104,97,110,32,96,69,110,97,98,108,101,96,32,108,101,110,103,116,104,32,105,110,32,111,114,100,101,114,32,110,111,116,32,116,111,32,98,101,10,32,32,102,108,111,111,100,101,100,32,119,105,116,104,32,96,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,96,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,10,10,45,32,42,42,96,123,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,84,105,109,101,125,96,42,42,32,45,32,73,102,32,97,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,117,110,115,10,32,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,102,111,114,32,97,116,32,108,101,97,115,116,32,96,84,105,109,101,96,32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,10,32,32,96,123,109,111,110,105,116,111,114,44,32,80,105,100,79,114,80,111,114,116,44,32,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,73,110,102,111,125,96,32,105,115,32,115,101,110,116,32,116,111,32,96,77,111,110,105,116,111,114,80,105,100,96,46,10,32,32,96,80,105,100,79,114,80,111,114,116,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,104,97,116,32,119,97,115,32,114,117,110,110,105,110,103,46,32,96,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,111,102,10,32,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,101,118,101,110,116,46,10,10,32,32,73,102,32,97,32,96,116,58,112,105,100,47,48,96,44,32,116,104,101,32,116,117,112,108,101,115,32,96,123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125,96,44,32,96,123,105,110,44,32,76,111,99,97,116,105,111,110,125,96,44,32,97,110,100,10,32,32,96,123,111,117,116,44,32,76,111,99,97,116,105,111,110,125,96,32,97,114,101,32,112,114,101,115,101,110,116,44,32,119,104,101,114,101,32,96,76,111,99,97,116,105,111,110,96,32,105,115,32,101,105,116,104,101,114,32,97,110,32,77,70,65,10,32,32,40,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,96,41,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,10,32,32,115,99,104,101,100,117,108,101,100,32,105,110,47,111,117,116,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,32,32,73,102,32,97,32,96,116,58,112,111,114,116,47,48,96,44,32,116,104,101,32,116,117,112,108,101,115,32,96,123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125,96,32,97,110,100,32,96,123,112,111,114,116,95,111,112,44,79,112,125,96,32,97,114,101,10,32,32,112,114,101,115,101,110,116,46,32,96,79,112,96,32,105,115,32,111,110,101,32,111,102,32,96,112,114,111,99,95,115,105,103,96,44,32,96,116,105,109,101,111,117,116,96,44,32,96,105,110,112,117,116,96,44,32,96,111,117,116,112,117,116,96,44,32,96,101,118,101,110,116,96,44,32,111,114,10,32,32,96,100,105,115,116,95,99,109,100,96,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,105,99,104,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,119,97,115,32,101,120,101,99,117,116,105,110,103,46,10,10,32,32,96,112,114,111,99,95,115,105,103,96,32,105,115,32,97,110,32,105,110,116,101,114,110,97,108,32,111,112,101,114,97,116,105,111,110,32,97,110,100,32,105,115,32,110,101,118,101,114,32,116,111,32,97,112,112,101,97,114,44,32,119,104,105,108,101,32,116,104,101,32,111,116,104,101,114,115,10,32,32,114,101,112,114,101,115,101,110,116,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,115,32,96,116,105,109,101,111,117,116,96,44,32,96,114,101,97,100,121,95,105,110,112,117,116,96,44,10,32,32,96,114,101,97,100,121,95,111,117,116,112,117,116,96,44,32,96,101,118,101,110,116,96,44,32,97,110,100,32,96,111,117,116,112,117,116,118,96,32,40,119,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,117,115,101,100,32,98,121,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,41,46,32,86,97,108,117,101,32,96,77,105,108,108,105,115,96,32,105,110,32,116,117,112,108,101,32,96,116,105,109,101,111,117,116,96,32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,10,32,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,44,32,119,104,105,99,104,32,97,108,119,97,121,115,32,105,115,32,101,113,117,97,108,32,116,111,10,32,32,111,114,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,115,117,112,112,108,105,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,116,114,97,99,101,46,32,78,101,119,32,116,117,112,108,101,115,10,32,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,111,32,116,104,101,32,96,73,110,102,111,96,32,108,105,115,116,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,10,32,32,105,110,32,116,104,101,32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,32,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,99,116,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,78,73,70,115,32,111,114,32,100,114,105,118,101,114,115,32,116,104,97,116,32,116,97,107,101,32,116,111,111,32,108,111,110,103,32,116,111,10,32,32,101,120,101,99,117,116,101,46,32,49,32,109,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,103,111,111,100,32,109,97,120,105,109,117,109,32,116,105,109,101,32,102,111,114,32,97,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,111,114,32,97,10,32,32,78,73,70,46,32,72,111,119,101,118,101,114,44,32,97,32,116,105,109,101,45,115,104,97,114,105,110,103,32,115,121,115,116,101,109,32,105,115,32,117,115,117,97,108,108,121,32,116,111,32,99,111,110,115,105,100,101,114,32,101,118,101,114,121,116,104,105,110,103,32,60,32,49,48,48,32,109,115,10,32,32,97,115,32,34,112,111,115,115,105,98,108,101,34,32,97,110,100,32,102,97,105,114,108,121,32,34,110,111,114,109,97,108,34,46,32,72,111,119,101,118,101,114,44,32,108,111,110,103,101,114,32,115,99,104,101,100,117,108,101,32,116,105,109,101,115,32,99,97,110,32,105,110,100,105,99,97,116,101,10,32,32,115,119,97,112,112,105,110,103,32,111,114,32,97,32,109,105,115,98,101,104,97,118,105,110,103,32,78,73,70,47,100,114,105,118,101,114,46,32,77,105,115,98,101,104,97,118,105,110,103,32,78,73,70,115,32,97,110,100,32,100,114,105,118,101,114,115,32,99,97,110,32,99,97,117,115,101,10,32,32,98,97,100,32,114,101,115,111,117,114,99,101,32,117,116,105,108,105,122,97,116,105,111,110,32,97,110,100,32,98,97,100,32,111,118,101,114,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46,10,10,45,32,42,42,96,123,108,97,114,103,101,95,104,101,97,112,44,32,83,105,122,101,125,96,42,42,32,45,32,73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,101,115,117,108,116,115,32,105,110,10,32,32,116,104,101,32,97,108,108,111,99,97,116,101,100,32,115,105,122,101,32,111,102,32,97,32,104,101,97,112,32,98,101,105,110,103,32,97,116,32,108,101,97,115,116,32,96,83,105,122,101,96,32,119,111,114,100,115,44,32,97,32,109,101,115,115,97,103,101,10,32,32,96,123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,97,114,103,101,95,104,101,97,112,44,32,73,110,102,111,125,96,32,105,115,32,115,101,110,116,32,116,111,32,96,77,111,110,105,116,111,114,80,105,100,96,46,32,96,71,99,80,105,100,96,32,97,110,100,10,32,32,96,73,110,102,111,96,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32,96,108,111,110,103,95,103,99,96,32,101,97,114,108,105,101,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,116,117,112,108,101,32,116,97,103,103,101,100,10,32,32,119,105,116,104,32,96,116,105,109,101,111,117,116,96,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,115,105,122,101,115,32,111,102,32,97,108,108,32,109,101,109,111,114,121,32,98,108,111,99,107,115,10,32,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,108,108,32,104,101,97,112,32,103,101,110,101,114,97,116,105,111,110,115,32,97,102,116,101,114,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,101,113,117,97,108,32,116,111,32,111,114,10,32,32,104,105,103,104,101,114,32,116,104,97,110,32,96,83,105,122,101,96,46,10,10,32,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,105,115,32,107,105,108,108,101,100,32,98,121,10,32,32,91,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,44,32,105,116,32,105,115,32,107,105,108,108,101,100,32,98,101,102,111,114,101,10,32,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,99,111,109,112,108,101,116,101,32,97,110,100,32,116,104,117,115,32,110,111,32,108,97,114,103,101,32,104,101,97,112,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46,10,10,45,32,42,42,96,98,117,115,121,95,112,111,114,116,96,42,42,32,45,32,73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,10,32,32,116,111,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32,96,123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,112,111,114,116,44,32,80,111,114,116,125,96,32,105,115,32,115,101,110,116,32,116,111,10,32,32,96,77,111,110,105,116,111,114,80,105,100,96,46,32,96,83,117,115,80,105,100,96,32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,111,32,96,80,111,114,116,96,46,10,10,45,32,42,42,96,98,117,115,121,95,100,105,115,116,95,112,111,114,116,96,91,93,40,41,123,58,32,35,98,117,115,121,95,100,105,115,116,95,112,111,114,116,32,125,32,42,42,32,32,10,32,32,32,73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,32,116,111,32,97,32,112,114,111,99,101,115,115,32,111,110,32,97,32,114,101,109,111,116,101,10,32,32,110,111,100,101,32,119,104,111,115,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,97,115,32,104,97,110,100,108,101,100,32,98,121,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32,96,123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,100,105,115,116,95,112,111,114,116,44,32,80,111,114,116,125,96,10,32,32,105,115,32,115,101,110,116,32,116,111,32,96,77,111,110,105,116,111,114,80,105,100,96,46,32,96,83,117,115,80,105,100,96,32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,104,114,111,117,103,104,10,32,32,116,104,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,112,111,114,116,32,96,80,111,114,116,96,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,41,46,10,10,84,104,101,32,97,114,103,117,109,101,110,116,115,32,116,111,32,91,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,97,108,108,10,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,111,110,32,116,104,101,32,110,111,100,101,32,115,104,111,117,108,100,32,98,101,32,100,111,110,101,44,32,110,111,116,32,104,111,119,32,105,116,32,115,104,111,117,108,100,32,98,101,32,99,104,97,110,103,101,100,46,32,84,104,105,115,10,109,101,97,110,115,32,111,110,108,121,32,111,110,101,32,112,114,111,99,101,115,115,32,97,116,32,97,32,116,105,109,101,32,40,96,77,111,110,105,116,111,114,80,105,100,96,41,32,99,97,110,32,98,101,32,116,104,101,32,114,101,99,101,105,118,101,114,32,111,102,32,115,121,115,116,101,109,10,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,32,65,108,115,111,44,32,116,104,101,32,119,97,121,32,116,111,32,99,108,101,97,114,32,97,32,115,112,101,99,105,102,105,99,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,32,105,115,32,116,111,32,110,111,116,10,105,110,99,108,117,100,101,32,105,116,32,105,110,32,116,104,101,32,108,105,115,116,32,96,79,112,116,105,111,110,115,96,46,32,65,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,98,101,10,99,108,101,97,114,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,77,111,110,105,116,111,114,80,105,100,96,32,116,101,114,109,105,110,97,116,101,115,46,10,10,84,104,101,114,101,32,97,114,101,32,110,111,32,115,112,101,99,105,97,108,32,111,112,116,105,111,110,32,118,97,108,117,101,115,32,40,108,105,107,101,32,122,101,114,111,41,32,116,111,32,99,108,101,97,114,32,97,110,32,111,112,116,105,111,110,46,32,83,111,109,101,32,111,102,32,116,104,101,10,111,112,116,105,111,110,115,32,104,97,118,101,32,97,32,117,110,115,112,101,99,105,102,105,101,100,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,76,111,119,101,114,32,118,97,108,117,101,115,32,119,105,108,108,32,98,101,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,10,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,109,111,110,105,116,111,114,32,97,108,108,32,103,97,114,98,97,103,101,10,99,111,108,108,101,99,116,105,111,110,115,32,119,105,116,104,32,96,123,108,111,110,103,95,103,99,44,32,48,125,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,97,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,103,101,116,115,32,115,111,32,108,97,114,103,101,32,116,104,97,116,32,105,116,32,105,116,115,101,108,102,32,115,116,97,114,116,115,32,116,111,32,99,97,117,115,101,32,115,121,115,116,101,109,10,62,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,101,110,108,97,114,103,101,32,116,104,101,32,112,114,111,99,101,115,115,10,62,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,110,100,32,112,114,111,98,97,98,108,121,32,109,97,107,101,32,116,104,101,32,112,114,111,98,108,101,109,32,119,111,114,115,101,46,10,62,10,62,32,75,101,101,112,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,110,101,97,116,32,97,110,100,32,100,111,32,110,111,116,32,115,101,116,32,116,104,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,108,105,109,105,116,115,32,116,111,111,10,62,32,116,105,103,104,116,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,110,105,116,111,114,80,105,100,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,110,105,116,111,114,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => system,specification => [{attribute,{6096,2},spec,{{system_monitor,2},[{type,{6096,21},bounded_fun,[{type,{6096,21},'fun',[{type,{6096,21},product,[{var,{6096,22},'MonitorPid'},{var,{6096,34},'Options'}]},{var,{6096,46},'MonSettings'}]},[{type,{6097,7},constraint,[{atom,{6097,7},is_subtype},[{var,{6097,7},'MonitorPid'},{type,{6097,21},pid,[]}]]},{type,{6098,7},constraint,[{atom,{6098,7},is_subtype},[{var,{6098,7},'Options'},{type,{6098,18},list,[{user_type,{6098,20},system_monitor_option,[]}]}]]},{type,{6099,7},constraint,[{atom,{6099,7},is_subtype},[{var,{6099,7},'MonSettings'},{type,{6099,22},union,[{atom,{6099,22},undefined},{type,{6099,34},tuple,[{var,{6099,36},'OldMonitorPid'},{var,{6099,51},'OldOptions'}]}]}]]},{type,{6100,7},constraint,[{atom,{6100,7},is_subtype},[{var,{6100,7},'OldMonitorPid'},{type,{6100,24},pid,[]}]]},{type,{6101,7},constraint,[{atom,{6101,7},is_subtype},[{var,{6101,7},'OldOptions'},{type,{6101,21},list,[{user_type,{6101,23},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,1},{5947,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,65,114,103,41>>],#{<<101,110>> => <<87,104,101,110,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,32,96,117,110,100,101,102,105,110,101,100,96,44,32,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,10,115,101,116,116,105,110,103,115,32,97,114,101,32,99,108,101,97,114,101,100,46,10,10,67,97,108,108,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32,96,123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,32,97,115,32,97,114,103,117,109,101,110,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,10,99,97,108,108,105,110,103,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,41,46>>},#{group => system,specification => [{attribute,{5958,2},spec,{{system_monitor,1},[{type,{5958,21},bounded_fun,[{type,{5958,21},'fun',[{type,{5958,21},product,[{var,{5958,22},'Arg'}]},{var,{5958,30},'MonSettings'}]},[{type,{5959,7},constraint,[{atom,{5959,7},is_subtype},[{var,{5959,7},'Arg'},{type,{5959,14},union,[{atom,{5959,14},undefined},{type,{5959,26},tuple,[{var,{5959,28},'MonitorPid'},{var,{5959,40},'Options'}]}]}]]},{type,{5960,7},constraint,[{atom,{5960,7},is_subtype},[{var,{5960,7},'MonSettings'},{type,{5960,22},union,[{atom,{5960,22},undefined},{type,{5960,34},tuple,[{var,{5960,36},'MonitorPid'},{var,{5960,48},'Options'}]}]}]]},{type,{5961,7},constraint,[{atom,{5961,7},is_subtype},[{var,{5961,7},'MonitorPid'},{type,{5961,21},pid,[]}]]},{type,{5962,7},constraint,[{atom,{5962,7},is_subtype},[{var,{5962,7},'Options'},{type,{5962,18},list,[{user_type,{5962,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,0},{5931,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,32,97,115,32,96,123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,110,111,32,115,101,116,116,105,110,103,115,32,101,120,105,115,116,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>},#{group => system,specification => [{attribute,{5939,2},spec,{{system_monitor,0},[{type,{5939,21},bounded_fun,[{type,{5939,21},'fun',[{type,{5939,21},product,[]},{var,{5939,27},'MonSettings'}]},[{type,{5940,7},constraint,[{atom,{5940,7},is_subtype},[{var,{5940,7},'MonSettings'},{type,{5940,22},union,[{atom,{5940,22},undefined},{type,{5940,34},tuple,[{var,{5940,36},'MonitorPid'},{var,{5940,48},'Options'}]}]}]]},{type,{5941,7},constraint,[{atom,{5941,7},is_subtype},[{var,{5941,7},'MonitorPid'},{type,{5941,21},pid,[]}]]},{type,{5942,7},constraint,[{atom,{5942,7},is_subtype},[{var,{5942,7},'Options'},{type,{5942,18},list,[{user_type,{5942,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,suspend_process,1},{5907,2},[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>],#{<<101,110>> => <<83,117,115,112,101,110,100,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,91,93,41,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>},#{group => processes,specification => [{attribute,{5916,2},spec,{{suspend_process,1},[{type,{5916,22},bounded_fun,[{type,{5916,22},'fun',[{type,{5916,22},product,[{var,{5916,23},'Suspendee'}]},{atom,{5916,37},true}]},[{type,{5917,7},constraint,[{atom,{5917,7},is_subtype},[{var,{5917,7},'Suspendee'},{type,{5917,20},pid,[]}]]}]]}]}}]}},{{function,suspend_process,2},{5808,2},[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,79,112,116,76,105,115,116,41>>],#{<<101,110>> => <<73,110,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,97,110,100,32,112,117,116,115,32,105,116,10,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,105,102,32,105,116,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,105,110,32,116,104,97,116,32,115,116,97,116,101,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,10,105,115,32,110,111,116,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,117,110,116,105,108,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,115,117,109,101,100,46,10,10,65,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,98,121,32,109,117,108,116,105,112,108,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,109,117,108,116,105,112,108,101,10,116,105,109,101,115,32,98,121,32,97,32,115,105,110,103,108,101,32,112,114,111,99,101,115,115,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,108,101,97,118,101,32,116,104,101,32,115,117,115,112,101,110,100,101,100,10,115,116,97,116,101,32,117,110,116,105,108,32,105,116,115,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,114,101,97,99,104,101,115,32,122,101,114,111,46,32,84,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,10,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,91,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,93,40,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,41,32,105,115,10,99,97,108,108,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,46,32,65,108,108,10,105,110,99,114,101,97,115,101,100,32,115,117,115,112,101,110,100,32,99,111,117,110,116,115,32,111,110,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,97,99,113,117,105,114,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,97,114,101,10,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46,10,10,79,112,116,105,111,110,115,32,40,96,79,112,116,96,115,41,58,10,10,45,32,42,42,96,97,115,121,110,99,104,114,111,110,111,117,115,96,42,42,32,45,32,65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,83,117,115,112,101,110,100,101,101,96,46,32,96,83,117,115,112,101,110,100,101,101,96,32,101,118,101,110,116,117,97,108,108,121,32,115,117,115,112,101,110,100,115,32,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,32,98,101,102,111,114,101,32,105,116,10,32,32,99,111,117,108,100,32,115,117,115,112,101,110,100,46,32,84,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,114,101,116,117,114,110,115,32,105,109,109,101,100,105,97,116,101,108,121,44,10,32,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,115,117,115,112,101,110,100,101,100,32,121,101,116,32,111,114,32,110,111,116,46,32,84,104,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,10,32,32,119,104,101,110,32,96,83,117,115,112,101,110,100,101,101,96,32,115,117,115,112,101,110,100,115,32,99,97,110,110,111,116,32,98,101,32,100,101,100,117,99,101,100,32,102,114,111,109,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,10,32,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,96,83,117,115,112,101,110,100,101,101,96,32,95,101,118,101,110,116,117,97,108,108,121,95,32,115,117,115,112,101,110,100,115,32,40,117,110,108,101,115,115,32,105,116,32,105,115,10,32,32,114,101,115,117,109,101,100,41,46,32,73,102,32,110,111,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,112,116,105,111,110,115,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,115,117,115,112,101,110,100,101,100,46,10,10,45,32,42,42,96,123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125,96,42,42,32,45,32,65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,97,10,32,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,112,108,121,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,10,32,32,96,123,82,101,112,108,121,84,97,103,44,32,83,116,97,116,101,125,96,32,119,104,101,114,101,32,96,83,116,97,116,101,96,32,105,115,32,101,105,116,104,101,114,58,10,10,32,32,45,32,42,42,96,101,120,105,116,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,101,120,105,116,101,100,46,10,10,32,32,45,32,42,42,96,115,117,115,112,101,110,100,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,119,32,115,117,115,112,101,110,100,101,100,46,10,10,32,32,45,32,42,42,96,110,111,116,95,115,117,115,112,101,110,100,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,104,97,112,112,101,110,10,32,32,32,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,115,117,101,100,32,116,104,105,115,32,114,101,113,117,101,115,116,44,32,104,97,118,101,32,99,97,108,108,101,100,10,32,32,32,32,91,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,93,40,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,41,32,98,101,102,111,114,101,32,103,101,116,116,105,110,103,32,116,104,101,32,114,101,112,108,121,46,10,10,32,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,44,32,116,104,101,32,96,123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125,96,32,111,112,116,105,111,110,32,98,101,104,97,118,101,115,10,32,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,112,116,105,111,110,32,119,105,116,104,111,117,116,32,114,101,112,108,121,32,116,97,103,46,10,10,45,32,42,42,96,117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,115,117,115,112,101,110,100,101,100,10,32,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,46,32,73,102,10,32,32,96,117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103,96,32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,44,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,10,32,32,105,115,32,115,101,110,116,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,32,111,114,32,105,102,32,97,10,32,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,104,97,115,32,98,101,101,110,32,115,101,110,116,32,97,110,100,32,105,115,32,105,110,32,116,114,97,110,115,105,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,44,32,111,114,32,105,102,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,10,32,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,97,110,100,32,97,32,115,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,105,115,32,105,110,32,116,114,97,110,115,105,116,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,10,32,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,32,114,101,109,97,105,110,115,32,117,110,99,104,97,110,103,101,100,46,10,10,73,102,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,105,110,99,114,101,97,115,101,100,44,10,96,116,114,117,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,89,111,117,32,99,97,110,32,101,97,115,105,108,121,32,99,114,101,97,116,101,32,100,101,97,100,108,111,99,107,115,32,105,102,32,112,114,111,99,101,115,115,101,115,32,115,117,115,112,101,110,100,115,32,101,97,99,104,32,111,116,104,101,114,32,40,100,105,114,101,99,116,108,121,32,111,114,10,62,32,105,110,32,99,105,114,99,108,101,115,41,46,32,73,110,32,69,82,84,83,32,118,101,114,115,105,111,110,115,32,112,114,105,111,114,32,116,111,32,69,82,84,83,32,118,101,114,115,105,111,110,32,49,48,46,48,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,62,32,112,114,101,118,101,110,116,101,100,32,115,117,99,104,32,100,101,97,100,108,111,99,107,115,44,32,98,117,116,32,116,104,105,115,32,112,114,101,118,101,110,116,105,111,110,32,104,97,115,32,110,111,119,32,98,101,101,110,32,114,101,109,111,118,101,100,32,100,117,101,32,116,111,10,62,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,97,115,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,114,101,115,105,100,101,115,32,111,110,32,97,110,111,116,104,101,114,10,32,32,110,111,100,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,118,97,108,105,100,32,96,79,112,116,96,115,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,98,101,101,110,10,32,32,115,117,115,112,101,110,100,101,100,32,109,111,114,101,32,116,105,109,101,115,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,116,104,97,110,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,105,110,116,101,114,110,97,108,32,100,97,116,97,32,115,116,114,117,99,116,117,114,101,115,46,32,84,104,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,105,115,32,103,114,101,97,116,101,114,32,116,104,97,110,10,32,32,50,44,48,48,48,44,48,48,48,44,48,48,48,32,115,117,115,112,101,110,100,115,32,97,110,100,32,119,105,108,108,32,110,101,118,101,114,32,98,101,32,108,111,119,101,114,46>>},#{group => processes,specification => [{attribute,{5891,2},spec,{{suspend_process,2},[{type,{5891,22},bounded_fun,[{type,{5891,22},'fun',[{type,{5891,22},product,[{var,{5891,23},'Suspendee'},{var,{5891,34},'OptList'}]},{type,{5891,46},boolean,[]}]},[{type,{5892,7},constraint,[{atom,{5892,7},is_subtype},[{var,{5892,7},'Suspendee'},{type,{5892,20},pid,[]}]]},{type,{5893,7},constraint,[{atom,{5893,7},is_subtype},[{var,{5893,7},'OptList'},{type,{5893,18},list,[{var,{5893,19},'Opt'}]}]]},{type,{5894,7},constraint,[{atom,{5894,7},is_subtype},[{var,{5894,7},'Opt'},{type,{5894,14},union,[{atom,{5894,14},unless_suspending},{atom,{5894,34},asynchronous},{type,{5894,49},tuple,[{atom,{5894,50},asynchronous},{type,{5894,64},term,[]}]}]}]]}]]}]}}]}},{{function,start_timer,4},{5755,2},[<<115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,123,116,105,109,101,111,117,116,44,32,84,105,109,101,114,82,101,102,44,32,77,115,103,125,96,10,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,101,115,116,96,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,98,115,44,32,102,97,108,115,101,125,96,42,42,32,45,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,73,116,32,109,101,97,110,115,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,10,32,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,95,114,101,108,97,116,105,118,101,95,32,99,117,114,114,101,110,116,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,46,10,10,45,32,42,42,96,123,97,98,115,44,32,116,114,117,101,125,96,42,42,32,45,32,65,98,115,111,108,117,116,101,32,96,84,105,109,101,96,32,118,97,108,117,101,46,32,84,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,10,32,32,97,110,32,97,98,115,111,108,117,116,101,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,84,104,101,32,97,98,115,111,108,117,116,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,115,101,116,32,116,111,32,101,120,112,105,114,101,32,111,110,44,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,10,105,110,116,101,114,118,97,108,10,96,91,32,96,91,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,41,96,40,115,116,97,114,116,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,44,32,96,91,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,41,96,40,101,110,100,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,32,93,96,46,10,73,102,32,97,32,114,101,108,97,116,105,118,101,32,116,105,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,110,101,103,97,116,105,118,101,46,10,10,73,102,32,96,68,101,115,116,96,32,105,115,32,97,32,96,116,58,112,105,100,47,48,96,44,32,105,116,32,109,117,115,116,32,98,101,32,97,32,96,116,58,112,105,100,47,48,96,32,111,102,32,97,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,10,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,101,105,116,104,101,114,32,116,101,114,109,105,110,97,116,101,100,32,111,114,32,110,111,116,46,32,73,102,10,96,68,101,115,116,96,32,105,115,32,97,110,32,96,116,58,97,116,111,109,47,48,96,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,10,112,114,111,99,101,115,115,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,110,97,109,101,32,105,115,32,108,111,111,107,101,100,32,117,112,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,105,109,101,114,10,101,120,112,105,114,97,116,105,111,110,46,32,78,111,32,101,114,114,111,114,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,46,10,10,73,102,32,96,68,101,115,116,96,32,105,115,32,97,32,96,116,58,112,105,100,47,48,96,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,10,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,96,116,58,112,105,100,47,48,96,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,111,114,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,10,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,52,46,49,49,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,105,109,101,114,115,32,97,114,101,32,110,111,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,10,119,104,101,110,32,96,68,101,115,116,96,32,105,115,32,97,110,32,96,116,58,97,116,111,109,47,48,96,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,93,40,96,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50,96,93,40,96,114,101,97,100,95,116,105,109,101,114,47,50,96,41,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,100,111,32,110,111,116,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,10,104,101,114,101,46>>},#{group => timer,specification => [{attribute,{5795,2},spec,{{start_timer,4},[{type,{5795,18},bounded_fun,[{type,{5795,18},'fun',[{type,{5795,18},product,[{var,{5795,19},'Time'},{var,{5795,25},'Dest'},{var,{5795,31},'Msg'},{var,{5795,36},'Options'}]},{var,{5795,48},'TimerRef'}]},[{type,{5796,7},constraint,[{atom,{5796,7},is_subtype},[{var,{5796,7},'Time'},{type,{5796,15},integer,[]}]]},{type,{5797,7},constraint,[{atom,{5797,7},is_subtype},[{var,{5797,7},'Dest'},{type,{5797,15},union,[{type,{5797,15},pid,[]},{type,{5797,23},atom,[]}]}]]},{type,{5798,7},constraint,[{atom,{5798,7},is_subtype},[{var,{5798,7},'Msg'},{type,{5798,14},term,[]}]]},{type,{5799,7},constraint,[{atom,{5799,7},is_subtype},[{var,{5799,7},'Options'},{type,{5799,18},list,[{var,{5799,19},'Option'}]}]]},{type,{5800,7},constraint,[{atom,{5800,7},is_subtype},[{var,{5800,7},'Abs'},{type,{5800,14},boolean,[]}]]},{type,{5801,7},constraint,[{atom,{5801,7},is_subtype},[{var,{5801,7},'Option'},{type,{5801,17},tuple,[{atom,{5801,18},abs},{var,{5801,23},'Abs'}]}]]},{type,{5802,7},constraint,[{atom,{5802,7},is_subtype},[{var,{5802,7},'TimerRef'},{type,{5802,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,start_timer,3},{5751,1},[<<115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>}},{{function,split_binary,2},{5714,2},[<<115,112,108,105,116,95,98,105,110,97,114,121,40,66,105,110,44,32,80,111,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,108,105,116,116,105,110,103,32,96,66,105,110,96,10,105,110,116,111,32,116,119,111,32,112,97,114,116,115,32,97,116,32,112,111,115,105,116,105,111,110,32,96,80,111,115,96,46,10,10,84,104,105,115,32,105,115,32,110,111,116,32,97,32,100,101,115,116,114,117,99,116,105,118,101,32,111,112,101,114,97,116,105,111,110,46,32,65,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,98,105,110,97,114,105,101,115,32,97,108,116,111,103,101,116,104,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,32,61,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,34,48,49,50,51,52,53,54,55,56,57,34,41,46,10,60,60,34,48,49,50,51,52,53,54,55,56,57,34,62,62,10,62,32,98,121,116,101,95,115,105,122,101,40,66,41,46,10,49,48,10,62,32,123,66,49,44,32,66,50,125,32,61,32,115,112,108,105,116,95,98,105,110,97,114,121,40,66,44,51,41,46,10,123,60,60,34,48,49,50,34,62,62,44,60,60,34,51,52,53,54,55,56,57,34,62,62,125,10,62,32,98,121,116,101,95,115,105,122,101,40,66,49,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,66,50,41,46,10,55,10,96,96,96>>},#{group => terms,specification => [{attribute,{5736,2},spec,{{split_binary,2},[{type,{5736,19},bounded_fun,[{type,{5736,19},'fun',[{type,{5736,19},product,[{var,{5736,20},'Bin'},{var,{5736,25},'Pos'}]},{type,{5736,33},tuple,[{type,{5736,34},binary,[]},{type,{5736,44},binary,[]}]}]},[{type,{5737,7},constraint,[{atom,{5737,7},is_subtype},[{var,{5737,7},'Bin'},{type,{5737,14},binary,[]}]]},{type,{5738,7},constraint,[{atom,{5738,7},is_subtype},[{var,{5738,7},'Pos'},{type,{5738,14},non_neg_integer,[]}]]}]]}]}}]}},{{function,spawn_link,3},{5700,2},[<<115,112,97,119,110,95,108,105,110,107,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,10,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{5706,2},spec,{{spawn_link,3},[{type,{5706,17},bounded_fun,[{type,{5706,17},'fun',[{type,{5706,17},product,[{var,{5706,18},'Module'},{var,{5706,26},'Function'},{var,{5706,36},'Args'}]},{type,{5706,45},pid,[]}]},[{type,{5707,7},constraint,[{atom,{5707,7},is_subtype},[{var,{5707,7},'Module'},{type,{5707,17},module,[]}]]},{type,{5708,7},constraint,[{atom,{5708,7},is_subtype},[{var,{5708,7},'Function'},{type,{5708,19},atom,[]}]]},{type,{5709,7},constraint,[{atom,{5709,7},is_subtype},[{var,{5709,7},'Args'},{type,{5709,15},list,[{type,{5709,16},term,[]}]}]]}]]}]}}]}},{{function,spawn,3},{5672,2},[<<115,112,97,119,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,10,10,91,96,101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41,96,93,40,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,41,32,105,115,10,32,101,118,97,108,117,97,116,101,100,32,98,121,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,10,40,119,104,101,114,101,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,96,65,114,103,115,96,41,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,10,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,46,32,73,102,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,97,110,100,32,105,116,115,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,114,101,97,115,111,110,32,96,117,110,100,101,102,96,10,111,99,99,117,114,115,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,112,97,119,110,40,115,112,101,101,100,44,32,114,101,103,117,108,97,116,111,114,44,32,91,104,105,103,104,95,115,112,101,101,100,44,32,116,104,105,110,95,99,117,116,93,41,46,10,60,48,46,49,51,46,49,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{5692,2},spec,{{spawn,3},[{type,{5692,12},bounded_fun,[{type,{5692,12},'fun',[{type,{5692,12},product,[{var,{5692,13},'Module'},{var,{5692,21},'Function'},{var,{5692,31},'Args'}]},{type,{5692,40},pid,[]}]},[{type,{5693,7},constraint,[{atom,{5693,7},is_subtype},[{var,{5693,7},'Module'},{type,{5693,17},module,[]}]]},{type,{5694,7},constraint,[{atom,{5694,7},is_subtype},[{var,{5694,7},'Function'},{type,{5694,19},atom,[]}]]},{type,{5695,7},constraint,[{atom,{5695,7},is_subtype},[{var,{5695,7},'Args'},{type,{5695,15},list,[{type,{5695,16},term,[]}]}]]}]]}]}}]}},{{function,size,1},{5646,2},[<<115,105,122,101,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,97,32,116,117,112,108,101,32,111,114,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,97,32,98,105,110,97,114,121,32,111,114,10,98,105,116,115,116,114,105,110,103,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,62,32,115,105,122,101,40,60,60,49,49,44,32,50,50,44,32,51,51,62,62,41,46,10,51,10,96,96,96,10,10,70,111,114,32,98,105,116,115,116,114,105,110,103,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,98,121,116,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,98,105,116,115,32,105,110,32,116,104,101,32,98,105,116,115,116,114,105,110,103,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,10,114,111,117,110,100,101,100,32,95,100,111,119,110,95,46,10,10,83,101,101,32,97,108,115,111,32,96,116,117,112,108,101,95,115,105,122,101,47,49,96,44,32,96,98,121,116,101,95,115,105,122,101,47,49,96,44,32,97,110,100,32,96,98,105,116,95,115,105,122,101,47,49,96,46>>},#{group => terms,specification => [{attribute,{5666,2},spec,{{size,1},[{type,{5666,11},bounded_fun,[{type,{5666,11},'fun',[{type,{5666,11},product,[{var,{5666,12},'Item'}]},{type,{5666,21},non_neg_integer,[]}]},[{type,{5667,7},constraint,[{atom,{5667,7},is_subtype},[{var,{5667,7},'Item'},{type,{5667,15},union,[{type,{5667,15},tuple,any},{type,{5667,25},binary,[]}]}]]}]]}]}}]}},{{function,setnode,3},{5624,2},[<<115,101,116,110,111,100,101,40,78,111,100,101,44,32,68,105,115,116,67,116,114,108,114,44,32,79,112,116,115,41>>],hidden,#{}},{{function,setnode,2},{5616,2},[<<115,101,116,110,111,100,101,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,seq_trace_print,2},{5608,2},[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,seq_trace_print,1},{5601,2},[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,40,80,49,41>>],hidden,#{}},{{function,seq_trace,2},{5593,2},[<<115,101,113,95,116,114,97,99,101,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,send_after,4},{5573,2},[<<115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,77,115,103,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,101,115,116,96,46,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,44,32,116,104,105,115,10,102,117,110,99,116,105,111,110,32,119,111,114,107,115,32,101,120,97,99,116,108,121,32,97,115,32,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,46>>},#{group => timer,specification => [{attribute,{5580,2},spec,{{send_after,4},[{type,{5580,17},bounded_fun,[{type,{5580,17},'fun',[{type,{5580,17},product,[{var,{5580,18},'Time'},{var,{5580,24},'Dest'},{var,{5580,30},'Msg'},{var,{5580,35},'Options'}]},{var,{5580,47},'TimerRef'}]},[{type,{5581,7},constraint,[{atom,{5581,7},is_subtype},[{var,{5581,7},'Time'},{type,{5581,15},integer,[]}]]},{type,{5582,7},constraint,[{atom,{5582,7},is_subtype},[{var,{5582,7},'Dest'},{type,{5582,15},union,[{type,{5582,15},pid,[]},{type,{5582,23},atom,[]}]}]]},{type,{5583,7},constraint,[{atom,{5583,7},is_subtype},[{var,{5583,7},'Msg'},{type,{5583,14},term,[]}]]},{type,{5584,7},constraint,[{atom,{5584,7},is_subtype},[{var,{5584,7},'Options'},{type,{5584,18},list,[{var,{5584,19},'Option'}]}]]},{type,{5585,7},constraint,[{atom,{5585,7},is_subtype},[{var,{5585,7},'Abs'},{type,{5585,14},boolean,[]}]]},{type,{5586,7},constraint,[{atom,{5586,7},is_subtype},[{var,{5586,7},'Option'},{type,{5586,17},tuple,[{atom,{5586,18},abs},{var,{5586,23},'Abs'}]}]]},{type,{5587,7},constraint,[{atom,{5587,7},is_subtype},[{var,{5587,7},'TimerRef'},{type,{5587,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,send_after,3},{5569,1},[<<115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>}},{{function,self,0},{5545,2},[<<115,101,108,102,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,101,108,102,40,41,46,10,60,48,46,50,54,46,48,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{5556,2},spec,{{self,0},[{type,{5556,11},'fun',[{type,{5556,11},product,[]},{type,{5556,17},pid,[]}]}]}}]}},{{function,round,1},{5504,2},[<<114,111,117,110,100,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,98,121,32,114,111,117,110,100,105,110,103,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,52,50,46,49,41,46,10,52,50,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,53,46,53,41,46,10,54,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,45,53,46,53,41,46,10,45,54,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,96,93,40,96,114,111,117,110,100,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,96,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,10,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,10,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,10,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{5538,2},spec,{{round,1},[{type,{5538,12},bounded_fun,[{type,{5538,12},'fun',[{type,{5538,12},product,[{var,{5538,13},'Number'}]},{type,{5538,24},integer,[]}]},[{type,{5539,7},constraint,[{atom,{5539,7},is_subtype},[{var,{5539,7},'Number'},{type,{5539,17},number,[]}]]}]]}]}}]}},{{function,resume_process,1},{5472,2},[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>],#{<<101,110>> => <<68,101,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,10,10,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,116,104,114,111,117,103,104,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,32,111,114,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,41,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,10,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,10,114,101,97,99,104,101,115,32,122,101,114,111,44,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,114,101,115,117,109,101,100,44,32,116,104,97,116,32,105,115,44,32,105,116,115,32,115,116,97,116,101,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,10,115,117,115,112,101,110,100,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,116,101,32,105,116,32,104,97,100,32,98,101,102,111,114,101,32,105,116,32,119,97,115,32,115,117,115,112,101,110,100,101,100,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,32,104,97,100,32,110,111,116,10,32,32,112,114,101,118,105,111,117,115,108,121,32,105,110,99,114,101,97,115,101,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,83,117,115,112,101,110,100,101,101,96,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => processes,specification => [{attribute,{5497,2},spec,{{resume_process,1},[{type,{5497,21},bounded_fun,[{type,{5497,21},'fun',[{type,{5497,21},product,[{var,{5497,22},'Suspendee'}]},{atom,{5497,36},true}]},[{type,{5498,7},constraint,[{atom,{5498,7},is_subtype},[{var,{5498,7},'Suspendee'},{type,{5498,20},pid,[]}]]}]]}]}}]}},{{function,registered,0},{5455,2},[<<114,101,103,105,115,116,101,114,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,97,109,101,115,32,116,104,97,116,32,104,97,118,101,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32,96,114,101,103,105,115,116,101,114,47,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,114,101,103,105,115,116,101,114,101,100,40,41,46,10,91,99,111,100,101,95,115,101,114,118,101,114,44,32,102,105,108,101,95,115,101,114,118,101,114,44,32,105,110,105,116,44,32,117,115,101,114,44,32,109,121,95,100,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{5466,2},spec,{{registered,0},[{type,{5466,17},bounded_fun,[{type,{5466,17},'fun',[{type,{5466,17},product,[]},{type,{5466,23},list,[{var,{5466,24},'RegName'}]}]},[{type,{5467,7},constraint,[{atom,{5467,7},is_subtype},[{var,{5467,7},'RegName'},{type,{5467,18},atom,[]}]]}]]}]}}]}},{{function,register,2},{5417,2},[<<114,101,103,105,115,116,101,114,40,82,101,103,78,97,109,101,44,32,80,105,100,79,114,80,111,114,116,41>>],#{<<101,110>> => <<82,101,103,105,115,116,101,114,115,32,116,104,101,32,110,97,109,101,32,96,82,101,103,78,97,109,101,96,32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,32,105,110,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,10,96,82,101,103,78,97,109,101,96,44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,44,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,112,105,100,32,111,114,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,32,105,110,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,40,96,82,101,103,78,97,109,101,32,33,32,77,101,115,115,97,103,101,96,41,32,97,110,100,32,109,111,115,116,32,111,116,104,101,114,32,66,73,70,115,32,116,104,97,116,32,116,97,107,101,10,97,32,112,105,100,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,115,32,97,115,32,97,110,32,97,114,103,117,109,101,110,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,114,101,103,105,115,116,101,114,40,100,98,44,32,80,105,100,41,46,10,116,114,117,101,10,96,96,96,10,10,84,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,10,91,68,105,114,101,99,116,108,121,32,86,105,115,105,98,108,101,32,69,114,108,97,110,103,32,82,101,115,111,117,114,99,101,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,118,105,115,105,98,108,101,45,114,101,115,111,117,114,99,101,115,96,41,10,97,110,100,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,110,114,101,103,105,115,116,101,114,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,79,114,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,97,108,114,101,97,100,121,32,105,110,32,117,115,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,115,32,97,108,114,101,97,100,121,32,114,101,103,105,115,116,101,114,101,100,32,40,97,108,114,101,97,100,121,32,104,97,115,32,97,10,32,32,110,97,109,101,41,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,117,110,100,101,102,105,110,101,100,96,46>>},#{group => processes,specification => [{attribute,{5448,2},spec,{{register,2},[{type,{5448,15},bounded_fun,[{type,{5448,15},'fun',[{type,{5448,15},product,[{var,{5448,16},'RegName'},{var,{5448,25},'PidOrPort'}]},{atom,{5448,39},true}]},[{type,{5449,7},constraint,[{atom,{5449,7},is_subtype},[{var,{5449,7},'RegName'},{type,{5449,18},atom,[]}]]},{type,{5450,7},constraint,[{atom,{5450,7},is_subtype},[{var,{5450,7},'PidOrPort'},{type,{5450,20},union,[{type,{5450,20},port,[]},{type,{5450,29},pid,[]}]}]]}]]}]}}]}},{{function,ref_to_list,1},{5402,2},[<<114,101,102,95,116,111,95,108,105,115,116,40,82,101,102,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,82,101,102,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{5411,2},spec,{{ref_to_list,1},[{type,{5411,18},bounded_fun,[{type,{5411,18},'fun',[{type,{5411,18},product,[{var,{5411,19},'Ref'}]},{type,{5411,27},string,[]}]},[{type,{5412,7},constraint,[{atom,{5412,7},is_subtype},[{var,{5412,7},'Ref'},{type,{5412,14},reference,[]}]]}]]}]}}]}},{{function,read_timer,2},{5348,2},[<<114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,101,105,116,104,101,114,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,32,111,114,10,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,46,32,96,84,105,109,101,114,82,101,102,96,32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,10,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46,10,10,96,79,112,116,105,111,110,115,96,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,65,115,121,110,99,125,96,42,42,32,45,32,65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32,96,65,115,121,110,99,96,10,32,32,100,101,102,97,117,108,116,115,32,116,111,32,96,102,97,108,115,101,96,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,10,32,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,46,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,10,32,32,96,116,114,117,101,96,44,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,115,116,97,116,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,10,32,32,96,111,107,96,46,32,65,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,97,116,32,96,123,114,101,97,100,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,32,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,32,119,104,101,110,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,10,116,105,109,101,114,32,101,120,112,105,114,101,115,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,96,102,97,108,115,101,96,44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,105,109,101,114,82,101,102,96,32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,10,84,104,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,111,114,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32,96,84,105,109,101,114,82,101,102,96,10,110,101,118,101,114,32,104,97,115,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,115,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,10,116,101,108,108,32,121,111,117,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,10,62,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,10,62,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,10,62,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,97,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,10,62,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,10,62,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,116,114,117,101,125,96,46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,102,97,108,115,101,125,96,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,62,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,93,40,96,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,41,46>>},#{group => timer,specification => [{attribute,{5390,2},spec,{{read_timer,2},[{type,{5390,17},bounded_fun,[{type,{5390,17},'fun',[{type,{5390,17},product,[{var,{5390,18},'TimerRef'},{var,{5390,28},'Options'}]},{type,{5390,40},union,[{var,{5390,40},'Result'},{atom,{5390,49},ok}]}]},[{type,{5391,7},constraint,[{atom,{5391,7},is_subtype},[{var,{5391,7},'TimerRef'},{type,{5391,19},reference,[]}]]},{type,{5392,7},constraint,[{atom,{5392,7},is_subtype},[{var,{5392,7},'Async'},{type,{5392,16},boolean,[]}]]},{type,{5393,7},constraint,[{atom,{5393,7},is_subtype},[{var,{5393,7},'Option'},{type,{5393,17},tuple,[{atom,{5393,18},async},{var,{5393,25},'Async'}]}]]},{type,{5394,7},constraint,[{atom,{5394,7},is_subtype},[{var,{5394,7},'Options'},{type,{5394,18},list,[{var,{5394,19},'Option'}]}]]},{type,{5395,7},constraint,[{atom,{5395,7},is_subtype},[{var,{5395,7},'Time'},{type,{5395,15},non_neg_integer,[]}]]},{type,{5396,7},constraint,[{atom,{5396,7},is_subtype},[{var,{5396,7},'Result'},{type,{5396,17},union,[{var,{5396,17},'Time'},{atom,{5396,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,read_timer,1},{5344,1},[<<114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>}},{{function,raise,3},{5287,2},[<<114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,99,108,97,115,115,44,32,114,101,97,115,111,110,44,32,97,110,100,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,116,114,97,99,101,10,40,95,115,116,97,99,107,116,114,97,99,101,95,41,46,10,10,96,67,108,97,115,115,96,32,105,115,32,96,101,114,114,111,114,96,44,32,96,101,120,105,116,96,44,32,111,114,32,96,116,104,114,111,119,96,46,32,83,111,44,32,105,102,32,105,116,32,119,101,114,101,32,110,111,116,32,102,111,114,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,44,10,96,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,101,114,108,97,110,103,58,67,108,97,115,115,40,82,101,97,115,111,110,41,96,32,40,103,105,118,101,110,32,116,104,97,116,32,96,67,108,97,115,115,96,32,105,115,32,97,32,118,97,108,105,100,32,99,108,97,115,115,41,46,10,10,96,82,101,97,115,111,110,96,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,10,10,96,83,116,97,99,107,116,114,97,99,101,96,32,105,115,32,97,32,108,105,115,116,32,97,115,32,112,114,111,118,105,100,101,100,32,105,110,32,97,32,116,114,121,45,99,97,116,99,104,32,99,108,97,117,115,101,46,10,10,96,96,96,101,114,108,97,110,103,10,116,114,121,10,32,32,32,32,46,46,46,10,99,97,116,99,104,32,67,108,97,115,115,58,82,101,97,115,111,110,58,83,116,97,99,107,116,114,97,99,101,32,45,62,10,32,32,32,32,46,46,46,10,101,110,100,10,96,96,96,10,10,84,104,97,116,32,105,115,44,32,97,32,108,105,115,116,32,111,102,32,102,111,117,114,45,116,117,112,108,101,115,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,32,124,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125,96,44,10,119,104,101,114,101,32,96,77,111,100,117,108,101,96,32,97,110,100,32,96,70,117,110,99,116,105,111,110,96,32,97,114,101,32,97,116,111,109,115,44,32,97,110,100,32,116,104,101,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,105,110,116,101,103,101,114,10,97,114,105,116,121,32,111,114,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46,32,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,99,97,110,32,97,108,115,111,32,99,111,110,116,97,105,110,10,96,123,70,117,110,44,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125,96,32,116,117,112,108,101,115,44,32,119,104,101,114,101,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,32,97,110,100,32,96,65,114,103,115,96,32,105,115,32,97,110,10,97,114,103,117,109,101,110,116,32,108,105,115,116,46,10,10,69,108,101,109,101,110,116,32,96,69,120,116,114,97,73,110,102,111,96,32,97,116,32,116,104,101,32,101,110,100,32,105,115,32,111,112,116,105,111,110,97,108,46,32,79,109,105,116,116,105,110,103,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,115,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,46,10,10,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,115,116,97,99,107,116,114,97,99,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,59,32,105,116,10,105,115,32,116,114,117,110,99,97,116,101,100,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,120,105,109,117,109,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,111,32,116,101,114,109,105,110,97,116,101,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,10,118,97,108,117,101,32,117,110,108,101,115,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,105,110,118,97,108,105,100,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,95,114,101,116,117,114,110,115,32,116,104,101,10,101,114,114,111,114,32,114,101,97,115,111,110,95,32,96,98,97,100,97,114,103,96,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,114,101,116,117,114,110,44,32,121,111,117,32,99,97,110,32,99,97,108,108,10,91,96,101,114,114,111,114,40,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,41,96,93,40,96,101,114,114,111,114,47,49,96,41,32,97,110,100,32,104,111,112,101,32,116,111,10,100,105,115,116,105,110,103,117,105,115,104,32,101,120,99,101,112,116,105,111,110,115,32,108,97,116,101,114,46,10,10,83,101,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,110,117,97,108,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,10,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,101,115,32,97,110,100,32,104,111,119,32,116,111,32,99,97,116,99,104,32,101,120,99,101,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{5329,2},spec,{{raise,3},[{type,{5329,12},bounded_fun,[{type,{5329,12},'fun',[{type,{5329,12},product,[{var,{5329,13},'Class'},{var,{5329,20},'Reason'},{var,{5329,28},'Stacktrace'}]},{atom,{5329,43},badarg}]},[{type,{5330,7},constraint,[{atom,{5330,7},is_subtype},[{var,{5330,7},'Class'},{type,{5330,16},union,[{atom,{5330,16},error},{atom,{5330,26},exit},{atom,{5330,35},throw}]}]]},{type,{5331,7},constraint,[{atom,{5331,7},is_subtype},[{var,{5331,7},'Reason'},{type,{5331,17},term,[]}]]},{type,{5332,7},constraint,[{atom,{5332,7},is_subtype},[{var,{5332,7},'Stacktrace'},{user_type,{5332,21},raise_stacktrace,[]}]]}]]}]}}]}},{{function,put,2},{5255,2},[<<112,117,116,40,75,101,121,44,32,86,97,108,41>>],#{<<101,110>> => <<65,100,100,115,32,97,32,110,101,119,32,96,75,101,121,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,44,32,97,110,100,10,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,32,73,102,32,96,75,101,121,96,32,101,120,105,115,116,115,44,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,105,115,32,100,101,108,101,116,101,100,32,97,110,100,32,114,101,112,108,97,99,101,100,32,98,121,10,96,86,97,108,96,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,46,10,10,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,88,32,61,32,112,117,116,40,110,97,109,101,44,32,119,97,108,114,117,115,41,44,32,89,32,61,32,112,117,116,40,110,97,109,101,44,32,99,97,114,112,101,110,116,101,114,41,44,10,90,32,61,32,103,101,116,40,110,97,109,101,41,44,10,123,88,44,32,89,44,32,90,125,46,10,123,117,110,100,101,102,105,110,101,100,44,119,97,108,114,117,115,44,99,97,114,112,101,110,116,101,114,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,118,97,108,117,101,115,32,115,116,111,114,101,100,32,119,104,101,110,32,96,112,117,116,96,32,105,115,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,116,104,101,32,115,99,111,112,101,32,111,102,32,97,32,96,99,97,116,99,104,96,32,97,114,101,10,62,32,110,111,116,32,114,101,116,114,97,99,116,101,100,32,105,102,32,97,32,96,116,104,114,111,119,96,32,105,115,32,101,118,97,108,117,97,116,101,100,44,32,111,114,32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>},#{group => processes,specification => [{attribute,{5279,2},spec,{{put,2},[{type,{5279,10},bounded_fun,[{type,{5279,10},'fun',[{type,{5279,10},product,[{var,{5279,11},'Key'},{var,{5279,16},'Val'}]},{type,{5279,24},term,[]}]},[{type,{5280,7},constraint,[{atom,{5280,7},is_subtype},[{var,{5280,7},'Key'},{type,{5280,14},term,[]}]]},{type,{5281,7},constraint,[{atom,{5281,7},is_subtype},[{var,{5281,7},'Val'},{type,{5281,14},term,[]}]]}]]}]}}]}},{{function,purge_module,1},{5223,2},[<<112,117,114,103,101,95,109,111,100,117,108,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46,32,66,101,102,111,114,101,32,116,104,105,115,32,66,73,70,32,105,115,32,117,115,101,100,44,32,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50,96,10,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,116,111,32,99,104,101,99,107,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,40,69,114,108,97,110,103,47,79,84,80,32,49,57,41,44,32,97,110,121,32,108,105,110,103,101,114,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,115,116,105,108,108,32,101,120,101,99,117,116,101,10,62,32,116,104,101,32,111,108,100,32,99,111,100,101,32,105,115,32,107,105,108,108,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,110,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,105,110,99,111,114,114,101,99,116,10,62,32,117,115,101,32,99,111,117,108,100,32,99,97,117,115,101,32,109,117,99,104,32,109,111,114,101,32,102,97,116,97,108,32,102,97,105,108,117,114,101,115,44,32,108,105,107,101,32,101,109,117,108,97,116,111,114,32,99,114,97,115,104,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46>>},#{group => code,specification => [{attribute,{5241,2},spec,{{purge_module,1},[{type,{5241,19},bounded_fun,[{type,{5241,19},'fun',[{type,{5241,19},product,[{var,{5241,20},'Module'}]},{atom,{5241,31},true}]},[{type,{5242,7},constraint,[{atom,{5242,7},is_subtype},[{var,{5242,7},'Module'},{type,{5242,17},atom,[]}]]}]]}]}}]}},{{function,processes,0},{5201,2},[<<112,114,111,99,101,115,115,101,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,10,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,105,118,101,46,32,84,104,97,116,32,105,115,44,10,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,102,111,114,32,97,110,32,101,120,105,116,105,110,103,10,112,114,111,99,101,115,115,44,32,98,117,116,32,105,116,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,102,114,111,109,10,96,112,114,111,99,101,115,115,101,115,47,48,96,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,114,111,99,101,115,115,101,115,40,41,46,10,91,60,48,46,48,46,48,62,44,60,48,46,50,46,48,62,44,60,48,46,52,46,48,62,44,60,48,46,53,46,48,62,44,60,48,46,55,46,48,62,44,60,48,46,56,46,48,62,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{5218,2},spec,{{processes,0},[{type,{5218,16},'fun',[{type,{5218,16},product,[]},{type,{5218,22},list,[{type,{5218,23},pid,[]}]}]}]}}]}},{{function,process_info,1},{5154,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,97,108,108,32,96,73,110,102,111,84,117,112,108,101,96,115,32,97,114,101,32,110,111,116,10,109,97,110,100,97,116,111,114,121,46,32,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,10,110,111,116,105,99,101,46,10,10,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,58,10,10,45,32,96,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,96,10,45,32,96,105,110,105,116,105,97,108,95,99,97,108,108,96,10,45,32,96,115,116,97,116,117,115,96,10,45,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,96,10,45,32,96,108,105,110,107,115,96,10,45,32,96,100,105,99,116,105,111,110,97,114,121,96,10,45,32,96,116,114,97,112,95,101,120,105,116,96,10,45,32,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,10,45,32,96,112,114,105,111,114,105,116,121,96,10,45,32,96,103,114,111,117,112,95,108,101,97,100,101,114,96,10,45,32,96,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,96,10,45,32,96,104,101,97,112,95,115,105,122,101,96,10,45,32,96,115,116,97,99,107,95,115,105,122,101,96,10,45,32,96,114,101,100,117,99,116,105,111,110,115,96,10,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,97,108,115,111,32,97,110,32,96,73,110,102,111,84,117,112,108,101,96,10,119,105,116,104,32,105,116,101,109,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,105,110,99,108,117,100,101,100,46,10,10,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,112,101,99,105,102,105,99,32,96,73,110,102,111,84,117,112,108,101,96,115,44,32,115,101,101,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,95,100,101,98,117,103,103,105,110,103,32,111,110,108,121,95,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,112,117,114,112,111,115,101,115,44,32,117,115,101,10,62,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{5193,2},spec,{{process_info,1},[{type,{5193,19},bounded_fun,[{type,{5193,19},'fun',[{type,{5193,19},product,[{var,{5193,20},'Pid'}]},{var,{5193,28},'Info'}]},[{type,{5194,7},constraint,[{atom,{5194,7},is_subtype},[{var,{5194,7},'Pid'},{type,{5194,14},pid,[]}]]},{type,{5195,7},constraint,[{atom,{5195,7},is_subtype},[{var,{5195,7},'Info'},{type,{5195,15},union,[{type,{5195,15},list,[{var,{5195,16},'InfoTuple'}]},{atom,{5195,29},undefined}]}]]},{type,{5196,7},constraint,[{atom,{5196,7},is_subtype},[{var,{5196,7},'InfoTuple'},{user_type,{5196,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,process_flag,3},{5128,2},[<<112,114,111,99,101,115,115,95,102,108,97,103,40,80,105,100,44,32,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,99,101,114,116,97,105,110,32,102,108,97,103,115,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,96,80,105,100,96,44,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,10,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32,96,70,108,97,103,96,10,97,114,101,32,111,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,111,115,101,32,97,108,108,111,119,101,100,32,105,110,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,10,110,97,109,101,108,121,32,96,115,97,118,101,95,99,97,108,108,115,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{5137,2},spec,{{process_flag,3},[{type,{5137,19},bounded_fun,[{type,{5137,19},'fun',[{type,{5137,19},product,[{var,{5137,20},'Pid'},{var,{5137,25},'Flag'},{var,{5137,31},'Value'}]},{var,{5137,41},'OldValue'}]},[{type,{5138,7},constraint,[{atom,{5138,7},is_subtype},[{var,{5138,7},'Pid'},{type,{5138,14},pid,[]}]]},{type,{5139,7},constraint,[{atom,{5139,7},is_subtype},[{var,{5139,7},'Flag'},{atom,{5139,15},save_calls}]]},{type,{5140,7},constraint,[{atom,{5140,7},is_subtype},[{var,{5140,7},'Value'},{type,{5140,16},non_neg_integer,[]}]]},{type,{5141,7},constraint,[{atom,{5141,7},is_subtype},[{var,{5141,7},'OldValue'},{type,{5141,19},non_neg_integer,[]}]]}]]}]}}]}},{{function,process_display,2},{5098,2},[<<112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,84,121,112,101,41>>],#{<<101,110>> => <<87,114,105,116,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,96,80,105,100,96,32,111,110,32,91,115,116,97,110,100,97,114,100,32,101,114,114,111,114,93,40,96,116,58,105,111,58,115,116,97,110,100,97,114,100,95,101,114,114,111,114,47,48,96,41,46,10,10,84,104,101,32,111,110,108,121,32,97,108,108,111,119,101,100,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,97,116,111,109,32,96,84,121,112,101,96,32,105,115,32,96,98,97,99,107,116,114,97,99,101,96,44,32,119,104,105,99,104,32,115,104,111,119,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,10,116,104,101,32,99,97,108,108,32,115,116,97,99,107,44,32,105,110,99,108,117,100,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,97,108,108,32,99,104,97,105,110,44,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,112,114,105,110,116,101,100,32,102,105,114,115,116,46,32,84,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,111,117,116,112,117,116,32,105,115,32,110,111,116,32,102,117,114,116,104,101,114,32,100,101,102,105,110,101,100,46>>},#{group => processes,specification => [{attribute,{5106,2},spec,{{process_display,2},[{type,{5106,22},bounded_fun,[{type,{5106,22},'fun',[{type,{5106,22},product,[{var,{5106,23},'Pid'},{var,{5106,28},'Type'}]},{atom,{5106,37},true}]},[{type,{5107,7},constraint,[{atom,{5107,7},is_subtype},[{var,{5107,7},'Pid'},{type,{5107,14},pid,[]}]]},{type,{5108,7},constraint,[{atom,{5108,7},is_subtype},[{var,{5108,7},'Type'},{atom,{5108,15},backtrace}]]}]]}]}}]}},{{function,pre_loaded,0},{5086,2},[<<112,114,101,95,108,111,97,100,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,112,114,101,108,111,97,100,101,100,32,105,110,32,116,104,101,32,114,117,110,45,116,105,109,101,32,115,121,115,116,101,109,46,10,10,80,114,101,45,108,111,97,100,101,100,32,109,111,100,117,108,101,115,32,97,114,101,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,110,101,101,100,101,100,32,116,111,32,98,111,111,116,115,116,114,97,112,32,116,104,101,32,115,121,115,116,101,109,32,116,111,10,108,111,97,100,32,116,104,101,32,102,105,114,115,116,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,102,114,111,109,32,101,105,116,104,101,114,32,100,105,115,107,32,111,114,32,98,121,32,117,115,105,110,103,32,96,109,58,101,114,108,95,98,111,111,116,95,115,101,114,118,101,114,96,46>>},#{group => code,specification => [{attribute,{5092,2},spec,{{pre_loaded,0},[{type,{5092,17},'fun',[{type,{5092,17},product,[]},{type,{5092,23},list,[{type,{5092,24},module,[]}]}]}]}}]}},{{function,prepare_loading,2},{5050,2},[<<112,114,101,112,97,114,101,95,108,111,97,100,105,110,103,40,77,111,100,117,108,101,44,32,67,111,100,101,41>>],hidden,#{}},{{function,timestamp,0},{5011,2},[<<116,105,109,101,115,116,97,109,112,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,111,110,10,116,104,101,32,102,111,114,109,97,116,32,96,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,96,46,10,10,84,104,105,115,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,96,111,115,58,116,105,109,101,115,116,97,109,112,47,48,96,32,97,110,100,32,116,104,101,32,100,101,112,114,101,99,97,116,101,100,32,91,96,101,114,108,97,110,103,58,110,111,119,47,48,96,93,40,96,110,111,119,47,48,96,41,32,117,115,101,46,10,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41,96,32,105,115,32,112,117,114,101,108,121,32,116,111,32,115,105,109,112,108,105,102,121,32,117,115,101,32,102,111,114,32,101,120,105,115,116,105,110,103,10,99,111,100,101,32,116,104,97,116,32,97,115,115,117,109,101,115,32,116,104,105,115,32,116,105,109,101,32,115,116,97,109,112,32,102,111,114,109,97,116,46,32,67,117,114,114,101,110,116,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,32,99,97,110,32,109,111,114,101,10,101,102,102,105,99,105,101,110,116,108,121,32,98,101,32,114,101,116,114,105,101,118,101,100,32,105,110,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,121,111,117,114,32,99,104,111,105,99,101,32,117,115,105,110,103,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,47,49,96,93,40,96,115,121,115,116,101,109,95,116,105,109,101,47,49,96,41,46,10,10,84,104,101,32,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41,96,32,66,73,70,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,58,10,10,96,96,96,99,10,116,105,109,101,115,116,97,109,112,40,41,32,45,62,10,32,32,32,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,109,105,99,114,111,115,101,99,111,110,100,41,44,10,32,32,32,32,77,101,103,97,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,95,48,48,48,95,48,48,48,44,10,32,32,32,32,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,32,45,32,77,101,103,97,83,101,99,115,42,49,48,48,48,95,48,48,48,44,10,32,32,32,32,77,105,99,114,111,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,114,101,109,32,49,48,48,48,95,48,48,48,44,10,32,32,32,32,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,46,10,96,96,96,10,10,73,116,44,32,104,111,119,101,118,101,114,44,32,117,115,101,115,32,97,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,117,105,108,100,32,103,97,114,98,97,103,101,32,111,110,32,116,104,101,10,104,101,97,112,32,97,110,100,32,119,105,116,104,32,115,108,105,103,104,116,108,121,32,98,101,116,116,101,114,32,112,101,114,102,111,114,109,97,110,99,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{5043,2},spec,{{timestamp,0},[{type,{5043,16},bounded_fun,[{type,{5043,16},'fun',[{type,{5043,16},product,[]},{var,{5043,22},'Timestamp'}]},[{type,{5044,7},constraint,[{atom,{5044,7},is_subtype},[{var,{5044,7},'Timestamp'},{user_type,{5044,20},timestamp,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,1},{4993,2},[<<116,105,109,101,95,111,102,102,115,101,116,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,10,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41,96,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,10,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32,96,85,110,105,116,96,115,46>>},#{group => time,specification => [{attribute,{5005,2},spec,{{time_offset,1},[{type,{5005,18},bounded_fun,[{type,{5005,18},'fun',[{type,{5005,18},product,[{var,{5005,19},'Unit'}]},{type,{5005,28},integer,[]}]},[{type,{5006,7},constraint,[{atom,{5006,7},is_subtype},[{var,{5006,7},'Unit'},{user_type,{5006,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,0},{4962,2},[<<116,105,109,101,95,111,102,102,115,101,116,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,105,110,32,96,110,97,116,105,118,101,96,10,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,32,67,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,97,100,100,101,100,32,116,111,32,97,110,32,69,114,108,97,110,103,10,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,103,105,118,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,46,10,10,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,111,112,101,114,97,116,105,111,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,10,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,117,115,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,32,99,104,97,110,103,101,32,105,110,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,32,98,101,32,111,98,115,101,114,118,101,100,32,97,116,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,10,62,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,46,10,62,10,62,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,10,62,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,44,32,116,104,101,32,116,105,109,101,10,62,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,10,62,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,10,62,32,115,121,115,116,101,109,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,10,62,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,59,32,115,111,44,10,62,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,10,62,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{4988,2},spec,{{time_offset,0},[{type,{4988,18},'fun',[{type,{4988,18},product,[]},{type,{4988,24},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,convert_time_unit,3},{4900,2},[<<99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,84,105,109,101,44,32,70,114,111,109,85,110,105,116,44,32,84,111,85,110,105,116,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32,96,70,114,111,109,85,110,105,116,96,32,116,111,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,96,67,111,110,118,101,114,116,101,100,84,105,109,101,96,32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32,96,84,111,85,110,105,116,96,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,117,115,105,110,103,32,116,104,101,10,96,102,108,111,111,114,47,49,96,32,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,89,111,117,32,99,97,110,32,108,111,115,101,32,97,99,99,117,114,97,99,121,32,97,110,100,32,112,114,101,99,105,115,105,111,110,32,119,104,101,110,32,99,111,110,118,101,114,116,105,110,103,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,46,32,84,111,10,62,32,109,105,110,105,109,105,122,101,32,115,117,99,104,32,108,111,115,115,44,32,99,111,108,108,101,99,116,32,97,108,108,32,100,97,116,97,32,97,116,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,100,111,32,116,104,101,10,62,32,99,111,110,118,101,114,115,105,111,110,32,111,110,32,116,104,101,32,101,110,100,32,114,101,115,117,108,116,46>>},#{group => time,specification => [{attribute,{4913,2},spec,{{convert_time_unit,3},[{type,{4913,24},bounded_fun,[{type,{4913,24},'fun',[{type,{4913,24},product,[{var,{4913,25},'Time'},{var,{4913,31},'FromUnit'},{var,{4913,41},'ToUnit'}]},{var,{4913,52},'ConvertedTime'}]},[{type,{4914,7},constraint,[{atom,{4914,7},is_subtype},[{var,{4914,7},'Time'},{type,{4914,15},integer,[]}]]},{type,{4915,7},constraint,[{atom,{4915,7},is_subtype},[{var,{4915,7},'ConvertedTime'},{type,{4915,24},integer,[]}]]},{type,{4916,7},constraint,[{atom,{4916,7},is_subtype},[{var,{4916,7},'FromUnit'},{user_type,{4916,19},time_unit,[]}]]},{type,{4917,7},constraint,[{atom,{4917,7},is_subtype},[{var,{4917,7},'ToUnit'},{user_type,{4917,17},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,1},{4879,2},[<<115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,10,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,67,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41,96,93,40,96,115,121,115,116,101,109,95,116,105,109,101,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{4894,2},spec,{{system_time,1},[{type,{4894,18},bounded_fun,[{type,{4894,18},'fun',[{type,{4894,18},product,[{var,{4894,19},'Unit'}]},{type,{4894,28},integer,[]}]},[{type,{4895,7},constraint,[{atom,{4895,7},is_subtype},[{var,{4895,7},'Unit'},{user_type,{4895,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,0},{4859,2},[<<115,121,115,116,101,109,95,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,105,110,10,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,67,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41,96,93,40,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,96,43,96,91,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41,96,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{4874,2},spec,{{system_time,0},[{type,{4874,18},'fun',[{type,{4874,18},product,[]},{type,{4874,24},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,1},{4842,2},[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,10,116,104,101,32,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41,96,93,40,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,44,10,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32,96,85,110,105,116,96,115,46>>},#{group => time,specification => [{attribute,{4853,2},spec,{{monotonic_time,1},[{type,{4853,21},bounded_fun,[{type,{4853,21},'fun',[{type,{4853,21},product,[{var,{4853,22},'Unit'}]},{type,{4853,31},integer,[]}]},[{type,{4854,7},constraint,[{atom,{4854,7},is_subtype},[{var,{4854,7},'Unit'},{user_type,{4854,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,0},{4810,2},[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,105,110,32,96,110,97,116,105,118,101,96,10,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,32,84,104,105,115,32,105,115,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,10,115,105,110,99,101,32,115,111,109,101,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,105,115,32,97,10,62,32,91,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,32,116,105,109,101,44,10,62,32,98,117,116,32,95,110,111,116,95,32,97,10,62,32,91,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,116,114,105,99,116,108,121,45,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,10,62,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,115,101,99,117,116,105,118,101,32,99,97,108,108,115,32,116,111,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,32,99,97,110,32,112,114,111,100,117,99,101,32,116,104,101,10,62,32,115,97,109,101,32,114,101,115,117,108,116,46,10,62,10,62,32,68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,119,105,108,108,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,115,32,105,110,10,62,32,116,105,109,101,32,97,115,32,98,97,115,101,32,102,111,114,32,116,104,101,105,114,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,99,108,111,99,107,115,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,115,32,95,112,111,105,110,116,108,101,115,115,95,10,62,32,99,111,109,112,97,114,105,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,46,32,68,105,102,102,101,114,101,110,116,10,62,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,99,97,110,32,97,108,115,111,32,112,108,97,99,101,32,116,104,105,115,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,10,62,32,100,105,102,102,101,114,101,110,116,32,114,101,108,97,116,105,118,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,46,32,73,116,32,99,97,110,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,116,105,109,101,10,62,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,41,44,32,116,104,101,32,112,97,115,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,118,97,108,117,101,41,44,10,62,32,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,122,101,114,111,41,46,32,84,104,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,97,116,10,62,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,98,121,32,99,97,108,108,105,110,103,10,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,116,97,114,116,95,116,105,109,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,41,46>>},#{group => time,specification => [{attribute,{4837,2},spec,{{monotonic_time,0},[{type,{4837,21},'fun',[{type,{4837,21},product,[]},{type,{4837,27},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,0},{4798,2},[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,10,91,105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115,96,41,46,10,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{4805,2},spec,{{unique_integer,0},[{type,{4805,21},'fun',[{type,{4805,21},product,[]},{type,{4805,27},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,1},{4732,2},[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,77,111,100,105,102,105,101,114,76,105,115,116,41>>],#{<<101,110>> => <<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,10,91,105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115,96,41,46,10,84,104,101,32,105,110,116,101,103,101,114,32,105,115,32,117,110,105,113,117,101,32,105,110,32,116,104,101,32,115,101,110,115,101,32,116,104,97,116,32,116,104,105,115,32,66,73,70,44,32,117,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,10,109,111,100,105,102,105,101,114,115,44,32,100,111,101,115,32,110,111,116,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,105,110,116,101,103,101,114,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,10,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,69,97,99,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32,99,97,110,32,111,102,32,99,111,117,114,115,101,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,10,111,116,104,101,114,32,109,101,97,110,115,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,119,104,101,110,32,96,91,93,96,32,105,115,32,112,97,115,115,101,100,32,97,115,32,96,77,111,100,105,102,105,101,114,76,105,115,116,96,44,32,98,111,116,104,32,110,101,103,97,116,105,118,101,32,97,110,100,32,112,111,115,105,116,105,118,101,10,105,110,116,101,103,101,114,115,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,116,111,32,117,115,101,32,116,104,101,32,114,97,110,103,101,32,111,102,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,110,101,101,100,10,104,101,97,112,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,97,114,101,10,97,108,115,111,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,117,110,105,113,117,101,44,32,116,104,97,116,32,105,115,44,32,97,110,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,32,99,97,110,32,98,101,32,115,109,97,108,108,101,114,10,111,114,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,46,10,10,96,77,111,100,105,102,105,101,114,96,115,58,10,10,45,32,42,42,112,111,115,105,116,105,118,101,42,42,32,45,32,82,101,116,117,114,110,115,32,111,110,108,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32,96,112,111,115,105,116,105,118,101,96,32,109,111,100,105,102,105,101,114,32,121,111,117,32,119,105,108,108,32,103,101,116,32,104,101,97,112,32,97,108,108,111,99,97,116,101,100,10,32,32,105,110,116,101,103,101,114,115,32,40,98,105,103,110,117,109,115,41,32,113,117,105,99,107,101,114,46,10,10,45,32,42,42,109,111,110,111,116,111,110,105,99,42,42,32,45,32,82,101,116,117,114,110,115,10,32,32,91,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,116,114,105,99,116,108,121,45,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,10,32,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,99,114,101,97,116,105,111,110,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,105,115,10,32,32,97,108,119,97,121,115,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,105,110,115,116,97,110,99,101,46,10,10,32,32,84,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,101,118,101,110,116,115,32,111,110,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,97,116,32,105,115,44,32,105,102,32,98,111,116,104,32,96,88,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,32,97,110,100,10,32,32,96,89,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,32,97,114,101,32,101,120,101,99,117,116,101,100,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,10,32,32,40,111,114,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,41,32,111,110,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,110,100,32,96,88,32,60,32,89,96,44,32,119,101,32,107,110,111,119,10,32,32,116,104,97,116,32,96,88,96,32,119,97,115,32,99,114,101,97,116,101,100,32,98,101,102,111,114,101,32,96,89,96,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,83,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,32,97,114,101,32,105,110,104,101,114,101,110,116,108,121,32,113,117,105,116,101,32,101,120,112,101,110,115,105,118,101,32,116,111,10,32,32,62,32,103,101,110,101,114,97,116,101,32,97,110,100,32,115,99,97,108,101,115,32,112,111,111,114,108,121,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,118,97,108,117,101,115,32,110,101,101,100,32,116,111,32,98,101,10,32,32,62,32,115,121,110,99,104,114,111,110,105,122,101,100,32,98,101,116,119,101,101,110,32,67,80,85,32,99,111,114,101,115,46,32,84,104,97,116,32,105,115,44,32,100,111,32,110,111,116,32,112,97,115,115,32,116,104,101,32,96,109,111,110,111,116,111,110,105,99,96,10,32,32,62,32,109,111,100,105,102,105,101,114,32,117,110,108,101,115,115,32,121,111,117,32,114,101,97,108,108,121,32,110,101,101,100,32,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,10,10,65,108,108,32,118,97,108,105,100,32,96,77,111,100,105,102,105,101,114,96,115,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,46,32,82,101,112,101,97,116,101,100,32,40,118,97,108,105,100,41,32,96,77,111,100,105,102,105,101,114,96,115,32,105,110,32,116,104,101,10,96,77,111,100,105,102,105,101,114,76,105,115,116,96,32,97,114,101,32,105,103,110,111,114,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,115,101,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,32,117,115,105,110,103,32,100,105,102,102,101,114,101,110,116,32,115,101,116,115,10,62,32,111,102,32,96,77,111,100,105,102,105,101,114,96,115,32,95,119,105,108,108,32,111,118,101,114,108,97,112,95,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32,99,97,108,108,105,110,103,10,62,32,91,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,44,32,97,110,100,10,62,32,91,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,112,111,115,105,116,105,118,101,44,32,109,111,110,111,116,111,110,105,99,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,32,114,101,112,101,97,116,101,100,108,121,44,32,121,111,117,10,62,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,115,101,101,32,115,111,109,101,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,97,114,101,32,114,101,116,117,114,110,101,100,32,98,121,32,98,111,116,104,32,99,97,108,108,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,105,102,32,96,77,111,100,105,102,105,101,114,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,105,102,32,96,77,111,100,105,102,105,101,114,96,32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,109,111,100,105,102,105,101,114,46>>},#{group => terms,specification => [{attribute,{4791,2},spec,{{unique_integer,1},[{type,{4791,21},bounded_fun,[{type,{4791,21},'fun',[{type,{4791,21},product,[{var,{4791,22},'ModifierList'}]},{type,{4791,39},integer,[]}]},[{type,{4792,7},constraint,[{atom,{4792,7},is_subtype},[{var,{4792,7},'ModifierList'},{type,{4792,23},list,[{var,{4792,24},'Modifier'}]}]]},{type,{4793,7},constraint,[{atom,{4793,7},is_subtype},[{var,{4793,7},'Modifier'},{type,{4793,19},union,[{atom,{4793,19},positive},{atom,{4793,30},monotonic}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,posixtime_to_universaltime,1},{4726,2},[<<112,111,115,105,120,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,80,49,41>>],hidden,#{}},{{function,ports,0},{4714,2},[<<112,111,114,116,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,111,114,116,115,32,101,120,105,115,116,105,110,103,32,111,110,10,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,111,114,116,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,111,112,101,110,46>>},#{group => ports,specification => [{attribute,{4721,2},spec,{{ports,0},[{type,{4721,12},'fun',[{type,{4721,12},product,[]},{type,{4721,18},list,[{type,{4721,19},port,[]}]}]}]}}]}},{{function,port_to_list,1},{4703,2},[<<112,111,114,116,95,116,111,95,108,105,115,116,40,80,111,114,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,10,96,80,111,114,116,96,46>>},#{group => terms,specification => [{attribute,{4708,2},spec,{{port_to_list,1},[{type,{4708,19},bounded_fun,[{type,{4708,19},'fun',[{type,{4708,19},product,[{var,{4708,20},'Port'}]},{type,{4708,29},string,[]}]},[{type,{4709,7},constraint,[{atom,{4709,7},is_subtype},[{var,{4709,7},'Port'},{type,{4709,15},port,[]}]]}]]}]}}]}},{{function,pid_to_list,1},{4680,2},[<<112,105,100,95,116,111,95,108,105,115,116,40,80,105,100,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,80,105,100,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,112,105,100,95,116,111,95,108,105,115,116,40,115,101,108,102,40,41,41,46,10,34,60,48,46,56,53,46,48,62,34,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,91,99,114,101,97,116,105,111,110,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,41,32,102,111,114,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,80,105,100,96,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,10,62,32,111,102,32,97,32,110,111,100,101,32,119,105,116,104,32,97,32,115,112,101,99,105,102,105,99,32,110,97,109,101,32,99,97,110,32,103,101,116,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{4697,2},spec,{{pid_to_list,1},[{type,{4697,18},bounded_fun,[{type,{4697,18},'fun',[{type,{4697,18},product,[{var,{4697,19},'Pid'}]},{type,{4697,27},string,[]}]},[{type,{4698,7},constraint,[{atom,{4698,7},is_subtype},[{var,{4698,7},'Pid'},{type,{4698,14},pid,[]}]]}]]}]}}]}},{{function,phash2,2},{4657,2},[<<112,104,97,115,104,50,40,84,101,114,109,44,32,82,97,110,103,101,41>>],#{<<101,110>> => <<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,10,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32,96,84,101,114,109,96,32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,10,96,48,46,46,82,97,110,103,101,45,49,96,46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32,96,82,97,110,103,101,96,32,105,115,32,50,94,51,50,46,32,87,104,101,110,32,119,105,116,104,111,117,116,32,97,114,103,117,109,101,110,116,10,96,82,97,110,103,101,96,44,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,94,50,55,45,49,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,105,115,32,66,73,70,32,105,115,32,97,108,119,97,121,115,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,104,97,115,104,105,110,103,32,116,101,114,109,115,46,32,73,116,32,100,105,115,116,114,105,98,117,116,101,115,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,10,98,101,116,116,101,114,32,116,104,97,110,32,91,96,112,104,97,115,104,47,50,96,93,40,96,112,104,97,115,104,47,50,96,41,44,32,97,110,100,32,105,116,32,105,115,32,102,97,115,116,101,114,32,102,111,114,32,98,105,103,110,117,109,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,97,110,103,101,32,96,48,46,46,82,97,110,103,101,45,49,96,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,114,97,110,103,101,32,111,102,10,91,96,112,104,97,115,104,47,50,96,93,40,96,112,104,97,115,104,47,50,96,41,44,32,119,104,105,99,104,32,105,115,32,96,49,46,46,82,97,110,103,101,96,46>>},#{group => terms,specification => [{attribute,{4672,2},spec,{{phash2,2},[{type,{4672,13},bounded_fun,[{type,{4672,13},'fun',[{type,{4672,13},product,[{var,{4672,14},'Term'},{var,{4672,20},'Range'}]},{var,{4672,30},'Hash'}]},[{type,{4673,7},constraint,[{atom,{4673,7},is_subtype},[{var,{4673,7},'Term'},{type,{4673,15},term,[]}]]},{type,{4674,7},constraint,[{atom,{4674,7},is_subtype},[{var,{4674,7},'Range'},{type,{4674,16},pos_integer,[]}]]},{type,{4675,7},constraint,[{atom,{4675,7},is_subtype},[{var,{4675,7},'Hash'},{type,{4675,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,phash2,1},{4653,1},[<<112,104,97,115,104,50,40,84,101,114,109,41>>],none,#{group => terms,equiv => <<112,104,97,115,104,50,47,50>>}},{{function,phash,2},{4627,2},[<<112,104,97,115,104,40,84,101,114,109,44,32,82,97,110,103,101,41>>],#{<<101,110>> => <<62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,115,32,91,96,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,96,93,40,96,112,104,97,115,104,50,47,50,96,41,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,10,62,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,78,111,116,101,32,116,104,97,116,32,96,101,114,108,97,110,103,58,112,104,97,115,104,40,88,44,78,41,96,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,101,113,117,97,108,32,116,111,10,62,32,96,101,114,108,97,110,103,58,112,104,97,115,104,50,40,88,44,78,41,96,10,10,80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,10,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,10,69,82,84,83,32,52,46,57,46,49,46,49,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32,96,84,101,114,109,96,32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,10,96,49,46,46,82,97,110,103,101,96,46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32,96,82,97,110,103,101,96,32,105,115,32,50,94,51,50,46>>},#{deprecated => <<101,114,108,97,110,103,58,112,104,97,115,104,47,50,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,32,105,110,115,116,101,97,100>>,group => deprecated,specification => [{attribute,{4640,2},spec,{{phash,2},[{type,{4640,12},bounded_fun,[{type,{4640,12},'fun',[{type,{4640,12},product,[{var,{4640,13},'Term'},{var,{4640,19},'Range'}]},{var,{4640,29},'Hash'}]},[{type,{4641,7},constraint,[{atom,{4641,7},is_subtype},[{var,{4641,7},'Term'},{type,{4641,15},term,[]}]]},{type,{4642,7},constraint,[{atom,{4642,7},is_subtype},[{var,{4642,7},'Range'},{type,{4642,16},pos_integer,[]}]]},{type,{4643,7},constraint,[{atom,{4643,7},is_subtype},[{var,{4643,7},'Hash'},{type,{4643,15},pos_integer,[]}]]}]]}]}}]}},{{function,now,0},{4599,2},[<<110,111,119,40,41>>],#{<<101,110>> => <<62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,95,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,68,111,32,110,111,116,32,117,115,101,32,105,116,46,95,10,62,10,62,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,62,32,91,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,62,32,83,112,101,99,105,102,105,99,97,108,108,121,44,32,115,101,99,116,105,111,110,32,91,68,111,115,32,97,110,100,32,68,111,110,116,39,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,68,111,115,95,97,110,100,95,68,111,110,116,115,41,10,62,32,100,101,115,99,114,105,98,101,115,32,119,104,97,116,32,116,111,32,117,115,101,32,105,110,115,116,101,97,100,32,111,102,32,96,101,114,108,97,110,103,58,110,111,119,47,48,96,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32,96,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,101,108,97,112,115,101,100,32,116,105,109,101,32,115,105,110,99,101,10,48,48,58,48,48,32,71,77,84,44,32,74,97,110,117,97,114,121,32,49,44,32,49,57,55,48,32,40,122,101,114,111,32,104,111,117,114,41,44,32,105,102,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,79,116,104,101,114,119,105,115,101,32,115,111,109,101,32,111,116,104,101,114,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,105,115,32,99,104,111,115,101,110,46,32,73,116,32,105,115,32,97,108,115,111,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32,116,104,105,115,32,66,73,70,32,114,101,116,117,114,110,32,99,111,110,116,105,110,117,111,117,115,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,32,72,101,110,99,101,44,32,116,104,101,10,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,96,101,114,108,97,110,103,58,110,111,119,47,48,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,110,101,114,97,116,101,32,117,110,105,113,117,101,32,116,105,109,101,32,115,116,97,109,112,115,46,32,73,102,10,105,116,32,105,115,32,99,97,108,108,101,100,32,105,110,32,97,32,116,105,103,104,116,32,108,111,111,112,32,111,110,32,97,32,102,97,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,99,111,109,101,10,115,107,101,119,101,100,46,10,10,67,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,111,99,97,108,32,116,105,109,101,32,111,102,32,100,97,121,32,105,102,32,116,104,101,32,116,105,109,101,45,122,111,110,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,102,10,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,105,115,32,112,114,111,112,101,114,108,121,32,99,111,110,102,105,103,117,114,101,100,46>>},#{deprecated => <<101,114,108,97,110,103,58,110,111,119,47,48,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,115,101,101,32,116,104,101,32,34,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,32,105,110,32,69,114,108,97,110,103,34,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110>>,group => deprecated,specification => [{attribute,{4621,2},spec,{{now,0},[{type,{4621,10},bounded_fun,[{type,{4621,10},'fun',[{type,{4621,10},product,[]},{var,{4621,16},'Timestamp'}]},[{type,{4622,7},constraint,[{atom,{4622,7},is_subtype},[{var,{4622,7},'Timestamp'},{user_type,{4622,20},timestamp,[]}]]}]]}]}}]}},{{function,node,1},{4586,2},[<<110,111,100,101,40,65,114,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,96,65,114,103,96,32,111,114,105,103,105,110,97,116,101,115,46,32,96,65,114,103,96,32,99,97,110,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,10,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,32,112,111,114,116,46,32,73,102,32,96,65,114,103,96,32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,110,100,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,10,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,110,111,110,111,100,101,64,110,111,104,111,115,116,96,32,105,115,32,114,101,116,117,114,110,101,100,46>>},#{group => terms,specification => [{attribute,{4592,2},spec,{{node,1},[{type,{4592,11},bounded_fun,[{type,{4592,11},'fun',[{type,{4592,11},product,[{var,{4592,12},'Arg'}]},{var,{4592,20},'Node'}]},[{type,{4593,7},constraint,[{atom,{4593,7},is_subtype},[{var,{4593,7},'Arg'},{type,{4593,14},union,[{type,{4593,14},pid,[]},{type,{4593,22},port,[]},{type,{4593,31},reference,[]}]}]]},{type,{4594,7},constraint,[{atom,{4594,7},is_subtype},[{var,{4594,7},'Node'},{type,{4594,15},node,[]}]]}]]}]}}]}},{{function,node,0},{4574,2},[<<110,111,100,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,110,111,110,111,100,101,64,110,111,104,111,115,116,96,32,105,115,10,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>},#{group => distribution,specification => [{attribute,{4579,2},spec,{{node,0},[{type,{4579,11},bounded_fun,[{type,{4579,11},'fun',[{type,{4579,11},product,[]},{var,{4579,17},'Node'}]},[{type,{4580,7},constraint,[{atom,{4580,7},is_subtype},[{var,{4580,7},'Node'},{type,{4580,15},node,[]}]]}]]}]}}]}},{{function,nif_error,2},{4559,2},[<<110,105,102,95,101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32,96,101,114,114,111,114,47,50,96,44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,10,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,10,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>},#{group => processes,specification => [{attribute,{4566,2},spec,{{nif_error,2},[{type,{4566,16},bounded_fun,[{type,{4566,16},'fun',[{type,{4566,16},product,[{var,{4566,17},'Reason'},{var,{4566,25},'Args'}]},{type,{4566,34},no_return,[]}]},[{type,{4567,7},constraint,[{atom,{4567,7},is_subtype},[{var,{4567,7},'Reason'},{type,{4567,17},term,[]}]]},{type,{4568,7},constraint,[{atom,{4568,7},is_subtype},[{var,{4568,7},'Args'},{type,{4568,15},list,[{type,{4568,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,nif_error,1},{4545,2},[<<110,105,102,95,101,114,114,111,114,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32,96,101,114,114,111,114,47,49,96,44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,10,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,10,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>},#{group => processes,specification => [{attribute,{4552,2},spec,{{nif_error,1},[{type,{4552,16},bounded_fun,[{type,{4552,16},'fun',[{type,{4552,16},product,[{var,{4552,17},'Reason'}]},{type,{4552,28},no_return,[]}]},[{type,{4553,7},constraint,[{atom,{4553,7},is_subtype},[{var,{4553,7},'Reason'},{type,{4553,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,monitor_node,3},{4515,2},[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,70,108,97,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<66,101,104,97,118,101,115,32,97,115,32,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,108,111,119,115,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,116,111,32,98,101,10,115,112,101,99,105,102,105,101,100,44,32,110,97,109,101,108,121,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,46,10,10,84,104,105,115,32,111,112,116,105,111,110,32,97,108,108,111,119,115,32,116,104,101,32,66,73,70,32,116,111,32,119,97,105,116,32,116,104,101,32,110,111,114,109,97,108,32,110,101,116,119,111,114,107,32,99,111,110,110,101,99,116,105,111,110,32,116,105,109,101,45,111,117,116,10,102,111,114,32,116,104,101,32,95,109,111,110,105,116,111,114,101,100,32,110,111,100,101,95,32,116,111,32,99,111,110,110,101,99,116,32,105,116,115,101,108,102,44,32,101,118,101,110,32,105,102,32,105,116,32,99,97,110,110,111,116,32,98,101,32,97,99,116,105,118,101,108,121,10,99,111,110,110,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,110,111,100,101,32,40,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,98,108,111,99,107,101,100,41,46,32,84,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,10,98,101,32,117,115,101,102,117,108,32,99,97,110,32,111,110,108,121,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,117,115,105,110,103,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,32,96,100,105,115,116,95,97,117,116,111,95,99,111,110,110,101,99,116,32,111,110,99,101,96,46,10,73,102,32,116,104,97,116,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,117,115,101,100,44,32,111,112,116,105,111,110,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,112,116,105,111,110,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,32,105,115,32,117,115,101,100,32,105,110,116,101,114,110,97,108,108,121,32,97,110,100,32,105,115,32,115,101,108,100,111,109,32,110,101,101,100,101,100,32,105,110,10,62,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,104,101,114,101,32,116,104,101,32,110,101,116,119,111,114,107,32,116,111,112,111,108,111,103,121,32,97,110,100,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,115,32,105,110,32,101,102,102,101,99,116,32,97,114,101,10,62,32,107,110,111,119,110,32,105,110,32,97,100,118,97,110,99,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,32,111,114,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,10,109,97,108,102,111,114,109,101,100,46>>},#{group => distribution,specification => [{attribute,{4535,2},spec,{{monitor_node,3},[{type,{4535,19},bounded_fun,[{type,{4535,19},'fun',[{type,{4535,19},product,[{var,{4535,20},'Node'},{var,{4535,26},'Flag'},{var,{4535,32},'Options'}]},{atom,{4535,44},true}]},[{type,{4536,7},constraint,[{atom,{4536,7},is_subtype},[{var,{4536,7},'Node'},{type,{4536,15},node,[]}]]},{type,{4537,7},constraint,[{atom,{4537,7},is_subtype},[{var,{4537,7},'Flag'},{type,{4537,15},boolean,[]}]]},{type,{4538,7},constraint,[{atom,{4538,7},is_subtype},[{var,{4538,7},'Options'},{type,{4538,18},list,[{var,{4538,19},'Option'}]}]]},{type,{4539,7},constraint,[{atom,{4539,7},is_subtype},[{var,{4539,7},'Option'},{atom,{4539,17},allow_passive_connect}]]}]]}]}}]}},{{function,monitor_node,2},{4483,2},[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,70,108,97,103,41>>],#{<<101,110>> => <<77,111,110,105,116,111,114,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,46,32,73,102,32,96,70,108,97,103,96,32,105,115,32,96,116,114,117,101,96,44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,10,111,110,46,32,73,102,32,96,70,108,97,103,96,32,105,115,32,96,102,97,108,115,101,96,44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,10,10,77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32,91,96,109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41,96,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,102,111,114,32,116,104,101,10,115,97,109,101,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,10,105,110,115,116,97,110,99,101,115,46,10,10,73,102,32,96,78,111,100,101,96,32,102,97,105,108,115,32,111,114,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,123,110,111,100,101,100,111,119,110,44,32,78,111,100,101,125,96,32,105,115,32,100,101,108,105,118,101,114,101,100,10,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,109,97,100,101,32,116,119,111,32,99,97,108,108,115,32,116,111,10,91,96,109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41,96,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,97,110,100,32,96,78,111,100,101,96,32,116,101,114,109,105,110,97,116,101,115,44,32,116,119,111,10,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,10,96,78,111,100,101,96,44,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,99,114,101,97,116,101,32,111,110,101,46,32,73,102,32,116,104,105,115,32,102,97,105,108,115,44,32,97,32,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,32,105,115,10,100,101,108,105,118,101,114,101,100,46,10,10,84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,104,101,32,96,110,111,100,101,100,111,119,110,96,32,115,105,103,110,97,108,32,105,115,32,110,111,116,32,111,114,100,101,114,101,100,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,111,116,104,101,114,32,108,105,110,107,10,111,114,32,109,111,110,105,116,111,114,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,110,111,100,101,32,116,104,97,116,32,103,111,101,115,32,100,111,119,110,46,32,73,102,32,121,111,117,32,110,101,101,100,32,97,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,10,97,108,108,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,101,32,96,110,111,100,101,100,111,119,110,96,32,115,105,103,110,97,108,10,105,115,32,115,101,110,116,44,32,121,111,117,32,115,104,111,117,108,100,32,117,115,101,32,96,110,101,116,95,107,101,114,110,101,108,58,109,111,110,105,116,111,114,95,110,111,100,101,115,47,49,96,46,10,10,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,97,115,32,97,110,121,32,111,116,104,101,114,32,110,111,100,101,115,46,10,10,70,97,105,108,117,114,101,58,32,96,110,111,116,97,108,105,118,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{4508,2},spec,{{monitor_node,2},[{type,{4508,19},bounded_fun,[{type,{4508,19},'fun',[{type,{4508,19},product,[{var,{4508,20},'Node'},{var,{4508,26},'Flag'}]},{atom,{4508,35},true}]},[{type,{4509,7},constraint,[{atom,{4509,7},is_subtype},[{var,{4509,7},'Node'},{type,{4509,15},node,[]}]]},{type,{4510,7},constraint,[{atom,{4510,7},is_subtype},[{var,{4510,7},'Flag'},{type,{4510,15},boolean,[]}]]}]]}]}}]}},{{function,monitor,3},{4353,2},[<<109,111,110,105,116,111,114,40,84,121,112,101,44,32,73,116,101,109,44,32,79,112,116,115,41>>],#{<<101,110>> => <<80,114,111,118,105,100,101,115,32,97,110,32,111,112,116,105,111,110,32,108,105,115,116,32,102,111,114,32,109,111,100,105,102,105,99,97,116,105,111,110,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,10,96,109,111,110,105,116,111,114,47,50,96,46,32,84,104,101,32,96,84,121,112,101,96,32,97,110,100,32,96,73,116,101,109,96,32,97,114,103,117,109,101,110,116,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,109,101,97,110,105,110,103,32,97,115,32,119,104,101,110,10,112,97,115,115,101,100,32,116,111,32,91,96,109,111,110,105,116,111,114,47,50,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46,10,10,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,97,108,105,97,115,44,32,85,110,97,108,105,97,115,79,112,116,125,96,42,42,32,45,32,84,104,101,32,114,101,116,117,114,110,101,100,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,119,105,108,108,32,97,108,115,111,32,98,101,99,111,109,101,32,97,110,10,32,32,97,108,105,97,115,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,10,32,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,83,101,101,32,97,108,115,111,32,96,97,108,105,97,115,47,48,96,46,32,84,104,101,32,96,85,110,97,108,105,97,115,79,112,116,96,10,32,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32,97,108,105,97,115,32,115,104,111,117,108,100,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,46,10,10,32,32,45,32,42,42,96,101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115,96,42,42,32,45,32,79,110,108,121,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32,96,117,110,97,108,105,97,115,47,49,96,32,119,105,108,108,10,32,32,32,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,46,10,10,32,32,45,32,42,42,96,100,101,109,111,110,105,116,111,114,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,118,105,97,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32,96,100,101,109,111,110,105,116,111,114,47,49,96,32,111,114,10,32,32,32,32,119,104,101,110,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,105,115,10,32,32,32,32,100,101,108,105,118,101,114,101,100,32,100,117,101,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,10,10,32,32,45,32,42,42,96,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,32,40,115,101,101,32,96,100,101,109,111,110,105,116,111,114,96,32,111,112,116,105,111,110,32,97,98,111,118,101,41,32,111,114,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,10,32,32,32,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,87,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,118,105,97,32,116,104,101,32,97,108,105,97,115,10,32,32,32,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,97,108,115,111,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,110,10,32,32,32,32,99,108,105,101,110,116,47,115,101,114,118,101,114,32,115,99,101,110,97,114,105,111,115,32,119,104,101,110,32,97,32,99,108,105,101,110,116,32,109,111,110,105,116,111,114,115,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,119,105,108,108,32,103,101,116,32,116,104,101,10,32,32,32,32,114,101,112,108,121,32,118,105,97,32,116,104,101,32,97,108,105,97,115,46,32,79,110,99,101,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,114,101,99,101,105,118,101,100,32,98,111,116,104,32,116,104,101,32,97,108,105,97,115,32,97,110,100,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,10,32,32,32,32,97,32,114,101,112,108,121,32,111,114,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,109,111,118,101,100,32,117,115,105,110,103,10,32,32,32,32,116,104,101,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,32,66,73,70,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,115,116,105,108,108,32,98,101,32,108,101,102,116,32,97,99,116,105,118,101,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,32,32,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,32,32,65,108,105,97,115,77,111,110,82,101,113,73,100,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,91,123,97,108,105,97,115,44,32,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,125,93,41,44,10,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,32,32,37,37,32,65,108,105,97,115,32,97,115,32,119,101,108,108,32,97,115,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,10,32,32,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,32,111,114,32,97,32,39,68,79,87,78,39,32,109,101,115,115,97,103,101,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,39,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,39,10,32,32,32,32,32,32,37,37,32,97,115,32,117,110,97,108,105,97,115,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,59,10,32,32,32,32,32,32,32,32,32,32,123,39,68,79,87,78,39,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,114,111,114,40,69,120,105,116,82,101,97,115,111,110,41,10,32,32,32,32,32,32,101,110,100,46,10,32,32,96,96,96,10,10,32,32,78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,10,32,32,97,116,32,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,32,32,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,10,32,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,45,32,42,42,96,123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125,96,42,42,32,45,32,82,101,112,108,97,99,101,32,116,104,101,32,100,101,102,97,117,108,116,32,96,84,97,103,96,32,119,105,116,104,32,96,85,115,101,114,68,101,102,105,110,101,100,84,97,103,96,10,32,32,105,110,32,116,104,101,32,91,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,93,40,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101,41,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,10,32,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,44,32,116,104,101,32,96,39,68,79,87,78,39,96,32,116,97,103,10,32,32,105,110,32,116,104,101,32,100,111,119,110,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,114,101,112,108,97,99,101,100,32,98,121,32,96,85,115,101,114,68,101,102,105,110,101,100,84,97,103,96,46,10,10,32,32,65,110,32,101,120,97,109,112,108,101,32,111,102,32,104,111,119,32,116,104,101,32,96,123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125,96,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,111,114,100,101,114,32,116,111,10,32,32,101,110,97,98,108,101,32,116,104,101,32,110,101,119,10,32,32,91,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,102,102,95,103,117,105,100,101,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,45,109,101,115,115,97,103,101,115,96,41,44,10,32,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,79,84,80,32,50,52,44,32,119,104,101,110,32,109,97,107,105,110,103,32,109,117,108,116,105,112,108,101,32,114,101,113,117,101,115,116,115,32,116,111,32,100,105,102,102,101,114,101,110,116,32,115,101,114,118,101,114,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,70,114,111,109,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,114,111,109,32,33,32,123,114,101,112,108,121,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,32,32,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,115,44,32,82,101,113,117,101,115,116,41,32,119,104,101,110,32,105,115,95,108,105,115,116,40,83,101,114,118,101,114,80,105,100,115,41,32,45,62,10,32,32,32,32,32,32,82,101,113,73,100,32,61,32,109,97,107,101,95,114,101,102,40,41,44,10,32,32,32,32,32,32,108,105,115,116,115,58,102,111,114,101,97,99,104,40,102,117,110,32,40,83,101,114,118,101,114,80,105,100,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,95,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,116,97,103,44,32,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,125,93,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,115,41,44,10,32,32,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,108,101,110,103,116,104,40,83,101,114,118,101,114,80,105,100,115,41,44,32,91,93,41,46,10,10,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,95,82,101,113,73,100,44,32,48,44,32,65,99,99,41,32,45,62,10,32,32,32,32,32,32,65,99,99,59,10,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,44,32,65,99,99,41,32,45,62,10,32,32,32,32,32,32,37,37,32,84,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,100,101,116,101,99,116,32,116,104,97,116,32,119,101,32,109,97,116,99,104,32,111,110,32,116,104,101,32,39,82,101,113,73,100,39,10,32,32,32,32,32,32,37,37,32,114,101,102,101,114,101,110,99,101,32,105,110,32,97,108,108,32,99,108,97,117,115,101,115,44,32,97,110,100,32,119,105,108,108,32,101,110,97,98,108,101,32,116,104,101,32,115,101,108,101,99,116,105,118,101,10,32,32,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,114,101,99,101,105,118,101,32,97,98,108,101,32,116,111,10,32,32,32,32,32,32,37,37,32,115,107,105,112,32,112,97,115,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,116,10,32,32,32,32,32,32,37,37,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,116,104,101,32,39,82,101,113,73,100,39,32,114,101,102,101,114,101,110,99,101,32,119,97,115,32,99,114,101,97,116,101,100,46,46,46,10,32,32,32,32,32,32,82,101,115,32,61,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,72,101,114,101,32,119,101,32,116,121,112,105,99,97,108,108,121,32,119,111,117,108,100,32,104,97,118,101,32,100,101,97,99,116,105,118,97,116,101,100,32,116,104,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,109,111,110,105,116,111,114,32,98,121,32,97,32,99,97,108,108,32,116,111,32,100,101,109,111,110,105,116,111,114,40,77,111,110,44,32,91,102,108,117,115,104,93,41,32,98,117,116,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,119,101,32,105,103,110,111,114,101,32,116,104,105,115,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,102,111,114,32,115,105,109,112,108,105,99,105,116,121,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,111,107,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,115,117,108,116,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,44,32,95,77,111,110,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,114,111,114,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,45,49,44,32,91,82,101,115,32,124,32,65,99,99,93,41,46,10,32,32,96,96,96,10,10,32,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,101,120,97,109,112,108,101,32,116,111,32,119,111,114,107,32,97,115,32,105,110,116,101,110,100,101,100,44,32,116,104,101,32,99,108,105,101,110,116,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,10,32,32,97,116,32,108,101,97,115,116,32,97,110,32,79,84,80,32,50,52,32,115,121,115,116,101,109,44,32,98,117,116,32,116,104,101,32,115,101,114,118,101,114,115,32,109,97,121,32,101,120,101,99,117,116,101,32,111,110,32,111,108,100,101,114,32,115,121,115,116,101,109,115,46>>},#{group => processes,specification => [{attribute,{4471,2},spec,{{monitor,3},[{type,{4472,7},bounded_fun,[{type,{4472,7},'fun',[{type,{4472,7},product,[{atom,{4472,8},process},{user_type,{4472,17},monitor_process_identifier,[]},{type,{4472,47},list,[{user_type,{4472,48},monitor_option,[]}]}]},{var,{4472,70},'MonitorRef'}]},[{type,{4473,9},constraint,[{atom,{4473,9},is_subtype},[{var,{4473,9},'MonitorRef'},{type,{4473,23},reference,[]}]]}]]},{type,{4474,7},bounded_fun,[{type,{4474,7},'fun',[{type,{4474,7},product,[{atom,{4474,8},port},{user_type,{4474,14},monitor_port_identifier,[]},{type,{4474,41},list,[{user_type,{4474,42},monitor_option,[]}]}]},{var,{4474,64},'MonitorRef'}]},[{type,{4475,9},constraint,[{atom,{4475,9},is_subtype},[{var,{4475,9},'MonitorRef'},{type,{4475,23},reference,[]}]]}]]},{type,{4476,7},bounded_fun,[{type,{4476,7},'fun',[{type,{4476,7},product,[{atom,{4476,8},time_offset},{atom,{4476,21},clock_service},{type,{4476,36},list,[{user_type,{4476,37},monitor_option,[]}]}]},{var,{4476,59},'MonitorRef'}]},[{type,{4477,9},constraint,[{atom,{4477,9},is_subtype},[{var,{4477,9},'MonitorRef'},{type,{4477,23},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,monitor,2},{4200,2},[<<109,111,110,105,116,111,114,40,84,121,112,101,44,32,73,116,101,109,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,111,102,32,116,121,112,101,32,96,84,121,112,101,96,32,116,111,32,116,104,101,32,101,110,116,105,116,121,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,46,10,10,73,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,111,114,32,105,116,32,99,104,97,110,103,101,115,32,109,111,110,105,116,111,114,101,100,32,115,116,97,116,101,44,32,116,104,101,32,99,97,108,108,101,114,10,111,102,32,96,109,111,110,105,116,111,114,47,50,96,32,105,115,32,110,111,116,105,102,105,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,97,116,58,10,123,58,32,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101,125,10,10,96,96,96,101,114,108,97,110,103,10,123,84,97,103,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,105,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,97,107,101,115,32,116,105,109,101,32,98,101,102,111,114,101,10,62,32,116,104,101,32,115,105,103,110,97,108,32,114,101,97,99,104,101,115,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,46,10,10,96,84,121,112,101,96,32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58,32,96,112,114,111,99,101,115,115,96,44,32,96,112,111,114,116,96,32,111,114,32,96,116,105,109,101,95,111,102,102,115,101,116,96,46,10,10,65,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,108,121,32,111,110,99,101,44,32,97,102,116,101,114,32,116,104,97,116,32,105,116,32,105,115,32,114,101,109,111,118,101,100,10,102,114,111,109,32,98,111,116,104,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,77,111,110,105,116,111,114,115,32,97,114,101,32,102,105,114,101,100,32,119,104,101,110,10,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,101,114,109,105,110,97,116,101,115,44,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,10,99,114,101,97,116,105,111,110,44,32,111,114,32,105,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,44,10,119,101,32,100,111,32,110,111,116,32,107,110,111,119,32,105,102,32,105,116,32,115,116,105,108,108,32,101,120,105,115,116,115,46,32,84,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,115,111,32,116,117,114,110,101,100,32,111,102,102,32,119,104,101,110,10,96,100,101,109,111,110,105,116,111,114,47,49,96,32,105,115,32,99,97,108,108,101,100,46,10,10,65,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,98,121,32,110,97,109,101,32,114,101,115,111,108,118,101,115,32,116,104,101,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,116,111,32,96,116,58,112,105,100,47,48,96,10,111,114,32,96,116,58,112,111,114,116,47,48,96,32,111,110,108,121,32,111,110,99,101,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,109,111,110,105,116,111,114,32,105,110,115,116,97,110,116,105,97,116,105,111,110,44,32,108,97,116,101,114,32,99,104,97,110,103,101,115,32,116,111,10,116,104,101,32,110,97,109,101,32,114,101,103,105,115,116,114,97,116,105,111,110,32,119,105,108,108,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,111,110,105,116,111,114,46,10,10,87,104,101,110,32,97,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,104,97,116,10,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,101,114,108,97,110,103,10,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125,10,96,96,96,10,10,73,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,96,77,111,110,105,116,111,114,82,101,102,96,32,97,110,100,32,96,84,121,112,101,96,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,10,101,97,114,108,105,101,114,44,32,97,110,100,58,10,10,45,32,42,42,96,79,98,106,101,99,116,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,44,32,119,104,105,99,104,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,101,118,101,110,116,46,32,87,104,101,110,10,32,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,108,111,99,97,108,32,112,111,114,116,44,32,96,79,98,106,101,99,116,96,32,119,105,108,108,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,96,116,58,112,105,100,47,48,96,10,32,32,111,114,32,96,116,58,112,111,114,116,47,48,96,32,116,104,97,116,32,119,97,115,32,98,101,105,110,103,32,109,111,110,105,116,111,114,101,100,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,98,121,10,32,32,110,97,109,101,44,32,96,79,98,106,101,99,116,96,32,119,105,108,108,32,104,97,118,101,32,102,111,114,109,97,116,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,119,104,101,114,101,10,32,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,119,104,105,99,104,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,119,105,116,104,10,32,32,96,109,111,110,105,116,111,114,47,50,96,32,99,97,108,108,32,97,110,100,32,96,78,111,100,101,96,32,105,115,32,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,110,111,100,101,32,110,97,109,101,32,40,102,111,114,10,32,32,112,111,114,116,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,44,32,96,78,111,100,101,96,32,105,115,32,97,108,119,97,121,115,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,41,46,10,10,45,32,42,42,96,73,110,102,111,96,42,42,32,45,32,69,105,116,104,101,114,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,44,32,96,110,111,112,114,111,99,96,32,40,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,10,32,32,100,105,100,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,109,111,110,105,116,111,114,32,99,114,101,97,116,105,111,110,41,44,32,111,114,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,40,110,111,10,32,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,115,41,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,112,114,111,99,101,115,115,96,123,58,32,35,109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,32,125,42,42,32,45,32,67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,10,32,32,96,116,58,112,105,100,47,48,96,32,40,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,41,44,32,97,110,32,97,116,111,109,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,111,114,32,97,32,116,117,112,108,101,10,32,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,44,32,108,111,99,97,116,101,100,32,101,108,115,101,119,104,101,114,101,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,101,102,111,114,101,32,69,82,84,83,32,49,48,46,48,32,40,79,84,80,32,50,49,46,48,41,44,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,99,111,117,108,100,32,102,97,105,108,32,119,105,116,104,32,96,98,97,100,97,114,103,96,10,32,32,62,32,105,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,100,32,111,110,32,97,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,40,115,117,99,104,32,97,115,32,101,114,108,95,105,110,116,101,114,102,97,99,101,10,32,32,62,32,111,114,32,106,105,110,116,101,114,102,97,99,101,41,44,32,119,104,101,114,101,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,46,10,32,32,62,10,32,32,62,32,78,111,119,44,32,115,117,99,104,32,97,32,99,97,108,108,32,116,111,32,96,109,111,110,105,116,111,114,96,32,119,105,108,108,32,105,110,115,116,101,97,100,32,115,117,99,99,101,101,100,32,97,110,100,32,97,32,109,111,110,105,116,111,114,32,105,115,32,99,114,101,97,116,101,100,46,10,32,32,62,32,66,117,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,111,110,108,121,32,115,117,112,101,114,118,105,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,10,32,32,62,32,96,123,39,68,79,87,78,39,44,32,95,44,32,112,114,111,99,101,115,115,44,32,95,44,32,110,111,99,111,110,110,101,99,116,105,111,110,125,96,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,115,115,97,103,101,32,116,104,97,116,32,109,97,121,32,98,101,10,32,32,62,32,114,101,99,101,105,118,101,100,44,32,97,115,32,116,104,101,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,104,97,118,101,32,110,111,32,119,97,121,32,111,102,32,114,101,112,111,114,116,105,110,103,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,10,32,32,62,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,112,111,114,116,96,123,58,32,35,109,111,110,105,116,111,114,95,112,111,114,116,32,125,42,42,32,45,32,67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32,96,116,58,112,111,114,116,47,48,96,10,32,32,40,111,110,108,121,32,108,111,99,97,108,41,44,32,97,110,32,97,116,111,109,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,10,32,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,111,114,116,44,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,78,111,116,101,44,32,116,104,97,116,32,97,116,116,101,109,112,116,32,116,111,32,109,111,110,105,116,111,114,32,97,10,32,32,114,101,109,111,116,101,32,112,111,114,116,32,119,105,108,108,32,114,101,115,117,108,116,32,105,110,32,96,98,97,100,97,114,103,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,116,105,109,101,95,111,102,102,115,101,116,96,123,58,32,35,109,111,110,105,116,111,114,95,116,105,109,101,95,111,102,102,115,101,116,32,125,42,42,32,45,32,77,111,110,105,116,111,114,115,32,99,104,97,110,103,101,115,32,105,110,10,32,32,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,32,98,101,116,119,101,101,110,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,32,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,46,32,79,110,101,32,118,97,108,105,100,32,96,73,116,101,109,96,10,32,32,101,120,105,115,116,115,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,96,116,105,109,101,95,111,102,102,115,101,116,32,84,121,112,101,96,44,32,110,97,109,101,108,121,32,116,104,101,32,97,116,111,109,10,32,32,96,99,108,111,99,107,95,115,101,114,118,105,99,101,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,116,111,109,32,96,99,108,111,99,107,95,115,101,114,118,105,99,101,96,32,105,115,32,95,110,111,116,95,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,10,32,32,110,97,109,101,32,111,102,32,97,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,105,115,32,99,97,115,101,32,105,116,32,115,101,114,118,101,115,32,97,115,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,116,101,114,110,97,108,32,99,108,111,99,107,32,115,101,114,118,105,99,101,32,97,116,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,119,104,101,110,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,105,102,32,116,104,101,10,32,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,105,115,32,99,104,97,110,103,101,100,44,32,111,114,32,105,102,32,116,104,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,10,32,32,102,105,110,97,108,32,100,117,114,105,110,103,10,32,32,91,102,105,110,97,108,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116,41,32,119,104,101,110,32,116,104,101,10,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,87,104,101,110,32,97,32,99,104,97,110,103,101,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,109,97,100,101,44,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,10,32,32,116,114,105,103,103,101,114,101,100,32,111,110,99,101,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,119,97,115,32,99,104,97,110,103,101,100,32,111,114,32,110,111,116,46,10,10,32,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,10,32,32,91,109,117,108,116,105,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,44,32,116,104,101,32,116,105,109,101,10,32,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,10,32,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,100,111,101,115,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,10,32,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,44,32,115,111,10,32,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,10,32,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,95,110,111,116,95,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,116,114,105,103,103,101,114,101,100,46,32,84,104,97,116,10,32,32,105,115,44,32,114,101,112,101,97,116,101,100,32,99,104,97,110,103,101,115,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,116,114,105,103,103,101,114,32,116,104,101,32,109,111,110,105,116,111,114,32,114,101,112,101,97,116,101,100,108,121,46,10,10,32,32,87,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,97,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,65,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,39,67,72,65,78,71,69,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,73,116,101,109,44,32,78,101,119,84,105,109,101,79,102,102,115,101,116,125,10,32,32,96,96,96,10,10,32,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,82,101,102,96,44,32,96,84,121,112,101,96,44,32,97,110,100,32,96,73,116,101,109,96,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,44,32,97,110,100,10,32,32,96,78,101,119,84,105,109,101,79,102,102,115,101,116,96,32,105,115,32,116,104,101,32,110,101,119,32,116,105,109,101,32,111,102,102,115,101,116,46,10,10,32,32,87,104,101,110,32,116,104,101,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,104,97,115,32,98,101,101,110,32,114,101,99,101,105,118,101,100,32,121,111,117,32,97,114,101,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,10,32,32,114,101,116,114,105,101,118,101,32,116,104,101,32,111,108,100,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,10,32,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,47,48,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,121,111,117,32,99,97,110,32,111,98,115,101,114,118,101,32,116,104,101,10,32,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,47,48,96,32,98,101,102,111,114,101,32,121,111,117,32,103,101,116,10,32,32,116,104,101,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,48,46,10,10,77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32,96,109,111,110,105,116,111,114,47,50,96,32,102,111,114,32,116,104,101,32,115,97,109,101,32,96,73,116,101,109,96,32,97,110,100,47,111,114,10,96,84,121,112,101,96,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46,10,10,84,104,101,32,109,111,110,105,116,111,114,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,104,97,116,32,105,115,44,32,111,116,104,101,114,32,96,84,121,112,101,96,115,32,97,110,100,10,96,73,116,101,109,96,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,111,114,32,119,104,101,110,32,96,109,111,110,105,116,111,114,47,50,96,32,105,115,32,101,120,116,101,110,100,101,100,44,32,111,116,104,101,114,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,102,111,114,10,62,32,96,84,97,103,96,44,32,96,79,98,106,101,99,116,96,44,32,97,110,100,32,96,73,110,102,111,96,32,105,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,105,110,116,114,111,100,117,99,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{4341,2},spec,{{monitor,2},[{type,{4342,7},bounded_fun,[{type,{4342,7},'fun',[{type,{4342,7},product,[{atom,{4342,8},process},{user_type,{4342,17},monitor_process_identifier,[]}]},{var,{4342,50},'MonitorRef'}]},[{type,{4343,9},constraint,[{atom,{4343,9},is_subtype},[{var,{4343,9},'MonitorRef'},{type,{4343,23},reference,[]}]]}]]},{type,{4344,7},bounded_fun,[{type,{4344,7},'fun',[{type,{4344,7},product,[{atom,{4344,8},port},{user_type,{4344,14},monitor_port_identifier,[]}]},{var,{4344,44},'MonitorRef'}]},[{type,{4345,9},constraint,[{atom,{4345,9},is_subtype},[{var,{4345,9},'MonitorRef'},{type,{4345,23},reference,[]}]]}]]},{type,{4346,7},bounded_fun,[{type,{4346,7},'fun',[{type,{4346,7},product,[{atom,{4346,8},time_offset},{atom,{4346,21},clock_service}]},{var,{4346,39},'MonitorRef'}]},[{type,{4347,9},constraint,[{atom,{4347,9},is_subtype},[{var,{4347,9},'MonitorRef'},{type,{4347,23},reference,[]}]]}]]}]}}]}},{{function,module_loaded,1},{4180,2},[<<109,111,100,117,108,101,95,108,111,97,100,101,100,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,105,115,32,108,111,97,100,101,100,32,97,115,10,91,95,99,117,114,114,101,110,116,32,99,111,100,101,95,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,59,32,111,116,104,101,114,119,105,115,101,44,10,96,102,97,108,115,101,96,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,116,116,101,109,112,116,32,116,111,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46>>},#{group => code,specification => [{attribute,{4186,2},spec,{{module_loaded,1},[{type,{4186,20},bounded_fun,[{type,{4186,20},'fun',[{type,{4186,20},product,[{var,{4186,21},'Module'}]},{type,{4186,32},boolean,[]}]},[{type,{4187,7},constraint,[{atom,{4187,7},is_subtype},[{var,{4187,7},'Module'},{type,{4187,17},module,[]}]]}]]}]}}]}},{{function,md5_update,2},{4170,2},[<<109,100,53,95,117,112,100,97,116,101,40,67,111,110,116,101,120,116,44,32,68,97,116,97,41>>],#{<<101,110>> => <<85,112,100,97,116,101,32,97,110,32,77,68,53,32,96,67,111,110,116,101,120,116,96,32,119,105,116,104,32,96,68,97,116,97,96,32,97,110,100,32,114,101,116,117,114,110,115,32,97,32,96,78,101,119,67,111,110,116,101,120,116,96,46>>},#{group => checksum,specification => [{attribute,{4172,2},spec,{{md5_update,2},[{type,{4172,17},bounded_fun,[{type,{4172,17},'fun',[{type,{4172,17},product,[{var,{4172,18},'Context'},{var,{4172,27},'Data'}]},{var,{4172,36},'NewContext'}]},[{type,{4173,7},constraint,[{atom,{4173,7},is_subtype},[{var,{4173,7},'Context'},{type,{4173,18},binary,[]}]]},{type,{4174,7},constraint,[{atom,{4174,7},is_subtype},[{var,{4174,7},'Data'},{type,{4174,15},iodata,[]}]]},{type,{4175,7},constraint,[{atom,{4175,7},is_subtype},[{var,{4175,7},'NewContext'},{type,{4175,21},binary,[]}]]}]]}]}}]}},{{function,md5_init,0},{4159,2},[<<109,100,53,95,105,110,105,116,40,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,110,32,77,68,53,32,99,111,110,116,101,120,116,44,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,10,91,96,109,100,53,95,117,112,100,97,116,101,47,50,96,93,40,96,109,100,53,95,117,112,100,97,116,101,47,50,96,41,46>>},#{group => checksum,specification => [{attribute,{4164,2},spec,{{md5_init,0},[{type,{4164,15},bounded_fun,[{type,{4164,15},'fun',[{type,{4164,15},product,[]},{var,{4164,21},'Context'}]},[{type,{4165,7},constraint,[{atom,{4165,7},is_subtype},[{var,{4165,7},'Context'},{type,{4165,18},binary,[]}]]}]]}]}}]}},{{function,md5_final,1},{4147,2},[<<109,100,53,95,102,105,110,97,108,40,67,111,110,116,101,120,116,41>>],#{<<101,110>> => <<70,105,110,105,115,104,101,115,32,116,104,101,32,117,112,100,97,116,101,32,111,102,32,97,110,32,77,68,53,32,96,67,111,110,116,101,120,116,96,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,117,116,101,100,32,96,77,68,53,96,32,109,101,115,115,97,103,101,10,100,105,103,101,115,116,46>>},#{group => checksum,specification => [{attribute,{4152,2},spec,{{md5_final,1},[{type,{4152,16},bounded_fun,[{type,{4152,16},'fun',[{type,{4152,16},product,[{var,{4152,17},'Context'}]},{var,{4152,29},'Digest'}]},[{type,{4153,7},constraint,[{atom,{4153,7},is_subtype},[{var,{4153,7},'Context'},{type,{4153,18},binary,[]}]]},{type,{4154,7},constraint,[{atom,{4154,7},is_subtype},[{var,{4154,7},'Digest'},{type,{4154,17},binary,[]}]]}]]}]}}]}},{{function,md5,1},{4126,2},[<<109,100,53,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,32,77,68,53,32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,32,102,114,111,109,32,96,68,97,116,97,96,44,32,119,104,101,114,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,100,105,103,101,115,116,32,105,115,10,49,50,56,32,98,105,116,115,32,40,49,54,32,98,121,116,101,115,41,46,32,96,68,97,116,97,96,32,105,115,32,97,32,98,105,110,97,114,121,32,111,114,32,97,32,108,105,115,116,32,111,102,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,97,110,100,10,98,105,110,97,114,105,101,115,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,77,68,53,44,32,115,101,101,10,91,82,70,67,32,49,51,50,49,32,45,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,93,40,104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,49,51,50,49,46,116,120,116,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,32,105,115,32,95,110,111,116,95,32,99,111,110,115,105,100,101,114,101,100,32,115,97,102,101,32,102,111,114,32,99,111,100,101,45,115,105,103,110,105,110,103,32,111,114,10,62,32,115,111,102,116,119,97,114,101,45,105,110,116,101,103,114,105,116,121,32,112,117,114,112,111,115,101,115,46>>},#{group => checksum,specification => [{attribute,{4140,2},spec,{{md5,1},[{type,{4140,10},bounded_fun,[{type,{4140,10},'fun',[{type,{4140,10},product,[{var,{4140,11},'Data'}]},{var,{4140,20},'Digest'}]},[{type,{4141,7},constraint,[{atom,{4141,7},is_subtype},[{var,{4141,7},'Data'},{type,{4141,15},iodata,[]}]]},{type,{4142,7},constraint,[{atom,{4142,7},is_subtype},[{var,{4142,7},'Digest'},{type,{4142,17},binary,[]}]]}]]}]}}]}},{{function,match_spec_test,3},{4085,2},[<<109,97,116,99,104,95,115,112,101,99,95,116,101,115,116,40,77,97,116,99,104,65,103,97,105,110,115,116,44,32,77,97,116,99,104,83,112,101,99,44,32,84,121,112,101,41>>],#{<<101,110>> => <<84,101,115,116,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,117,115,101,100,32,105,110,32,99,97,108,108,115,32,116,111,32,96,101,116,115,58,115,101,108,101,99,116,47,50,96,32,97,110,100,10,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,116,101,115,116,115,32,98,111,116,104,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,34,115,121,110,116,97,99,116,105,99,34,32,99,111,114,114,101,99,116,110,101,115,115,32,97,110,100,10,114,117,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,103,97,105,110,115,116,32,116,104,101,32,111,98,106,101,99,116,46,10,73,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,110,116,97,105,110,115,32,101,114,114,111,114,115,44,32,116,104,101,32,116,117,112,108,101,10,96,123,101,114,114,111,114,44,32,69,114,114,111,114,115,125,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,101,114,101,32,96,69,114,114,111,114,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,110,97,116,117,114,97,108,32,108,97,110,103,117,97,103,101,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,119,104,97,116,32,119,97,115,32,119,114,111,110,103,32,119,105,116,104,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46,10,10,73,102,32,96,84,121,112,101,96,32,105,115,32,96,116,97,98,108,101,96,44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,46,32,84,104,101,32,102,117,110,99,116,105,111,110,10,116,104,101,110,32,114,101,116,117,114,110,115,32,96,123,111,107,44,82,101,115,117,108,116,44,91,93,44,87,97,114,110,105,110,103,115,125,96,44,32,119,104,101,114,101,32,96,82,101,115,117,108,116,96,32,105,115,32,119,104,97,116,32,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,10,116,104,101,32,114,101,115,117,108,116,32,105,110,32,97,32,114,101,97,108,32,96,101,116,115,58,115,101,108,101,99,116,47,50,96,32,99,97,108,108,44,32,111,114,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,10,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,111,98,106,101,99,116,32,116,117,112,108,101,46,10,10,73,102,32,96,84,121,112,101,96,32,105,115,32,96,116,114,97,99,101,96,44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,46,32,84,104,101,32,102,117,110,99,116,105,111,110,10,114,101,116,117,114,110,115,32,96,123,111,107,44,32,82,101,115,117,108,116,44,32,70,108,97,103,115,44,32,87,97,114,110,105,110,103,115,125,96,44,32,119,104,101,114,101,32,96,82,101,115,117,108,116,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,96,116,114,117,101,96,32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,116,111,32,98,101,32,101,109,105,116,116,101,100,10,45,32,96,102,97,108,115,101,96,32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,101,109,105,116,116,101,100,10,45,32,84,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,32,116,111,32,98,101,32,97,112,112,101,110,100,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,10,10,96,70,108,97,103,115,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,116,111,32,98,101,32,101,110,97,98,108,101,100,44,32,99,117,114,114,101,110,116,108,121,32,116,104,105,115,10,105,115,32,111,110,108,121,32,96,114,101,116,117,114,110,95,116,114,97,99,101,96,46,10,10,84,104,105,115,32,105,115,32,97,32,117,115,101,102,117,108,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,116,101,115,116,32,116,111,111,108,44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,119,114,105,116,105,110,103,32,99,111,109,112,108,105,99,97,116,101,100,10,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,10,10,83,101,101,32,97,108,115,111,32,96,101,116,115,58,116,101,115,116,95,109,115,47,50,96,46>>},#{group => terms,specification => [{attribute,{4117,2},spec,{{match_spec_test,3},[{type,{4117,22},bounded_fun,[{type,{4117,22},'fun',[{type,{4117,22},product,[{var,{4117,23},'MatchAgainst'},{var,{4117,37},'MatchSpec'},{var,{4117,48},'Type'}]},{var,{4117,57},'TestResult'}]},[{type,{4118,7},constraint,[{atom,{4118,7},is_subtype},[{var,{4118,7},'MatchAgainst'},{type,{4118,23},union,[{type,{4118,23},list,[{type,{4118,24},term,[]}]},{type,{4118,34},tuple,any}]}]]},{type,{4119,7},constraint,[{atom,{4119,7},is_subtype},[{var,{4119,7},'MatchSpec'},{type,{4119,20},term,[]}]]},{type,{4120,7},constraint,[{atom,{4120,7},is_subtype},[{var,{4120,7},'Type'},{type,{4120,15},union,[{atom,{4120,15},table},{atom,{4120,23},trace}]}]]},{type,{4121,7},constraint,[{atom,{4121,7},is_subtype},[{var,{4121,7},'TestResult'},{type,{4121,21},union,[{type,{4121,21},tuple,[{atom,{4121,22},ok},{type,{4121,26},term,[]},{type,{4121,34},list,[{atom,{4121,35},return_trace}]},{type,{4121,50},list,[{type,{4121,52},tuple,[{type,{4121,53},union,[{atom,{4121,53},error},{atom,{4121,61},warning}]},{type,{4121,70},string,[]}]}]}]},{type,{4121,85},tuple,[{atom,{4121,86},error},{type,{4121,93},list,[{type,{4121,95},tuple,[{type,{4121,96},union,[{atom,{4121,96},error},{atom,{4121,104},warning}]},{type,{4121,113},string,[]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,map_get,2},{4060,2},[<<109,97,112,95,103,101,116,40,75,101,121,44,32,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,118,97,108,117,101,32,96,86,97,108,117,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,102,32,96,77,97,112,96,32,99,111,110,116,97,105,110,115,32,96,75,101,121,96,46,10,10,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,123,98,97,100,109,97,112,44,77,97,112,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,77,97,112,96,32,105,115,32,110,111,116,32,97,32,109,97,112,44,32,111,114,32,119,105,116,104,32,97,10,96,123,98,97,100,107,101,121,44,75,101,121,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,62,32,75,101,121,32,61,32,49,51,51,55,44,10,32,32,77,97,112,32,61,32,35,123,52,50,32,61,62,32,118,97,108,117,101,95,116,119,111,44,49,51,51,55,32,61,62,32,34,118,97,108,117,101,32,111,110,101,34,44,34,97,34,32,61,62,32,49,125,44,10,32,32,109,97,112,95,103,101,116,40,75,101,121,44,77,97,112,41,46,10,34,118,97,108,117,101,32,111,110,101,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{4077,2},spec,{{map_get,2},[{type,{4077,14},bounded_fun,[{type,{4077,14},'fun',[{type,{4077,14},product,[{var,{4077,15},'Key'},{var,{4077,20},'Map'}]},{var,{4077,28},'Value'}]},[{type,{4078,7},constraint,[{atom,{4078,7},is_subtype},[{var,{4078,7},'Map'},{type,{4078,14},map,any}]]},{type,{4079,7},constraint,[{atom,{4079,7},is_subtype},[{var,{4079,7},'Key'},{type,{4079,14},any,[]}]]},{type,{4080,7},constraint,[{atom,{4080,7},is_subtype},[{var,{4080,7},'Value'},{type,{4080,16},any,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,map_size,1},{4042,2},[<<109,97,112,95,115,105,122,101,40,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,107,101,121,45,118,97,108,117,101,32,112,97,105,114,115,32,105,110,32,96,77,97,112,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,112,95,115,105,122,101,40,35,123,97,61,62,49,44,32,98,61,62,50,44,32,99,61,62,51,125,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{4054,2},spec,{{map_size,1},[{type,{4054,15},bounded_fun,[{type,{4054,15},'fun',[{type,{4054,15},product,[{var,{4054,16},'Map'}]},{type,{4054,24},non_neg_integer,[]}]},[{type,{4055,7},constraint,[{atom,{4055,7},is_subtype},[{var,{4055,7},'Map'},{type,{4055,14},map,any}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,make_ref,0},{4026,2},[<<109,97,107,101,95,114,101,102,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,91,117,110,105,113,117,101,32,114,101,102,101,114,101,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,114,101,102,101,114,101,110,99,101,115,96,41,46,32,84,104,101,10,114,101,102,101,114,101,110,99,101,32,105,115,32,117,110,105,113,117,101,32,97,109,111,110,103,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,66,101,102,111,114,101,32,79,84,80,32,50,51,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,44,10,62,32,114,101,102,101,114,101,110,99,101,115,32,99,114,101,97,116,101,100,32,111,110,32,97,32,110,101,119,101,114,32,110,111,100,101,32,99,97,110,32,98,101,32,109,105,115,116,97,107,101,110,32,102,111,114,32,97,32,114,101,102,101,114,101,110,99,101,32,99,114,101,97,116,101,100,32,111,110,10,62,32,97,110,32,111,108,100,101,114,32,110,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,46>>},#{group => terms,specification => [{attribute,{4037,2},spec,{{make_ref,0},[{type,{4037,15},'fun',[{type,{4037,15},product,[]},{type,{4037,21},reference,[]}]}]}}]}},{{function,localtime,0},{4004,2},[<<108,111,99,97,108,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,44,10,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,10,96,96,96,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46>>},#{group => time,specification => [{attribute,{4020,2},spec,{{localtime,0},[{type,{4020,16},bounded_fun,[{type,{4020,16},'fun',[{type,{4020,16},product,[]},{var,{4020,22},'DateTime'}]},[{type,{4021,7},constraint,[{atom,{4021,7},is_subtype},[{var,{4021,7},'DateTime'},{remote_type,{4021,19},[{atom,{4021,19},calendar},{atom,{4021,28},datetime},[]]}]]}]]}]}}]}},{{function,loaded,0},{3991,2},[<<108,111,97,100,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,40,99,117,114,114,101,110,116,32,97,110,100,32,111,108,100,32,99,111,100,101,41,44,32,105,110,99,108,117,100,105,110,103,10,112,114,101,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46>>},#{group => code,specification => [{attribute,{3998,2},spec,{{loaded,0},[{type,{3998,13},bounded_fun,[{type,{3998,13},'fun',[{type,{3998,13},product,[]},{type,{3998,19},list,[{var,{3998,20},'Module'}]}]},[{type,{3999,7},constraint,[{atom,{3999,7},is_subtype},[{var,{3999,7},'Module'},{type,{3999,17},module,[]}]]}]]}]}}]}},{{function,list_to_tuple,1},{3974,2},[<<108,105,115,116,95,116,111,95,116,117,112,108,101,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,76,105,115,116,96,44,32,102,111,114,32,101,120,97,109,112,108,101,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,116,117,112,108,101,40,91,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,93,41,46,10,123,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,125,10,96,96,96,10,10,96,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46>>},#{group => terms,specification => [{attribute,{3985,2},spec,{{list_to_tuple,1},[{type,{3985,20},bounded_fun,[{type,{3985,20},'fun',[{type,{3985,20},product,[{var,{3985,21},'List'}]},{type,{3985,30},tuple,any}]},[{type,{3986,7},constraint,[{atom,{3986,7},is_subtype},[{var,{3986,7},'List'},{type,{3986,15},list,[{type,{3986,16},term,[]}]}]]}]]}]}}]}},{{function,list_to_ref,1},{3949,2},[<<108,105,115,116,95,116,111,95,114,101,102,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,114,101,102,101,114,101,110,99,101,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,114,101,102,40,34,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,34,41,46,10,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,114,101,102,101,114,101,110,99,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3968,2},spec,{{list_to_ref,1},[{type,{3968,18},bounded_fun,[{type,{3968,18},'fun',[{type,{3968,18},product,[{var,{3968,19},'String'}]},{type,{3968,30},reference,[]}]},[{type,{3969,7},constraint,[{atom,{3969,7},is_subtype},[{var,{3969,7},'String'},{type,{3969,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_port,1},{3923,2},[<<108,105,115,116,95,116,111,95,112,111,114,116,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,112,111,114,116,40,34,35,80,111,114,116,60,48,46,52,62,34,41,46,10,35,80,111,114,116,60,48,46,52,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3943,2},spec,{{list_to_port,1},[{type,{3943,19},bounded_fun,[{type,{3943,19},'fun',[{type,{3943,19},product,[{var,{3943,20},'String'}]},{type,{3943,31},port,[]}]},[{type,{3944,7},constraint,[{atom,{3944,7},is_subtype},[{var,{3944,7},'String'},{type,{3944,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_pid,1},{3898,2},[<<108,105,115,116,95,116,111,95,112,105,100,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,112,105,100,40,34,60,48,46,52,46,49,62,34,41,46,10,60,48,46,52,46,49,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3917,2},spec,{{list_to_pid,1},[{type,{3917,18},bounded_fun,[{type,{3917,18},'fun',[{type,{3917,18},product,[{var,{3917,19},'String'}]},{type,{3917,30},pid,[]}]},[{type,{3918,7},constraint,[{atom,{3918,7},is_subtype},[{var,{3918,7},'String'},{type,{3918,17},string,[]}]]}]]}]}}]}},{{function,list_to_integer,2},{3837,2},[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,83,116,114,105,110,103,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32,96,66,97,115,101,96,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,102,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,51,70,70,34,44,32,49,54,41,46,10,45,49,48,50,51,10,96,96,96,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,96,66,97,115,101,96,32,105,115,32,49,54,44,32,96,83,116,114,105,110,103,96,32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,10,96,34,94,91,43,45,93,63,40,91,48,45,57,93,124,91,65,45,70,93,124,91,97,45,102,93,41,43,36,34,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{3873,2},spec,{{list_to_integer,2},[{type,{3873,22},bounded_fun,[{type,{3873,22},'fun',[{type,{3873,22},product,[{var,{3873,23},'String'},{var,{3873,31},'Base'}]},{type,{3873,40},integer,[]}]},[{type,{3874,7},constraint,[{atom,{3874,7},is_subtype},[{var,{3874,7},'String'},{type,{3874,17},string,[]}]]},{type,{3875,7},constraint,[{atom,{3875,7},is_subtype},[{var,{3875,7},'Base'},{type,{3875,15},range,[{integer,{3875,15},2},{integer,{3875,18},36}]}]]}]]}]}}]}},{{function,list_to_integer,1},{3785,2},[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,49,50,51,34,41,46,10,49,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,49,50,51,34,41,46,10,45,49,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,34,41,46,10,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,10,96,96,96,10,10,96,83,116,114,105,110,103,96,32,109,117,115,116,32,99,111,110,116,97,105,110,32,97,116,32,108,101,97,115,116,32,111,110,101,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,99,97,110,32,104,97,118,101,32,97,110,32,111,112,116,105,111,110,97,108,10,112,114,101,102,105,120,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,34,96,43,96,34,32,111,114,32,34,96,45,96,34,32,99,104,97,114,97,99,116,101,114,32,40,116,104,97,116,32,105,115,44,32,96,83,116,114,105,110,103,96,32,109,117,115,116,10,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,34,94,91,43,45,93,63,91,48,45,57,93,43,36,34,96,41,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{3812,2},spec,{{list_to_integer,1},[{type,{3812,22},bounded_fun,[{type,{3812,22},'fun',[{type,{3812,22},product,[{var,{3812,23},'String'}]},{type,{3812,34},integer,[]}]},[{type,{3813,7},constraint,[{atom,{3813,7},is_subtype},[{var,{3813,7},'String'},{type,{3813,17},string,[]}]]}]]}]}}]}},{{function,list_to_float,1},{3762,2},[<<108,105,115,116,95,116,111,95,102,108,111,97,116,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,32,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,34,50,46,50,48,49,55,55,54,52,101,43,48,34,41,46,10,50,46,50,48,49,55,55,54,52,10,96,96,96,10,10,84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,10,91,69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,96,41,32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,10,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>},#{group => terms,specification => [{attribute,{3779,2},spec,{{list_to_float,1},[{type,{3779,20},bounded_fun,[{type,{3779,20},'fun',[{type,{3779,20},product,[{var,{3779,21},'String'}]},{type,{3779,32},float,[]}]},[{type,{3780,7},constraint,[{atom,{3780,7},is_subtype},[{var,{3780,7},'String'},{type,{3780,17},string,[]}]]}]]}]}}]}},{{function,list_to_existing_atom,1},{3738,2},[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,114,101,10,97,108,114,101,97,100,121,32,101,120,105,115,116,115,32,115,117,99,104,32,97,116,111,109,46,32,65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,102,32,105,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,114,117,110,45,116,105,109,101,10,115,121,115,116,101,109,32,98,121,32,101,105,116,104,101,114,32,108,111,97,100,105,110,103,32,99,111,100,101,32,111,114,32,99,114,101,97,116,105,110,103,32,97,32,116,101,114,109,32,105,110,32,119,104,105,99,104,32,116,104,101,32,97,116,111,109,32,105,115,32,112,97,114,116,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,100,111,101,115,32,110,111,116,32,97,108,114,101,97,100,121,32,101,120,105,115,116,32,97,110,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,10,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,10,62,32,114,101,119,114,105,116,101,32,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,96,34,115,111,109,101,95,97,116,111,109,34,96,46,32,73,102,10,62,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32,96,115,111,109,101,95,97,116,111,109,96,32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,10,62,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,10,62,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,10,62,32,91,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,34,115,111,109,101,95,97,116,111,109,34,41,96,93,40,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,41,32,119,105,108,108,32,102,97,105,108,46>>},#{group => terms,specification => [{attribute,{3756,2},spec,{{list_to_existing_atom,1},[{type,{3756,28},bounded_fun,[{type,{3756,28},'fun',[{type,{3756,28},product,[{var,{3756,29},'String'}]},{type,{3756,40},atom,[]}]},[{type,{3757,7},constraint,[{atom,{3757,7},is_subtype},[{var,{3757,7},'String'},{type,{3757,17},string,[]}]]}]]}]}}]}},{{function,list_to_bitstring,1},{3713,2},[<<108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,66,105,116,115,116,114,105,110,103,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,116,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,116,115,116,114,105,110,103,115,32,105,110,10,96,66,105,116,115,116,114,105,110,103,76,105,115,116,96,46,32,40,84,104,101,32,108,97,115,116,32,116,97,105,108,32,105,110,32,96,66,105,116,115,116,114,105,110,103,76,105,115,116,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,10,98,105,116,115,116,114,105,110,103,46,41,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,44,55,58,52,62,62,46,10,60,60,54,44,55,58,52,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,44,55,58,52,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3732,2},spec,{{list_to_bitstring,1},[{type,{3732,24},bounded_fun,[{type,{3732,24},'fun',[{type,{3732,24},product,[{var,{3732,25},'BitstringList'}]},{type,{3732,43},bitstring,[]}]},[{type,{3733,7},constraint,[{atom,{3733,7},is_subtype},[{var,{3733,7},'BitstringList'},{user_type,{3733,24},bitstring_list,[]}]]}]]}]}}]}},{{function,list_to_binary,1},{3690,2},[<<108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,111,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32,96,73,111,76,105,115,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3707,2},spec,{{list_to_binary,1},[{type,{3707,21},bounded_fun,[{type,{3707,21},'fun',[{type,{3707,21},product,[{var,{3707,22},'IoList'}]},{type,{3707,33},binary,[]}]},[{type,{3708,7},constraint,[{atom,{3708,7},is_subtype},[{var,{3708,7},'IoList'},{type,{3708,17},iolist,[]}]]}]]}]}}]}},{{function,list_to_atom,1},{3654,2},[<<108,105,115,116,95,116,111,95,97,116,111,109,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,96,83,116,114,105,110,103,96,32,109,97,121,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,10,118,101,114,115,105,111,110,115,32,97,108,108,111,119,101,100,32,111,110,108,121,32,73,83,79,45,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,100,105,100,32,110,111,116,32,97,108,108,111,119,10,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,98,111,118,101,32,50,53,53,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,97,32,91,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,10,62,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,10,62,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,105,102,10,62,32,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,10,62,32,91,96,108,105,115,116,95,116,111,95,97,116,111,109,47,49,96,93,40,96,108,105,115,116,95,116,111,95,97,116,111,109,47,49,96,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,97,116,111,109,40,34,69,114,108,97,110,103,34,41,46,10,39,69,114,108,97,110,103,39,10,96,96,96>>},#{group => terms,specification => [{attribute,{3684,2},spec,{{list_to_atom,1},[{type,{3684,19},bounded_fun,[{type,{3684,19},'fun',[{type,{3684,19},product,[{var,{3684,20},'String'}]},{type,{3684,31},atom,[]}]},[{type,{3685,7},constraint,[{atom,{3685,7},is_subtype},[{var,{3685,7},'String'},{type,{3685,17},string,[]}]]}]]}]}}]}},{{function,link,1},{3594,2},[<<108,105,110,107,40,80,105,100,79,114,80,111,114,116,41>>],#{<<101,110>> => <<83,101,116,115,32,117,112,32,97,110,100,32,97,99,116,105,118,97,116,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,10,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,79,114,80,111,114,116,96,46,10,10,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,108,105,110,107,101,101,46,32,73,102,32,116,104,101,32,108,105,110,107,101,101,10,105,115,32,97,32,112,111,114,116,44,32,105,116,32,109,117,115,116,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,46,10,10,73,102,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,116,105,99,105,112,97,110,116,115,32,111,102,32,97,32,108,105,110,107,32,116,101,114,109,105,110,97,116,101,115,44,32,105,116,32,119,105,108,108,10,91,115,101,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,32,116,111,10,116,104,101,32,111,116,104,101,114,32,112,97,114,116,105,99,105,112,97,110,116,46,32,84,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,10,91,101,120,105,116,32,114,101,97,115,111,110,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,95,101,120,105,116,95,115,105,103,110,97,108,95,114,101,97,115,111,110,96,41,32,111,102,32,116,104,101,10,116,101,114,109,105,110,97,116,101,100,32,112,97,114,116,105,99,105,112,97,110,116,46,32,79,116,104,101,114,32,99,97,115,101,115,32,119,104,101,110,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,101,32,116,114,105,103,103,101,114,101,100,32,100,117,101,32,116,111,32,97,10,108,105,110,107,32,97,114,101,32,119,104,101,110,32,110,111,32,108,105,110,107,101,101,32,101,120,105,115,116,32,40,96,110,111,112,114,111,99,96,32,101,120,105,116,32,114,101,97,115,111,110,41,32,97,110,100,32,119,104,101,110,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,10,98,101,116,119,101,101,110,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,111,110,32,100,105,102,102,101,114,101,110,116,32,110,111,100,101,115,32,105,115,32,108,111,115,116,32,111,114,32,99,97,110,110,111,116,32,98,101,32,101,115,116,97,98,108,105,115,104,101,100,10,40,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,101,120,105,116,32,114,101,97,115,111,110,41,46,10,10,65,110,32,101,120,105,115,116,105,110,103,32,108,105,110,107,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,98,121,32,99,97,108,108,105,110,103,32,96,117,110,108,105,110,107,47,49,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,10,108,105,110,107,115,32,97,110,100,32,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,58,10,10,45,32,91,76,105,110,107,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,115,96,41,10,45,32,91,83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,45,32,91,82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,10,70,111,114,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,104,97,115,32,97,32,115,116,114,97,110,103,101,32,115,101,109,105,45,115,121,110,99,104,114,111,110,111,117,115,10,98,101,104,97,118,105,111,114,32,119,104,101,110,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,111,114,32,110,111,116,44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,10,100,111,101,115,32,110,111,116,32,91,116,114,97,112,32,101,120,105,116,115,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,41,46,32,73,102,32,116,104,101,32,97,98,111,118,101,32,105,115,32,116,114,117,101,10,97,110,100,32,116,104,101,32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,119,105,108,108,32,114,97,105,115,101,32,97,32,96,110,111,112,114,111,99,96,32,101,114,114,111,114,10,95,101,120,99,101,112,116,105,111,110,95,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,119,111,117,108,100,32,105,110,115,116,101,97,100,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,10,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,114,101,116,117,114,110,101,100,32,96,116,114,117,101,96,44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,32,108,97,116,101,114,32,119,97,115,32,115,101,110,116,32,97,110,32,101,120,105,116,10,115,105,103,110,97,108,32,119,105,116,104,32,96,110,111,112,114,111,99,96,32,101,120,105,116,32,114,101,97,115,111,110,44,32,98,117,116,32,116,104,105,115,32,105,115,32,117,110,102,111,114,116,117,110,97,116,101,108,121,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,101,10,96,110,111,112,114,111,99,96,32,91,101,120,99,101,112,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,101,120,99,101,112,116,105,111,110,115,96,41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,99,111,110,102,117,115,101,100,32,119,105,116,104,10,97,110,32,91,101,120,105,116,32,115,105,103,110,97,108,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,32,119,105,116,104,32,101,120,105,116,10,114,101,97,115,111,110,32,96,110,111,112,114,111,99,96,46,32,67,117,114,114,101,110,116,108,121,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,119,104,101,110,32,105,116,10,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,108,105,110,107,32,115,101,116,117,112,32,97,110,100,32,97,99,116,105,118,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,116,104,101,32,108,105,110,107,32,97,108,114,101,97,100,121,10,101,120,105,115,116,115,44,32,111,114,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,99,114,101,97,116,101,32,97,32,108,105,110,107,32,116,111,32,105,116,115,101,108,102,44,32,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,10,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,91,108,105,110,107,32,112,114,111,116,111,99,111,108,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,35,108,105,110,107,95,112,114,111,116,111,99,111,108,41,10,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,95,68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,70,97,105,108,117,114,101,58,10,10,45,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,79,114,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46,10,45,32,96,110,111,112,114,111,99,96,32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,110,100,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,105,116,32,101,120,105,115,116,115,32,97,115,10,32,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,46>>},#{group => processes,specification => [{attribute,{3648,2},spec,{{link,1},[{type,{3648,11},bounded_fun,[{type,{3648,11},'fun',[{type,{3648,11},product,[{var,{3648,12},'PidOrPort'}]},{atom,{3648,26},true}]},[{type,{3649,7},constraint,[{atom,{3649,7},is_subtype},[{var,{3649,7},'PidOrPort'},{type,{3649,20},union,[{type,{3649,20},pid,[]},{type,{3649,28},port,[]}]}]]}]]}]}}]}},{{function,length,1},{3577,2},[<<108,101,110,103,116,104,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,96,76,105,115,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,101,110,103,116,104,40,91,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,93,41,46,10,57,10,96,96,96>>},#{group => terms,specification => [{attribute,{3588,2},spec,{{length,1},[{type,{3588,13},bounded_fun,[{type,{3588,13},'fun',[{type,{3588,13},product,[{var,{3588,14},'List'}]},{type,{3588,23},non_neg_integer,[]}]},[{type,{3589,7},constraint,[{atom,{3589,7},is_subtype},[{var,{3589,7},'List'},{type,{3589,15},list,[{type,{3589,16},term,[]}]}]]}]]}]}}]}},{{function,is_process_alive,1},{3542,2},[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,105,100,41>>],#{<<101,110>> => <<96,80,105,100,96,32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,32,97,110,100,32,105,115,32,97,108,105,118,101,44,32,116,104,97,116,32,105,115,44,32,105,115,32,110,111,116,32,101,120,105,116,105,110,103,32,97,110,100,10,104,97,115,32,110,111,116,32,101,120,105,116,101,100,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,73,102,32,112,114,111,99,101,115,115,32,96,80,49,96,32,99,97,108,108,115,32,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,105,116,32,105,115,10,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,115,105,103,110,97,108,115,44,32,115,101,110,116,32,102,114,111,109,32,96,80,49,96,32,116,111,32,96,80,50,96,32,40,96,80,50,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,10,105,100,101,110,116,105,102,105,101,114,32,96,80,50,80,105,100,96,41,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,44,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,50,96,32,98,101,102,111,114,101,32,116,104,101,10,97,108,105,118,101,110,101,115,115,32,111,102,32,96,80,50,96,32,105,115,32,99,104,101,99,107,101,100,46,32,84,104,105,115,32,103,117,97,114,97,110,116,101,101,32,109,101,97,110,115,32,116,104,97,116,32,111,110,101,32,99,97,110,32,117,115,101,10,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,116,111,32,108,101,116,32,97,32,112,114,111,99,101,115,115,32,96,80,49,96,32,119,97,105,116,32,117,110,116,105,108,32,97,10,112,114,111,99,101,115,115,32,96,80,50,96,44,32,119,104,105,99,104,32,104,97,115,32,103,111,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,102,114,111,109,32,80,49,44,32,105,115,10,107,105,108,108,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,101,120,105,116,40,80,50,80,105,100,44,32,107,105,108,108,41,44,10,37,32,80,50,32,109,105,103,104,116,32,110,111,116,32,98,101,32,107,105,108,108,101,100,10,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,44,10,37,32,80,50,32,105,115,32,110,111,116,32,97,108,105,118,101,32,40,116,104,101,32,99,97,108,108,32,97,98,111,118,101,32,97,108,119,97,121,115,32,114,101,116,117,114,110,32,102,97,108,115,101,41,10,96,96,96,10,10,83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,98,111,117,116,32,91,115,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,10,97,110,100,32,91,101,114,108,97,110,103,58,101,120,105,116,47,50,93,40,96,101,120,105,116,47,50,96,41,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,105,103,110,97,108,115,32,97,110,100,32,101,120,105,116,10,115,105,103,110,97,108,115,46>>},#{group => processes,specification => [{attribute,{3570,2},spec,{{is_process_alive,1},[{type,{3570,23},bounded_fun,[{type,{3570,23},'fun',[{type,{3570,23},product,[{var,{3570,24},'Pid'}]},{type,{3570,32},boolean,[]}]},[{type,{3571,7},constraint,[{atom,{3571,7},is_subtype},[{var,{3571,7},'Pid'},{type,{3571,14},pid,[]}]]}]]}]}}]}},{{function,is_map_key,2},{3516,2},[<<105,115,95,109,97,112,95,107,101,121,40,75,101,121,44,32,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,109,97,112,32,96,77,97,112,96,32,99,111,110,116,97,105,110,115,32,96,75,101,121,96,32,97,110,100,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,10,99,111,110,116,97,105,110,32,116,104,101,32,96,75,101,121,96,46,10,10,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,123,98,97,100,109,97,112,44,77,97,112,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,77,97,112,96,32,105,115,32,110,111,116,32,97,32,109,97,112,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,62,32,77,97,112,32,61,32,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,46,10,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,10,62,32,105,115,95,109,97,112,95,107,101,121,40,34,52,50,34,44,77,97,112,41,46,10,116,114,117,101,10,62,32,105,115,95,109,97,112,95,107,101,121,40,118,97,108,117,101,44,77,97,112,41,46,10,102,97,108,115,101,10,96,96,96>>},#{group => terms,specification => [{attribute,{3535,2},spec,{{is_map_key,2},[{type,{3535,17},bounded_fun,[{type,{3535,17},'fun',[{type,{3535,17},product,[{var,{3535,18},'Key'},{var,{3535,23},'Map'}]},{type,{3535,31},boolean,[]}]},[{type,{3536,5},constraint,[{atom,{3536,5},is_subtype},[{var,{3536,5},'Key'},{type,{3536,12},term,[]}]]},{type,{3537,5},constraint,[{atom,{3537,5},is_subtype},[{var,{3537,5},'Map'},{type,{3537,12},map,any}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,is_builtin,3},{3501,2},[<<105,115,95,98,117,105,108,116,105,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<84,104,105,115,32,66,73,70,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,98,117,105,108,100,101,114,115,32,111,102,32,99,114,111,115,115,45,114,101,102,101,114,101,110,99,101,32,116,111,111,108,115,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,105,115,32,97,32,66,73,70,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,44,32,111,116,104,101,114,119,105,115,101,10,96,102,97,108,115,101,96,46>>},#{group => code,specification => [{attribute,{3508,2},spec,{{is_builtin,3},[{type,{3508,17},bounded_fun,[{type,{3508,17},'fun',[{type,{3508,17},product,[{var,{3508,18},'Module'},{var,{3508,26},'Function'},{var,{3508,36},'Arity'}]},{type,{3508,46},boolean,[]}]},[{type,{3509,7},constraint,[{atom,{3509,7},is_subtype},[{var,{3509,7},'Module'},{type,{3509,17},module,[]}]]},{type,{3510,7},constraint,[{atom,{3510,7},is_subtype},[{var,{3510,7},'Function'},{type,{3510,19},atom,[]}]]},{type,{3511,7},constraint,[{atom,{3511,7},is_subtype},[{var,{3511,7},'Arity'},{type,{3511,16},arity,[]}]]}]]}]}}]}},{{function,is_alive,0},{3485,2},[<<105,115,95,97,108,105,118,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,40,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,97,10,100,105,115,116,114,105,98,117,116,101,100,32,115,121,115,116,101,109,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,32,65,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,105,102,32,105,116,32,105,115,32,115,116,97,114,116,101,100,32,119,105,116,104,58,10,10,49,46,32,91,96,34,101,114,108,32,45,110,97,109,101,32,76,79,78,71,78,65,77,69,34,96,93,40,101,114,108,95,99,109,100,46,109,100,35,110,97,109,101,41,32,111,114,44,10,49,46,32,91,96,34,101,114,108,32,45,115,110,97,109,101,32,83,72,79,82,84,78,65,77,69,34,96,93,40,101,114,108,95,99,109,100,46,109,100,35,115,110,97,109,101,41,46,10,10,65,32,110,111,100,101,32,99,97,110,32,97,108,115,111,32,98,101,32,97,108,105,118,101,32,105,102,32,105,116,32,104,97,115,32,103,111,116,32,97,32,110,97,109,101,32,102,114,111,109,32,97,32,99,97,108,108,32,116,111,10,96,110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,50,96,32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,111,112,112,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48,96,46>>},#{group => distribution,specification => [{attribute,{3496,2},spec,{{is_alive,0},[{type,{3496,15},'fun',[{type,{3496,15},product,[]},{type,{3496,21},boolean,[]}]}]}}]}},{{function,iolist_to_iovec,1},{3446,2},[<<105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,73,111,76,105,115,116,79,114,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,91,105,111,118,101,99,93,40,96,116,58,105,111,118,101,99,47,48,96,41,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,10,96,73,111,76,105,115,116,79,114,66,105,110,97,114,121,96,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,102,108,97,116,116,101,110,32,97,110,32,105,111,108,105,115,116,32,98,117,116,10,121,111,117,32,100,111,32,110,111,116,32,110,101,101,100,32,97,32,115,105,110,103,108,101,32,98,105,110,97,114,121,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,115,115,105,110,103,32,116,104,101,32,100,97,116,97,32,116,111,32,110,105,102,10,102,117,110,99,116,105,111,110,115,32,115,117,99,104,32,97,115,32,91,96,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,96,93,40,101,114,108,95,110,105,102,46,109,100,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,41,32,111,114,32,100,111,10,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,46,32,84,104,101,32,97,100,118,97,110,116,97,103,101,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,118,101,114,10,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,32,105,115,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,99,111,112,121,10,91,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,93,40,96,101,58,115,121,115,116,101,109,58,98,105,110,97,114,121,104,97,110,100,108,105,110,103,46,109,100,35,114,101,102,99,95,98,105,110,97,114,121,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,115,109,97,108,108,32,98,105,110,97,114,105,101,115,32,97,110,100,32,105,110,116,101,103,101,114,115,32,105,116,32,119,111,114,107,115,32,97,115,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,91,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,93,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,108,97,114,103,101,114,32,98,105,110,97,114,105,101,115,44,32,116,104,101,121,32,97,114,101,32,115,112,108,105,116,32,97,110,100,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,102,111,114,109,10,37,37,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,97,108,108,105,110,103,32,116,104,101,32,67,32,102,117,110,99,116,105,111,110,32,119,114,105,116,101,118,46,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,60,60,49,62,62,44,60,60,50,58,56,48,57,54,62,62,44,60,60,51,58,56,48,57,54,62,62,93,41,46,10,91,60,60,49,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,48,44,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,46,46,46,62,62,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{3479,2},spec,{{iolist_to_iovec,1},[{type,{3479,22},bounded_fun,[{type,{3479,22},'fun',[{type,{3479,22},product,[{var,{3479,23},'IoListOrBinary'}]},{user_type,{3479,42},iovec,[]}]},[{type,{3480,7},constraint,[{atom,{3480,7},is_subtype},[{var,{3480,7},'IoListOrBinary'},{type,{3480,25},union,[{type,{3480,25},iolist,[]},{type,{3480,36},binary,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,49>>}},{{function,iolist_to_binary,1},{3422,2},[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,111,76,105,115,116,79,114,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,10,96,73,111,76,105,115,116,79,114,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3440,2},spec,{{iolist_to_binary,1},[{type,{3440,23},bounded_fun,[{type,{3440,23},'fun',[{type,{3440,23},product,[{var,{3440,24},'IoListOrBinary'}]},{type,{3440,43},binary,[]}]},[{type,{3441,7},constraint,[{atom,{3441,7},is_subtype},[{var,{3441,7},'IoListOrBinary'},{type,{3441,25},union,[{type,{3441,25},iolist,[]},{type,{3441,36},binary,[]}]}]]}]]}]}}]}},{{function,iolist_size,1},{3404,2},[<<105,111,108,105,115,116,95,115,105,122,101,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,44,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,116,104,97,116,32,119,111,117,108,100,32,98,101,32,116,104,101,10,114,101,115,117,108,116,32,111,102,32,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,116,101,109,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,111,108,105,115,116,95,115,105,122,101,40,91,49,44,50,124,60,60,51,44,52,62,62,93,41,46,10,52,10,96,96,96>>},#{group => terms,specification => [{attribute,{3416,2},spec,{{iolist_size,1},[{type,{3416,18},bounded_fun,[{type,{3416,18},'fun',[{type,{3416,18},product,[{var,{3416,19},'Item'}]},{type,{3416,28},non_neg_integer,[]}]},[{type,{3417,7},constraint,[{atom,{3417,7},is_subtype},[{var,{3417,7},'Item'},{type,{3417,15},union,[{type,{3417,15},iolist,[]},{type,{3417,26},binary,[]}]}]]}]]}]}}]}},{{function,integer_to_list,1},{3387,2},[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,73,110,116,101,103,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,55,55,41,46,10,34,55,55,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{3398,2},spec,{{integer_to_list,1},[{type,{3398,22},bounded_fun,[{type,{3398,22},'fun',[{type,{3398,22},product,[{var,{3398,23},'Integer'}]},{type,{3398,35},string,[]}]},[{type,{3399,7},constraint,[{atom,{3399,7},is_subtype},[{var,{3399,7},'Integer'},{type,{3399,18},integer,[]}]]}]]}]}}]}},{{function,integer_to_binary,1},{3369,2},[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,73,110,116,101,103,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,55,55,41,46,10,60,60,34,55,55,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3381,2},spec,{{integer_to_binary,1},[{type,{3381,24},bounded_fun,[{type,{3381,24},'fun',[{type,{3381,24},product,[{var,{3381,25},'Integer'}]},{type,{3381,37},binary,[]}]},[{type,{3382,7},constraint,[{atom,{3382,7},is_subtype},[{var,{3382,7},'Integer'},{type,{3382,18},integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,insert_element,3},{3346,2},[<<105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,44,32,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,96,84,101,114,109,96,32,105,110,115,101,114,116,101,100,32,97,116,32,112,111,115,105,116,105,111,110,32,96,73,110,100,101,120,96,32,105,110,32,116,117,112,108,101,10,96,84,117,112,108,101,49,96,46,32,65,108,108,32,101,108,101,109,101,110,116,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32,96,73,110,100,101,120,96,32,97,110,100,32,117,112,119,97,114,100,115,32,97,114,101,32,112,117,115,104,101,100,32,111,110,101,32,115,116,101,112,10,104,105,103,104,101,114,32,105,110,32,116,104,101,32,110,101,119,32,116,117,112,108,101,32,96,84,117,112,108,101,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,44,32,110,101,119,41,46,10,123,111,110,101,44,110,101,119,44,116,119,111,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{3360,2},spec,{{insert_element,3},[{type,{3360,21},bounded_fun,[{type,{3360,21},'fun',[{type,{3360,21},product,[{var,{3360,22},'Index'},{var,{3360,29},'Tuple1'},{var,{3360,37},'Term'}]},{var,{3360,46},'Tuple2'}]},[{type,{3361,7},constraint,[{atom,{3361,7},is_subtype},[{var,{3361,7},'Index'},{type,{3361,17},pos_integer,[]}]]},{type,{3362,7},constraint,[{atom,{3362,7},is_subtype},[{var,{3362,7},'Tuple1'},{type,{3362,17},tuple,any}]]},{type,{3363,7},constraint,[{atom,{3363,7},is_subtype},[{var,{3363,7},'Tuple2'},{type,{3363,17},tuple,any}]]},{type,{3364,7},constraint,[{atom,{3364,7},is_subtype},[{var,{3364,7},'Term'},{type,{3364,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,hibernate,3},{3306,2},[<<104,105,98,101,114,110,97,116,101,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<80,117,116,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,110,116,111,32,97,32,119,97,105,116,32,115,116,97,116,101,32,119,104,101,114,101,32,105,116,115,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,114,101,100,117,99,101,100,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,101,120,112,101,99,116,32,116,111,10,114,101,99,101,105,118,101,32,97,110,121,32,109,101,115,115,97,103,101,115,32,115,111,111,110,46,10,10,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,105,116,44,32,97,110,100,32,99,111,110,116,114,111,108,32,114,101,115,117,109,101,115,32,105,110,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,119,105,116,104,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,65,114,103,115,96,32,119,105,116,104,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,10,101,109,112,116,105,101,100,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,32,119,104,101,110,32,116,104,97,116,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46,32,84,104,117,115,10,96,101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51,96,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46,32,84,104,101,32,114,101,115,117,109,101,32,102,117,110,99,116,105,111,110,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,40,96,65,114,105,116,121,96,32,61,58,61,10,91,96,108,101,110,103,116,104,40,65,114,103,115,41,96,93,40,96,108,101,110,103,116,104,47,49,96,41,41,46,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,110,121,32,109,101,115,115,97,103,101,32,105,110,32,105,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,44,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,10,105,109,109,101,100,105,97,116,101,108,121,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,10,10,73,110,32,109,111,114,101,32,116,101,99,104,110,105,99,97,108,32,116,101,114,109,115,44,32,96,101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51,96,32,100,105,115,99,97,114,100,115,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,102,111,114,32,116,104,101,10,112,114,111,99,101,115,115,44,32,97,110,100,32,116,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,112,114,111,99,101,115,115,46,32,65,102,116,101,114,32,116,104,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,105,110,10,111,110,101,32,99,111,110,116,105,110,117,111,117,115,32,104,101,97,112,46,32,84,104,101,32,104,101,97,112,32,105,115,32,116,104,101,110,32,115,104,114,117,110,107,101,110,32,116,111,32,116,104,101,32,101,120,97,99,116,32,115,97,109,101,32,115,105,122,101,32,97,115,32,116,104,101,10,108,105,118,101,32,100,97,116,97,32,116,104,97,116,32,105,116,32,104,111,108,100,115,32,40,101,118,101,110,32,105,102,32,116,104,97,116,32,115,105,122,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,10,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,41,46,10,10,73,102,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,10,116,104,101,32,102,105,114,115,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,99,99,117,114,114,105,110,103,32,97,102,116,101,114,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,101,110,115,117,114,101,115,10,116,104,97,116,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,105,115,32,99,104,97,110,103,101,100,32,116,111,32,97,32,115,105,122,101,32,110,111,116,32,115,109,97,108,108,101,114,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,101,109,112,116,121,105,110,103,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,109,101,97,110,115,32,116,104,97,116,32,97,110,121,32,115,117,114,114,111,117,110,100,105,110,103,32,96,99,97,116,99,104,96,32,105,115,10,114,101,109,111,118,101,100,32,97,110,100,32,109,117,115,116,32,98,101,32,114,101,45,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,104,105,98,101,114,110,97,116,105,111,110,46,32,79,110,101,32,101,102,102,101,99,116,32,111,102,32,116,104,105,115,32,105,115,32,116,104,97,116,10,112,114,111,99,101,115,115,101,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32,96,112,114,111,99,95,108,105,98,96,32,40,97,108,115,111,32,105,110,100,105,114,101,99,116,108,121,44,32,115,117,99,104,32,97,115,32,96,103,101,110,95,115,101,114,118,101,114,96,10,112,114,111,99,101,115,115,101,115,41,44,32,97,114,101,32,116,111,32,117,115,101,32,96,112,114,111,99,95,108,105,98,58,104,105,98,101,114,110,97,116,101,47,51,96,32,105,110,115,116,101,97,100,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,10,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,99,111,110,116,105,110,117,101,115,32,116,111,32,119,111,114,107,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,107,101,115,32,117,112,46>>},#{group => processes,specification => [{attribute,{3338,2},spec,{{hibernate,3},[{type,{3338,16},bounded_fun,[{type,{3338,16},'fun',[{type,{3338,16},product,[{var,{3338,17},'Module'},{var,{3338,25},'Function'},{var,{3338,35},'Args'}]},{type,{3338,44},no_return,[]}]},[{type,{3339,7},constraint,[{atom,{3339,7},is_subtype},[{var,{3339,7},'Module'},{type,{3339,17},module,[]}]]},{type,{3340,7},constraint,[{atom,{3340,7},is_subtype},[{var,{3340,7},'Function'},{type,{3340,19},atom,[]}]]},{type,{3341,7},constraint,[{atom,{3341,7},is_subtype},[{var,{3341,7},'Args'},{type,{3341,15},list,[{type,{3341,16},term,[]}]}]]}]]}]}}]}},{{function,has_prepared_code_on_load,1},{3299,2},[<<104,97,115,95,112,114,101,112,97,114,101,100,95,99,111,100,101,95,111,110,95,108,111,97,100,40,80,114,101,112,97,114,101,100,67,111,100,101,41>>],hidden,#{}},{{function,halt,2},{3190,2},[<<104,97,108,116,47,50>>],#{<<101,110>> => <<72,97,108,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,83,116,97,116,117,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,115,116,97,116,117,115,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,116,104,32,115,116,97,116,117,115,32,99,111,100,101,32,96,83,116,97,116,117,115,96,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,79,110,32,109,97,110,121,32,112,108,97,116,102,111,114,109,115,44,32,116,104,101,32,79,83,32,115,117,112,112,111,114,116,115,32,111,110,108,121,32,115,116,97,116,117,115,32,99,111,100,101,115,32,48,45,50,53,53,46,32,65,32,116,111,111,32,108,97,114,103,101,10,32,32,62,32,115,116,97,116,117,115,32,99,111,100,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,98,121,32,99,108,101,97,114,105,110,103,32,116,104,101,32,104,105,103,104,32,98,105,116,115,46,10,10,32,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,118,97,108,105,100,58,10,10,32,32,45,32,42,42,96,123,102,108,117,115,104,44,32,69,110,97,98,108,101,70,108,117,115,104,105,110,103,125,96,123,58,32,35,104,97,108,116,95,102,108,117,115,104,32,125,42,42,32,45,32,73,102,32,96,69,110,97,98,108,101,70,108,117,115,104,105,110,103,96,32,101,113,117,97,108,115,10,32,32,32,32,96,116,114,117,101,96,44,32,119,104,105,99,104,32,97,108,115,111,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,112,101,114,102,111,114,109,10,32,32,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,101,114,97,116,105,111,110,115,32,98,101,102,111,114,101,32,116,101,114,109,105,110,97,116,105,110,103,58,10,10,32,32,32,32,45,32,70,108,117,115,104,32,97,108,108,32,111,117,116,115,116,97,110,100,105,110,103,32,111,117,116,112,117,116,46,10,32,32,32,32,45,32,83,101,110,100,32,97,108,108,32,69,114,108,97,110,103,32,112,111,114,116,115,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,110,100,32,119,97,105,116,32,102,111,114,32,116,104,101,109,32,116,111,32,101,120,105,116,46,10,32,32,32,32,45,32,87,97,105,116,32,102,111,114,32,97,108,108,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,116,111,32,99,111,109,112,108,101,116,101,32,97,108,108,32,111,117,116,115,116,97,110,100,105,110,103,32,97,115,121,110,99,32,106,111,98,115,46,10,32,32,32,32,45,32,67,97,108,108,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,91,78,73,70,32,95,111,110,32,104,97,108,116,95,32,99,97,108,108,98,97,99,107,115,93,40,101,114,108,95,110,105,102,46,109,100,35,111,110,95,104,97,108,116,41,46,10,32,32,32,32,45,32,87,97,105,116,32,102,111,114,32,97,108,108,32,111,110,103,111,105,110,103,10,32,32,32,32,32,32,91,78,73,70,32,99,97,108,108,115,32,119,105,116,104,32,116,104,101,32,95,100,101,108,97,121,32,104,97,108,116,95,32,115,101,116,116,105,110,103,93,40,101,114,108,95,110,105,102,46,109,100,35,100,101,108,97,121,95,104,97,108,116,41,32,101,110,97,98,108,101,100,10,32,32,32,32,32,32,116,111,32,114,101,116,117,114,110,46,10,32,32,32,32,45,32,67,97,108,108,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,96,97,116,101,120,105,116,96,47,96,111,110,95,101,120,105,116,96,32,99,97,108,108,98,97,99,107,115,46,10,10,32,32,32,32,73,102,32,96,69,110,97,98,108,101,70,108,117,115,104,105,110,103,96,32,101,113,117,97,108,115,32,96,102,97,108,115,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,10,32,32,32,32,105,109,109,101,100,105,97,116,101,108,121,32,119,105,116,104,111,117,116,32,112,101,114,102,111,114,109,105,110,103,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,108,105,115,116,101,100,32,111,112,101,114,97,116,105,111,110,115,46,10,10,32,32,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,32,32,62,10,32,32,32,32,62,32,82,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,112,114,105,111,114,32,116,111,32,79,84,80,32,50,54,46,48,32,99,97,108,108,101,100,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,96,97,116,101,120,105,116,96,47,96,111,110,95,101,120,105,116,96,10,32,32,32,32,62,32,99,97,108,108,98,97,99,107,115,32,97,108,115,111,32,119,104,101,110,32,96,102,108,117,115,104,96,32,119,97,115,32,100,105,115,97,98,108,101,100,44,32,98,117,116,32,97,115,32,111,102,32,79,84,80,32,50,54,46,48,32,116,104,105,115,32,105,115,32,110,111,10,32,32,32,32,62,32,108,111,110,103,101,114,32,116,104,101,32,99,97,115,101,46,10,10,32,32,45,32,42,42,96,123,102,108,117,115,104,95,116,105,109,101,111,117,116,44,32,84,105,109,101,111,117,116,32,58,58,32,48,46,46,50,49,52,55,52,56,51,54,52,55,32,124,32,105,110,102,105,110,105,116,121,125,96,123,58,32,35,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,32,125,42,42,32,45,10,32,32,32,32,83,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,116,105,109,101,32,97,108,108,111,119,101,100,32,102,111,114,32,91,102,108,117,115,104,105,110,103,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,112,114,105,111,114,32,116,111,10,32,32,32,32,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,96,84,105,109,101,111,117,116,96,32,105,115,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,32,84,104,101,32,100,101,102,97,117,108,116,10,32,32,32,32,118,97,108,117,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,116,104,101,32,96,101,114,108,96,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,10,32,32,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,10,32,32,32,32,73,102,32,102,108,117,115,104,105,110,103,32,104,97,115,32,98,101,101,110,32,111,110,103,111,105,110,103,32,102,111,114,32,96,84,105,109,101,111,117,116,96,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,102,108,117,115,104,105,110,103,32,111,112,101,114,97,116,105,111,110,115,10,32,32,32,32,119,105,108,108,32,98,101,32,105,110,116,101,114,114,117,112,116,101,100,32,97,110,100,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,32,116,101,114,109,105,110,97,116,101,100,10,32,32,32,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,99,111,100,101,32,96,50,53,53,96,46,32,73,102,32,102,108,117,115,104,105,110,103,32,105,115,32,110,111,116,32,101,110,97,98,108,101,100,44,32,116,104,101,32,116,105,109,101,111,117,116,32,119,105,108,108,32,104,97,118,101,10,32,32,32,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,32,32,83,101,101,32,97,108,115,111,32,116,104,101,32,96,101,114,108,96,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,32,32,32,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,115,104,111,114,116,101,115,116,32,116,105,109,101,111,117,116,32,115,101,116,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,32,97,110,100,32,116,104,101,10,32,32,32,32,96,102,108,117,115,104,95,116,105,109,101,111,117,116,96,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,116,104,101,32,97,99,116,117,97,108,32,116,105,109,101,111,117,116,32,118,97,108,117,101,32,105,110,32,101,102,102,101,99,116,46,10,10,32,32,32,32,83,105,110,99,101,58,32,79,84,80,32,50,55,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,65,98,111,114,116,32,58,58,32,97,98,111,114,116,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,97,98,111,114,116,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,98,121,32,97,98,111,114,116,105,110,103,32,97,110,100,32,112,114,111,100,117,99,101,32,97,32,99,111,114,101,32,100,117,109,112,32,105,102,32,99,111,114,101,10,32,32,100,117,109,112,105,110,103,32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,116,104,97,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,105,110,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,91,96,123,102,108,117,115,104,44,32,98,111,111,108,101,97,110,40,41,125,96,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,44,32,97,110,100,10,32,32,62,32,102,108,117,115,104,105,110,103,32,119,105,108,108,32,98,101,32,100,105,115,97,98,108,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,32,58,58,32,115,116,114,105,110,103,40,41,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,99,114,97,115,104,95,100,117,109,112,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,32,103,101,110,101,114,97,116,101,32,97,110,10,32,32,91,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,46,32,84,104,101,32,115,116,114,105,110,103,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,119,105,108,108,32,98,101,32,117,115,101,100,10,32,32,97,115,32,115,108,111,103,97,110,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,32,99,114,101,97,116,101,100,46,32,84,104,101,32,115,108,111,103,97,110,32,119,105,108,108,32,98,101,32,116,114,117,110,107,97,116,101,100,32,105,102,10,32,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,49,48,50,51,32,99,104,97,114,97,99,116,101,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,91,96,123,102,108,117,115,104,44,32,98,111,111,108,101,97,110,40,41,125,96,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,44,32,97,110,100,10,32,32,62,32,102,108,117,115,104,105,110,103,32,119,105,108,108,32,98,101,32,100,105,115,97,98,108,101,100,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,101,104,97,118,105,111,114,32,99,104,97,110,103,101,115,32,99,111,109,112,97,114,101,100,32,116,111,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,58,10,32,32,62,10,32,32,62,32,45,32,66,101,102,111,114,101,32,79,84,80,32,50,52,46,50,44,32,116,104,101,32,115,108,111,103,97,110,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,105,102,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,119,97,115,32,108,111,110,103,101,114,10,32,32,62,32,32,32,116,104,97,110,32,50,48,48,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,119,32,105,116,32,119,105,108,108,32,98,101,32,116,114,117,110,99,97,116,101,100,32,105,102,32,108,111,110,103,101,114,32,116,104,97,110,32,49,48,50,51,10,32,32,62,32,32,32,99,104,97,114,97,99,116,101,114,115,46,10,32,32,62,32,45,32,66,101,102,111,114,101,32,79,84,80,32,50,48,46,49,44,32,111,110,108,121,32,99,111,100,101,32,112,111,105,110,116,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,45,50,53,53,32,119,101,114,101,32,97,99,99,101,112,116,101,100,32,105,110,32,116,104,101,10,32,32,62,32,32,32,115,108,111,103,97,110,46,32,78,111,119,32,97,110,121,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,32,105,115,32,118,97,108,105,100,46>>},#{group => system,specification => [{attribute,{3287,2},spec,{{halt,2},[{type,{3287,11},'fun',[{type,{3287,11},product,[{ann_type,{3287,12},[{var,{3287,12},'Status'},{type,{3287,22},non_neg_integer,[]}]},{ann_type,{3287,41},[{var,{3287,41},'Options'},{user_type,{3287,52},halt_options,[]}]}]},{type,{3288,11},no_return,[]}]},{type,{3289,11},'fun',[{type,{3289,11},product,[{ann_type,{3289,12},[{var,{3289,12},'Abort'},{atom,{3289,21},abort}]},{ann_type,{3289,28},[{var,{3289,28},'Options'},{user_type,{3289,39},halt_options,[]}]}]},{type,{3290,11},no_return,[]}]},{type,{3291,11},'fun',[{type,{3291,11},product,[{ann_type,{3291,12},[{var,{3291,12},'CrashDumpSlogan'},{type,{3291,31},string,[]}]},{ann_type,{3291,41},[{var,{3291,41},'Options'},{user_type,{3291,52},halt_options,[]}]}]},{type,{3292,11},no_return,[]}]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,halt,1},{3156,2},[<<104,97,108,116,40,72,97,108,116,84,121,112,101,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,104,97,108,116,40,72,97,108,116,84,121,112,101,44,32,91,93,41,96,93,40,96,104,97,108,116,47,50,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,97,108,116,40,49,55,41,46,10,111,115,95,112,114,111,109,112,116,37,32,101,99,104,111,32,36,63,10,49,55,10,111,115,95,112,114,111,109,112,116,37,10,96,96,96>>},#{group => system,specification => [{attribute,{3169,2},spec,{{halt,1},[{type,{3169,11},'fun',[{type,{3169,11},product,[{ann_type,{3169,12},[{var,{3169,12},'Status'},{type,{3169,22},non_neg_integer,[]}]}]},{type,{3170,11},no_return,[]}]},{type,{3171,11},'fun',[{type,{3171,11},product,[{ann_type,{3171,12},[{var,{3171,12},'Abort'},{atom,{3171,21},abort}]}]},{type,{3172,11},no_return,[]}]},{type,{3173,11},'fun',[{type,{3173,11},product,[{ann_type,{3173,12},[{var,{3173,12},'CrashDumpSlogan'},{type,{3173,31},string,[]}]}]},{type,{3174,11},no_return,[]}]}]}}]}},{{function,halt,0},{3139,2},[<<104,97,108,116,40,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,104,97,108,116,40,48,44,32,91,93,41,96,93,40,96,104,97,108,116,47,50,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,97,108,116,40,41,46,10,111,115,95,112,114,111,109,112,116,37,10,96,96,96>>},#{group => system,specification => [{attribute,{3150,2},spec,{{halt,0},[{type,{3150,11},'fun',[{type,{3150,11},product,[]},{type,{3150,17},no_return,[]}]}]}}]}},{{function,group_leader,2},{3095,2},[<<103,114,111,117,112,95,108,101,97,100,101,114,40,71,114,111,117,112,76,101,97,100,101,114,44,32,80,105,100,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,96,80,105,100,96,32,116,111,32,96,71,114,111,117,112,76,101,97,100,101,114,96,46,32,84,121,112,105,99,97,108,108,121,44,32,116,104,105,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,97,10,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,102,114,111,109,32,97,32,99,101,114,116,97,105,110,32,115,104,101,108,108,32,105,115,32,116,111,32,104,97,118,101,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,104,97,110,10,96,105,110,105,116,96,46,10,10,84,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,104,111,117,108,100,32,98,101,32,114,97,114,101,108,121,32,99,104,97,110,103,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,105,116,104,32,97,32,115,117,112,101,114,118,105,115,105,111,110,10,116,114,101,101,44,32,98,101,99,97,117,115,101,32,79,84,80,32,97,115,115,117,109,101,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,116,104,101,105,114,32,112,114,111,99,101,115,115,101,115,32,105,115,32,116,104,101,105,114,10,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46,10,10,83,101,116,116,105,110,103,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,10,91,80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,83,101,101,32,97,108,115,111,32,96,103,114,111,117,112,95,108,101,97,100,101,114,47,48,96,32,97,110,100,10,91,79,84,80,32,100,101,115,105,103,110,32,112,114,105,110,99,105,112,108,101,115,93,40,96,101,58,115,121,115,116,101,109,58,97,112,112,108,105,99,97,116,105,111,110,115,46,109,100,35,115,116,111,112,112,105,110,103,96,41,32,114,101,108,97,116,101,100,32,116,111,32,115,116,97,114,116,105,110,103,10,97,110,100,32,115,116,111,112,112,105,110,103,32,97,112,112,108,105,99,97,116,105,111,110,115,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{3119,2},spec,{{group_leader,2},[{type,{3119,19},bounded_fun,[{type,{3119,19},'fun',[{type,{3119,19},product,[{var,{3119,20},'GroupLeader'},{var,{3119,33},'Pid'}]},{atom,{3119,41},true}]},[{type,{3120,7},constraint,[{atom,{3120,7},is_subtype},[{var,{3120,7},'GroupLeader'},{type,{3120,22},pid,[]}]]},{type,{3121,7},constraint,[{atom,{3121,7},is_subtype},[{var,{3121,7},'Pid'},{type,{3121,14},pid,[]}]]}]]}]}}]}},{{function,group_leader,0},{3069,2},[<<103,114,111,117,112,95,108,101,97,100,101,114,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,101,118,97,108,117,97,116,105,110,103,10,116,104,101,32,102,117,110,99,116,105,111,110,46,10,10,69,118,101,114,121,32,112,114,111,99,101,115,115,32,105,115,32,97,32,109,101,109,98,101,114,32,111,102,32,115,111,109,101,32,112,114,111,99,101,115,115,32,103,114,111,117,112,32,97,110,100,32,97,108,108,32,103,114,111,117,112,115,32,104,97,118,101,32,97,32,95,103,114,111,117,112,10,108,101,97,100,101,114,95,46,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,103,114,111,117,112,32,105,115,32,99,104,97,110,110,101,108,101,100,32,116,111,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,46,32,87,104,101,110,32,97,32,110,101,119,10,112,114,111,99,101,115,115,32,105,115,32,115,112,97,119,110,101,100,44,32,105,116,32,103,101,116,115,32,116,104,101,32,115,97,109,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,115,32,116,104,101,32,115,112,97,119,110,105,110,103,32,112,114,111,99,101,115,115,46,10,10,73,110,105,116,105,97,108,108,121,44,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,44,32,96,105,110,105,116,96,32,105,115,32,98,111,116,104,32,105,116,115,32,111,119,110,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,110,100,32,116,104,101,32,103,114,111,117,112,10,108,101,97,100,101,114,32,111,102,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46,32,68,117,114,105,110,103,32,116,104,101,32,98,111,111,116,32,111,102,32,97,32,115,121,115,116,101,109,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,10,112,114,111,99,101,115,115,101,115,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,110,101,101,100,32,111,102,32,116,104,101,32,115,121,115,116,101,109,46,32,83,111,109,101,32,101,120,97,109,112,108,101,115,10,119,104,101,114,101,32,116,104,105,115,32,105,115,32,100,111,110,101,32,97,114,101,58,10,10,45,32,87,104,101,110,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,44,32,116,104,101,32,116,111,112,32,115,117,112,101,114,118,105,115,111,114,32,111,102,32,116,104,97,116,32,97,112,112,108,105,99,97,116,105,111,110,32,119,105,108,108,10,32,32,104,97,118,101,32,105,116,115,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,101,116,32,116,111,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46,32,83,101,101,32,96,97,112,112,108,105,99,97,116,105,111,110,58,115,116,97,114,116,47,50,96,10,32,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,45,32,87,104,101,110,32,114,117,110,110,105,110,103,32,116,101,115,116,115,44,32,98,111,116,104,32,91,96,99,111,109,109,111,110,95,116,101,115,116,96,93,40,96,101,58,99,111,109,109,111,110,95,116,101,115,116,58,105,110,100,101,120,46,104,116,109,108,96,41,32,97,110,100,10,32,32,96,109,58,101,117,110,105,116,96,32,115,101,116,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,105,110,32,111,114,100,101,114,32,116,111,32,99,97,112,116,117,114,101,32,97,110,121,32,73,47,79,32,102,114,111,109,32,116,104,101,32,116,101,115,116,99,97,115,101,46,10,45,32,84,104,101,32,91,105,110,116,101,114,97,99,116,105,118,101,32,115,104,101,108,108,93,40,96,109,58,115,104,101,108,108,96,41,32,115,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,111,32,105,110,116,101,114,99,101,112,116,32,73,47,79,46>>},#{group => processes,specification => [{attribute,{3090,2},spec,{{group_leader,0},[{type,{3090,19},'fun',[{type,{3090,19},product,[]},{type,{3090,25},pid,[]}]}]}}]}},{{function,get_module_info,1},{3061,2},[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,40,77,111,100,117,108,101,41>>],hidden,#{}},{{function,get_keys,1},{3036,2},[<<103,101,116,95,107,101,121,115,40,86,97,108,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,107,101,121,115,32,116,104,97,116,32,97,114,101,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,10,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,109,97,114,121,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,104,97,100,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,97,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,108,105,116,116,108,101,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,100,111,103,44,32,123,49,44,32,51,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,49,44,32,50,125,41,44,10,103,101,116,95,107,101,121,115,40,123,49,44,32,50,125,41,46,10,91,109,97,114,121,44,104,97,100,44,97,44,108,105,116,116,108,101,44,108,97,109,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{3054,2},spec,{{get_keys,1},[{type,{3054,15},bounded_fun,[{type,{3054,15},'fun',[{type,{3054,15},product,[{var,{3054,16},'Val'}]},{type,{3054,24},list,[{var,{3054,25},'Key'}]}]},[{type,{3055,7},constraint,[{atom,{3055,7},is_subtype},[{var,{3055,7},'Val'},{type,{3055,14},term,[]}]]},{type,{3056,7},constraint,[{atom,{3056,7},is_subtype},[{var,{3056,7},'Key'},{type,{3056,14},term,[]}]]}]]}]}}]}},{{function,get_keys,0},{3014,2},[<<103,101,116,95,107,101,121,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,107,101,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,10,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,100,111,103,44,32,123,97,110,105,109,97,108,44,49,125,41,44,10,112,117,116,40,99,111,119,44,32,123,97,110,105,109,97,108,44,50,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,97,110,105,109,97,108,44,51,125,41,44,10,103,101,116,95,107,101,121,115,40,41,46,10,91,100,111,103,44,99,111,119,44,108,97,109,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{3030,2},spec,{{get_keys,0},[{type,{3030,15},bounded_fun,[{type,{3030,15},'fun',[{type,{3030,15},product,[]},{type,{3030,21},list,[{var,{3030,22},'Key'}]}]},[{type,{3031,7},constraint,[{atom,{3031,7},is_subtype},[{var,{3031,7},'Key'},{type,{3031,14},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,get,1},{2988,2},[<<103,101,116,40,75,101,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,96,75,101,121,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,84,104,101,32,101,120,112,101,99,116,101,100,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,41,46,10,123,97,114,101,44,112,108,97,121,105,110,103,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{3007,2},spec,{{get,1},[{type,{3007,10},bounded_fun,[{type,{3007,10},'fun',[{type,{3007,10},product,[{var,{3007,11},'Key'}]},{type,{3007,19},union,[{var,{3007,19},'Val'},{atom,{3007,25},undefined}]}]},[{type,{3008,7},constraint,[{atom,{3008,7},is_subtype},[{var,{3008,7},'Key'},{type,{3008,14},term,[]}]]},{type,{3009,7},constraint,[{atom,{3009,7},is_subtype},[{var,{3009,7},'Val'},{type,{3009,14},term,[]}]]}]]}]}}]}},{{function,get,0},{2966,2},[<<103,101,116,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,115,32,97,32,108,105,115,116,32,111,102,32,96,123,75,101,121,44,32,86,97,108,125,96,32,116,117,112,108,101,115,46,32,84,104,101,32,105,116,101,109,115,32,105,110,10,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,107,101,121,51,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,41,46,10,91,123,107,101,121,49,44,109,101,114,114,121,125,44,123,107,101,121,50,44,108,97,109,98,115,125,44,123,107,101,121,51,44,123,97,114,101,44,112,108,97,121,105,110,103,125,125,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{2981,2},spec,{{get,0},[{type,{2981,10},bounded_fun,[{type,{2981,10},'fun',[{type,{2981,10},product,[]},{type,{2981,16},list,[{type,{2981,17},tuple,[{var,{2981,18},'Key'},{var,{2981,23},'Val'}]}]}]},[{type,{2982,7},constraint,[{atom,{2982,7},is_subtype},[{var,{2982,7},'Key'},{type,{2982,14},term,[]}]]},{type,{2983,7},constraint,[{atom,{2983,7},is_subtype},[{var,{2983,7},'Val'},{type,{2983,14},term,[]}]]}]]}]}}]}},{{function,garbage_collect_message_area,0},{2960,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,95,109,101,115,115,97,103,101,95,97,114,101,97,40,41>>],hidden,#{}},{{function,garbage_collect,2},{2874,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,46,10,10,96,79,112,116,105,111,110,96,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125,96,42,42,32,45,32,84,104,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50,96,93,40,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50,96,41,32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,97,115,121,110,99,96,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,10,32,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,10,32,32,102,111,114,109,32,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,44,32,82,101,113,117,101,115,116,73,100,44,32,71,67,82,101,115,117,108,116,125,96,46,10,10,45,32,42,42,96,123,116,121,112,101,44,32,39,109,97,106,111,114,39,32,124,32,39,109,105,110,111,114,39,125,96,42,42,32,45,32,84,114,105,103,103,101,114,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,114,101,113,117,101,115,116,101,100,10,32,32,116,121,112,101,46,32,68,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,96,39,109,97,106,111,114,39,96,44,32,119,104,105,99,104,32,119,111,117,108,100,32,116,114,105,103,103,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,71,67,46,32,84,104,101,10,32,32,111,112,116,105,111,110,32,96,39,109,105,110,111,114,39,96,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,104,105,110,116,32,97,110,100,32,109,97,121,32,108,101,97,100,32,116,111,32,101,105,116,104,101,114,32,109,105,110,111,114,32,111,114,32,109,97,106,111,114,32,71,67,10,32,32,114,117,110,46,10,10,73,102,32,96,80,105,100,96,32,101,113,117,97,108,115,32,96,115,101,108,102,47,48,96,44,32,97,110,100,32,110,111,32,96,97,115,121,110,99,96,32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,103,97,114,98,97,103,101,10,99,111,108,108,101,99,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48,96,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,110,100,32,119,105,108,108,32,98,101,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32,96,97,115,121,110,99,96,10,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32,96,71,67,82,101,115,117,108,116,96,32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,10,98,101,32,114,101,116,117,114,110,101,100,46,10,10,96,71,67,82,101,115,117,108,116,96,32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,114,101,113,117,101,115,116,32,97,115,10,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,104,97,115,32,98,101,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,78,111,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,10,32,32,98,121,32,96,80,105,100,96,32,116,101,114,109,105,110,97,116,101,100,32,98,101,102,111,114,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,111,117,108,100,32,98,101,32,115,97,116,105,115,102,105,101,100,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,99,97,118,101,97,116,115,32,97,112,112,108,121,32,97,115,32,102,111,114,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48,96,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{2915,2},spec,{{garbage_collect,2},[{type,{2915,22},bounded_fun,[{type,{2915,22},'fun',[{type,{2915,22},product,[{var,{2915,23},'Pid'},{var,{2915,28},'OptionList'}]},{type,{2915,43},union,[{var,{2915,43},'GCResult'},{atom,{2915,54},async}]}]},[{type,{2916,7},constraint,[{atom,{2916,7},is_subtype},[{var,{2916,7},'Pid'},{type,{2916,14},pid,[]}]]},{type,{2917,7},constraint,[{atom,{2917,7},is_subtype},[{var,{2917,7},'RequestId'},{type,{2917,20},term,[]}]]},{type,{2918,7},constraint,[{atom,{2918,7},is_subtype},[{var,{2918,7},'Option'},{type,{2918,17},union,[{type,{2918,17},tuple,[{atom,{2918,18},async},{var,{2918,25},'RequestId'}]},{type,{2918,38},tuple,[{atom,{2918,39},type},{type,{2918,45},union,[{atom,{2918,45},major},{atom,{2918,55},minor}]}]}]}]]},{type,{2919,7},constraint,[{atom,{2919,7},is_subtype},[{var,{2919,7},'OptionList'},{type,{2919,21},list,[{var,{2919,22},'Option'}]}]]},{type,{2920,7},constraint,[{atom,{2920,7},is_subtype},[{var,{2920,7},'GCResult'},{type,{2920,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,garbage_collect,1},{2861,1},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,41>>],none,#{group => processes,equiv => <<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,91,93,41>>}},{{function,garbage_collect,0},{2839,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,41>>],#{<<101,110>> => <<70,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,101,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,117,110,108,101,115,115,32,105,116,32,104,97,115,32,98,101,101,110,32,110,111,116,105,99,101,100,32,40,111,114,32,116,104,101,114,101,32,97,114,101,32,103,111,111,100,10,114,101,97,115,111,110,115,32,116,111,32,115,117,115,112,101,99,116,41,32,116,104,97,116,32,116,104,101,32,115,112,111,110,116,97,110,101,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,105,108,108,32,111,99,99,117,114,32,116,111,111,32,108,97,116,101,10,111,114,32,110,111,116,32,97,116,32,97,108,108,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,73,109,112,114,111,112,101,114,32,117,115,101,32,99,97,110,32,115,101,114,105,111,117,115,108,121,32,100,101,103,114,97,100,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>},#{group => processes,specification => [{attribute,{2851,2},spec,{{garbage_collect,0},[{type,{2851,22},'fun',[{type,{2851,22},product,[]},{atom,{2851,28},true}]}]}}]}},{{function,function_exported,3},{2824,2},[<<102,117,110,99,116,105,111,110,95,101,120,112,111,114,116,101,100,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,105,115,10,91,99,117,114,114,101,110,116,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,32,97,110,100,32,99,111,110,116,97,105,110,115,32,97,110,32,101,120,112,111,114,116,101,100,10,102,117,110,99,116,105,111,110,32,96,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,66,73,70,32,40,97,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,109,112,108,101,109,101,110,116,101,100,10,105,110,32,67,41,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,110,97,109,101,44,32,111,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => code,specification => [{attribute,{2831,2},spec,{{function_exported,3},[{type,{2831,24},bounded_fun,[{type,{2831,24},'fun',[{type,{2831,24},product,[{var,{2831,25},'Module'},{var,{2831,33},'Function'},{var,{2831,43},'Arity'}]},{type,{2831,53},boolean,[]}]},[{type,{2832,7},constraint,[{atom,{2832,7},is_subtype},[{var,{2832,7},'Module'},{type,{2832,17},module,[]}]]},{type,{2833,7},constraint,[{atom,{2833,7},is_subtype},[{var,{2833,7},'Function'},{type,{2833,19},atom,[]}]]},{type,{2834,7},constraint,[{atom,{2834,7},is_subtype},[{var,{2834,7},'Arity'},{type,{2834,16},arity,[]}]]}]]}]}}]}},{{function,fun_to_list,1},{2740,2},[<<102,117,110,95,116,111,95,108,105,115,116,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,83,116,114,105,110,103,96,32,116,104,97,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,96,70,117,110,96,46,10,10,96,83,116,114,105,110,103,96,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,44,32,105,102,32,96,70,117,110,96,32,119,97,115,32,99,114,101,97,116,101,100,32,98,121,32,97,10,91,102,117,110,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115,96,41,32,111,102,32,116,104,101,32,102,111,114,109,10,96,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,96,58,10,10,96,34,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,34,96,10,10,84,104,101,32,102,111,114,109,32,111,102,32,96,83,116,114,105,110,103,96,32,119,104,101,110,32,96,70,117,110,96,32,105,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,111,116,104,101,114,32,116,121,112,101,115,32,111,102,10,91,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115,96,41,32,100,105,102,102,101,114,115,32,100,101,112,101,110,100,105,110,103,10,111,110,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,111,114,32,105,102,32,116,104,101,10,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,40,117,110,99,111,109,112,105,108,101,100,10,101,115,99,114,105,112,116,115,44,32,116,104,101,32,69,114,108,97,110,103,32,115,104,101,108,108,44,32,97,110,100,32,111,116,104,101,114,32,99,111,100,101,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,101,114,108,95,101,118,97,108,32,109,111,100,117,108,101,41,58,10,10,45,32,42,42,99,111,109,112,105,108,101,100,32,99,111,100,101,42,42,32,45,32,96,34,35,70,117,110,60,77,46,73,46,85,62,34,96,44,32,119,104,101,114,101,32,77,44,32,73,32,97,110,100,32,85,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32,118,97,108,117,101,115,10,32,32,110,97,109,101,100,32,96,109,111,100,117,108,101,96,44,32,96,105,110,100,101,120,96,32,97,110,100,32,96,117,110,105,113,96,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,10,32,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,40,70,117,110,41,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,46,10,10,45,32,42,42,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,42,42,32,45,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,10,32,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,10,32,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,71,101,110,101,114,97,108,108,121,44,32,111,110,101,32,99,97,110,32,110,111,116,32,117,115,101,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,99,104,101,99,107,32,105,102,32,116,119,111,10,62,32,102,117,110,115,32,97,114,101,32,101,113,117,97,108,32,97,115,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,100,111,101,115,32,110,111,116,32,116,97,107,101,32,116,104,101,32,102,117,110,39,115,10,62,32,101,110,118,105,114,111,110,109,101,110,116,32,105,110,116,111,32,97,99,99,111,117,110,116,46,32,83,101,101,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,32,102,111,114,32,104,111,119,32,116,111,10,62,32,103,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,97,32,102,117,110,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,111,117,116,112,117,116,32,111,102,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,69,114,108,97,110,103,10,62,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,97,110,100,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,97,100,100,47,49,44,32,97,100,100,50,47,48,44,32,102,117,110,95,116,117,112,108,101,47,48,93,41,46,10,97,100,100,40,65,41,32,45,62,32,102,117,110,40,66,41,32,45,62,32,65,32,43,32,66,32,101,110,100,46,10,97,100,100,50,40,41,32,45,62,32,102,117,110,32,97,100,100,47,49,46,10,102,117,110,95,116,117,112,108,101,40,41,32,45,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,32,116,101,115,116,58,97,100,100,50,40,41,125,46,10,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,35,70,117,110,60,116,101,115,116,46,49,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,96,102,117,110,32,116,101,115,116,58,97,100,100,47,49,96,32,105,115,32,117,112,103,114,97,100,97,98,108,101,32,98,117,116,32,96,116,101,115,116,58,97,100,100,50,40,41,96,32,105,115,32,110,111,116,32,117,112,103,114,97,100,97,98,108,101,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,116,101,115,116,58,97,100,100,40,49,41,44,32,116,101,115,116,58,97,100,100,40,52,50,41,125,46,10,123,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,96,116,101,115,116,58,97,100,100,40,49,41,96,32,97,110,100,32,96,116,101,115,116,58,97,100,100,40,52,50,41,96,32,104,97,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,97,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,105,115,32,110,111,116,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,46,10,10,96,96,96,101,114,108,97,110,103,10,62,116,101,115,116,58,102,117,110,95,116,117,112,108,101,40,41,46,10,123,35,70,117,110,60,116,101,115,116,46,50,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,51,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,84,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,100,105,102,102,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,102,117,110,115,32,99,111,109,101,32,102,114,111,109,10,100,105,102,102,101,114,101,110,116,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,32,62,10,123,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,44,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,105,115,32,102,111,114,109,32,105,110,32,117,110,99,111,109,112,105,108,101,100,10,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,10,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{2818,2},spec,{{fun_to_list,1},[{type,{2818,18},bounded_fun,[{type,{2818,18},'fun',[{type,{2818,18},product,[{var,{2818,19},'Fun'}]},{ann_type,{2818,27},[{var,{2818,27},'String'},{type,{2818,37},string,[]}]}]},[{type,{2819,7},constraint,[{atom,{2819,7},is_subtype},[{var,{2819,7},'Fun'},{type,{2819,14},function,[]}]]}]]}]}}]}},{{function,fun_info_mfa,1},{2730,2},[<<102,117,110,95,105,110,102,111,95,109,102,97,40,70,117,110,41>>],hidden,#{}},{{function,fun_info,2},{2708,2},[<<102,117,110,95,105,110,102,111,40,70,117,110,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,70,117,110,96,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,105,110,32,116,104,101,32,102,111,114,109,10,96,123,73,116,101,109,44,73,110,102,111,125,96,46,10,10,70,111,114,32,97,110,121,32,102,117,110,44,32,96,73,116,101,109,96,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32,96,109,111,100,117,108,101,96,44,32,96,110,97,109,101,96,44,32,96,97,114,105,116,121,96,44,32,96,101,110,118,96,44,32,111,114,10,96,116,121,112,101,96,46,10,10,70,111,114,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,73,116,101,109,96,32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32,96,105,110,100,101,120,96,44,32,96,110,101,119,95,105,110,100,101,120,96,44,10,96,110,101,119,95,117,110,105,113,96,44,32,96,117,110,105,113,96,44,32,97,110,100,32,96,112,105,100,96,46,32,70,111,114,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,97,110,121,32,111,102,32,116,104,101,115,101,10,105,116,101,109,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,97,116,111,109,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,83,101,101,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{2722,2},spec,{{fun_info,2},[{type,{2722,15},bounded_fun,[{type,{2722,15},'fun',[{type,{2722,15},product,[{var,{2722,16},'Fun'},{var,{2722,21},'Item'}]},{type,{2722,30},tuple,[{var,{2722,31},'Item'},{var,{2722,37},'Info'}]}]},[{type,{2723,7},constraint,[{atom,{2723,7},is_subtype},[{var,{2723,7},'Fun'},{type,{2723,14},function,[]}]]},{type,{2724,7},constraint,[{atom,{2724,7},is_subtype},[{var,{2724,7},'Item'},{user_type,{2724,15},fun_info_item,[]}]]},{type,{2725,7},constraint,[{atom,{2725,7},is_subtype},[{var,{2725,7},'Info'},{type,{2725,15},term,[]}]]}]]}]}}]}},{{function,floor,1},{2690,2},[<<102,108,111,111,114,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,111,114,40,45,49,48,46,53,41,46,10,45,49,49,10,96,96,96>>},#{group => terms,specification => [{attribute,{2702,2},spec,{{floor,1},[{type,{2702,12},bounded_fun,[{type,{2702,12},'fun',[{type,{2702,12},product,[{var,{2702,13},'Number'}]},{type,{2702,24},integer,[]}]},[{type,{2703,7},constraint,[{atom,{2703,7},is_subtype},[{var,{2703,7},'Number'},{type,{2703,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,float_to_list,2},{2633,2},[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,70,108,111,97,116,96,32,117,115,105,110,103,32,102,105,120,101,100,10,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,10,10,65,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58,10,10,45,32,73,102,32,111,112,116,105,111,110,32,96,100,101,99,105,109,97,108,115,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,99,111,110,116,97,105,110,115,32,97,116,32,109,111,115,116,10,32,32,96,68,101,99,105,109,97,108,115,96,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,112,97,115,116,32,116,104,101,32,100,101,99,105,109,97,108,32,112,111,105,110,116,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,100,111,101,115,32,110,111,116,32,102,105,116,10,32,32,105,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,115,116,97,116,105,99,32,98,117,102,102,101,114,32,111,102,32,50,53,54,32,98,121,116,101,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,114,111,119,115,32,96,98,97,100,97,114,103,96,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,99,111,109,112,97,99,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,116,114,97,105,108,105,110,103,32,122,101,114,111,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,108,105,115,116,10,32,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,109,101,97,110,105,110,103,102,117,108,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,111,112,116,105,111,110,32,96,100,101,99,105,109,97,108,115,96,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,115,99,105,101,110,116,105,102,105,99,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,10,32,32,110,111,116,97,116,105,111,110,32,119,105,116,104,32,96,68,101,99,105,109,97,108,115,96,32,100,105,103,105,116,115,32,111,102,32,112,114,101,99,105,115,105,111,110,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,115,104,111,114,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,32,116,104,101,32,115,109,97,108,108,101,115,116,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,97,116,32,115,116,105,108,108,32,103,117,97,114,97,110,116,101,101,115,32,116,104,97,116,10,32,32,96,70,32,61,58,61,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,44,32,91,115,104,111,114,116,93,41,41,96,46,32,87,104,101,110,32,116,104,101,32,102,108,111,97,116,32,105,115,32,105,110,115,105,100,101,32,116,104,101,10,32,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,44,32,116,104,101,32,110,111,116,97,116,105,111,110,32,116,104,97,116,32,121,105,101,108,100,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,32,32,105,115,32,117,115,101,100,32,40,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,111,114,32,110,111,114,109,97,108,32,100,101,99,105,109,97,108,32,110,111,116,97,116,105,111,110,41,46,32,70,108,111,97,116,115,32,111,117,116,115,105,100,101,32,116,104,101,10,32,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,32,97,114,101,32,97,108,119,97,121,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,116,111,32,97,118,111,105,100,10,32,32,99,111,110,102,117,115,105,110,103,32,114,101,115,117,108,116,115,32,119,104,101,110,32,100,111,105,110,103,32,97,114,105,116,104,109,101,116,105,99,32,111,112,101,114,97,116,105,111,110,115,46,10,45,32,73,102,32,96,79,112,116,105,111,110,115,96,32,105,115,32,96,91,93,96,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,97,115,32,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,34,55,46,49,50,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,34,55,46,49,50,48,101,43,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,10,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,96,93,40,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,120,112,108,97,105,110,101,100,32,105,110,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,46>>},#{group => terms,specification => [{attribute,{2678,2},spec,{{float_to_list,2},[{type,{2678,20},bounded_fun,[{type,{2678,20},'fun',[{type,{2678,20},product,[{var,{2678,21},'Float'},{var,{2678,28},'Options'}]},{type,{2678,40},string,[]}]},[{type,{2679,7},constraint,[{atom,{2679,7},is_subtype},[{var,{2679,7},'Float'},{type,{2679,16},float,[]}]]},{type,{2680,7},constraint,[{atom,{2680,7},is_subtype},[{var,{2680,7},'Options'},{type,{2680,18},list,[{var,{2680,19},'Option'}]}]]},{type,{2681,7},constraint,[{atom,{2681,7},is_subtype},[{var,{2681,7},'Option'},{type,{2681,18},union,[{type,{2681,18},tuple,[{atom,{2681,19},decimals},{ann_type,{2681,29},[{var,{2681,29},'Decimals'},{type,{2681,41},range,[{integer,{2681,41},0},{integer,{2681,44},253}]}]}]},{type,{2682,18},tuple,[{atom,{2682,19},scientific},{ann_type,{2682,31},[{var,{2682,31},'Decimals'},{type,{2682,43},range,[{integer,{2682,43},0},{integer,{2682,46},249}]}]}]},{atom,{2683,18},compact},{atom,{2684,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_list,1},{2629,1},[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,41>>],none,#{group => terms,equiv => <<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,50,48,125,93,41>>}},{{function,float_to_binary,2},{2589,2},[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,70,108,111,97,116,96,32,117,115,105,110,103,32,102,105,120,101,100,10,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,10,10,96,79,112,116,105,111,110,115,96,32,98,101,104,97,118,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,60,60,34,55,46,49,50,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,60,60,34,55,46,49,50,48,101,43,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,41,10,60,60,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{2614,2},spec,{{float_to_binary,2},[{type,{2614,22},bounded_fun,[{type,{2614,22},'fun',[{type,{2614,22},product,[{var,{2614,23},'Float'},{var,{2614,30},'Options'}]},{type,{2614,42},binary,[]}]},[{type,{2615,7},constraint,[{atom,{2615,7},is_subtype},[{var,{2615,7},'Float'},{type,{2615,16},float,[]}]]},{type,{2616,7},constraint,[{atom,{2616,7},is_subtype},[{var,{2616,7},'Options'},{type,{2616,18},list,[{var,{2616,19},'Option'}]}]]},{type,{2617,7},constraint,[{atom,{2617,7},is_subtype},[{var,{2617,7},'Option'},{type,{2617,18},union,[{type,{2617,18},tuple,[{atom,{2617,19},decimals},{ann_type,{2617,29},[{var,{2617,29},'Decimals'},{type,{2617,41},range,[{integer,{2617,41},0},{integer,{2617,44},253}]}]}]},{type,{2618,18},tuple,[{atom,{2618,19},scientific},{ann_type,{2618,31},[{var,{2618,31},'Decimals'},{type,{2618,43},range,[{integer,{2618,43},0},{integer,{2618,46},249}]}]}]},{atom,{2619,18},compact},{atom,{2620,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_binary,1},{2585,1},[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,41>>],none,#{group => terms,equiv => <<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,50,48,125,93,41>>,since => <<79,84,80,32,82,49,54,66>>}},{{function,float,1},{2555,2},[<<102,108,111,97,116,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,102,108,111,97,116,32,98,121,32,99,111,110,118,101,114,116,105,110,103,32,96,78,117,109,98,101,114,96,32,116,111,32,97,32,102,108,111,97,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,40,53,53,41,46,10,53,53,46,48,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,117,115,101,100,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,105,110,32,97,32,103,117,97,114,100,44,32,105,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,10,62,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,59,32,102,111,114,32,99,108,97,114,105,116,121,44,32,117,115,101,32,96,105,115,95,102,108,111,97,116,47,49,96,32,105,110,115,116,101,97,100,46,10,62,10,62,32,87,104,101,110,32,91,96,102,108,111,97,116,47,49,96,93,40,96,102,108,111,97,116,47,49,96,41,32,105,115,32,117,115,101,100,32,105,110,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,97,32,103,117,97,114,100,44,32,115,117,99,104,32,97,115,10,62,32,39,96,102,108,111,97,116,40,65,41,32,61,61,32,52,46,48,96,39,44,32,105,116,32,99,111,110,118,101,114,116,115,32,97,32,110,117,109,98,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>},#{group => terms,specification => [{attribute,{2574,2},spec,{{float,1},[{type,{2574,12},bounded_fun,[{type,{2574,12},'fun',[{type,{2574,12},product,[{var,{2574,13},'Number'}]},{type,{2574,24},float,[]}]},[{type,{2575,7},constraint,[{atom,{2575,7},is_subtype},[{var,{2575,7},'Number'},{type,{2575,17},number,[]}]]}]]}]}}]}},{{function,finish_after_on_load,2},{2546,2},[<<102,105,110,105,115,104,95,97,102,116,101,114,95,111,110,95,108,111,97,100,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,finish_loading,1},{2536,2},[<<102,105,110,105,115,104,95,108,111,97,100,105,110,103,40,80,114,101,112,97,114,101,100,67,111,100,101,76,105,115,116,41>>],hidden,#{}},{{function,external_size,2},{2507,2},[<<101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,10,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101,10,96,96,96,10,10,79,112,116,105,111,110,32,96,123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125,96,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,102,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,46,32,70,111,114,32,97,10,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,44,32,115,101,101,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46>>},#{group => terms,specification => [{attribute,{2525,2},spec,{{external_size,2},[{type,{2525,20},bounded_fun,[{type,{2525,20},'fun',[{type,{2525,20},product,[{var,{2525,21},'Term'},{var,{2525,27},'Options'}]},{type,{2525,39},non_neg_integer,[]}]},[{type,{2526,7},constraint,[{atom,{2526,7},is_subtype},[{var,{2526,7},'Term'},{type,{2526,15},term,[]}]]},{type,{2527,7},constraint,[{atom,{2527,7},is_subtype},[{var,{2527,7},'Options'},{type,{2527,18},list,[{type,{2527,19},union,[{atom,{2527,19},compressed},{type,{2528,10},tuple,[{atom,{2528,11},compressed},{ann_type,{2528,23},[{var,{2528,23},'Level'},{type,{2528,32},range,[{integer,{2528,32},0},{integer,{2528,35},9}]}]}]},{atom,{2529,10},deterministic},{type,{2530,10},tuple,[{atom,{2530,11},minor_version},{ann_type,{2530,26},[{var,{2530,26},'Version'},{type,{2530,37},range,[{integer,{2530,37},0},{integer,{2530,40},2}]}]}]},{atom,{2531,10},local}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,external_size,1},{2480,2},[<<101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41>>],#{<<101,110>> => <<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,10,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101,10,96,96,96,10,10,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,97,32,99,97,108,108,32,116,111,58,10,10,96,96,96,101,114,108,97,110,103,10,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,91,93,41,10,96,96,96>>},#{group => terms,specification => [{attribute,{2501,2},spec,{{external_size,1},[{type,{2501,20},bounded_fun,[{type,{2501,20},'fun',[{type,{2501,20},product,[{var,{2501,21},'Term'}]},{type,{2501,30},non_neg_integer,[]}]},[{type,{2502,7},constraint,[{atom,{2502,7},is_subtype},[{var,{2502,7},'Term'},{type,{2502,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,exit_signal,2},{2472,2},[<<101,120,105,116,95,115,105,103,110,97,108,40,80,105,100,44,32,82,101,97,115,111,110,41>>],hidden,#{}},{{function,exit,2},{2402,2},[<<101,120,105,116,40,80,105,100,44,32,82,101,97,115,111,110,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,80,105,100,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32,96,82,101,97,115,111,110,96,32,105,115,32,97,110,121,32,116,101,114,109,44,32,101,120,99,101,112,116,32,96,110,111,114,109,97,108,96,32,111,114,10,96,107,105,108,108,96,44,32,97,110,100,32,96,80,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,58,10,10,45,32,73,102,32,96,80,96,32,105,115,32,110,111,116,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,96,80,96,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,10,32,32,96,82,101,97,115,111,110,96,46,10,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,10,32,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,96,80,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,116,101,114,109,32,96,110,111,114,109,97,108,96,32,97,110,100,32,96,80,105,100,96,32,105,115,32,116,104,101,10,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,96,80,96,32,119,104,105,99,104,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,110,118,111,107,101,100,10,96,101,114,108,97,110,103,58,101,120,105,116,40,80,105,100,44,32,110,111,114,109,97,108,41,96,32,40,116,104,101,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,32,115,105,103,110,97,108,32,119,105,116,104,32,116,104,101,10,96,110,111,114,109,97,108,96,32,114,101,97,115,111,110,32,116,111,32,105,116,115,101,108,102,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,119,97,114,110,105,110,103,41,58,10,10,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,96,39,115,10,32,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,45,32,84,104,101,32,115,105,103,110,97,108,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,102,32,96,80,96,32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46,10,10,73,102,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,107,105,108,108,96,44,32,116,104,97,116,32,105,115,44,32,105,102,32,91,96,101,120,105,116,40,80,105,100,44,32,107,105,108,108,41,96,93,40,96,101,120,105,116,47,50,96,41,32,105,115,10,99,97,108,108,101,100,44,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,80,105,100,96,44,32,119,104,105,99,104,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,101,100,96,46,32,84,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,10,99,104,97,110,103,101,100,32,102,114,111,109,32,96,107,105,108,108,96,32,116,111,32,96,107,105,108,108,101,100,96,32,116,111,32,104,105,110,116,32,116,111,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,107,105,108,108,101,100,10,112,114,111,99,101,115,115,32,103,111,116,32,107,105,108,108,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32,91,96,101,120,105,116,40,80,105,100,44,32,107,105,108,108,41,96,93,40,96,101,120,105,116,47,50,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,117,110,99,116,105,111,110,115,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,93,40,96,101,120,105,116,47,49,96,41,32,97,110,100,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,93,40,96,101,120,105,116,47,50,96,41,32,97,114,101,10,62,32,110,97,109,101,100,32,115,105,109,105,108,97,114,108,121,32,98,117,116,32,112,114,111,118,105,100,101,32,118,101,114,121,32,100,105,102,102,101,114,101,110,116,32,102,117,110,99,116,105,111,110,97,108,105,116,105,101,115,46,32,84,104,101,10,62,32,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,32,102,117,110,99,116,105,111,110,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,116,111,112,32,116,104,101,32,99,117,114,114,101,110,116,10,62,32,112,114,111,99,101,115,115,32,119,104,105,108,101,32,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,101,110,100,32,97,110,10,62,32,101,120,105,116,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,101,32,97,108,115,111,32,116,104,97,116,32,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,32,114,97,105,115,101,115,32,97,110,10,62,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,104,105,108,101,32,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,97,110,121,10,62,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,32,111,110,108,121,32,115,99,101,110,97,114,105,111,32,116,104,97,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,99,111,118,101,114,101,100,32,98,121,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,97,98,111,118,101,32,105,115,32,119,104,101,110,32,97,10,62,32,112,114,111,99,101,115,115,32,96,80,96,32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,116,111,32,105,116,115,101,108,102,44,32,116,104,97,116,32,105,115,10,62,32,96,101,114,108,97,110,103,58,101,120,105,116,40,115,101,108,102,40,41,44,32,110,111,114,109,97,108,41,96,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,10,62,10,62,32,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,62,32,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,96,80,96,39,115,32,112,114,111,99,101,115,115,10,62,32,32,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,96,39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,62,32,45,32,96,80,96,32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,105,102,32,96,80,96,32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,10,62,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,97,114,103,117,97,98,108,121,10,62,32,115,116,114,97,110,103,101,32,98,117,116,32,116,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,114,101,97,115,111,110,115,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2465,2},spec,{{exit,2},[{type,{2465,11},bounded_fun,[{type,{2465,11},'fun',[{type,{2465,11},product,[{var,{2465,12},'Pid'},{var,{2465,17},'Reason'}]},{atom,{2465,28},true}]},[{type,{2466,7},constraint,[{atom,{2466,7},is_subtype},[{var,{2466,7},'Pid'},{type,{2466,14},union,[{type,{2466,14},pid,[]},{type,{2466,22},port,[]}]}]]},{type,{2467,7},constraint,[{atom,{2467,7},is_subtype},[{var,{2467,7},'Reason'},{type,{2467,17},term,[]}]]}]]}]}}]}},{{function,exit,1},{2361,2},[<<101,120,105,116,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,120,105,116,96,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,120,105,116,96,32,105,115,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,104,111,117,108,100,32,98,101,10,115,116,111,112,112,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,116,101,108,108,105,110,103,32,97,32,112,114,111,99,101,115,115,32,116,111,32,115,116,111,112,32,105,115,32,114,101,99,101,105,118,101,100,41,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,100,105,102,102,101,114,32,102,114,111,109,32,91,96,101,114,114,111,114,47,49,44,50,44,51,96,93,40,96,101,114,114,111,114,47,49,96,41,32,98,121,32,99,97,117,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,10,97,32,100,105,102,102,101,114,101,110,116,32,99,108,97,115,115,32,97,110,100,32,98,121,32,104,97,118,105,110,103,32,97,32,114,101,97,115,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,108,105,115,116,32,111,102,10,102,117,110,99,116,105,111,110,115,32,102,114,111,109,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,46,10,10,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,10,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,120,105,116,58,32,102,111,111,98,97,114,10,62,32,99,97,116,99,104,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,102,111,111,98,97,114,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,97,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32,91,96,101,120,105,116,40,107,105,108,108,41,96,93,40,96,101,120,105,116,47,49,96,41,32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,116,99,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,44,10,62,32,105,116,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,97,110,100,32,97,108,115,111,32,101,109,105,116,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,10,62,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,40,110,111,116,32,96,107,105,108,108,101,100,96,41,32,116,111,32,97,108,108,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,83,117,99,104,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,10,62,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,99,97,110,32,98,101,32,116,114,97,112,112,101,100,32,98,121,32,116,104,101,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,10,62,32,109,101,97,110,115,32,116,104,97,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,98,101,104,97,118,101,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,10,62,32,116,104,101,121,32,97,114,101,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,105,103,110,97,108,32,119,105,108,108,32,98,101,32,117,110,116,114,97,112,112,97,98,108,101,32,105,102,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,115,117,99,104,32,97,10,62,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,119,105,116,104,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,93,40,96,101,120,105,116,47,50,96,41,46>>},#{group => processes,specification => [{attribute,{2396,2},spec,{{exit,1},[{type,{2396,11},bounded_fun,[{type,{2396,11},'fun',[{type,{2396,11},product,[{var,{2396,12},'Reason'}]},{type,{2396,23},no_return,[]}]},[{type,{2397,7},constraint,[{atom,{2397,7},is_subtype},[{var,{2397,7},'Reason'},{type,{2397,17},term,[]}]]}]]}]}}]}},{{function,error,3},{2321,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,32,96,65,114,103,115,96,32,105,115,10,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,10,96,110,111,110,101,96,46,10,10,73,102,32,96,65,114,103,115,96,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32,96,110,111,110,101,96,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,10,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,73,102,32,116,104,101,32,96,101,114,114,111,114,95,105,110,102,111,96,32,111,112,116,105,111,110,32,105,115,32,103,105,118,101,110,44,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,119,105,108,108,32,98,101,32,105,110,115,101,114,116,101,100,32,105,110,116,111,10,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,103,105,118,101,110,32,105,110,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,98,121,10,101,114,114,111,114,32,102,111,114,109,97,116,116,101,114,115,32,115,117,99,104,32,97,115,32,91,96,101,114,108,95,101,114,114,111,114,96,93,40,96,101,114,108,95,101,114,114,111,114,58,102,111,114,109,97,116,95,101,120,99,101,112,116,105,111,110,47,52,96,41,32,116,111,10,112,114,111,118,105,100,101,32,109,111,114,101,32,99,111,110,116,101,120,116,32,97,114,111,117,110,100,32,97,110,32,101,114,114,111,114,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,96,109,111,100,117,108,101,96,32,111,102,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,32,116,111,10,96,101,114,114,111,114,47,51,96,32,105,115,32,109,97,100,101,46,32,84,104,101,32,100,101,102,97,117,108,116,32,96,102,117,110,99,116,105,111,110,96,32,105,115,32,96,102,111,114,109,97,116,95,101,114,114,111,114,96,46,32,83,101,101,10,91,96,102,111,114,109,97,116,95,101,114,114,111,114,47,50,96,93,40,96,99,58,101,114,108,95,101,114,114,111,114,58,102,111,114,109,97,116,95,101,114,114,111,114,47,50,96,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,105,115,10,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,50,32,105,115,32,116,111,32,98,101,32,117,115,101,100,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{2348,2},spec,{{error,3},[{type,{2348,12},bounded_fun,[{type,{2348,12},'fun',[{type,{2348,12},product,[{var,{2348,13},'Reason'},{var,{2348,21},'Args'},{var,{2348,27},'Options'}]},{type,{2348,39},no_return,[]}]},[{type,{2349,7},constraint,[{atom,{2349,7},is_subtype},[{var,{2349,7},'Reason'},{type,{2349,17},term,[]}]]},{type,{2350,7},constraint,[{atom,{2350,7},is_subtype},[{var,{2350,7},'Args'},{type,{2350,15},union,[{type,{2350,15},list,[{type,{2350,16},term,[]}]},{atom,{2350,26},none}]}]]},{type,{2351,7},constraint,[{atom,{2351,7},is_subtype},[{var,{2351,7},'Options'},{type,{2351,18},list,[{var,{2351,19},'Option'}]}]]},{type,{2352,7},constraint,[{atom,{2352,7},is_subtype},[{var,{2352,7},'Option'},{type,{2352,17},tuple,[{atom,{2352,18},error_info},{var,{2352,32},'ErrorInfoMap'}]}]]},{type,{2353,7},constraint,[{atom,{2353,7},is_subtype},[{var,{2353,7},'ErrorInfoMap'},{type,{2353,23},map,[{type,{2353,33},map_field_assoc,[{atom,{2353,25},cause},{type,{2353,36},term,[]}]},{type,{2354,34},map_field_assoc,[{atom,{2354,25},module},{type,{2354,37},module,[]}]},{type,{2355,36},map_field_assoc,[{atom,{2355,25},function},{type,{2355,39},atom,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,error,2},{2275,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,32,96,65,114,103,115,96,32,105,115,10,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,10,96,110,111,110,101,96,46,10,10,73,102,32,96,65,114,103,115,96,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32,96,110,111,110,101,96,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,10,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,69,120,97,109,112,108,101,58,10,10,96,116,101,115,116,46,101,114,108,96,58,10,10,96,96,96,101,114,108,97,110,103,10,45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,101,120,97,109,112,108,101,95,102,117,110,47,50,93,41,46,10,10,101,120,97,109,112,108,101,95,102,117,110,40,65,49,44,32,65,50,41,32,45,62,10,32,32,32,32,101,114,108,97,110,103,58,101,114,114,111,114,40,109,121,95,101,114,114,111,114,44,32,91,65,49,44,32,65,50,93,41,46,10,96,96,96,10,10,69,114,108,97,110,103,32,115,104,101,108,108,58,10,10,96,96,96,101,114,108,97,110,103,10,54,62,32,99,40,116,101,115,116,41,46,10,123,111,107,44,116,101,115,116,125,10,55,62,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,109,121,95,101,114,114,111,114,10,32,32,32,32,32,105,110,32,102,117,110,99,116,105,111,110,32,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,47,50,10,32,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,97,115,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,10,96,96,96>>},#{group => processes,specification => [{attribute,{2312,2},spec,{{error,2},[{type,{2312,12},bounded_fun,[{type,{2312,12},'fun',[{type,{2312,12},product,[{var,{2312,13},'Reason'},{var,{2312,21},'Args'}]},{type,{2312,30},no_return,[]}]},[{type,{2313,7},constraint,[{atom,{2313,7},is_subtype},[{var,{2313,7},'Reason'},{type,{2313,17},term,[]}]]},{type,{2314,7},constraint,[{atom,{2314,7},is_subtype},[{var,{2314,7},'Args'},{type,{2314,15},union,[{type,{2314,15},list,[{type,{2314,16},term,[]}]},{atom,{2314,26},none}]}]]}]]}]}}]}},{{function,error,1},{2245,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,116,104,114,111,119,110,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,97,116,99,104,32,101,114,114,111,114,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,123,102,111,111,98,97,114,44,91,123,115,104,101,108,108,44,97,112,112,108,121,95,102,117,110,44,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,57,48,54,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,100,111,95,97,112,112,108,121,44,54,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,55,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,101,120,112,114,44,53,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,52,51,48,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,56,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,52,50,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,108,111,111,112,44,51,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,50,55,125,93,125,93,125,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{2268,2},spec,{{error,1},[{type,{2268,12},bounded_fun,[{type,{2268,12},'fun',[{type,{2268,12},product,[{var,{2268,13},'Reason'}]},{type,{2268,24},no_return,[]}]},[{type,{2269,7},constraint,[{atom,{2269,7},is_subtype},[{var,{2269,7},'Reason'},{type,{2269,17},term,[]}]]}]]}]}}]}},{{function,erase,1},{2219,2},[<<101,114,97,115,101,40,75,101,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,10,100,105,99,116,105,111,110,97,114,121,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,46,10,10,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,123,109,101,114,114,121,44,32,108,97,109,98,115,44,32,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,88,32,61,32,101,114,97,115,101,40,107,101,121,49,41,44,10,123,88,44,32,101,114,97,115,101,40,107,101,121,49,41,125,46,10,123,123,109,101,114,114,121,44,108,97,109,98,115,44,97,114,101,44,112,108,97,121,105,110,103,125,44,117,110,100,101,102,105,110,101,100,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{2237,2},spec,{{erase,1},[{type,{2237,12},bounded_fun,[{type,{2237,12},'fun',[{type,{2237,12},product,[{var,{2237,13},'Key'}]},{type,{2237,21},union,[{var,{2237,21},'Val'},{atom,{2237,27},undefined}]}]},[{type,{2238,7},constraint,[{atom,{2238,7},is_subtype},[{var,{2238,7},'Key'},{type,{2238,14},term,[]}]]},{type,{2239,7},constraint,[{atom,{2239,7},is_subtype},[{var,{2239,7},'Val'},{type,{2239,14},term,[]}]]}]]}]}}]}},{{function,erase,0},{2199,2},[<<101,114,97,115,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,123,49,44,32,50,44,32,51,125,41,44,10,112,117,116,40,107,101,121,50,44,32,91,97,44,32,98,44,32,99,93,41,44,10,101,114,97,115,101,40,41,46,10,91,123,107,101,121,49,44,123,49,44,50,44,51,125,125,44,123,107,101,121,50,44,91,97,44,98,44,99,93,125,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{2212,2},spec,{{erase,0},[{type,{2212,12},bounded_fun,[{type,{2212,12},'fun',[{type,{2212,12},product,[]},{type,{2212,18},list,[{type,{2212,19},tuple,[{var,{2212,20},'Key'},{var,{2212,25},'Val'}]}]}]},[{type,{2213,7},constraint,[{atom,{2213,7},is_subtype},[{var,{2213,7},'Key'},{type,{2213,14},term,[]}]]},{type,{2214,7},constraint,[{atom,{2214,7},is_subtype},[{var,{2214,7},'Val'},{type,{2214,14},term,[]}]]}]]}]}}]}},{{function,dt_spread_tag,1},{2192,2},[<<100,116,95,115,112,114,101,97,100,95,116,97,103,40,66,111,111,108,41>>],hidden,#{}},{{function,dt_restore_tag,1},{2185,2},[<<100,116,95,114,101,115,116,111,114,101,95,116,97,103,40,84,97,103,68,97,116,97,41>>],hidden,#{}},{{function,dt_put_tag,1},{2178,2},[<<100,116,95,112,117,116,95,116,97,103,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,dt_prepend_vm_tag_data,1},{2170,2},[<<100,116,95,112,114,101,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,dt_get_tag_data,0},{2164,2},[<<100,116,95,103,101,116,95,116,97,103,95,100,97,116,97,40,41>>],hidden,#{}},{{function,dt_get_tag,0},{2158,2},[<<100,116,95,103,101,116,95,116,97,103,40,41>>],hidden,#{}},{{function,dt_append_vm_tag_data,1},{2150,2},[<<100,116,95,97,112,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,display_string,2},{2142,2},[<<100,105,115,112,108,97,121,95,115,116,114,105,110,103,40,68,101,118,105,99,101,44,32,80,49,41>>],hidden,#{}},{{function,display_string,1},{2131,2},[<<100,105,115,112,108,97,121,95,115,116,114,105,110,103,40,80,49,41>>],hidden,#{}},{{function,display,1},{2115,2},[<<100,105,115,112,108,97,121,40,84,101,114,109,41>>],#{<<101,110>> => <<80,114,105,110,116,115,32,97,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,84,101,114,109,96,32,111,110,32,116,104,101,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,32,84,104,101,32,112,114,105,110,116,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,109,97,121,10,62,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,100,101,116,97,105,108,115,32,116,104,97,116,32,100,111,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,104,105,103,104,45,108,101,118,101,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,10,62,32,116,104,101,32,116,101,114,109,32,105,110,32,69,114,108,97,110,103,46>>},#{group => terms,specification => [{attribute,{2125,2},spec,{{display,1},[{type,{2125,14},bounded_fun,[{type,{2125,14},'fun',[{type,{2125,14},product,[{var,{2125,15},'Term'}]},{atom,{2125,24},true}]},[{type,{2126,7},constraint,[{atom,{2126,7},is_subtype},[{var,{2126,7},'Term'},{type,{2126,15},term,[]}]]}]]}]}}]}},{{function,unalias,1},{2092,2},[<<117,110,97,108,105,97,115,40,65,108,105,97,115,41>>],#{<<101,110>> => <<68,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,96,65,108,105,97,115,96,32,112,114,101,118,105,111,117,115,108,121,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,65,110,32,97,108,105,97,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,98,101,32,99,114,101,97,116,101,100,32,118,105,97,32,96,97,108,105,97,115,47,48,96,32,111,114,32,96,109,111,110,105,116,111,114,47,51,96,46,10,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,32,119,105,108,108,32,97,108,119,97,121,115,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,10,111,112,116,105,111,110,115,32,117,115,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,97,108,105,97,115,46,10,10,82,101,116,117,114,110,115,32,116,114,117,101,32,105,102,32,96,65,108,105,97,115,96,32,119,97,115,32,97,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,97,108,105,97,115,32,102,111,114,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,101,115,59,10,111,116,104,101,114,119,105,115,101,44,32,102,97,108,115,101,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,32,111,102,10,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2108,2},spec,{{unalias,1},[{type,{2108,14},bounded_fun,[{type,{2108,14},'fun',[{type,{2108,14},product,[{var,{2108,15},'Alias'}]},{type,{2108,25},boolean,[]}]},[{type,{2109,7},constraint,[{atom,{2109,7},is_subtype},[{var,{2109,7},'Alias'},{type,{2109,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,alias,1},{2033,2},[<<97,108,105,97,115,40,79,112,116,115,41>>],#{<<101,110>> => <<67,114,101,97,116,101,32,97,110,32,97,108,105,97,115,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,10,99,114,101,97,116,101,100,32,116,104,101,32,97,108,105,97,115,46,32,87,104,101,110,32,116,104,101,32,97,108,105,97,115,32,104,97,115,32,98,101,101,110,32,100,101,97,99,116,105,118,97,116,101,100,44,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,117,115,105,110,103,32,116,104,101,10,97,108,105,97,115,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32,96,117,110,97,108,105,97,115,47,49,96,46,10,10,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,32,102,111,114,32,91,96,97,108,105,97,115,47,49,96,93,40,96,97,108,105,97,115,47,49,96,41,58,10,10,45,32,42,42,96,101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,111,110,108,121,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,10,32,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,117,114,32,105,102,32,110,111,32,111,112,116,105,111,110,115,10,32,32,97,114,101,32,112,97,115,115,101,100,32,111,114,32,105,102,32,96,97,108,105,97,115,47,48,96,32,105,115,32,99,97,108,108,101,100,46,10,10,45,32,42,42,96,114,101,112,108,121,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,10,32,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,101,110,100,44,10,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,61,32,97,108,105,97,115,40,91,114,101,112,108,121,93,41,44,10,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,37,37,32,65,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,10,32,32,32,32,37,37,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,116,104,101,32,39,114,101,112,108,121,39,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,97,102,116,101,114,32,53,48,48,48,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,117,110,97,108,105,97,115,40,65,108,105,97,115,82,101,113,73,100,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,70,108,117,115,104,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,99,97,115,101,32,116,104,101,32,114,101,112,108,121,32,97,114,114,105,118,101,100,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,106,117,115,116,32,98,101,102,111,114,101,32,116,104,101,32,97,108,105,97,115,32,119,97,115,32,100,101,97,99,116,105,118,97,116,101,100,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,99,101,105,118,101,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,32,32,32,32,32,32,32,32,97,102,116,101,114,32,48,32,45,62,32,101,120,105,116,40,116,105,109,101,111,117,116,41,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,10,32,32,32,32,101,110,100,46,10,96,96,96,10,10,78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,32,97,116,10,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,32,111,102,10,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2085,2},spec,{{alias,1},[{type,{2085,12},bounded_fun,[{type,{2085,12},'fun',[{type,{2085,12},product,[{var,{2085,13},'Opts'}]},{var,{2085,22},'Alias'}]},[{type,{2086,7},constraint,[{atom,{2086,7},is_subtype},[{var,{2086,7},'Alias'},{type,{2086,16},reference,[]}]]},{type,{2087,7},constraint,[{atom,{2087,7},is_subtype},[{var,{2087,7},'Opts'},{type,{2087,15},list,[{type,{2087,16},union,[{atom,{2087,16},explicit_unalias},{atom,{2087,37},reply}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,alias,0},{2030,1},[<<97,108,105,97,115,40,41>>],none,#{group => processes,equiv => <<97,108,105,97,115,40,91,93,41>>,since => <<79,84,80,32,50,52,46,48>>}},{{function,demonitor,2},{1968,2},[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,96,116,114,117,101,96,32,117,110,108,101,115,115,32,96,105,110,102,111,96,32,105,115,32,112,97,114,116,32,111,102,32,96,79,112,116,105,111,110,76,105,115,116,96,46,10,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,102,108,117,115,104,96,42,42,32,45,32,82,101,109,111,118,101,115,32,40,111,110,101,41,32,96,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,44,32,105,102,32,116,104,101,114,101,32,105,115,10,32,32,111,110,101,44,32,102,114,111,109,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,10,10,32,32,67,97,108,108,105,110,103,32,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,10,32,32,102,111,108,108,111,119,105,110,103,44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,44,10,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,116,114,117,101,10,32,32,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,32,32,116,114,117,101,10,32,32,101,110,100,10,32,32,96,96,96,10,10,45,32,42,42,96,105,110,102,111,96,42,42,32,45,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,102,111,117,110,100,32,97,110,100,32,114,101,109,111,118,101,100,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,110,111,32,96,39,68,79,87,78,39,96,10,32,32,32,32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,97,110,100,32,119,105,108,108,32,110,111,116,32,98,101,10,32,32,32,32,100,101,108,105,118,101,114,101,100,46,10,10,32,32,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,46,32,84,104,105,115,10,32,32,32,32,112,114,111,98,97,98,108,121,32,98,101,99,97,117,115,101,32,115,111,109,101,111,110,101,32,97,108,114,101,97,100,121,32,104,97,115,32,112,108,97,99,101,100,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,32,32,32,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,10,32,32,73,102,32,111,112,116,105,111,110,32,96,105,110,102,111,96,32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,102,108,117,115,104,96,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,97,10,32,32,102,108,117,115,104,32,119,97,115,32,110,101,101,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,84,104,101,32,115,97,109,101,32,102,97,105,108,117,114,101,32,97,115,32,102,111,114,32,96,100,101,109,111,110,105,116,111,114,47,49,96,46>>},#{group => processes,specification => [{attribute,{2018,2},spec,{{demonitor,2},[{type,{2018,16},bounded_fun,[{type,{2018,16},'fun',[{type,{2018,16},product,[{var,{2018,17},'MonitorRef'},{var,{2018,29},'OptionList'}]},{type,{2018,44},boolean,[]}]},[{type,{2019,7},constraint,[{atom,{2019,7},is_subtype},[{var,{2019,7},'MonitorRef'},{type,{2019,21},reference,[]}]]},{type,{2020,7},constraint,[{atom,{2020,7},is_subtype},[{var,{2020,7},'OptionList'},{type,{2020,21},list,[{var,{2020,22},'Option'}]}]]},{type,{2021,7},constraint,[{atom,{2021,7},is_subtype},[{var,{2021,7},'Option'},{type,{2021,17},union,[{atom,{2021,17},flush},{atom,{2021,25},info}]}]]}]]}]}}]}},{{function,demonitor,1},{1925,2},[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>],#{<<101,110>> => <<73,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,98,116,97,105,110,101,100,32,98,121,32,99,97,108,108,105,110,103,10,96,109,111,110,105,116,111,114,47,50,96,44,32,116,104,105,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,114,101,97,100,121,32,116,117,114,110,101,100,10,111,102,102,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,10,10,79,110,99,101,32,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,10,116,104,97,116,32,110,111,32,96,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,44,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,44,32,119,105,108,108,32,98,101,10,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,32,72,111,119,101,118,101,114,44,32,97,10,96,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,10,109,101,115,115,97,103,101,32,113,117,101,117,101,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,46,32,73,116,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,115,117,97,108,108,121,32,97,100,118,105,115,97,98,108,101,32,116,111,32,114,101,109,111,118,101,32,115,117,99,104,10,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,102,114,111,109,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,105,102,32,116,104,105,115,32,99,108,101,97,110,117,112,32,105,115,32,119,97,110,116,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,32,40,69,82,84,83,32,53,46,53,41,32,91,96,100,101,109,111,110,105,116,111,114,47,49,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,98,101,104,97,118,101,100,10,62,32,99,111,109,112,108,101,116,101,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,10,62,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,114,101,97,99,104,101,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,84,104,105,115,32,104,97,100,32,111,110,101,32,117,110,100,101,115,105,114,97,98,108,101,10,62,32,101,102,102,101,99,116,46,32,89,111,117,32,99,111,117,108,100,32,110,101,118,101,114,32,107,110,111,119,32,119,104,101,110,32,121,111,117,32,119,101,114,101,32,103,117,97,114,97,110,116,101,101,100,32,95,110,111,116,95,32,116,111,32,114,101,99,101,105,118,101,32,97,10,62,32,96,68,79,87,78,96,32,109,101,115,115,97,103,101,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46,10,62,10,62,32,84,104,101,32,99,117,114,114,101,110,116,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,118,105,101,119,101,100,32,97,115,32,116,119,111,32,99,111,109,98,105,110,101,100,32,111,112,101,114,97,116,105,111,110,115,58,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,10,62,32,115,101,110,100,32,97,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,97,110,100,32,105,103,110,111,114,101,32,97,110,121,32,102,117,116,117,114,101,10,62,32,114,101,115,117,108,116,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46,10,10,70,97,105,108,117,114,101,58,32,73,116,32,105,115,32,97,110,32,101,114,114,111,114,32,105,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,114,101,102,101,114,115,32,116,111,32,97,32,109,111,110,105,116,111,114,105,110,103,32,115,116,97,114,116,101,100,32,98,121,10,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,32,97,108,108,32,115,117,99,104,32,99,97,115,101,115,32,97,114,101,32,99,104,101,97,112,32,116,111,32,99,104,101,99,107,46,32,73,102,32,99,104,101,99,107,105,110,103,32,105,115,32,99,104,101,97,112,44,10,116,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,44,32,102,111,114,32,101,120,97,109,112,108,101,32,105,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,105,115,32,97,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,46>>},#{group => processes,specification => [{attribute,{1961,2},spec,{{demonitor,1},[{type,{1961,16},bounded_fun,[{type,{1961,16},'fun',[{type,{1961,16},product,[{var,{1961,17},'MonitorRef'}]},{atom,{1961,32},true}]},[{type,{1962,7},constraint,[{atom,{1962,7},is_subtype},[{var,{1962,7},'MonitorRef'},{type,{1962,21},reference,[]}]]}]]}]}}]}},{{function,delete_module,1},{1906,2},[<<100,101,108,101,116,101,95,109,111,100,117,108,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<77,97,107,101,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,32,98,101,99,111,109,101,32,111,108,100,32,99,111,100,101,32,97,110,100,32,100,101,108,101,116,101,115,32,97,108,108,32,114,101,102,101,114,101,110,99,101,115,10,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,102,114,111,109,32,116,104,101,32,101,120,112,111,114,116,32,116,97,98,108,101,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,100,111,101,115,10,110,111,116,32,101,120,105,115,116,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,105,115,32,97,110,32,111,108,100,32,118,101,114,115,105,111,110,32,111,102,32,96,77,111,100,117,108,101,96,46>>},#{group => code,specification => [{attribute,{1919,2},spec,{{delete_module,1},[{type,{1919,20},bounded_fun,[{type,{1919,20},'fun',[{type,{1919,20},product,[{var,{1919,21},'Module'}]},{type,{1919,32},union,[{atom,{1919,32},true},{atom,{1919,39},undefined}]}]},[{type,{1920,7},constraint,[{atom,{1920,7},is_subtype},[{var,{1920,7},'Module'},{type,{1920,17},module,[]}]]}]]}]}}]}},{{function,delete_element,2},{1886,2},[<<100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,97,116,32,96,73,110,100,101,120,96,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,117,112,108,101,32,96,84,117,112,108,101,49,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,41,46,10,123,111,110,101,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{1898,2},spec,{{delete_element,2},[{type,{1898,21},bounded_fun,[{type,{1898,21},'fun',[{type,{1898,21},product,[{var,{1898,22},'Index'},{var,{1898,29},'Tuple1'}]},{var,{1898,40},'Tuple2'}]},[{type,{1899,7},constraint,[{atom,{1899,7},is_subtype},[{var,{1899,7},'Index'},{type,{1899,17},pos_integer,[]}]]},{type,{1900,7},constraint,[{atom,{1900,7},is_subtype},[{var,{1900,7},'Tuple1'},{type,{1900,17},tuple,any}]]},{type,{1901,7},constraint,[{atom,{1901,7},is_subtype},[{var,{1901,7},'Tuple2'},{type,{1901,17},tuple,any}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,decode_packet,3},{1697,2},[<<100,101,99,111,100,101,95,112,97,99,107,101,116,40,84,121,112,101,44,32,66,105,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<68,101,99,111,100,101,115,32,116,104,101,32,98,105,110,97,114,121,32,96,66,105,110,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,112,114,111,116,111,99,111,108,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,84,121,112,101,96,46,10,83,105,109,105,108,97,114,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,100,111,110,101,32,98,121,32,115,111,99,107,101,116,115,32,119,105,116,104,32,111,112,116,105,111,110,32,96,123,112,97,99,107,101,116,44,84,121,112,101,125,46,96,10,10,73,102,32,97,110,32,101,110,116,105,114,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,96,66,105,110,96,44,32,105,116,32,105,115,32,114,101,116,117,114,110,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,10,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,97,115,32,96,123,111,107,44,80,97,99,107,101,116,44,82,101,115,116,125,96,46,10,10,73,102,32,96,66,105,110,96,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,99,107,101,116,44,32,96,123,109,111,114,101,44,76,101,110,103,116,104,125,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,96,76,101,110,103,116,104,96,32,105,115,32,101,105,116,104,101,114,32,116,104,101,32,101,120,112,101,99,116,101,100,32,95,116,111,116,97,108,32,115,105,122,101,95,32,111,102,32,116,104,101,32,112,97,99,107,101,116,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,10,116,104,101,32,101,120,112,101,99,116,101,100,32,112,97,99,107,101,116,32,115,105,122,101,32,105,115,32,117,110,107,110,111,119,110,46,32,96,100,101,99,111,100,101,95,112,97,99,107,101,116,96,32,99,97,110,32,116,104,101,110,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,10,119,105,116,104,32,109,111,114,101,32,100,97,116,97,32,97,100,100,101,100,46,10,10,73,102,32,116,104,101,32,112,97,99,107,101,116,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,112,114,111,116,111,99,111,108,32,102,111,114,109,97,116,44,32,96,123,101,114,114,111,114,44,82,101,97,115,111,110,125,96,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,96,84,121,112,101,96,115,58,10,10,45,32,42,42,96,114,97,119,32,124,32,48,96,42,42,32,45,32,78,111,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,105,115,32,100,111,110,101,46,32,84,104,101,32,101,110,116,105,114,101,32,98,105,110,97,114,121,32,105,115,32,114,101,116,117,114,110,101,100,10,32,32,117,110,108,101,115,115,32,105,116,32,105,115,32,101,109,112,116,121,46,10,10,45,32,42,42,96,49,32,124,32,50,32,124,32,52,96,42,42,32,45,32,80,97,99,107,101,116,115,32,99,111,110,115,105,115,116,32,111,102,32,97,32,104,101,97,100,101,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,10,32,32,105,110,32,116,104,101,32,112,97,99,107,101,116,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,97,116,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46,32,84,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,104,101,97,100,101,114,32,99,97,110,10,32,32,98,101,32,111,110,101,44,32,116,119,111,44,32,111,114,32,102,111,117,114,32,98,121,116,101,115,59,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,98,121,116,101,115,32,105,115,32,98,105,103,45,101,110,100,105,97,110,46,32,84,104,101,32,104,101,97,100,101,114,10,32,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,102,32,119,104,101,110,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,42,42,96,108,105,110,101,96,42,42,32,45,32,65,32,112,97,99,107,101,116,32,105,115,32,97,32,108,105,110,101,45,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,44,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,10,32,32,108,97,116,105,110,45,49,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,32,105,115,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,10,32,32,112,97,99,107,101,116,32,117,110,108,101,115,115,32,116,104,101,32,108,105,110,101,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,111,112,116,105,111,110,32,96,108,105,110,101,95,108,101,110,103,116,104,96,46,10,10,45,32,42,42,96,97,115,110,49,32,124,32,99,100,114,32,124,32,115,117,110,114,109,32,124,32,102,99,103,105,32,124,32,116,112,107,116,96,42,42,32,45,32,84,104,101,32,104,101,97,100,101,114,32,105,115,32,95,110,111,116,95,32,115,116,114,105,112,112,101,100,32,111,102,102,46,10,10,32,32,84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,32,32,45,32,42,42,96,97,115,110,49,96,32,92,45,32,65,83,78,46,49,32,66,69,82,42,42,10,10,32,32,45,32,42,42,96,115,117,110,114,109,96,32,92,45,32,83,117,110,39,115,32,82,80,67,32,101,110,99,111,100,105,110,103,42,42,10,10,32,32,45,32,42,42,96,99,100,114,96,32,92,45,32,67,79,82,66,65,32,40,71,73,79,80,32,49,46,49,41,42,42,10,10,32,32,45,32,42,42,96,102,99,103,105,96,32,92,45,32,70,97,115,116,32,67,71,73,42,42,10,10,32,32,45,32,42,42,96,116,112,107,116,96,32,92,45,32,84,80,75,84,32,102,111,114,109,97,116,32,92,91,82,70,67,49,48,48,54,93,42,42,10,10,45,32,42,42,96,104,116,116,112,32,124,32,104,116,116,112,104,32,124,32,104,116,116,112,95,98,105,110,32,124,32,104,116,116,112,104,95,98,105,110,96,42,42,32,45,32,84,104,101,32,72,121,112,101,114,116,101,120,116,32,84,114,97,110,115,102,101,114,32,80,114,111,116,111,99,111,108,46,10,32,32,84,104,101,32,112,97,99,107,101,116,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,119,105,116,104,32,116,104,101,32,102,111,114,109,97,116,32,97,99,99,111,114,100,105,110,103,32,116,111,32,96,72,116,116,112,80,97,99,107,101,116,96,32,100,101,115,99,114,105,98,101,100,10,32,32,101,97,114,108,105,101,114,46,32,65,32,112,97,99,107,101,116,32,105,115,32,101,105,116,104,101,114,32,97,32,114,101,113,117,101,115,116,44,32,97,32,114,101,115,112,111,110,115,101,44,32,97,32,104,101,97,100,101,114,44,32,111,114,32,97,110,32,101,110,100,32,111,102,10,32,32,104,101,97,100,101,114,32,109,97,114,107,46,32,73,110,118,97,108,105,100,32,108,105,110,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,96,72,116,116,112,69,114,114,111,114,96,46,10,10,32,32,82,101,99,111,103,110,105,122,101,100,32,114,101,113,117,101,115,116,32,109,101,116,104,111,100,115,32,97,110,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,97,116,111,109,115,46,32,79,116,104,101,114,115,32,97,114,101,10,32,32,114,101,116,117,114,110,101,100,32,97,115,32,115,116,114,105,110,103,115,46,32,83,116,114,105,110,103,115,32,111,102,32,117,110,114,101,99,111,103,110,105,122,101,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,10,32,32,111,110,108,121,32,99,97,112,105,116,97,108,32,108,101,116,116,101,114,115,32,102,105,114,115,116,32,97,110,100,32,97,102,116,101,114,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,10,32,32,96,34,83,101,99,45,87,101,98,115,111,99,107,101,116,45,75,101,121,34,96,46,32,72,101,97,100,101,114,32,102,105,101,108,100,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,114,101,116,117,114,110,101,100,32,105,110,10,32,32,96,85,110,109,111,100,105,102,105,101,100,70,105,101,108,100,96,32,97,115,32,115,116,114,105,110,103,115,44,32,119,105,116,104,111,117,116,32,97,110,121,32,99,111,110,118,101,114,115,105,111,110,32,111,114,32,102,111,114,109,97,116,116,105,110,103,46,10,10,32,32,84,104,101,32,112,114,111,116,111,99,111,108,32,116,121,112,101,32,96,104,116,116,112,96,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,108,105,110,101,32,119,104,101,110,32,97,110,10,32,32,96,72,116,116,112,82,101,113,117,101,115,116,96,32,111,114,32,97,110,32,96,72,116,116,112,82,101,115,112,111,110,115,101,96,32,105,115,32,101,120,112,101,99,116,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,97,114,101,32,116,111,32,117,115,101,10,32,32,96,104,116,116,112,104,96,32,116,111,32,103,101,116,32,96,72,116,116,112,72,101,97,100,101,114,96,115,32,117,110,116,105,108,32,96,104,116,116,112,95,101,111,104,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,105,99,104,32,109,97,114,107,115,32,116,104,101,32,101,110,100,10,32,32,111,102,32,116,104,101,32,104,101,97,100,101,114,115,32,97,110,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,109,101,115,115,97,103,101,32,98,111,100,121,46,10,10,32,32,84,104,101,32,118,97,114,105,97,110,116,115,32,96,104,116,116,112,95,98,105,110,96,32,97,110,100,32,96,104,116,116,112,104,95,98,105,110,96,32,114,101,116,117,114,110,32,115,116,114,105,110,103,115,32,40,96,72,116,116,112,83,116,114,105,110,103,96,41,32,97,115,10,32,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,108,105,115,116,115,46,10,10,32,32,83,105,110,99,101,32,79,84,80,32,50,54,46,48,44,32,96,72,111,115,116,96,32,109,97,121,32,98,101,32,97,110,32,73,80,118,54,32,97,100,100,114,101,115,115,32,101,110,99,108,111,115,101,100,32,105,110,32,96,91,93,96,44,32,97,115,32,100,101,102,105,110,101,100,32,105,110,10,32,32,91,82,70,67,50,55,51,50,32,93,40,104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,50,55,51,50,46,116,120,116,41,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,112,97,99,107,101,116,95,115,105,122,101,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,115,105,122,101,32,111,102,32,116,104,101,10,32,32,112,97,99,107,101,116,32,98,111,100,121,46,32,73,102,32,116,104,101,32,112,97,99,107,101,116,32,104,101,97,100,101,114,32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,105,115,10,32,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,108,101,110,103,116,104,44,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,105,110,118,97,108,105,100,46,10,32,32,68,101,102,97,117,108,116,115,32,116,111,32,48,44,32,119,104,105,99,104,32,109,101,97,110,115,32,110,111,32,115,105,122,101,32,108,105,109,105,116,46,10,10,45,32,42,42,96,123,108,105,110,101,95,108,101,110,103,116,104,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32,96,108,105,110,101,96,44,32,108,105,110,101,115,32,108,111,110,103,101,114,10,32,32,116,104,97,110,32,116,104,101,32,105,110,100,105,99,97,116,101,100,32,108,101,110,103,116,104,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,10,10,32,32,79,112,116,105,111,110,32,96,108,105,110,101,95,108,101,110,103,116,104,96,32,97,108,115,111,32,97,112,112,108,105,101,115,32,116,111,32,96,104,116,116,112,42,96,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,115,32,97,110,32,97,108,105,97,115,32,102,111,114,10,32,32,111,112,116,105,111,110,32,96,112,97,99,107,101,116,95,115,105,122,101,96,32,105,102,32,96,112,97,99,107,101,116,95,115,105,122,101,96,32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,115,101,116,46,32,84,104,105,115,32,117,115,101,32,105,115,32,111,110,108,121,10,32,32,105,110,116,101,110,100,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,45,32,42,42,96,123,108,105,110,101,95,100,101,108,105,109,105,116,101,114,44,32,48,32,61,60,32,98,121,116,101,40,41,32,61,60,32,50,53,53,125,96,42,42,32,45,32,70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32,96,108,105,110,101,96,44,32,115,101,116,115,32,116,104,101,10,32,32,100,101,108,105,109,105,116,105,110,103,32,98,121,116,101,46,32,68,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,96,36,92,110,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,51,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,111,107,44,60,60,34,97,98,99,34,62,62,44,60,60,34,100,34,62,62,125,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,53,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,109,111,114,101,44,54,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{1789,2},spec,{{decode_packet,3},[{type,{1789,20},bounded_fun,[{type,{1789,20},'fun',[{type,{1789,20},product,[{var,{1789,21},'Type'},{var,{1789,27},'Bin'},{var,{1789,32},'Options'}]},{type,{1790,35},union,[{type,{1790,35},tuple,[{atom,{1790,36},ok},{var,{1790,40},'Packet'},{var,{1790,48},'Rest'}]},{type,{1791,35},tuple,[{atom,{1791,36},more},{var,{1791,42},'Length'}]},{type,{1792,35},tuple,[{atom,{1792,36},error},{var,{1792,43},'Reason'}]}]}]},[{type,{1793,7},constraint,[{atom,{1793,7},is_subtype},[{var,{1793,7},'Type'},{type,{1793,15},union,[{atom,{1793,15},raw},{integer,{1793,23},0},{integer,{1793,27},1},{integer,{1793,31},2},{integer,{1793,35},4},{atom,{1793,39},asn1},{atom,{1793,48},cdr},{atom,{1793,56},sunrm},{atom,{1793,66},fcgi},{atom,{1794,15},tpkt},{atom,{1794,24},line},{atom,{1794,33},http},{atom,{1794,42},http_bin},{atom,{1794,55},httph},{atom,{1794,65},httph_bin}]}]]},{type,{1795,7},constraint,[{atom,{1795,7},is_subtype},[{var,{1795,7},'Bin'},{type,{1795,14},binary,[]}]]},{type,{1796,7},constraint,[{atom,{1796,7},is_subtype},[{var,{1796,7},'Options'},{type,{1796,18},list,[{var,{1796,19},'Opt'}]}]]},{type,{1797,7},constraint,[{atom,{1797,7},is_subtype},[{var,{1797,7},'Opt'},{type,{1797,14},union,[{type,{1797,14},tuple,[{atom,{1797,15},packet_size},{type,{1797,28},non_neg_integer,[]}]},{type,{1798,14},tuple,[{atom,{1798,15},line_length},{type,{1798,28},non_neg_integer,[]}]}]}]]},{type,{1799,7},constraint,[{atom,{1799,7},is_subtype},[{var,{1799,7},'Packet'},{type,{1799,17},union,[{type,{1799,17},binary,[]},{var,{1799,28},'HttpPacket'}]}]]},{type,{1800,7},constraint,[{atom,{1800,7},is_subtype},[{var,{1800,7},'Rest'},{type,{1800,15},binary,[]}]]},{type,{1801,7},constraint,[{atom,{1801,7},is_subtype},[{var,{1801,7},'Length'},{type,{1801,17},union,[{type,{1801,17},non_neg_integer,[]},{atom,{1801,37},undefined}]}]]},{type,{1802,7},constraint,[{atom,{1802,7},is_subtype},[{var,{1802,7},'Reason'},{type,{1802,17},term,[]}]]},{type,{1803,7},constraint,[{atom,{1803,7},is_subtype},[{var,{1803,7},'HttpPacket'},{type,{1803,21},union,[{var,{1803,21},'HttpRequest'},{var,{1804,21},'HttpResponse'},{var,{1805,21},'HttpHeader'},{atom,{1806,21},http_eoh},{var,{1807,21},'HttpError'}]}]]},{type,{1808,7},constraint,[{atom,{1808,7},is_subtype},[{var,{1808,7},'HttpRequest'},{type,{1808,22},tuple,[{atom,{1808,23},http_request},{var,{1808,39},'HttpMethod'},{var,{1808,51},'HttpUri'},{var,{1808,60},'HttpVersion'}]}]]},{type,{1809,7},constraint,[{atom,{1809,7},is_subtype},[{var,{1809,7},'HttpResponse'},{type,{1809,23},tuple,[{atom,{1809,24},http_response},{var,{1809,41},'HttpVersion'},{type,{1809,54},integer,[]},{var,{1809,65},'HttpString'}]}]]},{type,{1810,7},constraint,[{atom,{1810,7},is_subtype},[{var,{1810,7},'HttpHeader'},{type,{1810,21},tuple,[{atom,{1810,22},http_header},{type,{1811,22},integer,[]},{var,{1812,22},'HttpField'},{ann_type,{1813,22},[{var,{1813,22},'UnmodifiedField'},{var,{1813,41},'HttpString'}]},{ann_type,{1814,22},[{var,{1814,22},'Value'},{var,{1814,31},'HttpString'}]}]}]]},{type,{1815,7},constraint,[{atom,{1815,7},is_subtype},[{var,{1815,7},'HttpError'},{type,{1815,20},tuple,[{atom,{1815,21},http_error},{var,{1815,35},'HttpString'}]}]]},{type,{1816,7},constraint,[{atom,{1816,7},is_subtype},[{var,{1816,7},'HttpMethod'},{type,{1816,21},union,[{atom,{1816,21},'OPTIONS'},{atom,{1816,33},'GET'},{atom,{1816,41},'HEAD'},{atom,{1816,50},'POST'},{atom,{1816,59},'PUT'},{atom,{1816,67},'DELETE'},{atom,{1817,21},'TRACE'},{var,{1817,31},'HttpString'}]}]]},{type,{1818,7},constraint,[{atom,{1818,7},is_subtype},[{var,{1818,7},'HttpUri'},{type,{1818,18},union,[{atom,{1818,18},'*'},{type,{1819,18},tuple,[{atom,{1819,20},absoluteURI},{type,{1820,20},union,[{atom,{1820,20},http},{atom,{1820,29},https}]},{ann_type,{1821,20},[{var,{1821,20},'Host'},{var,{1821,28},'HttpString'}]},{ann_type,{1822,20},[{var,{1822,20},'Port'},{type,{1822,28},union,[{remote_type,{1822,28},[{atom,{1822,28},inet},{atom,{1822,33},port_number},[]]},{atom,{1822,49},undefined}]}]},{ann_type,{1823,20},[{var,{1823,20},'Path'},{var,{1823,28},'HttpString'}]}]},{type,{1824,18},tuple,[{atom,{1824,19},scheme},{ann_type,{1824,29},[{var,{1824,29},'Scheme'},{var,{1824,39},'HttpString'}]},{var,{1824,51},'HttpString'}]},{type,{1825,18},tuple,[{atom,{1825,19},abs_path},{var,{1825,31},'HttpString'}]},{var,{1826,18},'HttpString'}]}]]},{type,{1827,7},constraint,[{atom,{1827,7},is_subtype},[{var,{1827,7},'HttpVersion'},{type,{1827,22},tuple,[{ann_type,{1827,23},[{var,{1827,23},'Major'},{type,{1827,32},non_neg_integer,[]}]},{ann_type,{1827,51},[{var,{1827,51},'Minor'},{type,{1827,60},non_neg_integer,[]}]}]}]]},{type,{1828,7},constraint,[{atom,{1828,7},is_subtype},[{var,{1828,7},'HttpField'},{type,{1828,20},union,[{atom,{1828,20},'Cache-Control'},{atom,{1829,20},'Connection'},{atom,{1830,20},'Date'},{atom,{1831,20},'Pragma'},{atom,{1832,20},'Transfer-Encoding'},{atom,{1833,20},'Upgrade'},{atom,{1834,20},'Via'},{atom,{1835,20},'Accept'},{atom,{1836,20},'Accept-Charset'},{atom,{1837,20},'Accept-Encoding'},{atom,{1838,20},'Accept-Language'},{atom,{1839,20},'Authorization'},{atom,{1840,20},'From'},{atom,{1841,20},'Host'},{atom,{1842,20},'If-Modified-Since'},{atom,{1843,20},'If-Match'},{atom,{1844,20},'If-None-Match'},{atom,{1845,20},'If-Range'},{atom,{1846,20},'If-Unmodified-Since'},{atom,{1847,20},'Max-Forwards'},{atom,{1848,20},'Proxy-Authorization'},{atom,{1849,20},'Range'},{atom,{1850,20},'Referer'},{atom,{1851,20},'User-Agent'},{atom,{1852,20},'Age'},{atom,{1853,20},'Location'},{atom,{1854,20},'Proxy-Authenticate'},{atom,{1855,20},'Public'},{atom,{1856,20},'Retry-After'},{atom,{1857,20},'Server'},{atom,{1858,20},'Vary'},{atom,{1859,20},'Warning'},{atom,{1860,19},'Www-Authenticate'},{atom,{1861,20},'Allow'},{atom,{1862,20},'Content-Base'},{atom,{1863,20},'Content-Encoding'},{atom,{1864,20},'Content-Language'},{atom,{1865,20},'Content-Length'},{atom,{1866,20},'Content-Location'},{atom,{1867,20},'Content-Md5'},{atom,{1868,20},'Content-Range'},{atom,{1869,20},'Content-Type'},{atom,{1870,20},'Etag'},{atom,{1871,20},'Expires'},{atom,{1872,20},'Last-Modified'},{atom,{1873,20},'Accept-Ranges'},{atom,{1874,20},'Set-Cookie'},{atom,{1875,20},'Set-Cookie2'},{atom,{1876,20},'X-Forwarded-For'},{atom,{1877,20},'Cookie'},{atom,{1878,20},'Keep-Alive'},{atom,{1879,20},'Proxy-Connection'},{var,{1880,20},'HttpString'}]}]]},{type,{1881,7},constraint,[{atom,{1881,7},is_subtype},[{var,{1881,7},'HttpString'},{type,{1881,21},union,[{type,{1881,21},string,[]},{type,{1881,32},binary,[]}]}]]}]]}]}}]}},{{function,date,0},{1676,2},[<<100,97,116,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,115,32,96,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,96,46,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,100,97,116,101,40,41,46,10,123,49,57,57,53,44,50,44,49,57,125,10,96,96,96>>},#{group => time,specification => [{attribute,{1691,2},spec,{{date,0},[{type,{1691,11},bounded_fun,[{type,{1691,11},'fun',[{type,{1691,11},product,[]},{var,{1691,17},'Date'}]},[{type,{1692,7},constraint,[{atom,{1692,7},is_subtype},[{var,{1692,7},'Date'},{remote_type,{1692,15},[{atom,{1692,15},calendar},{atom,{1692,24},date},[]]}]]}]]}]}}]}},{{function,crc32_combine,3},{1646,2},[<<99,114,99,51,50,95,99,111,109,98,105,110,101,40,70,105,114,115,116,67,114,99,44,32,83,101,99,111,110,100,67,114,99,44,32,83,101,99,111,110,100,83,105,122,101,41>>],#{<<101,110>> => <<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,115,46,10,10,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,10,116,111,32,98,101,32,107,110,111,119,110,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,89,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,90,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{1668,2},spec,{{crc32_combine,3},[{type,{1668,20},bounded_fun,[{type,{1668,20},'fun',[{type,{1668,20},product,[{var,{1668,21},'FirstCrc'},{var,{1668,31},'SecondCrc'},{var,{1668,42},'SecondSize'}]},{type,{1668,57},non_neg_integer,[]}]},[{type,{1669,7},constraint,[{atom,{1669,7},is_subtype},[{var,{1669,7},'FirstCrc'},{type,{1669,19},non_neg_integer,[]}]]},{type,{1670,7},constraint,[{atom,{1670,7},is_subtype},[{var,{1670,7},'SecondCrc'},{type,{1670,20},non_neg_integer,[]}]]},{type,{1671,7},constraint,[{atom,{1671,7},is_subtype},[{var,{1671,7},'SecondSize'},{type,{1671,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,crc32,2},{1621,2},[<<99,114,99,51,50,40,79,108,100,67,114,99,44,32,68,97,116,97,41>>],#{<<101,110>> => <<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,10,96,79,108,100,67,114,99,96,44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32,96,68,97,116,97,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,88,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,89,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{1639,2},spec,{{crc32,2},[{type,{1639,12},bounded_fun,[{type,{1639,12},'fun',[{type,{1639,12},product,[{var,{1639,13},'OldCrc'},{var,{1639,21},'Data'}]},{type,{1639,30},non_neg_integer,[]}]},[{type,{1640,7},constraint,[{atom,{1640,7},is_subtype},[{var,{1640,7},'OldCrc'},{type,{1640,17},non_neg_integer,[]}]]},{type,{1641,7},constraint,[{atom,{1641,7},is_subtype},[{var,{1641,7},'Data'},{type,{1641,15},iodata,[]}]]}]]}]}}]}},{{function,crc32,1},{1613,2},[<<99,114,99,51,50,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,114,99,51,50,32,40,73,69,69,69,32,56,48,50,46,51,32,115,116,121,108,101,41,32,99,104,101,99,107,115,117,109,32,102,111,114,32,96,68,97,116,97,96,46>>},#{group => checksum,specification => [{attribute,{1615,2},spec,{{crc32,1},[{type,{1615,12},bounded_fun,[{type,{1615,12},'fun',[{type,{1615,12},product,[{var,{1615,13},'Data'}]},{type,{1615,22},non_neg_integer,[]}]},[{type,{1616,7},constraint,[{atom,{1616,7},is_subtype},[{var,{1616,7},'Data'},{type,{1616,15},iodata,[]}]]}]]}]}}]}},{{function,check_process_code,3},{1529,2},[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<67,104,101,99,107,115,32,105,102,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,10,96,77,111,100,117,108,101,96,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,108,108,111,119,95,103,99,44,32,98,111,111,108,101,97,110,40,41,125,96,42,42,32,45,32,68,101,116,101,114,109,105,110,101,115,32,105,102,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,108,108,111,119,101,100,32,119,104,101,110,10,32,32,112,101,114,102,111,114,109,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,96,123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125,96,32,105,115,32,112,97,115,115,101,100,44,32,97,110,100,32,97,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,10,32,32,105,115,32,97,98,111,114,116,101,100,32,40,115,101,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,96,67,104,101,99,107,82,101,115,117,108,116,96,32,98,101,108,111,119,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,111,32,97,108,108,111,119,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,116,104,97,116,32,105,115,44,32,96,123,97,108,108,111,119,95,103,99,44,32,116,114,117,101,125,96,46,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125,96,42,42,32,45,32,84,104,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51,96,93,40,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51,96,41,32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,97,115,121,110,99,96,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,10,32,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,10,32,32,102,111,114,109,32,96,123,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,44,32,82,101,113,117,101,115,116,73,100,44,32,67,104,101,99,107,82,101,115,117,108,116,125,96,46,10,10,73,102,32,96,80,105,100,96,32,101,113,117,97,108,115,32,96,115,101,108,102,47,48,96,44,32,97,110,100,32,110,111,32,96,97,115,121,110,99,96,32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,10,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,110,100,32,105,115,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32,96,97,115,121,110,99,96,10,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32,96,67,104,101,99,107,82,101,115,117,108,116,96,32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,10,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,10,10,96,67,104,101,99,107,82,101,115,117,108,116,96,32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46,10,32,32,84,104,97,116,32,105,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,99,111,110,116,97,105,110,115,32,102,117,110,115,32,116,104,97,116,32,114,101,102,101,114,101,110,99,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,100,111,101,115,32,110,111,116,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,102,111,114,10,32,32,96,77,111,100,117,108,101,96,46,10,10,45,32,42,42,96,97,98,111,114,116,101,100,96,42,42,32,45,32,84,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,97,98,111,114,116,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,101,101,100,101,100,32,116,111,32,98,101,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,114,101,113,117,101,115,116,101,100,10,32,32,98,121,32,112,97,115,115,105,110,103,32,111,112,116,105,111,110,32,96,123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125,96,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,85,112,32,117,110,116,105,108,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,92,42,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,99,104,101,99,107,115,32,102,111,114,32,97,108,108,10,62,32,116,121,112,101,115,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,111,108,100,32,99,111,100,101,46,32,84,104,97,116,32,105,115,44,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,101,46,103,46,32,114,101,116,117,114,110,10,62,32,97,100,100,114,101,115,115,101,115,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,41,44,32,105,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,96,102,117,110,96,115,32,105,110,32,112,114,111,99,101,115,115,10,62,32,99,111,110,116,101,120,116,41,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,108,105,116,101,114,97,108,115,32,105,110,32,116,104,101,32,99,111,100,101,46,10,62,10,62,32,65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,111,110,108,121,32,99,104,101,99,107,115,32,102,111,114,10,62,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,99,111,100,101,46,32,73,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,118,105,97,32,96,102,117,110,96,115,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,46,10,62,32,73,102,32,115,117,99,104,32,96,102,117,110,96,115,32,101,120,105,115,116,32,97,110,100,32,97,114,101,32,117,115,101,100,32,97,102,116,101,114,32,97,32,112,117,114,103,101,32,111,102,32,116,104,101,32,111,108,100,32,99,111,100,101,44,32,97,110,32,101,120,99,101,112,116,105,111,110,10,62,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,112,111,110,32,117,115,97,103,101,32,40,115,97,109,101,32,97,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,96,102,117,110,96,32,105,115,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,10,62,32,112,114,111,99,101,115,115,32,97,102,116,101,114,32,116,104,101,32,112,117,114,103,101,41,46,32,76,105,116,101,114,97,108,115,32,119,105,108,108,32,98,101,32,116,97,107,101,110,32,99,97,114,101,32,111,102,32,40,99,111,112,105,101,100,41,32,97,116,32,97,32,108,97,116,101,114,10,62,32,115,116,97,103,101,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,99,97,110,32,97,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,49,32,98,101,32,101,110,97,98,108,101,100,32,119,104,101,110,10,62,32,91,98,117,105,108,100,105,110,103,32,79,84,80,93,40,96,101,58,115,121,115,116,101,109,58,105,110,115,116,97,108,108,46,109,100,35,97,100,118,97,110,99,101,100,45,99,111,110,102,105,103,117,114,97,116,105,111,110,45,97,110,100,45,98,117,105,108,100,45,111,102,45,101,114,108,97,110,103,45,111,116,112,95,99,111,110,102,105,103,117,114,105,110,103,96,41,44,10,62,32,97,110,100,32,119,105,108,108,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,98,101,32,101,110,97,98,108,101,100,32,105,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,32,115,117,112,112,111,114,116,32,105,115,32,101,110,97,98,108,101,100,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,100,117,108,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>},#{group => code,specification => [{attribute,{1595,2},spec,{{check_process_code,3},[{type,{1595,25},bounded_fun,[{type,{1595,25},'fun',[{type,{1595,25},product,[{var,{1595,26},'Pid'},{var,{1595,31},'Module'},{var,{1595,39},'OptionList'}]},{type,{1595,54},union,[{var,{1595,54},'CheckResult'},{atom,{1595,68},async}]}]},[{type,{1596,7},constraint,[{atom,{1596,7},is_subtype},[{var,{1596,7},'Pid'},{type,{1596,14},pid,[]}]]},{type,{1597,7},constraint,[{atom,{1597,7},is_subtype},[{var,{1597,7},'Module'},{type,{1597,17},module,[]}]]},{type,{1598,7},constraint,[{atom,{1598,7},is_subtype},[{var,{1598,7},'RequestId'},{type,{1598,20},term,[]}]]},{type,{1599,7},constraint,[{atom,{1599,7},is_subtype},[{var,{1599,7},'Option'},{type,{1599,17},union,[{type,{1599,17},tuple,[{atom,{1599,18},async},{var,{1599,25},'RequestId'}]},{type,{1599,38},tuple,[{atom,{1599,39},allow_gc},{type,{1599,49},boolean,[]}]}]}]]},{type,{1600,7},constraint,[{atom,{1600,7},is_subtype},[{var,{1600,7},'OptionList'},{type,{1600,21},list,[{var,{1600,22},'Option'}]}]]},{type,{1601,7},constraint,[{atom,{1601,7},is_subtype},[{var,{1601,7},'CheckResult'},{type,{1601,22},union,[{type,{1601,22},boolean,[]},{atom,{1601,34},aborted}]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,check_process_code,2},{1521,1},[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,41>>],none,#{group => code,equiv => <<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,91,93,41>>}},{{function,check_old_code,1},{1501,2},[<<99,104,101,99,107,95,111,108,100,95,99,111,100,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,77,111,100,117,108,101,96,32,104,97,115,10,91,111,108,100,32,99,111,100,101,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46>>},#{group => code,specification => [{attribute,{1509,2},spec,{{check_old_code,1},[{type,{1509,21},bounded_fun,[{type,{1509,21},'fun',[{type,{1509,21},product,[{var,{1509,22},'Module'}]},{type,{1509,33},boolean,[]}]},[{type,{1510,7},constraint,[{atom,{1510,7},is_subtype},[{var,{1510,7},'Module'},{type,{1510,17},module,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,ceil,1},{1483,2},[<<99,101,105,108,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,108,101,115,115,32,116,104,97,110,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,101,105,108,40,53,46,53,41,46,10,54,10,96,96,96>>},#{group => terms,specification => [{attribute,{1495,2},spec,{{ceil,1},[{type,{1495,11},bounded_fun,[{type,{1495,11},'fun',[{type,{1495,11},product,[{var,{1495,12},'Number'}]},{type,{1495,23},integer,[]}]},[{type,{1496,7},constraint,[{atom,{1496,7},is_subtype},[{var,{1496,7},'Number'},{type,{1496,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,cancel_timer,2},{1417,2},[<<99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,10,111,114,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,46,32,96,84,105,109,101,114,82,101,102,96,32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,10,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,65,115,121,110,99,125,96,42,42,32,45,32,65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32,96,65,115,121,110,99,96,32,100,101,102,97,117,108,116,115,10,32,32,116,111,32,96,102,97,108,115,101,96,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,87,104,101,110,10,32,32,96,65,115,121,110,99,96,32,105,115,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,99,97,110,99,101,108,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,10,32,32,84,104,97,116,32,105,115,44,32,96,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,10,32,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32,96,111,107,96,46,10,10,45,32,42,42,96,123,105,110,102,111,44,32,73,110,102,111,125,96,42,42,32,45,32,82,101,113,117,101,115,116,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,82,101,115,117,108,116,96,32,111,102,32,116,104,101,10,32,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32,96,73,110,102,111,96,32,100,101,102,97,117,108,116,115,32,116,111,32,96,116,114,117,101,96,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,103,105,118,101,110,46,10,32,32,87,104,101,110,32,96,73,110,102,111,96,32,105,115,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,10,32,32,99,97,110,99,101,108,108,97,116,105,111,110,32,105,115,32,103,105,118,101,110,46,10,10,32,32,45,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,32,96,102,97,108,115,101,96,58,32,105,102,32,96,73,110,102,111,96,32,105,115,32,96,116,114,117,101,96,44,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,32,32,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,46,32,111,116,104,101,114,119,105,115,101,32,96,111,107,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32,45,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,32,96,116,114,117,101,96,58,32,105,102,32,96,73,110,102,111,96,32,105,115,32,96,116,114,117,101,96,44,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,10,32,32,32,32,96,123,99,97,110,99,101,108,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,32,32,32,32,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,32,119,104,101,110,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,44,10,32,32,32,32,111,116,104,101,114,119,105,115,101,32,110,111,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,10,99,97,110,99,101,108,101,100,32,116,105,109,101,114,32,119,111,117,108,100,32,104,97,118,101,32,101,120,112,105,114,101,100,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,96,102,97,108,115,101,96,44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,105,109,101,114,82,101,102,96,32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,10,84,104,105,115,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,97,108,114,101,97,100,121,32,104,97,100,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,10,98,101,99,97,117,115,101,32,96,84,105,109,101,114,82,101,102,96,32,110,101,118,101,114,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,10,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,105,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,10,62,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,10,62,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,10,62,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,10,62,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,111,114,32,105,115,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,10,62,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,116,114,117,101,125,96,46,32,73,102,32,117,115,105,110,103,10,62,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,102,97,108,115,101,125,96,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,98,108,111,99,107,115,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,10,62,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50,96,93,40,96,114,101,97,100,95,116,105,109,101,114,47,50,96,41,46>>},#{group => time,specification => [{attribute,{1469,2},spec,{{cancel_timer,2},[{type,{1469,19},bounded_fun,[{type,{1469,19},'fun',[{type,{1469,19},product,[{var,{1469,20},'TimerRef'},{var,{1469,30},'Options'}]},{type,{1469,42},union,[{var,{1469,42},'Result'},{atom,{1469,51},ok}]}]},[{type,{1470,7},constraint,[{atom,{1470,7},is_subtype},[{var,{1470,7},'TimerRef'},{type,{1470,19},reference,[]}]]},{type,{1471,7},constraint,[{atom,{1471,7},is_subtype},[{var,{1471,7},'Async'},{type,{1471,16},boolean,[]}]]},{type,{1472,7},constraint,[{atom,{1472,7},is_subtype},[{var,{1472,7},'Info'},{type,{1472,15},boolean,[]}]]},{type,{1473,7},constraint,[{atom,{1473,7},is_subtype},[{var,{1473,7},'Option'},{type,{1473,17},union,[{type,{1473,17},tuple,[{atom,{1473,18},async},{var,{1473,25},'Async'}]},{type,{1473,34},tuple,[{atom,{1473,35},info},{var,{1473,41},'Info'}]}]}]]},{type,{1474,7},constraint,[{atom,{1474,7},is_subtype},[{var,{1474,7},'Options'},{type,{1474,18},list,[{var,{1474,19},'Option'}]}]]},{type,{1475,7},constraint,[{atom,{1475,7},is_subtype},[{var,{1475,7},'Time'},{type,{1475,15},non_neg_integer,[]}]]},{type,{1476,7},constraint,[{atom,{1476,7},is_subtype},[{var,{1476,7},'Result'},{type,{1476,17},union,[{var,{1476,17},'Time'},{atom,{1476,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,cancel_timer,1},{1413,1},[<<99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,41>>],none,#{group => time,equiv => <<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>}},{{function,call_on_load_function,1},{1399,2},[<<99,97,108,108,95,111,110,95,108,111,97,100,95,102,117,110,99,116,105,111,110,40,80,49,41>>],hidden,#{}},{{function,byte_size,1},{1378,2},[<<98,121,116,101,95,115,105,122,101,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,110,101,101,100,101,100,32,116,111,32,99,111,110,116,97,105,110,32,96,66,105,116,115,116,114,105,110,103,96,46,10,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,96,66,105,116,115,116,114,105,110,103,96,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,10,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32,95,117,112,95,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{1393,2},spec,{{byte_size,1},[{type,{1393,16},bounded_fun,[{type,{1393,16},'fun',[{type,{1393,16},product,[{var,{1393,17},'Bitstring'}]},{type,{1393,31},non_neg_integer,[]}]},[{type,{1394,7},constraint,[{atom,{1394,7},is_subtype},[{var,{1394,7},'Bitstring'},{type,{1394,20},bitstring,[]}]]}]]}]}}]}},{{function,bump_reductions,1},{1357,2},[<<98,117,109,112,95,114,101,100,117,99,116,105,111,110,115,40,82,101,100,117,99,116,105,111,110,115,41>>],#{<<101,110>> => <<84,104,105,115,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,99,114,101,109,101,110,116,115,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,102,111,114,32,116,104,101,10,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,73,110,32,116,104,101,32,66,101,97,109,32,101,109,117,108,97,116,111,114,44,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,105,115,32,110,111,114,109,97,108,108,121,32,105,110,99,114,101,109,101,110,116,101,100,32,98,121,32,111,110,101,32,102,111,114,10,101,97,99,104,32,102,117,110,99,116,105,111,110,32,97,110,100,32,66,73,70,32,99,97,108,108,46,32,65,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,32,105,115,32,102,111,114,99,101,100,32,119,104,101,110,32,116,104,101,32,99,111,117,110,116,101,114,32,114,101,97,99,104,101,115,10,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,40,52,48,48,48,32,114,101,100,117,99,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,49,57,46,50,32,97,110,100,32,108,97,116,101,114,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,66,101,97,109,32,109,97,99,104,105,110,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,10,62,32,119,97,114,110,105,110,103,46,32,73,116,32,105,115,32,117,110,108,105,107,101,108,121,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,111,116,104,101,114,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{1371,2},spec,{{bump_reductions,1},[{type,{1371,22},bounded_fun,[{type,{1371,22},'fun',[{type,{1371,22},product,[{var,{1371,23},'Reductions'}]},{atom,{1371,38},true}]},[{type,{1372,7},constraint,[{atom,{1372,7},is_subtype},[{var,{1372,7},'Reductions'},{type,{1372,21},pos_integer,[]}]]}]]}]}}]}},{{function,bitstring_to_list,1},{1332,2},[<<98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32,96,66,105,116,115,116,114,105,110,103,96,46,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,111,102,10,116,104,101,32,108,105,115,116,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,49,45,55,32,98,105,116,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,62,62,41,46,10,91,49,44,49,55,55,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,91,49,44,49,55,55,44,60,60,51,58,51,62,62,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{1351,2},spec,{{bitstring_to_list,1},[{type,{1351,24},bounded_fun,[{type,{1351,24},'fun',[{type,{1351,24},product,[{var,{1351,25},'Bitstring'}]},{type,{1351,39},list,[{type,{1351,40},union,[{type,{1351,40},byte,[]},{type,{1351,49},bitstring,[]}]}]}]},[{type,{1352,7},constraint,[{atom,{1352,7},is_subtype},[{var,{1352,7},'Bitstring'},{type,{1352,20},bitstring,[]}]]}]]}]}}]}},{{function,bit_size,1},{1313,2},[<<98,105,116,95,115,105,122,101,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,105,116,115,32,111,102,32,96,66,105,116,115,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,49,57,10,62,32,98,105,116,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,50,52,10,96,96,96>>},#{group => terms,specification => [{attribute,{1326,2},spec,{{bit_size,1},[{type,{1326,15},bounded_fun,[{type,{1326,15},'fun',[{type,{1326,15},product,[{var,{1326,16},'Bitstring'}]},{type,{1326,30},non_neg_integer,[]}]},[{type,{1327,7},constraint,[{atom,{1327,7},is_subtype},[{var,{1327,7},'Bitstring'},{type,{1327,20},bitstring,[]}]]}]]}]}}]}},{{function,binary_to_term,2},{1250,2},[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,44,32,79,112,116,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,44,32,98,117,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,116,111,10,102,105,116,32,115,112,101,99,105,97,108,32,112,117,114,112,111,115,101,115,46,10,10,84,104,101,32,97,108,108,111,119,101,100,32,111,112,116,105,111,110,115,32,97,114,101,58,10,10,45,32,42,42,96,115,97,102,101,96,42,42,32,45,32,85,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46,10,10,32,32,87,104,101,110,32,101,110,97,98,108,101,100,44,32,105,116,32,112,114,101,118,101,110,116,115,32,100,101,99,111,100,105,110,103,32,100,97,116,97,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,116,116,97,99,107,32,116,104,101,32,69,114,108,97,110,103,10,32,32,114,117,110,116,105,109,101,46,32,73,110,32,116,104,101,32,101,118,101,110,116,32,111,102,32,114,101,99,101,105,118,105,110,103,32,117,110,115,97,102,101,32,100,97,116,97,44,32,100,101,99,111,100,105,110,103,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,10,32,32,101,114,114,111,114,46,10,10,32,32,84,104,105,115,32,112,114,101,118,101,110,116,115,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,100,105,114,101,99,116,108,121,44,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,105,110,100,105,114,101,99,116,108,121,10,32,32,40,97,115,32,116,104,101,121,32,97,114,101,32,101,109,98,101,100,100,101,100,32,105,110,32,99,101,114,116,97,105,110,32,115,116,114,117,99,116,117,114,101,115,44,32,115,117,99,104,32,97,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,10,32,32,114,101,102,115,44,32,97,110,100,32,102,117,110,115,41,44,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,101,120,116,101,114,110,97,108,32,102,117,110,99,116,105,111,110,32,114,101,102,101,114,101,110,99,101,115,46,32,78,111,110,101,32,111,102,10,32,32,116,104,111,115,101,32,114,101,115,111,117,114,99,101,115,32,97,114,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,44,32,115,111,32,117,110,99,104,101,99,107,101,100,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,109,32,99,97,110,10,32,32,101,120,104,97,117,115,116,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,32,32,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,98,97,100,32,97,114,103,117,109,101,110,116,10,32,32,62,32,104,101,108,108,111,46,10,32,32,104,101,108,108,111,10,32,32,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,32,32,104,101,108,108,111,10,32,32,96,96,96,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,96,115,97,102,101,96,32,111,112,116,105,111,110,32,101,110,115,117,114,101,115,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,108,121,32,112,114,111,99,101,115,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,62,32,98,117,116,32,105,116,32,100,111,101,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,32,116,111,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,46,32,89,111,117,32,109,117,115,116,10,32,32,62,32,97,108,119,97,121,115,32,118,97,108,105,100,97,116,101,32,100,97,116,97,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,46,32,73,102,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,115,116,111,114,101,100,32,111,114,10,32,32,62,32,116,114,97,110,115,105,116,115,32,116,104,114,111,117,103,104,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,121,111,117,32,115,104,111,117,108,100,32,97,108,115,111,32,99,111,110,115,105,100,101,114,10,32,32,62,32,99,114,121,112,116,111,103,114,97,112,104,105,99,97,108,108,121,32,115,105,103,110,105,110,103,32,105,116,46,10,10,45,32,42,42,96,117,115,101,100,96,42,42,32,45,32,67,104,97,110,103,101,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,116,111,32,96,123,84,101,114,109,44,32,85,115,101,100,125,96,32,119,104,101,114,101,32,96,85,115,101,100,96,32,105,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,99,116,117,97,108,108,121,32,114,101,97,100,32,102,114,111,109,32,96,66,105,110,97,114,121,96,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,73,110,112,117,116,32,61,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,44,34,119,111,114,108,100,34,62,62,46,10,32,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,44,49,49,57,44,49,49,49,44,49,49,52,44,49,48,56,44,49,48,48,62,62,10,32,32,62,32,123,84,101,114,109,44,32,85,115,101,100,125,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,73,110,112,117,116,44,32,91,117,115,101,100,93,41,46,10,32,32,123,104,101,108,108,111,44,32,57,125,10,32,32,62,32,115,112,108,105,116,95,98,105,110,97,114,121,40,73,110,112,117,116,44,32,85,115,101,100,41,46,10,32,32,123,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,44,32,60,60,34,119,111,114,108,100,34,62,62,125,10,32,32,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,115,97,102,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,117,110,115,97,102,101,32,100,97,116,97,32,105,115,32,100,101,99,111,100,101,100,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,44,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,44,32,97,110,100,32,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,46>>},#{group => terms,specification => [{attribute,{1303,2},spec,{{binary_to_term,2},[{type,{1303,21},bounded_fun,[{type,{1303,21},'fun',[{type,{1303,21},product,[{var,{1303,22},'Binary'},{var,{1303,30},'Opts'}]},{type,{1303,39},union,[{type,{1303,39},term,[]},{type,{1303,48},tuple,[{type,{1303,49},term,[]},{var,{1303,57},'Used'}]}]}]},[{type,{1304,7},constraint,[{atom,{1304,7},is_subtype},[{var,{1304,7},'Binary'},{user_type,{1304,17},ext_binary,[]}]]},{type,{1305,7},constraint,[{atom,{1305,7},is_subtype},[{var,{1305,7},'Opt'},{type,{1305,14},union,[{atom,{1305,14},safe},{atom,{1305,21},used}]}]]},{type,{1306,7},constraint,[{atom,{1306,7},is_subtype},[{var,{1306,7},'Opts'},{type,{1306,15},list,[{var,{1306,16},'Opt'}]}]]},{type,{1307,7},constraint,[{atom,{1307,7},is_subtype},[{var,{1307,7},'Used'},{type,{1307,15},pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,binary_to_term,1},{1221,2},[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,121,32,111,98,106,101,99,116,32,96,66,105,110,97,114,121,96,44,10,119,104,105,99,104,32,109,117,115,116,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,10,91,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,41,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111,10,96,96,96,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,87,104,101,110,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,116,104,101,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,109,97,121,32,115,117,98,109,105,116,10,62,32,100,97,116,97,32,105,110,32,97,32,119,97,121,32,116,111,32,99,114,101,97,116,101,32,114,101,115,111,117,114,99,101,115,44,32,115,117,99,104,32,97,115,32,97,116,111,109,115,32,97,110,100,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,115,44,32,116,104,97,116,10,62,32,99,97,110,110,111,116,32,98,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,32,97,110,100,32,108,101,97,100,32,116,111,32,68,101,110,105,97,108,32,111,102,32,83,101,114,118,105,99,101,32,97,116,116,97,99,107,46,32,73,110,32,115,117,99,104,10,62,32,99,97,115,101,115,44,32,99,111,110,115,105,100,101,114,32,117,115,105,110,103,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,41,32,119,105,116,104,32,116,104,101,32,96,115,97,102,101,96,10,62,32,111,112,116,105,111,110,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,32,97,110,100,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,46>>},#{group => terms,specification => [{attribute,{1244,2},spec,{{binary_to_term,1},[{type,{1244,21},bounded_fun,[{type,{1244,21},'fun',[{type,{1244,21},product,[{var,{1244,22},'Binary'}]},{type,{1244,33},term,[]}]},[{type,{1245,7},constraint,[{atom,{1245,7},is_subtype},[{var,{1245,7},'Binary'},{user_type,{1245,17},ext_binary,[]}]]}]]}]}}]}},{{function,binary_to_list,3},{1201,2},[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,40,66,105,110,97,114,121,44,32,83,116,97,114,116,44,32,83,116,111,112,41>>],#{<<101,110>> => <<65,115,32,91,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,41,44,32,98,117,116,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32,96,83,116,97,114,116,96,32,116,111,32,112,111,115,105,116,105,111,110,32,96,83,116,111,112,96,32,105,110,32,96,66,105,110,97,114,121,96,46,10,84,104,101,32,112,111,115,105,116,105,111,110,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,97,114,101,32,110,117,109,98,101,114,101,100,32,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,95,84,104,101,32,111,110,101,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,32,102,111,114,32,98,105,110,97,114,105,101,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,78,101,119,10,62,32,99,111,100,101,32,105,115,32,116,111,32,117,115,101,32,96,98,105,110,97,114,121,58,98,105,110,95,116,111,95,108,105,115,116,47,51,96,32,105,110,32,83,84,68,76,73,66,32,105,110,115,116,101,97,100,46,32,65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,10,62,32,109,111,100,117,108,101,32,96,98,105,110,97,114,121,96,32,99,111,110,115,105,115,116,101,110,116,108,121,32,117,115,101,32,122,101,114,111,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,46>>},#{group => terms,specification => [{attribute,{1213,2},spec,{{binary_to_list,3},[{type,{1213,21},bounded_fun,[{type,{1213,21},'fun',[{type,{1213,21},product,[{var,{1213,22},'Binary'},{var,{1213,30},'Start'},{var,{1213,37},'Stop'}]},{type,{1213,46},list,[{type,{1213,47},byte,[]}]}]},[{type,{1214,7},constraint,[{atom,{1214,7},is_subtype},[{var,{1214,7},'Binary'},{type,{1214,17},binary,[]}]]},{type,{1215,7},constraint,[{atom,{1215,7},is_subtype},[{var,{1215,7},'Start'},{type,{1215,16},pos_integer,[]}]]},{type,{1216,7},constraint,[{atom,{1216,7},is_subtype},[{var,{1216,7},'Stop'},{type,{1216,15},pos_integer,[]}]]}]]}]}}]}},{{function,binary_to_list,1},{1193,2},[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32,96,66,105,110,97,114,121,96,46>>},#{group => terms,specification => [{attribute,{1195,2},spec,{{binary_to_list,1},[{type,{1195,21},bounded_fun,[{type,{1195,21},'fun',[{type,{1195,21},product,[{var,{1195,22},'Binary'}]},{type,{1195,33},list,[{type,{1195,34},byte,[]}]}]},[{type,{1196,7},constraint,[{atom,{1196,7},is_subtype},[{var,{1196,7},'Binary'},{type,{1196,17},binary,[]}]]}]]}]}}]}},{{function,binary_to_integer,2},{1015,2},[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,66,105,110,97,114,121,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32,96,66,97,115,101,96,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,51,70,70,34,62,62,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,91,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50,96,41,32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,10,97,115,32,96,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{1032,2},spec,{{binary_to_integer,2},[{type,{1032,24},bounded_fun,[{type,{1032,24},'fun',[{type,{1032,24},product,[{var,{1032,25},'Binary'},{var,{1032,33},'Base'}]},{type,{1032,42},integer,[]}]},[{type,{1033,7},constraint,[{atom,{1033,7},is_subtype},[{var,{1033,7},'Binary'},{type,{1033,17},binary,[]}]]},{type,{1034,7},constraint,[{atom,{1034,7},is_subtype},[{var,{1034,7},'Base'},{type,{1034,15},range,[{integer,{1034,15},2},{integer,{1034,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,1},{980,2},[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,49,50,51,34,62,62,41,46,10,49,50,51,10,96,96,96,10,10,91,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49,96,41,32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,10,97,115,32,96,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{997,2},spec,{{binary_to_integer,1},[{type,{997,24},bounded_fun,[{type,{997,24},'fun',[{type,{997,24},product,[{var,{997,25},'Binary'}]},{type,{997,36},integer,[]}]},[{type,{998,7},constraint,[{atom,{998,7},is_subtype},[{var,{998,7},'Binary'},{type,{998,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_float,1},{956,2},[<<98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,60,60,34,50,46,50,48,49,55,55,54,52,101,43,48,34,62,62,41,46,10,50,46,50,48,49,55,55,54,52,10,96,96,96,10,10,84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,10,91,69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,96,41,32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,10,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>},#{group => terms,specification => [{attribute,{974,2},spec,{{binary_to_float,1},[{type,{974,22},bounded_fun,[{type,{974,22},'fun',[{type,{974,22},product,[{var,{974,23},'Binary'}]},{type,{974,34},float,[]}]},[{type,{975,7},constraint,[{atom,{975,7},is_subtype},[{var,{975,7},'Binary'},{type,{975,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_existing_atom,2},{914,2},[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<65,115,32,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,44,32,98,117,116,32,116,104,101,32,97,116,111,109,32,109,117,115,116,32,101,120,105,115,116,46,10,10,84,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,104,97,115,32,97,32,91,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,32,102,111,114,32,116,104,101,10,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,44,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,10,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,110,111,116,32,115,97,102,101,32,116,111,32,99,114,101,97,116,101,32,109,97,110,121,32,97,116,111,109,115,32,102,114,111,109,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,99,111,109,101,32,102,114,111,109,32,97,110,10,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,105,108,101,32,102,101,116,99,104,101,100,32,102,114,111,109,32,116,104,101,32,73,110,116,101,114,110,101,116,41,44,32,102,111,114,32,101,120,97,109,112,108,101,44,10,117,115,105,110,103,32,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,117,115,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,111,110,32,119,104,101,110,32,116,104,101,10,105,110,112,117,116,32,98,105,110,97,114,121,32,99,111,109,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46,10,10,65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,97,110,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,119,104,101,110,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,111,114,10,119,104,101,110,32,99,114,101,97,116,101,100,32,112,114,111,103,114,97,109,109,97,116,105,99,97,108,108,121,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,98,121,10,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,41,46,32,83,101,101,32,116,104,101,32,110,101,120,116,32,110,111,116,101,32,102,111,114,32,97,110,32,101,120,97,109,112,108,101,32,111,102,10,119,104,101,110,32,97,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,32,102,111,114,32,97,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,98,117,116,32,110,111,116,32,105,110,32,116,104,101,10,99,111,109,112,105,108,101,100,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,109,111,100,117,108,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,97,116,111,109,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,10,62,32,114,101,119,114,105,116,101,32,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,96,34,115,111,109,101,95,97,116,111,109,34,96,46,32,73,102,10,62,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32,96,115,111,109,101,95,97,116,111,109,96,32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,10,62,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,10,62,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,10,62,32,91,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,60,60,34,115,111,109,101,95,97,116,111,109,34,62,62,44,32,117,116,102,56,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,41,10,62,32,119,105,108,108,32,102,97,105,108,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46>>},#{group => terms,specification => [{attribute,{949,2},spec,{{binary_to_existing_atom,2},[{type,{949,30},bounded_fun,[{type,{949,30},'fun',[{type,{949,30},product,[{var,{949,31},'Binary'},{var,{949,39},'Encoding'}]},{type,{949,52},atom,[]}]},[{type,{950,7},constraint,[{atom,{950,7},is_subtype},[{var,{950,7},'Binary'},{type,{950,17},binary,[]}]]},{type,{951,7},constraint,[{atom,{951,7},is_subtype},[{var,{951,7},'Encoding'},{type,{951,19},union,[{atom,{951,19},latin1},{atom,{951,28},unicode},{atom,{951,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_existing_atom,1},{906,1},[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_atom,2},{857,2},[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,32,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,117,116,102,56,96,10,111,114,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,98,105,110,97,114,121,32,109,117,115,116,32,99,111,110,116,97,105,110,32,118,97,108,105,100,32,85,84,70,45,56,32,115,101,113,117,101,110,99,101,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,32,105,115,10,62,32,99,97,112,97,98,108,101,32,111,102,32,100,101,99,111,100,105,110,103,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,119,111,117,108,100,32,102,97,105,108,32,105,102,32,116,104,101,10,62,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,101,100,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,62,32,50,53,53,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,10,62,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,119,104,101,116,104,101,114,10,62,32,91,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,41,32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,10,62,32,116,104,97,110,32,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,10,62,32,105,110,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,34,69,114,108,97,110,103,34,62,62,44,32,108,97,116,105,110,49,41,46,10,39,69,114,108,97,110,103,39,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,49,48,50,52,47,117,116,102,56,62,62,44,32,117,116,102,56,41,46,10,39,208,128,39,10,96,96,96>>},#{group => terms,specification => [{attribute,{894,2},spec,{{binary_to_atom,2},[{type,{894,21},bounded_fun,[{type,{894,21},'fun',[{type,{894,21},product,[{var,{894,22},'Binary'},{var,{894,30},'Encoding'}]},{type,{894,43},atom,[]}]},[{type,{895,7},constraint,[{atom,{895,7},is_subtype},[{var,{895,7},'Binary'},{type,{895,17},binary,[]}]]},{type,{896,7},constraint,[{atom,{896,7},is_subtype},[{var,{896,7},'Encoding'},{type,{896,19},union,[{atom,{896,19},latin1},{atom,{896,28},unicode},{atom,{896,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_atom,1},{849,1},[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_part,3},{840,1},[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,83,116,97,114,116,44,32,76,101,110,103,116,104,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,123,83,116,97,114,116,44,32,76,101,110,103,116,104,125,41>>,since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_part,2},{798,2},[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,80,111,115,76,101,110,41>>],#{<<101,110>> => <<69,120,116,114,97,99,116,115,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,101,115,99,114,105,98,101,100,32,98,121,32,96,80,111,115,76,101,110,96,46,10,10,78,101,103,97,116,105,118,101,32,108,101,110,103,116,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,120,116,114,97,99,116,32,98,121,116,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,98,105,110,97,114,121,46,32,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,44,49,48,62,62,46,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,98,121,116,101,95,115,105,122,101,40,66,105,110,41,44,32,45,53,125,41,46,10,60,60,54,44,55,44,56,44,57,44,49,48,62,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,115,76,101,110,96,32,105,110,32,97,110,121,32,119,97,121,32,114,101,102,101,114,101,110,99,101,115,32,111,117,116,115,105,100,101,32,116,104,101,32,98,105,110,97,114,121,46,10,10,96,83,116,97,114,116,96,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,116,104,97,116,32,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,62,62,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,48,44,50,125,41,46,10,60,60,49,44,50,62,62,10,96,96,96,10,10,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,96,80,111,115,76,101,110,96,32,115,101,109,97,110,116,105,99,115,44,32,115,101,101,32,96,109,58,98,105,110,97,114,121,96,46>>},#{group => terms,specification => [{attribute,{825,2},spec,{{binary_part,2},[{type,{825,18},bounded_fun,[{type,{825,18},'fun',[{type,{825,18},product,[{var,{825,19},'Subject'},{var,{825,28},'PosLen'}]},{type,{825,39},binary,[]}]},[{type,{826,7},constraint,[{atom,{826,7},is_subtype},[{var,{826,7},'Subject'},{type,{826,18},binary,[]}]]},{type,{827,7},constraint,[{atom,{827,7},is_subtype},[{var,{827,7},'PosLen'},{type,{827,17},tuple,[{ann_type,{827,18},[{var,{827,18},'Start'},{type,{827,27},non_neg_integer,[]}]},{ann_type,{827,46},[{var,{827,46},'Length'},{type,{827,56},integer,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,atom_to_list,1},{772,2},[<<97,116,111,109,95,116,111,95,108,105,115,116,40,65,116,111,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,117,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,111,102,32,96,65,116,111,109,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,69,114,108,97,110,103,39,41,46,10,34,69,114,108,97,110,103,34,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,228,189,160,229,165,189,39,41,46,10,91,50,48,51,50,48,44,50,50,57,48,57,93,10,96,96,96,10,10,83,101,101,32,96,109,58,117,110,105,99,111,100,101,96,32,102,111,114,32,104,111,119,32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,116,111,32,100,105,102,102,101,114,101,110,116,32,102,111,114,109,97,116,115,46>>},#{group => terms,specification => [{attribute,{791,2},spec,{{atom_to_list,1},[{type,{791,19},bounded_fun,[{type,{791,19},'fun',[{type,{791,19},product,[{var,{791,20},'Atom'}]},{type,{791,29},string,[]}]},[{type,{792,7},constraint,[{atom,{792,7},is_subtype},[{var,{792,7},'Atom'},{type,{792,15},atom,[]}]]}]]}]}}]}},{{function,atom_to_binary,2},{744,2},[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,65,116,111,109,96,46,10,10,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,108,97,116,105,110,49,96,44,32,111,110,101,32,98,121,116,101,32,101,120,105,115,116,115,32,102,111,114,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,116,101,120,116,10,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,117,116,102,56,96,32,111,114,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,10,117,115,105,110,103,32,85,84,70,45,56,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,114,101,113,117,105,114,101,32,109,117,108,116,105,112,108,101,32,98,121,116,101,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,97,116,111,109,115,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,97,110,100,10,62,32,91,96,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,108,97,116,105,110,49,41,96,93,40,96,97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50,96,41,32,109,97,121,32,102,97,105,108,32,105,102,32,116,104,101,32,116,101,120,116,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,96,65,116,111,109,96,32,99,111,110,116,97,105,110,115,32,97,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,62,32,50,53,53,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,39,69,114,108,97,110,103,39,44,32,108,97,116,105,110,49,41,46,10,60,60,34,69,114,108,97,110,103,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{765,2},spec,{{atom_to_binary,2},[{type,{765,21},bounded_fun,[{type,{765,21},'fun',[{type,{765,21},product,[{var,{765,22},'Atom'},{var,{765,28},'Encoding'}]},{type,{765,41},binary,[]}]},[{type,{766,7},constraint,[{atom,{766,7},is_subtype},[{var,{766,7},'Atom'},{type,{766,15},atom,[]}]]},{type,{767,7},constraint,[{atom,{767,7},is_subtype},[{var,{767,7},'Encoding'},{type,{767,19},union,[{atom,{767,19},latin1},{atom,{767,28},unicode},{atom,{767,38},utf8}]}]]}]]}]}}]}},{{function,atom_to_binary,1},{735,1},[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,41>>],none,#{group => terms,equiv => <<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,append_element,2},{706,2},[<<97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,84,117,112,108,101,49,44,32,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,116,104,97,116,32,104,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,109,111,114,101,32,116,104,97,110,32,96,84,117,112,108,101,49,96,44,32,97,110,100,32,99,111,110,116,97,105,110,115,32,116,104,101,10,101,108,101,109,101,110,116,115,32,105,110,32,96,84,117,112,108,101,49,96,32,102,111,108,108,111,119,101,100,32,98,121,32,96,84,101,114,109,96,32,97,115,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,46,10,10,83,101,109,97,110,116,105,99,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,108,105,115,116,95,116,111,95,116,117,112,108,101,40,116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,49,41,32,43,43,32,91,84,101,114,109,93,41,96,93,40,96,108,105,115,116,95,116,111,95,116,117,112,108,101,47,49,96,41,44,32,98,117,116,32,109,117,99,104,10,102,97,115,116,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,123,111,110,101,44,32,116,119,111,125,44,32,116,104,114,101,101,41,46,10,123,111,110,101,44,116,119,111,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{722,2},spec,{{append_element,2},[{type,{722,21},bounded_fun,[{type,{722,21},'fun',[{type,{722,21},product,[{var,{722,22},'Tuple1'},{var,{722,30},'Term'}]},{var,{722,39},'Tuple2'}]},[{type,{723,7},constraint,[{atom,{723,7},is_subtype},[{var,{723,7},'Tuple1'},{type,{723,17},tuple,any}]]},{type,{724,7},constraint,[{atom,{724,7},is_subtype},[{var,{724,7},'Tuple2'},{type,{724,17},tuple,any}]]},{type,{725,7},constraint,[{atom,{725,7},is_subtype},[{var,{725,7},'Term'},{type,{725,15},term,[]}]]}]]}]}}]}},{{function,adler32_combine,3},{676,2},[<<97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,70,105,114,115,116,65,100,108,101,114,44,32,83,101,99,111,110,100,65,100,108,101,114,44,32,83,101,99,111,110,100,83,105,122,101,41>>],#{<<101,110>> => <<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,115,46,10,10,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,10,116,111,32,98,101,32,107,110,111,119,110,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,89,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,90,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{698,2},spec,{{adler32_combine,3},[{type,{698,22},bounded_fun,[{type,{698,22},'fun',[{type,{698,22},product,[{var,{698,23},'FirstAdler'},{var,{698,35},'SecondAdler'},{var,{698,48},'SecondSize'}]},{type,{698,63},non_neg_integer,[]}]},[{type,{699,7},constraint,[{atom,{699,7},is_subtype},[{var,{699,7},'FirstAdler'},{type,{699,21},non_neg_integer,[]}]]},{type,{700,7},constraint,[{atom,{700,7},is_subtype},[{var,{700,7},'SecondAdler'},{type,{700,22},non_neg_integer,[]}]]},{type,{701,7},constraint,[{atom,{701,7},is_subtype},[{var,{701,7},'SecondSize'},{type,{701,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,adler32,2},{651,2},[<<97,100,108,101,114,51,50,40,79,108,100,65,100,108,101,114,44,32,68,97,116,97,41>>],#{<<101,110>> => <<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,10,96,79,108,100,65,100,108,101,114,96,44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32,96,68,97,116,97,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,88,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,89,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{669,2},spec,{{adler32,2},[{type,{669,14},bounded_fun,[{type,{669,14},'fun',[{type,{669,14},product,[{var,{669,15},'OldAdler'},{var,{669,25},'Data'}]},{type,{669,34},non_neg_integer,[]}]},[{type,{670,7},constraint,[{atom,{670,7},is_subtype},[{var,{670,7},'OldAdler'},{type,{670,19},non_neg_integer,[]}]]},{type,{671,7},constraint,[{atom,{671,7},is_subtype},[{var,{671,7},'Data'},{type,{671,15},iodata,[]}]]}]]}]}}]}},{{function,adler32,1},{643,2},[<<97,100,108,101,114,51,50,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,102,111,114,32,96,68,97,116,97,96,46>>},#{group => checksum,specification => [{attribute,{645,2},spec,{{adler32,1},[{type,{645,14},bounded_fun,[{type,{645,14},'fun',[{type,{645,14},product,[{var,{645,15},'Data'}]},{type,{645,24},non_neg_integer,[]}]},[{type,{646,7},constraint,[{atom,{646,7},is_subtype},[{var,{646,7},'Data'},{type,{646,15},iodata,[]}]]}]]}]}}]}}]}. \ No newline at end of file +{docs_v1,{21,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,#{<<101,110>> => <<84,104,101,32,69,114,108,97,110,103,32,66,73,70,115,32,97,110,100,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,46,10,10,66,121,32,99,111,110,118,101,110,116,105,111,110,44,32,109,111,115,116,32,91,66,117,105,108,116,45,73,110,32,70,117,110,99,116,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,102,117,110,99,116,105,111,110,115,46,109,100,35,98,117,105,108,116,45,105,110,45,102,117,110,99,116,105,111,110,115,45,98,105,102,115,96,41,10,40,66,73,70,115,41,32,97,110,100,32,97,108,108,32,91,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,93,40,96,101,58,115,121,115,116,101,109,58,116,121,112,101,115,112,101,99,46,109,100,35,112,114,101,100,101,102,105,110,101,100,96,41,32,97,114,101,32,105,110,99,108,117,100,101,100,10,105,110,32,116,104,105,115,32,109,111,100,117,108,101,46,32,83,111,109,101,32,111,102,32,116,104,101,32,66,73,70,115,32,97,110,100,32,97,108,108,32,111,102,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,32,118,105,101,119,101,100,32,109,111,114,101,10,111,114,32,108,101,115,115,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,32,97,110,100,32,97,114,101,32,95,97,117,116,111,45,105,109,112,111,114,116,101,100,95,46,10,84,104,117,115,44,32,105,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,97,108,108,115,10,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,97,110,100,32,91,96,101,114,108,97,110,103,58,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,10,97,114,101,32,105,100,101,110,116,105,99,97,108,46,10,10,65,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,97,110,110,111,116,97,116,101,100,32,119,105,116,104,32,96,97,117,116,111,45,105,109,112,111,114,116,101,100,96,32,97,110,100,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,10,97,110,110,111,116,97,116,101,100,32,119,105,116,104,32,96,112,114,101,100,101,102,105,110,101,100,96,46,10,10,83,111,109,101,32,97,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,97,108,115,111,32,97,108,108,111,119,101,100,32,105,110,32,91,103,117,97,114,100,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,103,117,97,114,100,45,101,120,112,114,101,115,115,105,111,110,115,96,41,46,10,83,117,99,104,32,66,73,70,115,32,97,114,101,32,97,110,110,111,116,101,100,32,119,105,116,104,32,98,111,116,104,32,96,97,117,116,111,45,105,109,112,111,114,116,101,100,96,32,97,110,100,32,96,103,117,97,114,100,45,98,105,102,96,46,10,10,66,73,70,115,32,99,97,110,32,102,97,105,108,32,102,111,114,32,118,97,114,105,111,117,115,32,114,101,97,115,111,110,115,46,32,65,108,108,32,66,73,70,115,32,102,97,105,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,121,10,97,114,101,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,115,32,111,102,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,46,32,84,104,101,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,10,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,101,97,99,104,32,105,110,100,105,118,105,100,117,97,108,32,66,73,70,46>>},#{otp_doc_vsn => {1,0,0}},[{{type,memory_type,0},{12124,2},[<<109,101,109,111,114,121,95,116,121,112,101,40,41>>],none,#{exported => false}},{{type,send_destination,0},{10963,2},[<<115,101,110,100,95,100,101,115,116,105,110,97,116,105,111,110,40,41>>],#{<<101,110>> => <<84,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,102,111,114,32,97,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,46,10,10,84,104,105,115,32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,32,114,101,102,101,114,101,110,99,101,10,100,101,110,111,116,105,110,103,32,97,32,112,114,111,99,101,115,115,32,97,108,105,97,115,44,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,96,10,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>},#{exported => true,specification => [{attribute,{10970,2},type,{send_destination,{type,{10970,29},union,[{type,{10970,29},pid,[]},{type,{10971,29},reference,[]},{type,{10972,29},port,[]},{ann_type,{10973,30},[{var,{10973,30},'RegName'},{type,{10973,41},atom,[]}]},{type,{10974,29},tuple,[{ann_type,{10974,30},[{var,{10974,30},'RegName'},{type,{10974,41},atom,[]}]},{ann_type,{10974,49},[{var,{10974,49},'Node'},{type,{10974,57},node,[]}]}]}]},[]}}]}},{{type,spawn_opt_option,0},{9936,2},[<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110,40,41>>],#{<<101,110>> => <<79,112,116,105,111,110,115,32,102,111,114,32,91,96,115,112,97,119,110,95,111,112,116,40,41,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,46>>},#{exported => true,specification => [{attribute,{9937,2},type,{spawn_opt_option,{type,{9938,2},union,[{atom,{9938,2},link},{atom,{9939,9},monitor},{type,{9940,9},tuple,[{atom,{9940,10},monitor},{ann_type,{9940,19},[{var,{9940,19},'MonitorOpts'},{type,{9940,34},list,[{user_type,{9940,35},monitor_option,[]}]}]}]},{type,{9941,9},tuple,[{atom,{9941,10},priority},{ann_type,{9941,20},[{var,{9941,20},'Level'},{user_type,{9941,29},priority_level,[]}]}]},{type,{9942,9},tuple,[{atom,{9942,10},fullsweep_after},{ann_type,{9942,27},[{var,{9942,27},'Number'},{type,{9942,37},non_neg_integer,[]}]}]},{type,{9943,9},tuple,[{atom,{9943,10},min_heap_size},{ann_type,{9943,25},[{var,{9943,25},'Size'},{type,{9943,33},non_neg_integer,[]}]}]},{type,{9944,9},tuple,[{atom,{9944,10},min_bin_vheap_size},{ann_type,{9944,30},[{var,{9944,30},'VSize'},{type,{9944,39},non_neg_integer,[]}]}]},{type,{9945,9},tuple,[{atom,{9945,10},max_heap_size},{ann_type,{9945,25},[{var,{9945,25},'Size'},{user_type,{9945,33},max_heap_size,[]}]}]},{type,{9946,9},tuple,[{atom,{9946,10},message_queue_data},{ann_type,{9946,30},[{var,{9946,30},'MQD'},{user_type,{9946,37},message_queue_data,[]}]}]},{type,{9947,9},tuple,[{atom,{9947,10},async_dist},{ann_type,{9947,22},[{var,{9947,22},'Enabled'},{type,{9947,33},boolean,[]}]}]}]},[]}}]}},{{type,max_heap_size,0},{9924,2},[<<109,97,120,95,104,101,97,112,95,115,105,122,101,40,41>>],#{<<101,110>> => <<80,114,111,99,101,115,115,32,109,97,120,32,104,101,97,112,32,115,105,122,101,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41>>},#{exported => true,specification => [{attribute,{9928,2},type,{max_heap_size,{ann_type,{9929,9},[{var,{9929,9},'Size'},{type,{9929,17},union,[{type,{9929,17},non_neg_integer,[]},{type,{9931,9},map,[{type,{9931,17},map_field_assoc,[{atom,{9931,12},size},{type,{9931,20},non_neg_integer,[]}]},{type,{9932,17},map_field_assoc,[{atom,{9932,12},kill},{type,{9932,20},boolean,[]}]},{type,{9933,25},map_field_assoc,[{atom,{9933,12},error_logger},{type,{9933,28},boolean,[]}]},{type,{9934,36},map_field_assoc,[{atom,{9934,12},include_shared_binaries},{type,{9934,39},boolean,[]}]}]}]}]},[]}}]}},{{type,garbage_collection_defaults,0},{9606,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,100,101,102,97,117,108,116,115,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,119,105,116,104,32,116,104,101,32,115,121,115,116,101,109,32,119,105,100,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,100,101,102,97,117,108,116,115,46>>},#{exported => false,specification => [{attribute,{9607,2},type,{garbage_collection_defaults,{type,{9607,40},list,[{type,{9607,41},union,[{type,{9607,41},tuple,[{atom,{9607,42},max_heap_size},{type,{9607,57},non_neg_integer,[]}]},{type,{9608,41},tuple,[{atom,{9608,42},min_bin_vheap_size},{type,{9608,62},non_neg_integer,[]}]},{type,{9609,41},tuple,[{atom,{9609,42},min_heap_size},{type,{9609,57},non_neg_integer,[]}]},{type,{9610,41},tuple,[{atom,{9610,42},fullsweep_after},{type,{9610,59},non_neg_integer,[]}]}]}]},[]}}]}},{{type,info_list,0},{9603,2},[<<105,110,102,111,95,108,105,115,116,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9604,2},type,{info_list,{type,{9604,22},nil,[]},[]}}]}},{{type,sub_level,0},{9600,2},[<<115,117,98,95,108,101,118,101,108,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9601,2},type,{sub_level,{type,{9601,22},union,[{type,{9601,22},list,[{ann_type,{9601,23},[{var,{9601,23},'LevelEntry'},{user_type,{9601,37},level_entry,[]}]}]},{ann_type,{9602,23},[{var,{9602,23},'LogicalCpuId'},{type,{9602,39},tuple,[{atom,{9602,40},logical},{type,{9602,49},non_neg_integer,[]}]}]}]},[]}}]}},{{type,level_tag,0},{9598,2},[<<108,101,118,101,108,95,116,97,103,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9599,2},type,{level_tag,{type,{9599,22},union,[{atom,{9599,22},core},{atom,{9599,29},node},{atom,{9599,36},processor},{atom,{9599,48},thread}]},[]}}]}},{{type,level_entry,0},{9592,2},[<<108,101,118,101,108,95,101,110,116,114,121,40,41>>],#{<<101,110>> => <<>>},#{exported => false,specification => [{attribute,{9593,2},type,{level_entry,{type,{9594,9},union,[{type,{9594,9},tuple,[{ann_type,{9594,10},[{var,{9594,10},'LevelTag'},{user_type,{9594,22},level_tag,[]}]},{ann_type,{9594,35},[{var,{9594,35},'SubLevel'},{user_type,{9594,47},sub_level,[]}]}]},{type,{9595,9},tuple,[{ann_type,{9595,10},[{var,{9595,10},'LevelTag'},{user_type,{9595,22},level_tag,[]}]},{ann_type,{9596,10},[{var,{9596,10},'InfoList'},{user_type,{9596,22},info_list,[]}]},{ann_type,{9597,10},[{var,{9597,10},'SubLevel'},{user_type,{9597,22},sub_level,[]}]}]}]},[]}}]}},{{type,cpu_topology,0},{9572,2},[<<99,112,117,95,116,111,112,111,108,111,103,121,40,41>>],#{<<101,110>> => <<84,104,101,32,99,117,114,114,101,110,116,32,99,112,117,32,116,111,112,111,108,111,103,121,46,10,10,96,110,111,100,101,96,32,114,101,102,101,114,115,32,116,111,32,78,111,110,45,85,110,105,102,111,114,109,32,77,101,109,111,114,121,32,65,99,99,101,115,115,32,40,78,85,77,65,41,32,110,111,100,101,115,46,32,96,116,104,114,101,97,100,96,32,114,101,102,101,114,115,10,116,111,32,104,97,114,100,119,97,114,101,32,116,104,114,101,97,100,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,73,110,116,101,108,32,104,121,112,101,114,45,116,104,114,101,97,100,115,41,46,10,10,65,32,108,101,118,101,108,32,105,110,32,116,101,114,109,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,99,97,110,32,98,101,32,111,109,105,116,116,101,100,32,105,102,32,111,110,108,121,32,111,110,101,32,101,110,116,114,121,32,101,120,105,115,116,115,32,97,110,100,10,96,73,110,102,111,76,105,115,116,96,32,105,115,32,101,109,112,116,121,46,10,10,96,116,104,114,101,97,100,96,32,99,97,110,32,111,110,108,121,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32,96,99,111,114,101,96,46,32,96,99,111,114,101,96,32,99,97,110,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,10,96,112,114,111,99,101,115,115,111,114,96,32,111,114,32,96,110,111,100,101,96,46,32,96,112,114,111,99,101,115,115,111,114,96,32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,10,96,110,111,100,101,96,46,32,96,110,111,100,101,96,32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32,96,112,114,111,99,101,115,115,111,114,96,46,32,84,104,97,116,10,105,115,44,32,78,85,77,65,32,110,111,100,101,115,32,99,97,110,32,98,101,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,111,114,32,112,114,111,99,101,115,115,111,114,32,101,120,116,101,114,110,97,108,46,32,65,32,67,80,85,10,116,111,112,111,108,111,103,121,32,99,97,110,32,99,111,110,115,105,115,116,32,111,102,32,97,32,109,105,120,32,111,102,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,78,85,77,65,32,110,111,100,101,115,44,10,97,115,32,108,111,110,103,32,97,115,32,101,97,99,104,32,108,111,103,105,99,97,108,32,67,80,85,32,98,101,108,111,110,103,115,32,116,111,32,95,111,110,101,95,32,78,85,77,65,32,110,111,100,101,46,32,67,97,99,104,101,32,104,105,101,114,97,114,99,104,121,32,105,115,10,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,116,121,112,101,44,32,98,117,116,32,119,105,108,108,32,98,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,79,116,104,101,114,10,116,104,105,110,103,115,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,105,116,32,105,110,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,83,111,44,32,101,120,112,101,99,116,10,116,104,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,116,121,112,101,32,116,111,32,99,104,97,110,103,101,46>>},#{exported => false,specification => [{attribute,{9590,2},type,{cpu_topology,{type,{9591,9},union,[{type,{9591,9},list,[{ann_type,{9591,10},[{var,{9591,10},'LevelEntry'},{user_type,{9591,24},level_entry,[]}]}]},{atom,{9591,41},undefined}]},[]}}]}},{{type,trace_pattern_flag,0},{9506,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,trace_match_spec,0},{9485,2},[<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99,40,41>>],none,#{exported => false}},{{type,trace_pattern_mfa,0},{9483,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97,40,41>>],none,#{exported => false}},{{type,match_variable,0},{9482,2},[<<109,97,116,99,104,95,118,97,114,105,97,98,108,101,40,41>>],none,#{exported => false}},{{type,scheduler_bind_type,0},{8690,2},[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41>>],#{<<101,110>> => <<84,104,101,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,46>>},#{exported => false,specification => [{attribute,{8691,2},type,{scheduler_bind_type,{type,{8692,7},union,[{atom,{8692,7},no_node_processor_spread},{atom,{8693,7},no_node_thread_spread},{atom,{8694,7},no_spread},{atom,{8695,7},processor_spread},{atom,{8696,7},spread},{atom,{8697,7},thread_spread},{atom,{8698,7},thread_no_node_processor_spread},{atom,{8699,7},unbound}]},[]}}]}},{{type,stack_item,0},{7732,2},[<<115,116,97,99,107,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,process_info_result_item,0},{7682,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,process_info_item,0},{7644,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,message_queue_data,0},{7298,2},[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41>>],#{<<101,110>> => <<83,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,80,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,100,97,116,97,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41>>},#{exported => true,specification => [{attribute,{7305,2},type,{message_queue_data,{type,{7306,2},union,[{atom,{7306,2},off_heap},{atom,{7306,13},on_heap}]},[]}}]}},{{type,priority_level,0},{7291,2},[<<112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41>>],#{<<101,110>> => <<80,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,10,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41>>},#{exported => true,specification => [{attribute,{7295,2},type,{priority_level,{type,{7296,7},union,[{atom,{7296,7},low},{atom,{7296,13},normal},{atom,{7296,22},high},{atom,{7296,29},max}]},[]}}]}},{{type,monitor_option,0},{4195,2},[<<109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41>>],#{<<101,110>> => <<83,101,101,32,96,109,111,110,105,116,111,114,47,51,96,46>>},#{exported => true,specification => [{attribute,{4196,2},type,{monitor_option,{type,{4196,27},union,[{type,{4196,27},tuple,[{atom,{4196,28},alias},{type,{4196,37},union,[{atom,{4196,37},explicit_unalias},{atom,{4196,58},demonitor},{atom,{4196,72},reply_demonitor}]}]},{type,{4197,27},tuple,[{atom,{4197,28},tag},{type,{4197,35},term,[]}]}]},[]}}]}},{{type,monitor_port_identifier,0},{4194,2},[<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,monitor_process_identifier,0},{4193,2},[<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,registered_process_identifier,0},{4192,2},[<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114,40,41>>],none,#{exported => false}},{{type,registered_name,0},{4191,2},[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,40,41>>],none,#{exported => false}},{{type,halt_options,0},{3186,2},[<<104,97,108,116,95,111,112,116,105,111,110,115,40,41>>],none,#{exported => false}},{{type,trace_info_return,0},{633,2},[<<116,114,97,99,101,95,105,110,102,111,95,114,101,116,117,114,110,40,41>>],none,#{exported => false}},{{type,trace_info_flag,0},{617,2},[<<116,114,97,99,101,95,105,110,102,111,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,trace_info_item_result,0},{607,2},[<<116,114,97,99,101,95,105,110,102,111,95,105,116,101,109,95,114,101,115,117,108,116,40,41>>],none,#{exported => false}},{{type,trace_flag,0},{581,2},[<<116,114,97,99,101,95,102,108,97,103,40,41>>],none,#{exported => false}},{{type,bitstring_list,0},{578,2},[<<98,105,116,115,116,114,105,110,103,95,108,105,115,116,40,41>>],none,#{exported => false}},{{type,raise_stacktrace,0},{569,2},[<<114,97,105,115,101,95,115,116,97,99,107,116,114,97,99,101,40,41>>],#{<<101,110>> => <<65,32,101,120,116,101,110,100,101,100,32,96,116,58,115,116,97,99,107,116,114,97,99,101,47,48,96,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,96,114,97,105,115,101,47,51,96,46>>},#{exported => true,specification => [{attribute,{572,2},type,{raise_stacktrace,{type,{573,7},union,[{type,{573,7},list,[{type,{573,8},union,[{type,{573,8},tuple,[{type,{573,9},module,[]},{type,{573,19},atom,[]},{type,{573,27},union,[{type,{573,27},arity,[]},{type,{573,37},list,[{type,{573,38},term,[]}]}]}]},{type,{574,8},tuple,[{type,{574,9},function,[]},{type,{574,21},union,[{type,{574,21},arity,[]},{type,{574,31},list,[{type,{574,32},term,[]}]}]}]}]}]},{user_type,{575,9},stacktrace,[]}]},[]}}]}},{{type,system_monitor_option,0},{560,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,system_profile_option,0},{551,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,fun_info_item,0},{533,2},[<<102,117,110,95,105,110,102,111,95,105,116,101,109,40,41>>],none,#{exported => false}},{{type,iovec,0},{396,2},[<<105,111,118,101,99,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,102,117,108,32,116,111,32,117,115,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,10,91,96,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,96,93,40,101,114,108,95,110,105,102,46,109,100,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,41,46>>},#{exported => true,specification => [{attribute,{400,2},type,{iovec,{type,{400,18},list,[{type,{400,19},binary,[]}]},[]}}]}},{{type,dist_handle,0},{392,2},[<<100,105,115,116,95,104,97,110,100,108,101,40,41>>],#{<<101,110>> => <<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>},#{exported => true,specification => [{attribute,{393,2},opaque,{dist_handle,{type,{393,26},atom,[]},[]}}]}},{{type,nif_resource,0},{385,2},[<<110,105,102,95,114,101,115,111,117,114,99,101,40,41>>],#{<<101,110>> => <<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,10,91,78,73,70,32,114,101,115,111,117,114,99,101,32,111,98,106,101,99,116,32,93,40,101,114,108,95,110,105,102,46,109,100,35,114,101,115,111,117,114,99,101,95,111,98,106,101,99,116,115,41,46>>},#{exported => true,specification => [{attribute,{389,2},opaque,{nif_resource,{type,{389,27},reference,[]},[]}}]}},{{type,prepared_code,0},{382,2},[<<112,114,101,112,97,114,101,100,95,99,111,100,101,40,41>>],none,#{exported => true}},{{type,deprecated_time_unit,0},{364,2},[<<100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41>>],#{<<101,110>> => <<84,104,101,32,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,32,116,121,112,101,32,97,108,115,111,32,99,111,110,115,105,115,116,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,95,100,101,112,114,101,99,97,116,101,100,95,32,115,121,109,98,111,108,105,99,10,116,105,109,101,32,117,110,105,116,115,58,10,10,45,32,42,42,96,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,109,105,108,108,105,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,109,105,108,108,105,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,109,105,99,114,111,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,109,105,99,114,111,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,45,32,42,42,96,110,97,110,111,95,115,101,99,111,110,100,115,96,42,42,32,45,32,83,97,109,101,32,97,115,32,91,96,110,97,110,111,115,101,99,111,110,100,96,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46>>},#{exported => true,specification => [{attribute,{376,2},type,{deprecated_time_unit,{type,{377,7},union,[{atom,{377,7},seconds},{atom,{378,9},milli_seconds},{atom,{379,9},micro_seconds},{atom,{380,9},nano_seconds}]},[]}}]}},{{type,time_unit,0},{295,2},[<<116,105,109,101,95,117,110,105,116,40,41>>],#{<<101,110>> => <<84,104,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,101,114,108,97,110,103,32,116,105,109,101,32,65,80,73,115,46,10,10,83,117,112,112,111,114,116,101,100,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,58,10,10,45,32,42,42,96,80,97,114,116,115,80,101,114,83,101,99,111,110,100,32,58,58,32,105,110,116,101,103,101,114,40,41,32,62,61,32,49,96,42,42,32,45,32,84,105,109,101,32,117,110,105,116,32,101,120,112,114,101,115,115,101,100,32,105,110,32,112,97,114,116,115,32,112,101,114,10,32,32,115,101,99,111,110,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,101,113,117,97,108,115,32,96,49,47,80,97,114,116,115,80,101,114,83,101,99,111,110,100,96,32,115,101,99,111,110,100,46,10,10,45,32,42,42,96,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,105,110,116,101,103,101,114,32,96,49,96,46,10,10,45,32,42,42,96,109,105,108,108,105,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,10,32,32,116,104,101,32,105,110,116,101,103,101,114,32,96,49,48,48,48,96,46,10,10,45,32,42,42,96,109,105,99,114,111,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,10,32,32,116,104,101,32,105,110,116,101,103,101,114,32,96,49,48,48,48,95,48,48,48,96,46,10,10,45,32,42,42,96,110,97,110,111,115,101,99,111,110,100,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,105,110,116,101,103,101,114,32,96,49,48,48,48,95,48,48,48,95,48,48,48,96,46,10,10,45,32,42,42,96,110,97,116,105,118,101,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,110,97,116,105,118,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,44,32,97,110,100,32,114,101,109,97,105,110,115,32,116,104,101,10,32,32,115,97,109,101,32,117,110,116,105,108,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,101,114,109,105,110,97,116,101,115,46,32,73,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,111,112,112,101,100,32,97,110,100,10,32,32,116,104,101,110,32,115,116,97,114,116,101,100,32,97,103,97,105,110,32,40,101,118,101,110,32,111,110,32,116,104,101,32,115,97,109,101,32,109,97,99,104,105,110,101,41,44,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,10,32,32,110,101,119,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,97,110,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,111,108,100,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,10,10,32,32,79,110,101,32,99,97,110,32,103,101,116,32,97,110,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,49,44,32,115,101,99,111,110,100,44,32,110,97,116,105,118,101,41,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,46,32,84,104,101,10,32,32,114,101,115,117,108,116,32,101,113,117,97,108,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,32,100,111,101,115,32,110,111,116,32,97,100,100,32,117,112,32,116,111,32,97,32,119,104,111,108,101,32,110,117,109,98,101,114,44,10,32,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,100,111,119,110,119,97,114,100,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,103,105,118,101,115,32,121,111,117,32,109,111,114,101,32,111,114,32,108,101,115,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,62,32,97,98,111,117,116,32,116,104,101,32,113,117,97,108,105,116,121,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,73,116,32,115,101,116,115,32,97,32,108,105,109,105,116,32,102,111,114,32,116,104,101,10,32,32,62,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,97,110,100,32,102,111,114,32,116,104,101,10,32,32,62,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,44,32,98,117,116,32,105,116,32,103,105,118,101,115,10,32,32,62,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,102,10,32,32,62,32,116,105,109,101,32,118,97,108,117,101,115,46,32,84,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,10,32,32,62,32,116,105,109,101,32,118,97,108,117,101,115,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,46,10,10,45,32,42,42,96,112,101,114,102,95,99,111,117,110,116,101,114,96,42,42,32,45,32,83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,99,111,117,110,116,101,114,32,116,105,109,101,10,32,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,96,112,101,114,102,95,99,111,117,110,116,101,114,96,32,116,105,109,101,32,117,110,105,116,32,98,101,104,97,118,101,115,32,109,117,99,104,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,96,110,97,116,105,118,101,96,32,116,105,109,101,10,32,32,117,110,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,114,117,110,116,105,109,101,32,114,101,115,116,97,114,116,115,46,32,84,111,32,103,101,116,32,118,97,108,117,101,115,32,111,102,32,116,104,105,115,10,32,32,116,121,112,101,44,32,99,97,108,108,32,96,111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48,96,46,10,10,45,32,42,42,96,116,58,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,47,48,96,42,42,32,45,10,32,32,68,101,112,114,101,99,97,116,101,100,32,115,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,84,104,101,32,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,32,116,121,112,101,32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,111,32,99,111,110,118,101,114,116,32,116,105,109,101,32,118,97,108,117,101,115,32,98,101,116,119,101,101,110,32,116,105,109,101,10,117,110,105,116,115,44,32,117,115,101,32,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,46>>},#{exported => true,specification => [{attribute,{353,2},type,{time_unit,{type,{354,2},union,[{type,{354,2},pos_integer,[]},{atom,{355,9},second},{atom,{356,9},millisecond},{atom,{357,9},microsecond},{atom,{358,9},nanosecond},{atom,{359,9},native},{atom,{360,9},perf_counter},{user_type,{361,9},deprecated_time_unit,[]}]},[]}}]}},{{type,timestamp,0},{290,2},[<<116,105,109,101,115,116,97,109,112,40,41>>],#{<<101,110>> => <<83,101,101,32,91,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,47,48,96,93,40,96,116,105,109,101,115,116,97,109,112,47,48,96,41,46>>},#{exported => true,specification => [{attribute,{291,2},type,{timestamp,{type,{291,22},tuple,[{ann_type,{291,23},[{var,{291,23},'MegaSecs'},{type,{291,35},non_neg_integer,[]}]},{ann_type,{292,23},[{var,{292,23},'Secs'},{type,{292,31},non_neg_integer,[]}]},{ann_type,{293,23},[{var,{293,23},'MicroSecs'},{type,{293,36},non_neg_integer,[]}]}]},[]}}]}},{{type,ext_iovec,0},{285,2},[<<101,120,116,95,105,111,118,101,99,40,41>>],#{<<101,110>> => <<65,32,116,101,114,109,32,111,102,32,116,121,112,101,32,96,116,58,105,111,118,101,99,47,48,96,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,10,102,111,114,109,97,116,46>>},#{exported => false,specification => [{attribute,{289,2},type,{ext_iovec,{user_type,{289,22},iovec,[]},[]}}]}},{{type,ext_binary,0},{283,2},[<<101,120,116,95,98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>},#{exported => false,specification => [{attribute,{284,2},type,{ext_binary,{type,{284,23},binary,[]},[]}}]}},{{type,stacktrace,0},{274,2},[<<115,116,97,99,107,116,114,97,99,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,115,116,97,99,107,116,114,97,99,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,98,121,10,91,69,114,114,111,114,115,32,97,110,100,32,69,114,114,111,114,32,72,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,115,116,97,99,107,116,114,97,99,101,96,41,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,46>>},#{exported => true,specification => [{attribute,{279,2},type,{stacktrace,{type,{279,23},list,[{type,{279,24},union,[{type,{279,24},tuple,[{type,{279,25},module,[]},{type,{279,35},atom,[]},{type,{279,43},union,[{type,{279,43},arity,[]},{type,{279,53},list,[{type,{279,54},term,[]}]}]},{type,{280,25},list,[{user_type,{280,26},stacktrace_extrainfo,[]}]}]},{type,{281,24},tuple,[{type,{281,25},function,[]},{type,{281,37},union,[{type,{281,37},arity,[]},{type,{281,47},list,[{type,{281,48},term,[]}]}]},{type,{281,57},list,[{user_type,{281,58},stacktrace_extrainfo,[]}]}]}]}]},[]}}]}},{{type,stacktrace_extrainfo,0},{269,2},[<<115,116,97,99,107,116,114,97,99,101,95,101,120,116,114,97,105,110,102,111,40,41>>],none,#{exported => false}},{{type,tuple,0},{246,2},[<<116,117,112,108,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,116,117,112,108,101,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,116,117,112,108,101,96,41,46>>},#{exported => true,specification => [{attribute,{247,2},type,{tuple,{type,{247,18},tuple,any},[]}}]}},{{type,timeout,0},{241,2},[<<116,105,109,101,111,117,116,40,41>>],#{<<101,110>> => <<65,32,116,105,109,101,111,117,116,32,118,97,108,117,101,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,97,10,91,114,101,99,101,105,118,101,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,114,101,99,101,105,118,101,96,41,46>>},#{exported => true,specification => [{attribute,{245,2},type,{timeout,{type,{245,20},union,[{atom,{245,20},infinity},{type,{245,33},non_neg_integer,[]}]},[]}}]}},{{type,term,0},{239,2},[<<116,101,114,109,40,41>>],#{<<101,110>> => <<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32,96,116,58,97,110,121,47,48,96,46>>},#{exported => true,specification => [{attribute,{240,2},type,{term,{type,{240,17},any,[]},[]}}]}},{{type,string,0},{234,2},[<<115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,105,115,116,32,111,102,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,117,110,105,99,111,100,101,10,99,111,100,101,112,111,105,110,116,115,46>>},#{exported => true,specification => [{attribute,{238,2},type,{string,{type,{238,19},list,[{type,{238,20},char,[]}]},[]}}]}},{{type,reference,0},{232,2},[<<114,101,102,101,114,101,110,99,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,114,101,102,101,114,101,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,114,101,102,101,114,101,110,99,101,96,41,46>>},#{exported => true,specification => [{attribute,{233,2},type,{reference,{type,{233,22},reference,[]},[]}}]}},{{type,pos_integer,0},{230,2},[<<112,111,115,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,110,32,105,110,116,101,103,101,114,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46>>},#{exported => true,specification => [{attribute,{231,2},type,{pos_integer,{type,{231,24},pos_integer,[]},[]}}]}},{{type,port,0},{228,2},[<<112,111,114,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,112,111,114,116,45,105,100,101,110,116,105,102,105,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{229,2},type,{port,{type,{229,17},port,[]},[]}}]}},{{type,pid,0},{226,2},[<<112,105,100,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,112,105,100,96,41,46>>},#{exported => true,specification => [{attribute,{227,2},type,{pid,{type,{227,16},pid,[]},[]}}]}},{{type,number,0},{224,2},[<<110,117,109,98,101,114,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,110,117,109,98,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{225,2},type,{number,{type,{225,19},union,[{type,{225,19},integer,[]},{type,{225,31},float,[]}]},[]}}]}},{{type,nonempty_string,0},{222,2},[<<110,111,110,101,109,112,116,121,95,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,96,116,58,115,116,114,105,110,103,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,99,104,97,114,97,99,116,101,114,115,46>>},#{exported => true,specification => [{attribute,{223,2},type,{nonempty_string,{type,{223,28},nonempty_list,[{type,{223,42},char,[]}]},[]}}]}},{{type,nonempty_maybe_improper_list,2},{217,2},[<<110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41,93,40,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,41,10,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{221,2},type,{nonempty_maybe_improper_list,{type,{221,69},nonempty_maybe_improper_list,[{var,{221,98},'ContentType'},{var,{221,111},'TerminationType'}]},[{var,{221,36},'ContentType'},{var,{221,49},'TerminationType'}]}}]}},{{type,nonempty_maybe_improper_list,0},{215,2},[<<110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{216,2},type,{nonempty_maybe_improper_list,{type,{216,41},nonempty_maybe_improper_list,[{type,{216,70},any,[]},{type,{216,77},any,[]}]},[]}}]}},{{type,nonempty_list,1},{213,2},[<<110,111,110,101,109,112,116,121,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41,93,40,96,116,58,108,105,115,116,47,48,96,41,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{214,2},type,{nonempty_list,{type,{214,37},nonempty_list,[{var,{214,38},'ContentType'}]},[{var,{214,21},'ContentType'}]}}]}},{{type,nonempty_list,0},{211,2},[<<110,111,110,101,109,112,116,121,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,96,116,58,108,105,115,116,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{212,2},type,{nonempty_list,{type,{212,26},nonempty_list,[{type,{212,40},any,[]}]},[]}}]}},{{type,nonempty_improper_list,2},{208,2},[<<110,111,110,101,109,112,116,121,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,32,91,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,50,93,40,96,116,58,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,48,96,41,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>},#{exported => true,specification => [{attribute,{209,2},type,{nonempty_improper_list,{type,{210,9},nonempty_improper_list,[{var,{210,32},'ContentType'},{var,{210,45},'TerminationType'}]},[{var,{209,30},'ContentType'},{var,{209,43},'TerminationType'}]}}]}},{{type,nonempty_bitstring,0},{206,2},[<<110,111,110,101,109,112,116,121,95,98,105,116,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,32,96,116,58,98,105,116,115,116,114,105,110,103,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>},#{exported => true,specification => [{attribute,{207,2},type,{nonempty_bitstring,{type,{207,31},binary,[{integer,{207,35},1},{integer,{207,42},1}]},[]}}]}},{{type,nonempty_binary,0},{204,2},[<<110,111,110,101,109,112,116,121,95,98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,32,96,116,58,98,105,110,97,114,121,47,48,96,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>},#{exported => true,specification => [{attribute,{205,2},type,{nonempty_binary,{type,{205,28},binary,[{integer,{205,32},8},{integer,{205,39},8}]},[]}}]}},{{type,none,0},{197,2},[<<110,111,110,101,40,41>>],#{<<101,110>> => <<84,104,105,115,32,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,95,110,101,118,101,114,95,32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,59,32,116,104,97,116,32,105,115,10,105,116,32,119,105,108,108,32,95,97,108,119,97,121,115,95,32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46,10,10,73,110,32,97,32,115,112,101,99,44,32,117,115,101,32,96,116,58,110,111,95,114,101,116,117,114,110,47,48,96,32,102,111,114,32,116,104,101,32,115,97,107,101,32,111,102,32,99,108,97,114,105,116,121,46>>},#{exported => true,specification => [{attribute,{203,2},type,{none,{type,{203,17},none,[]},[]}}]}},{{type,non_neg_integer,0},{195,2},[<<110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,97,110,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,111,114,32,48,46>>},#{exported => true,specification => [{attribute,{196,2},type,{non_neg_integer,{type,{196,28},non_neg_integer,[]},[]}}]}},{{type,node,0},{193,2},[<<110,111,100,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,110,111,100,101,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,35,110,111,100,101,115,96,41,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>},#{exported => true,specification => [{attribute,{194,2},type,{node,{type,{194,17},atom,[]},[]}}]}},{{type,no_return,0},{188,2},[<<110,111,95,114,101,116,117,114,110,40,41>>],#{<<101,110>> => <<84,104,101,32,116,121,112,101,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,95,110,101,118,101,114,95,32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,44,32,116,104,97,116,32,105,115,32,105,116,10,119,105,108,108,32,95,97,108,119,97,121,115,95,32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>},#{exported => true,specification => [{attribute,{192,2},type,{no_return,{type,{192,22},none,[]},[]}}]}},{{type,nil,0},{186,2},[<<110,105,108,40,41>>],#{<<101,110>> => <<84,104,101,32,101,109,112,116,121,32,96,116,58,108,105,115,116,47,48,96,46>>},#{exported => true,specification => [{attribute,{187,2},type,{nil,{type,{187,16},nil,[]},[]}}]}},{{type,neg_integer,0},{184,2},[<<110,101,103,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{185,2},type,{neg_integer,{type,{185,24},neg_integer,[]},[]}}]}},{{type,module,0},{182,2},[<<109,111,100,117,108,101,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>},#{exported => true,specification => [{attribute,{183,2},type,{module,{type,{183,19},atom,[]},[]}}]}},{{type,mfa,0},{180,2},[<<109,102,97,40,41>>],#{<<101,110>> => <<65,32,116,104,114,101,101,45,116,117,112,108,101,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,102,117,110,99,116,105,111,110,32,115,105,103,110,97,116,117,114,101,46>>},#{exported => true,specification => [{attribute,{181,2},type,{mfa,{type,{181,16},tuple,[{type,{181,17},module,[]},{type,{181,26},atom,[]},{type,{181,33},arity,[]}]},[]}}]}},{{type,maybe_improper_list,2},{173,2},[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,44,32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,10,119,105,116,104,32,97,32,91,96,91,93,96,93,40,96,116,58,110,105,108,47,48,96,41,44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,102,32,116,104,101,32,116,121,112,101,10,96,67,111,110,116,101,110,116,84,121,112,101,96,46>>},#{exported => true,specification => [{attribute,{178,2},type,{maybe_improper_list,{type,{179,9},maybe_improper_list,[{var,{179,29},'ContentType'},{var,{179,42},'TerminationType'}]},[{var,{178,27},'ContentType'},{var,{178,40},'TerminationType'}]}}]}},{{type,maybe_improper_list,0},{168,2},[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,10,119,105,116,104,32,97,32,91,96,91,93,96,93,40,96,116,58,110,105,108,47,48,96,41,44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,99,97,110,32,98,101,32,111,102,32,97,110,121,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{172,2},type,{maybe_improper_list,{type,{172,32},maybe_improper_list,[{type,{172,52},any,[]},{type,{172,59},any,[]}]},[]}}]}},{{type,map,0},{163,2},[<<109,97,112,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,109,97,112,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,109,97,112,96,41,32,99,111,110,116,97,105,110,105,110,103,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,107,101,121,32,97,110,100,10,118,97,108,117,101,32,97,115,115,111,99,105,97,116,105,111,110,115,46>>},#{exported => true,specification => [{attribute,{167,2},type,{map,{type,{167,16},map,[{type,{167,25},map_field_assoc,[{type,{167,19},any,[]},{type,{167,28},any,[]}]}]},[]}}]}},{{type,list,1},{158,2},[<<108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,116,104,101,32,116,121,112,101,10,96,67,111,110,116,101,110,116,84,121,112,101,96,46>>},#{exported => true,specification => [{attribute,{162,2},type,{list,{type,{162,28},list,[{var,{162,29},'ContentType'}]},[{var,{162,12},'ContentType'}]}}]}},{{type,list,0},{156,2},[<<108,105,115,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,108,105,115,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,108,105,115,116,96,41,32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,97,110,121,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{157,2},type,{list,{type,{157,17},list,[{type,{157,18},any,[]}]},[]}}]}},{{type,iolist,0},{147,2},[<<105,111,108,105,115,116,40,41>>],#{<<101,110>> => <<65,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,10,10,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,32,97,110,121,10,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32,96,102,105,108,101,58,119,114,105,116,101,47,50,96,32,111,114,32,96,103,101,110,95,116,99,112,58,115,101,110,100,47,50,96,46,10,10,73,110,32,109,111,115,116,32,117,115,101,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,96,116,58,105,111,100,97,116,97,47,48,96,32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{155,2},type,{iolist,{type,{155,19},maybe_improper_list,[{type,{155,39},union,[{type,{155,39},byte,[]},{type,{155,48},binary,[]},{type,{155,59},iolist,[]}]},{type,{155,69},union,[{type,{155,69},binary,[]},{type,{155,80},nil,[]}]}]},[]}}]}},{{type,iodata,0},{136,2},[<<105,111,100,97,116,97,40,41>>],#{<<101,110>> => <<65,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,10,10,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,10,97,110,121,32,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32,96,102,105,108,101,58,119,114,105,116,101,47,50,96,32,111,114,32,96,103,101,110,95,116,99,112,58,115,101,110,100,47,50,96,46,10,10,84,111,32,99,111,110,118,101,114,116,32,97,110,32,96,116,58,105,111,100,97,116,97,47,48,96,32,116,101,114,109,32,116,111,32,96,116,58,98,105,110,97,114,121,47,48,96,32,121,111,117,32,99,97,110,32,117,115,101,10,91,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,50,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,32,84,111,32,116,114,97,110,115,99,111,100,101,32,97,32,96,116,58,115,116,114,105,110,103,47,48,96,32,111,114,10,96,116,58,117,110,105,99,111,100,101,58,99,104,97,114,100,97,116,97,47,48,96,32,116,111,32,96,116,58,105,111,100,97,116,97,47,48,96,32,121,111,117,32,99,97,110,32,117,115,101,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,49,96,46>>},#{exported => true,specification => [{attribute,{146,2},type,{iodata,{type,{146,19},union,[{type,{146,19},iolist,[]},{type,{146,30},binary,[]}]},[]}}]}},{{type,integer,0},{134,2},[<<105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,105,110,116,101,103,101,114,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{135,2},type,{integer,{type,{135,20},integer,[]},[]}}]}},{{type,identifier,0},{128,2},[<<105,100,101,110,116,105,102,105,101,114,40,41>>],#{<<101,110>> => <<65,110,32,117,110,105,113,117,101,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,115,111,109,101,32,101,110,116,105,116,121,44,32,102,111,114,32,101,120,97,109,112,108,101,32,97,10,91,112,114,111,99,101,115,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,96,41,44,32,91,112,111,114,116,93,40,96,101,58,115,121,115,116,101,109,58,112,111,114,116,115,46,109,100,35,112,111,114,116,115,96,41,32,111,114,10,91,109,111,110,105,116,111,114,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46>>},#{exported => true,specification => [{attribute,{133,2},type,{identifier,{type,{133,23},union,[{type,{133,23},pid,[]},{type,{133,31},port,[]},{type,{133,40},reference,[]}]},[]}}]}},{{type,function,0},{126,2},[<<102,117,110,99,116,105,111,110,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,102,117,110,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,117,110,96,41,46>>},#{exported => true,specification => [{attribute,{127,2},type,{function,{type,{127,21},'fun',[]},[]}}]}},{{type,float,0},{124,2},[<<102,108,111,97,116,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,102,108,111,97,116,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,110,117,109,98,101,114,96,41,46>>},#{exported => true,specification => [{attribute,{125,2},type,{float,{type,{125,18},float,[]},[]}}]}},{{type,dynamic,0},{122,2},[<<100,121,110,97,109,105,99,40,41>>],#{<<101,110>> => <<84,104,101,32,91,100,121,110,97,109,105,99,93,40,96,101,58,115,121,115,116,101,109,58,116,121,112,101,115,112,101,99,46,109,100,35,100,121,110,97,109,105,99,96,41,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{123,2},type,{dynamic,{type,{123,20},dynamic,[]},[]}}]}},{{type,char,0},{120,2},[<<99,104,97,114,40,41>>],#{<<101,110>> => <<65,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,32,111,114,32,97,32,96,109,58,117,110,105,99,111,100,101,96,32,99,111,100,101,112,111,105,110,116,32,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{121,2},type,{char,{type,{121,17},range,[{integer,{121,17},0},{integer,{121,20},1114111}]},[]}}]}},{{type,byte,0},{118,2},[<<98,121,116,101,40,41>>],#{<<101,110>> => <<65,32,98,121,116,101,32,111,102,32,100,97,116,97,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>},#{exported => true,specification => [{attribute,{119,2},type,{byte,{type,{119,17},range,[{integer,{119,17},0},{integer,{119,20},255}]},[]}}]}},{{type,boolean,0},{116,2},[<<98,111,111,108,101,97,110,40,41>>],#{<<101,110>> => <<65,32,91,98,111,111,108,101,97,110,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,111,111,108,101,97,110,96,41,32,118,97,108,117,101,46>>},#{exported => true,specification => [{attribute,{117,2},type,{boolean,{type,{117,20},union,[{atom,{117,20},true},{atom,{117,27},false}]},[]}}]}},{{type,bool,0},{114,2},[<<98,111,111,108,40,41>>],hidden,#{exported => true}},{{type,bitstring,0},{112,2},[<<98,105,116,115,116,114,105,110,103,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,98,105,116,115,116,114,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115,96,41,46>>},#{exported => true,specification => [{attribute,{113,2},type,{bitstring,{type,{113,22},binary,[{integer,113,0},{integer,{113,28},1}]},[]}}]}},{{type,binary,0},{107,2},[<<98,105,110,97,114,121,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,98,105,110,97,114,121,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115,96,41,44,32,116,104,97,116,32,105,115,44,10,97,32,98,105,116,115,116,114,105,110,103,32,119,105,116,104,32,97,32,115,105,122,101,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,46>>},#{exported => true,specification => [{attribute,{111,2},type,{binary,{type,{111,19},binary,[{integer,111,0},{integer,{111,25},8}]},[]}}]}},{{type,atom,0},{105,2},[<<97,116,111,109,40,41>>],#{<<101,110>> => <<65,110,32,69,114,108,97,110,103,32,91,97,116,111,109,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,97,116,111,109,96,41,46>>},#{exported => true,specification => [{attribute,{106,2},type,{atom,{type,{106,17},atom,[]},[]}}]}},{{type,arity,0},{103,2},[<<97,114,105,116,121,40,41>>],#{<<101,110>> => <<84,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,111,114,32,116,121,112,101,46>>},#{exported => true,specification => [{attribute,{104,2},type,{arity,{type,{104,18},arity,[]},[]}}]}},{{type,any,0},{101,2},[<<97,110,121,40,41>>],#{<<101,110>> => <<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32,96,116,58,116,101,114,109,47,48,96,46>>},#{exported => true,specification => [{attribute,{102,2},type,{any,{type,{102,16},any,[]},[]}}]}},{{function,'!',2},{12684,2},[<<39,33,39,40,68,115,116,44,32,77,115,103,41>>],hidden,#{}},{{function,'not',1},{12679,2},[<<39,110,111,116,39,40,65,41>>],hidden,#{}},{{function,'xor',2},{12675,2},[<<39,120,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'or',2},{12670,2},[<<39,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'and',2},{12666,2},[<<39,97,110,100,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'++',2},{12661,2},[<<39,43,43,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'--',2},{12657,2},[<<39,45,45,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bnot',1},{12652,2},[<<39,98,110,111,116,39,40,65,41>>],hidden,#{}},{{function,'bxor',2},{12648,2},[<<39,98,120,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'band',2},{12644,2},[<<39,98,97,110,100,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bor',2},{12640,2},[<<39,98,111,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bsr',2},{12636,2},[<<39,98,115,114,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'bsl',2},{12632,2},[<<39,98,115,108,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'rem',2},{12628,2},[<<39,114,101,109,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'div',2},{12624,2},[<<39,100,105,118,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'*',2},{12620,2},[<<39,42,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'/',2},{12616,2},[<<39,47,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'+',2},{12612,2},[<<39,43,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'-',2},{12608,2},[<<39,45,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'+',1},{12604,2},[<<39,43,39,40,65,41>>],hidden,#{}},{{function,'-',1},{12600,2},[<<39,45,39,40,65,41>>],hidden,#{}},{{function,'>',2},{12595,2},[<<39,62,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'<',2},{12591,2},[<<39,60,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'>=',2},{12587,2},[<<39,62,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=<',2},{12583,2},[<<39,61,60,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=/=',2},{12579,2},[<<39,61,47,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'/=',2},{12575,2},[<<39,47,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'=:=',2},{12571,2},[<<39,61,58,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,'==',2},{12567,2},[<<39,61,61,39,40,65,44,32,66,41>>],hidden,#{}},{{function,gather_gc_info_result,1},{12550,2},[<<103,97,116,104,101,114,95,103,99,95,105,110,102,111,95,114,101,115,117,108,116,40,82,101,102,41>>],hidden,#{}},{{function,alloc_sizes,1},{12503,2},[<<97,108,108,111,99,95,115,105,122,101,115,40,65,108,108,111,99,115,41>>],hidden,#{}},{{function,alloc_info,1},{12499,2},[<<97,108,108,111,99,95,105,110,102,111,40,65,108,108,111,99,115,41>>],hidden,#{}},{{function,memory,1},{12258,2},[<<109,101,109,111,114,121,47,49>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,109,101,109,111,114,121,32,111,102,32,116,121,112,101,32,96,84,121,112,101,96,46,32,84,104,101,10,97,114,103,117,109,101,110,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,32,111,102,32,96,116,58,109,101,109,111,114,121,95,116,121,112,101,47,48,96,32,97,116,111,109,115,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,10,97,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,115,116,32,111,102,32,96,123,109,101,109,111,114,121,95,116,121,112,101,40,41,44,32,83,105,122,101,32,58,58,32,105,110,116,101,103,101,114,32,62,61,32,48,125,96,32,116,117,112,108,101,115,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,49,96,32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,10,62,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,84,121,112,101,96,32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,116,121,112,101,115,32,108,105,115,116,101,100,32,105,110,32,116,104,101,10,32,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,93,40,96,109,101,109,111,114,121,47,48,96,41,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,109,97,120,105,109,117,109,96,32,105,115,32,112,97,115,115,101,100,32,97,115,32,96,84,121,112,101,96,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,110,111,116,32,114,117,110,32,105,110,10,32,32,105,110,115,116,114,117,109,101,110,116,101,100,32,109,111,100,101,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,97,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,10,32,32,100,105,115,97,98,108,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,93,40,96,109,101,109,111,114,121,47,48,96,41,46>>},#{group => system,specification => [{attribute,{12283,2},spec,{{memory,1},[{type,{12283,13},'fun',[{type,{12283,13},product,[{ann_type,{12283,14},[{var,{12283,14},'Type'},{user_type,{12283,22},memory_type,[]}]}]},{type,{12283,40},non_neg_integer,[]}]},{type,{12284,20},'fun',[{type,{12284,20},product,[{ann_type,{12284,21},[{var,{12284,21},'TypeList'},{type,{12284,33},list,[{user_type,{12284,34},memory_type,[]}]}]}]},{type,{12284,53},list,[{type,{12284,54},tuple,[{user_type,{12284,55},memory_type,[]},{type,{12284,70},non_neg_integer,[]}]}]}]}]}}]}},{{function,memory,0},{12141,2},[<<109,101,109,111,114,121,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,10,101,109,117,108,97,116,111,114,46,10,10,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,32,96,123,84,121,112,101,44,32,83,105,122,101,125,96,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,96,84,121,112,101,96,10,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,109,101,109,111,114,121,32,116,121,112,101,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,10,105,110,32,98,121,116,101,115,46,10,10,77,101,109,111,114,121,32,116,121,112,101,115,58,10,10,45,32,42,42,96,116,111,116,97,108,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,10,32,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,102,111,114,32,96,112,114,111,99,101,115,115,101,115,96,32,97,110,100,32,96,115,121,115,116,101,109,96,46,10,10,45,32,42,42,96,112,114,111,99,101,115,115,101,115,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,10,32,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,10,10,45,32,42,42,96,112,114,111,99,101,115,115,101,115,95,117,115,101,100,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,112,114,111,99,101,115,115,101,115,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,115,121,115,116,101,109,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,10,32,32,116,104,97,116,32,105,115,32,110,111,116,32,100,105,114,101,99,116,108,121,32,114,101,108,97,116,101,100,32,116,111,32,97,110,121,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,77,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,10,32,32,96,112,114,111,99,101,115,115,101,115,96,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,101,109,111,114,121,46,32,96,109,58,105,110,115,116,114,117,109,101,110,116,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,10,32,32,97,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,98,114,101,97,107,100,111,119,110,32,111,102,32,119,104,97,116,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,105,115,32,116,121,112,101,46,10,10,45,32,42,42,96,97,116,111,109,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,10,32,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,97,116,111,109,95,117,115,101,100,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,10,32,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,97,116,111,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,98,105,110,97,114,105,101,115,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,99,111,100,101,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,114,108,97,110,103,32,99,111,100,101,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,101,116,115,96,42,42,32,45,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,84,83,32,116,97,98,108,101,115,46,10,32,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32,96,115,121,115,116,101,109,96,32,109,101,109,111,114,121,46,10,10,45,32,42,42,96,109,97,120,105,109,117,109,96,42,42,32,45,32,84,104,101,32,109,97,120,105,109,117,109,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,115,105,110,99,101,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,105,115,32,111,110,108,121,32,112,114,101,115,101,110,116,32,119,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,10,32,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,114,117,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,115,101,101,10,32,32,96,109,58,105,110,115,116,114,117,109,101,110,116,96,32,97,110,100,47,111,114,32,91,96,101,114,108,40,49,41,96,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,46,32,83,111,109,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,114,116,10,62,32,111,102,32,116,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,116,46,10,62,10,62,32,87,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,32,105,115,32,109,111,114,101,10,62,32,97,99,99,117,114,97,116,101,44,32,98,117,116,32,109,101,109,111,114,121,32,100,105,114,101,99,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,96,109,97,108,108,111,99,96,32,40,97,110,100,32,102,114,105,101,110,100,115,41,32,105,115,32,115,116,105,108,108,10,62,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,96,115,121,115,116,101,109,96,32,118,97,108,117,101,46,32,68,105,114,101,99,116,32,99,97,108,108,115,32,116,111,32,96,109,97,108,108,111,99,96,32,97,114,101,32,111,110,108,121,32,100,111,110,101,32,102,114,111,109,10,62,32,79,83,45,115,112,101,99,105,102,105,99,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,97,110,100,32,112,101,114,104,97,112,115,32,102,114,111,109,32,117,115,101,114,45,105,109,112,108,101,109,101,110,116,101,100,32,69,114,108,97,110,103,32,100,114,105,118,101,114,115,10,62,32,116,104,97,116,32,100,111,32,110,111,116,32,117,115,101,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,100,114,105,118,101,114,32,105,110,116,101,114,102,97,99,101,46,10,62,10,62,32,65,115,32,116,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,96,112,114,111,99,101,115,115,101,115,96,32,97,110,100,32,96,115,121,115,116,101,109,96,44,32,116,104,101,32,101,114,114,111,114,32,105,110,10,62,32,96,115,121,115,116,101,109,96,32,112,114,111,112,97,103,97,116,101,115,32,116,111,32,116,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,46,10,62,10,62,32,84,104,101,32,100,105,102,102,101,114,101,110,116,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,97,114,101,32,115,117,109,109,101,100,32,97,114,101,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,44,10,62,32,119,104,105,99,104,32,105,110,116,114,111,100,117,99,101,115,32,97,110,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,10,10,84,104,101,32,100,105,102,102,101,114,101,110,116,32,118,97,108,117,101,115,32,104,97,118,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,108,97,116,105,111,110,32,116,111,32,101,97,99,104,32,111,116,104,101,114,46,32,86,97,108,117,101,115,32,98,101,103,105,110,110,105,110,103,10,119,105,116,104,32,97,110,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,96,96,96,116,101,120,116,10,116,111,116,97,108,32,32,32,32,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,115,121,115,116,101,109,10,112,114,111,99,101,115,115,101,115,32,32,61,32,112,114,111,99,101,115,115,101,115,95,117,115,101,100,32,43,32,80,114,111,99,101,115,115,101,115,78,111,116,85,115,101,100,10,115,121,115,116,101,109,32,32,32,32,32,61,32,97,116,111,109,32,43,32,98,105,110,97,114,121,32,43,32,99,111,100,101,32,43,32,101,116,115,32,43,32,79,116,104,101,114,83,121,115,116,101,109,10,97,116,111,109,32,32,32,32,32,32,32,61,32,97,116,111,109,95,117,115,101,100,32,43,32,65,116,111,109,78,111,116,85,115,101,100,10,82,101,97,108,84,111,116,97,108,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,82,101,97,108,83,121,115,116,101,109,10,82,101,97,108,83,121,115,116,101,109,32,61,32,115,121,115,116,101,109,32,43,32,77,105,115,115,101,100,83,121,115,116,101,109,10,96,96,96,10,10,77,111,114,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,96,116,111,116,97,108,96,32,118,97,108,117,101,32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,10,62,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,104,97,114,101,100,32,108,105,98,114,97,114,105,101,115,44,32,116,104,101,32,99,111,100,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,116,115,101,108,102,44,10,62,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,115,116,97,99,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,96,116,111,116,97,108,96,10,62,32,118,97,108,117,101,32,105,115,32,95,110,111,116,95,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,97,108,108,32,112,97,103,101,115,32,109,97,112,112,101,100,32,116,111,10,62,32,116,104,101,32,101,109,117,108,97,116,111,114,46,10,62,10,62,32,65,108,115,111,44,32,98,101,99,97,117,115,101,32,111,102,32,102,114,97,103,109,101,110,116,97,116,105,111,110,32,97,110,100,32,112,114,101,114,101,115,101,114,118,97,116,105,111,110,32,111,102,32,109,101,109,111,114,121,32,97,114,101,97,115,44,32,116,104,101,32,115,105,122,101,32,111,102,10,62,32,116,104,101,32,109,101,109,111,114,121,32,115,101,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,99,97,110,32,98,101,10,62,32,109,117,99,104,32,108,97,114,103,101,114,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,10,62,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46,10,10,70,97,105,108,117,114,101,58,32,96,110,111,116,115,117,112,96,32,105,102,32,97,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,10,100,105,115,97,98,108,101,100,46>>},#{group => system,specification => [{attribute,{12239,2},spec,{{memory,0},[{type,{12239,13},bounded_fun,[{type,{12239,13},'fun',[{type,{12239,13},product,[]},{type,{12239,19},list,[{type,{12239,20},tuple,[{var,{12239,21},'Type'},{var,{12239,27},'Size'}]}]}]},[{type,{12240,7},constraint,[{atom,{12240,7},is_subtype},[{var,{12240,7},'Type'},{user_type,{12240,15},memory_type,[]}]]},{type,{12241,7},constraint,[{atom,{12241,7},is_subtype},[{var,{12241,7},'Size'},{type,{12241,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,max,2},{12073,2},[<<109,97,120,40,84,101,114,109,49,44,32,84,101,114,109,50,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,111,102,32,96,84,101,114,109,49,96,32,97,110,100,32,96,84,101,114,109,50,96,46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,10,96,61,61,96,32,111,112,101,114,97,116,111,114,44,32,96,84,101,114,109,49,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,101,32,91,69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115,96,41,32,99,111,110,116,97,105,110,115,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32,96,61,61,96,32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,44,32,50,41,46,10,50,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,46,48,44,32,49,41,46,10,49,46,48,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,49,44,32,49,46,48,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,120,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,98,34,10,96,96,96,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,115,32,116,101,115,116,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46>>},#{group => terms,specification => [{attribute,{12107,2},spec,{{max,2},[{type,{12107,10},bounded_fun,[{type,{12107,10},'fun',[{type,{12107,10},product,[{var,{12107,11},'Term1'},{var,{12107,18},'Term2'}]},{var,{12107,28},'Maximum'}]},[{type,{12108,7},constraint,[{atom,{12108,7},is_subtype},[{var,{12108,7},'Term1'},{type,{12108,16},term,[]}]]},{type,{12109,7},constraint,[{atom,{12109,7},is_subtype},[{var,{12109,7},'Term2'},{type,{12109,16},term,[]}]]},{type,{12110,7},constraint,[{atom,{12110,7},is_subtype},[{var,{12110,7},'Maximum'},{type,{12110,18},term,[]}]]}]]}]}}]}},{{function,min,2},{12029,2},[<<109,105,110,40,84,101,114,109,49,44,32,84,101,114,109,50,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,96,84,101,114,109,49,96,32,97,110,100,32,96,84,101,114,109,50,96,46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,10,96,61,61,96,32,111,112,101,114,97,116,111,114,44,32,96,84,101,114,109,49,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,101,32,91,69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115,96,41,32,99,111,110,116,97,105,110,115,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32,96,61,61,96,32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,44,32,50,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,46,48,44,32,49,41,46,10,49,46,48,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,49,44,32,49,46,48,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,105,110,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,97,98,99,34,10,96,96,96,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,115,32,116,101,115,116,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46>>},#{group => terms,specification => [{attribute,{12063,2},spec,{{min,2},[{type,{12063,10},bounded_fun,[{type,{12063,10},'fun',[{type,{12063,10},product,[{var,{12063,11},'Term1'},{var,{12063,18},'Term2'}]},{var,{12063,28},'Minimum'}]},[{type,{12064,7},constraint,[{atom,{12064,7},is_subtype},[{var,{12064,7},'Term1'},{type,{12064,16},term,[]}]]},{type,{12065,7},constraint,[{atom,{12065,7},is_subtype},[{var,{12065,7},'Term2'},{type,{12065,16},term,[]}]]},{type,{12066,7},constraint,[{atom,{12066,7},is_subtype},[{var,{12066,7},'Minimum'},{type,{12066,18},term,[]}]]}]]}]}}]}},{{function,format_cpu_topology,1},{11986,2},[<<102,111,114,109,97,116,95,99,112,117,95,116,111,112,111,108,111,103,121,40,73,110,116,101,114,110,97,108,67,112,117,84,111,112,111,108,111,103,121,41>>],hidden,#{}},{{function,set_cpu_topology,1},{11894,2},[<<115,101,116,95,99,112,117,95,116,111,112,111,108,111,103,121,40,67,112,117,84,111,112,111,108,111,103,121,41>>],hidden,#{}},{{function,integer_to_binary,2},{11863,2},[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,73,110,116,101,103,101,114,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,32,105,110,32,98,97,115,101,10,96,66,97,115,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,49,48,50,51,44,32,49,54,41,46,10,60,60,34,51,70,70,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{11876,2},spec,{{integer_to_binary,2},[{type,{11876,24},bounded_fun,[{type,{11876,24},'fun',[{type,{11876,24},product,[{var,{11876,25},'Integer'},{var,{11876,34},'Base'}]},{type,{11876,43},binary,[]}]},[{type,{11877,7},constraint,[{atom,{11877,7},is_subtype},[{var,{11877,7},'Integer'},{type,{11877,18},integer,[]}]]},{type,{11878,7},constraint,[{atom,{11878,7},is_subtype},[{var,{11878,7},'Base'},{type,{11878,15},range,[{integer,{11878,15},2},{integer,{11878,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_list,2},{11845,2},[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,73,110,116,101,103,101,114,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,32,105,110,32,98,97,115,101,10,96,66,97,115,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,49,48,50,51,44,32,49,54,41,46,10,34,51,70,70,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{11857,2},spec,{{integer_to_list,2},[{type,{11857,22},bounded_fun,[{type,{11857,22},'fun',[{type,{11857,22},product,[{var,{11857,23},'Integer'},{var,{11857,32},'Base'}]},{type,{11857,41},string,[]}]},[{type,{11858,7},constraint,[{atom,{11858,7},is_subtype},[{var,{11858,7},'Integer'},{type,{11858,18},integer,[]}]]},{type,{11859,7},constraint,[{atom,{11859,7},is_subtype},[{var,{11859,7},'Base'},{type,{11859,15},range,[{integer,{11859,15},2},{integer,{11859,18},36}]}]]}]]}]}}]}},{{function,get_cookie,1},{11830,2},[<<103,101,116,95,99,111,111,107,105,101,40,78,111,100,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32,110,111,100,101,32,96,78,111,100,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,10,116,104,101,32,97,116,111,109,32,96,110,111,99,111,111,107,105,101,96,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,96,115,101,116,95,99,111,111,107,105,101,47,50,96,46>>},#{group => distribution,specification => [{attribute,{11836,2},spec,{{get_cookie,1},[{type,{11836,17},bounded_fun,[{type,{11836,17},'fun',[{type,{11836,17},product,[{var,{11836,18},'Node'}]},{type,{11836,27},union,[{var,{11836,27},'Cookie'},{atom,{11836,36},nocookie}]}]},[{type,{11837,7},constraint,[{atom,{11837,7},is_subtype},[{var,{11837,7},'Node'},{type,{11837,15},node,[]}]]},{type,{11838,7},constraint,[{atom,{11838,7},is_subtype},[{var,{11838,7},'Cookie'},{type,{11838,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,get_cookie,0},{11820,2},[<<103,101,116,95,99,111,111,107,105,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,97,116,111,109,32,96,110,111,99,111,111,107,105,101,96,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,96,115,101,116,95,99,111,111,107,105,101,47,49,96,46>>},#{group => distribution,specification => [{attribute,{11825,2},spec,{{get_cookie,0},[{type,{11825,17},bounded_fun,[{type,{11825,17},'fun',[{type,{11825,17},product,[]},{type,{11825,23},union,[{var,{11825,23},'Cookie'},{atom,{11825,32},nocookie}]}]},[{type,{11826,7},constraint,[{atom,{11826,7},is_subtype},[{var,{11826,7},'Cookie'},{type,{11826,17},atom,[]}]]}]]}]}}]}},{{function,set_cookie,2},{11797,2},[<<115,101,116,95,99,111,111,107,105,101,40,78,111,100,101,44,32,67,111,111,107,105,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32,96,78,111,100,101,96,32,116,111,32,116,104,101,32,97,116,111,109,32,96,67,111,111,107,105,101,96,46,32,73,102,32,96,78,111,100,101,96,32,105,115,32,116,104,101,32,108,111,99,97,108,10,110,111,100,101,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,115,101,116,115,32,116,104,101,32,99,111,111,107,105,101,32,111,102,32,97,108,108,32,111,116,104,101,114,32,110,111,100,101,115,32,40,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,10,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,41,32,116,111,32,96,67,111,111,107,105,101,96,46,10,10,83,101,101,32,115,101,99,116,105,111,110,32,91,68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,96,41,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,89,111,117,32,99,97,110,32,103,101,116,32,116,104,105,115,32,118,97,108,117,101,32,117,115,105,110,103,32,96,103,101,116,95,99,111,111,107,105,101,47,49,96,46,10,10,70,97,105,108,117,114,101,58,32,96,102,117,110,99,116,105,111,110,95,99,108,97,117,115,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{11810,2},spec,{{set_cookie,2},[{type,{11810,17},bounded_fun,[{type,{11810,17},'fun',[{type,{11810,17},product,[{var,{11810,18},'Node'},{var,{11810,24},'Cookie'}]},{atom,{11810,35},true}]},[{type,{11811,7},constraint,[{atom,{11811,7},is_subtype},[{var,{11811,7},'Node'},{type,{11811,15},node,[]}]]},{type,{11812,7},constraint,[{atom,{11812,7},is_subtype},[{var,{11812,7},'Cookie'},{type,{11812,17},atom,[]}]]}]]}]}}]}},{{function,set_cookie,1},{11776,2},[<<115,101,116,95,99,111,111,107,105,101,40,67,111,111,107,105,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,111,32,116,104,101,32,97,116,111,109,32,96,67,111,111,107,105,101,96,44,32,119,104,105,99,104,32,105,115,32,97,108,115,111,32,116,104,101,10,99,111,111,107,105,101,32,102,111,114,32,97,108,108,32,110,111,100,101,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,32,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32,96,115,101,116,95,99,111,111,107,105,101,47,50,96,10,96,67,111,111,107,105,101,96,46,10,10,83,101,101,32,115,101,99,116,105,111,110,32,91,68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,96,41,32,105,110,32,116,104,101,10,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,89,111,117,32,99,97,110,32,103,101,116,32,116,104,105,115,32,118,97,108,117,101,32,117,115,105,110,103,32,96,103,101,116,95,99,111,111,107,105,101,47,48,96,46,10,10,70,97,105,108,117,114,101,58,32,96,102,117,110,99,116,105,111,110,95,99,108,97,117,115,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{11790,2},spec,{{set_cookie,1},[{type,{11790,17},bounded_fun,[{type,{11790,17},'fun',[{type,{11790,17},product,[{var,{11790,18},'Cookie'}]},{atom,{11790,29},true}]},[{type,{11791,7},constraint,[{atom,{11791,7},is_subtype},[{var,{11791,7},'Cookie'},{type,{11791,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,delay_trap,2},{11770,2},[<<100,101,108,97,121,95,116,114,97,112,47,50>>],hidden,#{}},{{function,dmonitor_node,3},{11750,2},[<<100,109,111,110,105,116,111,114,95,110,111,100,101,47,51>>],hidden,#{}},{{function,dist_get_stat,1},{11738,2},[<<100,105,115,116,95,103,101,116,95,115,116,97,116,40,68,72,97,110,100,108,101,41>>],hidden,#{}},{{function,dist_ctrl_get_opt,2},{11712,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,111,112,116,40,68,72,97,110,100,108,101,44,32,79,112,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,10,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,93,40,96,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,41,10,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11731,2},spec,{{dist_ctrl_get_opt,2},[{type,{11731,24},bounded_fun,[{type,{11731,24},'fun',[{type,{11731,24},product,[{var,{11731,25},'DHandle'},{atom,{11731,34},get_size}]},{var,{11731,49},'Value'}]},[{type,{11732,7},constraint,[{atom,{11732,7},is_subtype},[{var,{11732,7},'DHandle'},{user_type,{11732,18},dist_handle,[]}]]},{type,{11733,7},constraint,[{atom,{11733,7},is_subtype},[{var,{11733,7},'Value'},{type,{11733,16},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_set_opt,3},{11672,2},[<<100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,40,68,72,97,110,100,108,101,44,32,79,112,116,44,32,86,97,108,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,84,104,105,115,32,111,112,116,105,111,110,32,99,111,110,116,114,111,108,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,99,97,108,108,115,32,116,111,10,91,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49,96,41,32,119,104,101,114,101,32,96,68,72,97,110,100,108,101,96,10,101,113,117,97,108,115,32,96,68,72,97,110,100,108,101,96,32,117,115,101,100,32,119,104,101,110,32,115,101,116,116,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,87,104,101,110,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,105,115,58,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,32,119,105,108,108,32,106,117,115,116,32,114,101,116,117,114,110,32,96,68,97,116,97,96,32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,10,32,32,99,104,97,110,110,101,108,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,32,119,105,108,108,32,114,101,116,117,114,110,32,96,68,97,116,97,96,32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,10,32,32,99,104,97,110,110,101,108,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,96,83,105,122,101,96,32,111,102,32,96,68,97,116,97,96,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,116,117,112,108,101,10,32,32,111,110,32,116,104,101,32,102,111,114,109,32,96,123,83,105,122,101,44,32,68,97,116,97,125,96,46,10,10,65,108,108,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,32,116,111,32,100,101,102,97,117,108,116,32,119,104,101,110,32,97,32,99,104,97,110,110,101,108,32,105,115,32,99,108,111,115,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11704,2},spec,{{dist_ctrl_set_opt,3},[{type,{11704,24},bounded_fun,[{type,{11704,24},'fun',[{type,{11704,24},product,[{var,{11704,25},'DHandle'},{atom,{11704,34},get_size},{var,{11704,46},'Value'}]},{var,{11704,56},'OldValue'}]},[{type,{11705,7},constraint,[{atom,{11705,7},is_subtype},[{var,{11705,7},'DHandle'},{user_type,{11705,18},dist_handle,[]}]]},{type,{11706,7},constraint,[{atom,{11706,7},is_subtype},[{var,{11706,7},'Value'},{type,{11706,16},boolean,[]}]]},{type,{11707,7},constraint,[{atom,{11707,7},is_subtype},[{var,{11707,7},'OldValue'},{type,{11707,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_get_data_notification,1},{11643,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41>>],#{<<101,110>> => <<82,101,113,117,101,115,116,32,110,111,116,105,102,105,99,97,116,105,111,110,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,102,101,116,99,104,32,117,115,105,110,103,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49,96,41,32,102,111,114,32,116,104,101,10,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,87,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,104,101,32,109,101,115,115,97,103,101,32,96,100,105,115,116,95,100,97,116,97,96,46,10,79,110,99,101,32,97,32,96,100,105,115,116,95,100,97,116,97,96,32,109,101,115,115,97,103,101,115,32,104,97,115,32,98,101,101,110,32,115,101,110,116,44,32,110,111,32,109,111,114,101,32,96,100,105,115,116,95,100,97,116,97,96,32,109,101,115,115,97,103,101,115,32,119,105,108,108,10,98,101,32,115,101,110,116,32,117,110,116,105,108,32,116,104,101,32,91,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,41,10,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,32,97,103,97,105,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11666,2},spec,{{dist_ctrl_get_data_notification,1},[{type,{11666,38},bounded_fun,[{type,{11666,38},'fun',[{type,{11666,38},product,[{var,{11666,39},'DHandle'}]},{atom,{11666,51},ok}]},[{type,{11667,7},constraint,[{atom,{11667,7},is_subtype},[{var,{11667,7},'DHandle'},{user_type,{11667,18},dist_handle,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_get_data,1},{11608,2},[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>],#{<<101,110>> => <<71,101,116,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,115,115,101,100,32,116,111,32,116,104,101,10,114,101,109,111,116,101,32,110,111,100,101,46,10,10,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,32,73,102,32,110,111,32,100,97,116,97,32,105,115,10,97,118,97,105,108,97,98,108,101,44,32,116,104,101,32,97,116,111,109,32,96,110,111,110,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,101,32,99,97,110,32,114,101,113,117,101,115,116,32,116,111,32,98,101,32,105,110,102,111,114,109,101,100,32,98,121,32,97,10,109,101,115,115,97,103,101,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,98,121,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49,96,41,46,10,10,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,104,101,110,32,116,104,101,114,101,32,97,114,101,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,32,99,111,110,102,105,103,117,114,101,100,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,68,72,97,110,100,108,101,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,96,103,101,116,95,115,105,122,101,96,32,111,112,116,105,111,110,10,102,111,114,32,116,104,101,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,93,40,96,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51,96,41,32,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,10,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,10,99,97,108,108,98,97,99,107,32,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,10,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11635,2},spec,{{dist_ctrl_get_data,1},[{type,{11635,25},bounded_fun,[{type,{11635,25},'fun',[{type,{11635,25},product,[{var,{11635,26},'DHandle'}]},{type,{11635,38},union,[{type,{11635,38},tuple,[{var,{11635,39},'Size'},{var,{11635,45},'Data'}]},{var,{11635,53},'Data'},{atom,{11635,60},none}]}]},[{type,{11636,7},constraint,[{atom,{11636,7},is_subtype},[{var,{11636,7},'Size'},{type,{11636,15},non_neg_integer,[]}]]},{type,{11637,7},constraint,[{atom,{11637,7},is_subtype},[{var,{11637,7},'DHandle'},{user_type,{11637,18},dist_handle,[]}]]},{type,{11638,7},constraint,[{atom,{11638,7},is_subtype},[{var,{11638,7},'Data'},{user_type,{11638,15},iovec,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_put_data,2},{11581,2},[<<100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41>>],#{<<101,110>> => <<68,101,108,105,118,101,114,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,116,111,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,62,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,117,110,108,101,115,115,32,97,110,10,62,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,10,62,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50,96,41,46,10,62,32,73,102,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,44,32,111,110,108,121,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,112,117,116,10,62,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,46,10,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,10,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,32,77,111,114,101,10,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11601,2},spec,{{dist_ctrl_put_data,2},[{type,{11601,25},bounded_fun,[{type,{11601,25},'fun',[{type,{11601,25},product,[{var,{11601,26},'DHandle'},{var,{11601,35},'Data'}]},{atom,{11601,44},ok}]},[{type,{11602,7},constraint,[{atom,{11602,7},is_subtype},[{var,{11602,7},'DHandle'},{user_type,{11602,18},dist_handle,[]}]]},{type,{11603,7},constraint,[{atom,{11603,7},is_subtype},[{var,{11603,7},'Data'},{type,{11603,15},iodata,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_input_handler,2},{11548,2},[<<100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41>>],#{<<101,110>> => <<82,101,103,105,115,116,101,114,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,46,10,10,79,110,99,101,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,44,32,96,73,110,112,117,116,72,97,110,100,108,101,114,96,32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,10,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41,96,93,40,96,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,41,32,119,105,116,104,32,116,104,101,10,96,68,72,97,110,100,108,101,96,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,105,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,87,104,101,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,62,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,32,112,114,111,99,101,115,115,44,32,105,116,32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,108,115,111,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,99,97,108,108,101,100,32,119,104,101,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,10,62,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,72,97,110,100,108,101,96,32,105,115,32,97,32,112,111,114,116,46,32,84,104,101,32,100,97,116,97,10,62,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,115,104,111,117,108,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,62,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,110,112,117,116,72,97,110,100,108,101,114,96,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,115,104,111,117,108,100,32,99,97,108,108,10,62,32,91,96,101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,93,40,96,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50,96,41,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,46,10,96,68,72,97,110,100,108,101,96,32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,10,91,96,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,96,93,40,97,108,116,95,100,105,115,116,46,109,100,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101,41,46,32,77,111,114,101,10,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,91,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101,93,40,97,108,116,95,100,105,115,116,46,109,100,35,100,105,115,116,114,105,98,117,116,105,111,110,45,109,111,100,117,108,101,41,46>>},#{group => distribution,specification => [{attribute,{11574,2},spec,{{dist_ctrl_input_handler,2},[{type,{11574,30},bounded_fun,[{type,{11574,30},'fun',[{type,{11574,30},product,[{var,{11574,31},'DHandle'},{var,{11574,40},'InputHandler'}]},{atom,{11574,57},ok}]},[{type,{11575,7},constraint,[{atom,{11575,7},is_subtype},[{var,{11575,7},'DHandle'},{user_type,{11575,18},dist_handle,[]}]]},{type,{11576,7},constraint,[{atom,{11576,7},is_subtype},[{var,{11576,7},'InputHandler'},{type,{11576,23},pid,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,port_get_data,1},{11537,2},[<<112,111,114,116,95,103,101,116,95,100,97,116,97,40,80,111,114,116,41>>],hidden,#{}},{{function,port_set_data,2},{11529,2},[<<112,111,114,116,95,115,101,116,95,100,97,116,97,40,80,111,114,116,44,32,68,97,116,97,41>>],hidden,#{}},{{function,port_info,2},[{file,[46,46,47,46,46,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,95,112,111,114,116,95,105,110,102,111,46,109,100]},{location,{1,1}}],[<<112,111,114,116,95,105,110,102,111,40,80,111,114,116,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,80,111,114,116,96,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,111,112,101,110,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,96,112,111,114,116,95,105,110,102,111,47,50,96,32,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,96,73,116,101,109,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,110,100,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,80,111,114,116,96,46,10,10,45,32,96,99,111,110,110,101,99,116,101,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,99,111,110,110,101,99,116,101,100,44,32,80,105,100,125,96,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46,10,45,32,96,105,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,105,100,44,32,73,110,100,101,120,125,96,32,119,104,101,114,101,32,96,73,110,100,101,120,96,32,105,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,105,110,100,101,120,32,111,102,32,116,104,101,32,112,111,114,116,46,32,84,104,105,115,32,105,110,100,101,120,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,112,111,114,116,115,46,10,45,32,96,105,110,112,117,116,96,32,45,32,114,101,116,117,114,110,115,32,96,123,105,110,112,117,116,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,112,111,114,116,46,10,45,32,96,108,105,110,107,115,96,32,45,32,114,101,116,117,114,110,115,32,96,123,108,105,110,107,115,44,32,80,105,100,115,125,96,32,119,104,101,114,101,32,96,80,105,100,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,105,115,32,108,105,110,107,101,100,32,116,111,46,10,45,32,96,108,111,99,107,105,110,103,96,32,45,32,114,101,116,117,114,110,115,32,96,123,108,111,99,107,105,110,103,44,32,76,111,99,107,105,110,103,125,96,32,119,104,101,114,101,32,96,76,111,99,107,105,110,103,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,32,32,42,32,96,112,111,114,116,95,108,101,118,101,108,96,32,40,112,111,114,116,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41,10,32,32,42,32,96,100,114,105,118,101,114,95,108,101,118,101,108,96,32,40,100,114,105,118,101,114,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,114,101,115,117,108,116,115,32,97,114,101,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,101,109,111,114,121,96,32,123,58,32,35,112,111,114,116,95,105,110,102,111,95,109,101,109,111,114,121,32,125,32,45,32,114,101,116,117,114,110,115,32,96,123,109,101,109,111,114,121,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,105,115,32,112,111,114,116,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,112,111,114,116,32,105,116,115,101,108,102,32,99,97,110,32,104,97,118,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,96,66,121,116,101,115,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,111,110,105,116,111,114,115,96,32,45,32,114,101,116,117,114,110,115,32,96,123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125,96,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,115,96,32,114,101,112,114,101,115,101,110,116,32,112,114,111,99,101,115,115,101,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,109,111,110,105,116,111,114,101,100,95,98,121,96,32,45,32,114,101,116,117,114,110,115,32,96,123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125,96,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,101,100,66,121,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,105,100,115,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,103,105,118,101,110,32,112,111,114,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,45,32,96,110,97,109,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,110,97,109,101,44,32,78,97,109,101,125,96,32,119,104,101,114,101,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,99,111,109,109,97,110,100,32,110,97,109,101,32,115,101,116,32,98,121,32,96,111,112,101,110,95,112,111,114,116,47,50,96,46,10,45,32,96,111,115,95,112,105,100,96,32,45,32,114,101,116,117,114,110,115,32,96,123,111,115,95,112,105,100,44,32,79,115,80,105,100,125,96,32,119,104,101,114,101,32,96,79,115,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,111,102,32,97,110,32,79,83,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,119,105,116,104,32,91,96,111,112,101,110,95,112,111,114,116,40,123,115,112,97,119,110,32,124,32,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,44,32,79,112,116,105,111,110,115,41,96,93,40,96,111,112,101,110,95,112,111,114,116,47,50,96,41,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,97,119,110,105,110,103,32,97,110,32,79,83,32,112,114,111,99,101,115,115,44,32,116,104,101,32,118,97,108,117,101,32,105,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,111,117,116,112,117,116,96,32,45,32,114,101,116,117,114,110,115,32,96,123,111,117,116,112,117,116,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,112,111,114,116,32,102,114,111,109,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,44,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,51,96,44,32,111,114,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,96,46,10,45,32,96,112,97,114,97,108,108,101,108,105,115,109,96,32,45,32,114,101,116,117,114,110,115,32,96,123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125,96,32,119,104,101,114,101,32,96,66,111,111,108,101,97,110,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,104,105,110,116,32,117,115,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,111,112,116,105,111,110,32,91,96,112,97,114,97,108,108,101,108,105,115,109,96,93,40,96,109,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,41,32,111,102,32,96,111,112,101,110,95,112,111,114,116,47,50,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,113,117,101,117,101,95,115,105,122,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,113,117,101,117,101,95,115,105,122,101,44,32,66,121,116,101,115,125,96,32,119,104,101,114,101,32,96,66,121,116,101,115,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,113,117,101,117,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,100,114,105,118,101,114,32,113,117,101,117,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,45,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,45,32,114,101,116,117,114,110,115,32,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,82,101,103,105,115,116,101,114,101,100,78,97,109,101,125,96,32,119,104,101,114,101,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,116,104,101,32,112,111,114,116,46,32,73,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>},#{group => ports,specification => [{attribute,{11475,2},spec,{{port_info,2},[{type,{11475,16},bounded_fun,[{type,{11475,16},'fun',[{type,{11475,16},product,[{var,{11475,17},'Port'},{ann_type,{11475,23},[{var,{11475,23},'Item'},{atom,{11475,31},connected}]}]},{type,{11475,45},union,[{type,{11475,45},tuple,[{atom,{11475,46},connected},{var,{11475,57},'Pid'}]},{atom,{11475,64},undefined}]}]},[{type,{11476,7},constraint,[{atom,{11476,7},is_subtype},[{var,{11476,7},'Port'},{type,{11476,15},union,[{type,{11476,15},port,[]},{type,{11476,24},atom,[]}]}]]},{type,{11477,7},constraint,[{atom,{11477,7},is_subtype},[{var,{11477,7},'Pid'},{type,{11477,14},pid,[]}]]}]]},{type,{11478,9},bounded_fun,[{type,{11478,9},'fun',[{type,{11478,9},product,[{var,{11478,10},'Port'},{ann_type,{11478,16},[{var,{11478,16},'Item'},{atom,{11478,24},id}]}]},{type,{11478,31},union,[{type,{11478,31},tuple,[{atom,{11478,32},id},{var,{11478,36},'Index'}]},{atom,{11478,45},undefined}]}]},[{type,{11479,7},constraint,[{atom,{11479,7},is_subtype},[{var,{11479,7},'Port'},{type,{11479,15},union,[{type,{11479,15},port,[]},{type,{11479,24},atom,[]}]}]]},{type,{11480,7},constraint,[{atom,{11480,7},is_subtype},[{var,{11480,7},'Index'},{type,{11480,16},non_neg_integer,[]}]]}]]},{type,{11481,9},bounded_fun,[{type,{11481,9},'fun',[{type,{11481,9},product,[{var,{11481,10},'Port'},{ann_type,{11481,16},[{var,{11481,16},'Item'},{atom,{11481,24},input}]}]},{type,{11481,34},union,[{type,{11481,34},tuple,[{atom,{11481,35},input},{var,{11481,42},'Bytes'}]},{atom,{11481,51},undefined}]}]},[{type,{11482,7},constraint,[{atom,{11482,7},is_subtype},[{var,{11482,7},'Port'},{type,{11482,15},union,[{type,{11482,15},port,[]},{type,{11482,24},atom,[]}]}]]},{type,{11483,7},constraint,[{atom,{11483,7},is_subtype},[{var,{11483,7},'Bytes'},{type,{11483,16},non_neg_integer,[]}]]}]]},{type,{11484,9},bounded_fun,[{type,{11484,9},'fun',[{type,{11484,9},product,[{var,{11484,10},'Port'},{ann_type,{11484,16},[{var,{11484,16},'Item'},{atom,{11484,24},links}]}]},{type,{11484,34},union,[{type,{11484,34},tuple,[{atom,{11484,35},links},{var,{11484,42},'Pids'}]},{atom,{11484,50},undefined}]}]},[{type,{11485,7},constraint,[{atom,{11485,7},is_subtype},[{var,{11485,7},'Port'},{type,{11485,15},union,[{type,{11485,15},port,[]},{type,{11485,24},atom,[]}]}]]},{type,{11486,7},constraint,[{atom,{11486,7},is_subtype},[{var,{11486,7},'Pids'},{type,{11486,15},list,[{type,{11486,16},pid,[]}]}]]}]]},{type,{11487,9},bounded_fun,[{type,{11487,9},'fun',[{type,{11487,9},product,[{var,{11487,10},'Port'},{ann_type,{11487,16},[{var,{11487,16},'Item'},{atom,{11487,24},locking}]}]},{type,{11487,36},union,[{type,{11487,36},tuple,[{atom,{11487,37},locking},{var,{11487,46},'Locking'}]},{atom,{11487,57},undefined}]}]},[{type,{11488,7},constraint,[{atom,{11488,7},is_subtype},[{var,{11488,7},'Port'},{type,{11488,15},union,[{type,{11488,15},port,[]},{type,{11488,24},atom,[]}]}]]},{type,{11489,7},constraint,[{atom,{11489,7},is_subtype},[{var,{11489,7},'Locking'},{type,{11489,18},union,[{atom,{11489,18},false},{atom,{11489,28},port_level},{atom,{11489,43},driver_level}]}]]}]]},{type,{11490,9},bounded_fun,[{type,{11490,9},'fun',[{type,{11490,9},product,[{var,{11490,10},'Port'},{ann_type,{11490,16},[{var,{11490,16},'Item'},{atom,{11490,24},memory}]}]},{type,{11490,35},union,[{type,{11490,35},tuple,[{atom,{11490,36},memory},{var,{11490,44},'Bytes'}]},{atom,{11490,53},undefined}]}]},[{type,{11491,7},constraint,[{atom,{11491,7},is_subtype},[{var,{11491,7},'Port'},{type,{11491,15},union,[{type,{11491,15},port,[]},{type,{11491,24},atom,[]}]}]]},{type,{11492,7},constraint,[{atom,{11492,7},is_subtype},[{var,{11492,7},'Bytes'},{type,{11492,16},non_neg_integer,[]}]]}]]},{type,{11493,9},bounded_fun,[{type,{11493,9},'fun',[{type,{11493,9},product,[{var,{11493,10},'Port'},{ann_type,{11493,16},[{var,{11493,16},'Item'},{atom,{11493,24},monitors}]}]},{type,{11493,37},union,[{type,{11493,37},tuple,[{atom,{11493,38},monitors},{var,{11493,48},'Monitors'}]},{atom,{11493,60},undefined}]}]},[{type,{11494,7},constraint,[{atom,{11494,7},is_subtype},[{var,{11494,7},'Port'},{type,{11494,15},union,[{type,{11494,15},port,[]},{type,{11494,24},atom,[]}]}]]},{type,{11495,7},constraint,[{atom,{11495,7},is_subtype},[{var,{11495,7},'Monitors'},{type,{11495,19},list,[{type,{11495,20},tuple,[{atom,{11495,21},process},{type,{11495,30},pid,[]}]}]}]]}]]},{type,{11496,9},bounded_fun,[{type,{11496,9},'fun',[{type,{11496,9},product,[{var,{11496,10},'Port'},{ann_type,{11496,16},[{var,{11496,16},'Item'},{atom,{11496,24},monitored_by}]}]},{type,{11496,41},union,[{type,{11496,41},tuple,[{atom,{11496,42},monitored_by},{var,{11496,56},'MonitoredBy'}]},{atom,{11496,71},undefined}]}]},[{type,{11497,7},constraint,[{atom,{11497,7},is_subtype},[{var,{11497,7},'Port'},{type,{11497,15},union,[{type,{11497,15},port,[]},{type,{11497,24},atom,[]}]}]]},{type,{11498,7},constraint,[{atom,{11498,7},is_subtype},[{var,{11498,7},'MonitoredBy'},{type,{11498,22},list,[{type,{11498,23},pid,[]}]}]]}]]},{type,{11499,9},bounded_fun,[{type,{11499,9},'fun',[{type,{11499,9},product,[{var,{11499,10},'Port'},{ann_type,{11499,16},[{var,{11499,16},'Item'},{atom,{11499,24},name}]}]},{type,{11499,33},union,[{type,{11499,33},tuple,[{atom,{11499,34},name},{var,{11499,40},'Name'}]},{atom,{11499,48},undefined}]}]},[{type,{11500,7},constraint,[{atom,{11500,7},is_subtype},[{var,{11500,7},'Port'},{type,{11500,15},union,[{type,{11500,15},port,[]},{type,{11500,24},atom,[]}]}]]},{type,{11501,7},constraint,[{atom,{11501,7},is_subtype},[{var,{11501,7},'Name'},{type,{11501,15},string,[]}]]}]]},{type,{11502,9},bounded_fun,[{type,{11502,9},'fun',[{type,{11502,9},product,[{var,{11502,10},'Port'},{ann_type,{11502,16},[{var,{11502,16},'Item'},{atom,{11502,24},os_pid}]}]},{type,{11502,35},union,[{type,{11502,35},tuple,[{atom,{11502,36},os_pid},{var,{11502,44},'OsPid'}]},{atom,{11502,53},undefined}]}]},[{type,{11503,7},constraint,[{atom,{11503,7},is_subtype},[{var,{11503,7},'Port'},{type,{11503,15},union,[{type,{11503,15},port,[]},{type,{11503,24},atom,[]}]}]]},{type,{11504,7},constraint,[{atom,{11504,7},is_subtype},[{var,{11504,7},'OsPid'},{type,{11504,16},union,[{type,{11504,16},non_neg_integer,[]},{atom,{11504,36},undefined}]}]]}]]},{type,{11505,9},bounded_fun,[{type,{11505,9},'fun',[{type,{11505,9},product,[{var,{11505,10},'Port'},{ann_type,{11505,16},[{var,{11505,16},'Item'},{atom,{11505,24},output}]}]},{type,{11505,35},union,[{type,{11505,35},tuple,[{atom,{11505,36},output},{var,{11505,44},'Bytes'}]},{atom,{11505,53},undefined}]}]},[{type,{11506,7},constraint,[{atom,{11506,7},is_subtype},[{var,{11506,7},'Port'},{type,{11506,15},union,[{type,{11506,15},port,[]},{type,{11506,24},atom,[]}]}]]},{type,{11507,7},constraint,[{atom,{11507,7},is_subtype},[{var,{11507,7},'Bytes'},{type,{11507,16},non_neg_integer,[]}]]}]]},{type,{11508,9},bounded_fun,[{type,{11508,9},'fun',[{type,{11508,9},product,[{var,{11508,10},'Port'},{ann_type,{11508,16},[{var,{11508,16},'Item'},{atom,{11508,24},parallelism}]}]},{type,{11508,40},union,[{type,{11508,40},tuple,[{atom,{11508,41},parallelism},{var,{11508,54},'Boolean'}]},{atom,{11508,65},undefined}]}]},[{type,{11509,7},constraint,[{atom,{11509,7},is_subtype},[{var,{11509,7},'Port'},{type,{11509,15},union,[{type,{11509,15},port,[]},{type,{11509,24},atom,[]}]}]]},{type,{11510,7},constraint,[{atom,{11510,7},is_subtype},[{var,{11510,7},'Boolean'},{type,{11510,18},boolean,[]}]]}]]},{type,{11511,9},bounded_fun,[{type,{11511,9},'fun',[{type,{11511,9},product,[{var,{11511,10},'Port'},{ann_type,{11511,16},[{var,{11511,16},'Item'},{atom,{11511,24},queue_size}]}]},{type,{11511,39},union,[{type,{11511,39},tuple,[{atom,{11511,40},queue_size},{var,{11511,52},'Bytes'}]},{atom,{11511,61},undefined}]}]},[{type,{11512,7},constraint,[{atom,{11512,7},is_subtype},[{var,{11512,7},'Port'},{type,{11512,15},union,[{type,{11512,15},port,[]},{type,{11512,24},atom,[]}]}]]},{type,{11513,7},constraint,[{atom,{11513,7},is_subtype},[{var,{11513,7},'Bytes'},{type,{11513,16},non_neg_integer,[]}]]}]]},{type,{11514,9},bounded_fun,[{type,{11514,9},'fun',[{type,{11514,9},product,[{var,{11514,10},'Port'},{ann_type,{11514,16},[{var,{11514,16},'Item'},{atom,{11514,24},registered_name}]}]},{type,{11514,44},union,[{type,{11514,44},tuple,[{atom,{11514,45},registered_name},{var,{11514,62},'RegisteredName'}]},{type,{11514,80},nil,[]},{atom,{11514,85},undefined}]}]},[{type,{11515,7},constraint,[{atom,{11515,7},is_subtype},[{var,{11515,7},'Port'},{type,{11515,15},union,[{type,{11515,15},port,[]},{type,{11515,24},atom,[]}]}]]},{type,{11516,7},constraint,[{atom,{11516,7},is_subtype},[{var,{11516,7},'RegisteredName'},{type,{11516,25},atom,[]}]]}]]}]}}]}},{{function,port_info,1},{11429,2},[<<112,111,114,116,95,105,110,102,111,40,80,111,114,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,80,111,114,116,96,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,10,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,111,112,101,110,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,97,108,108,32,116,104,101,32,116,117,112,108,101,115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,10,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,10,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,91,96,112,111,114,116,95,105,110,102,111,47,49,96,93,40,96,112,111,114,116,95,105,110,102,111,47,49,96,41,32,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,84,104,101,32,114,101,115,117,108,116,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,96,73,116,101,109,96,115,58,10,10,45,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,40,105,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,41,10,45,32,96,105,100,96,10,45,32,96,99,111,110,110,101,99,116,101,100,96,10,45,32,96,108,105,110,107,115,96,10,45,32,96,110,97,109,101,96,10,45,32,96,105,110,112,117,116,96,10,45,32,96,111,117,116,112,117,116,96,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,96,73,116,101,109,96,115,44,32,115,101,101,32,96,112,111,114,116,95,105,110,102,111,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>},#{group => ports,specification => [{attribute,{11453,2},spec,{{port_info,1},[{type,{11453,16},bounded_fun,[{type,{11453,16},'fun',[{type,{11453,16},product,[{var,{11453,17},'Port'}]},{var,{11453,26},'Result'}]},[{type,{11454,7},constraint,[{atom,{11454,7},is_subtype},[{var,{11454,7},'Port'},{type,{11454,15},union,[{type,{11454,15},port,[]},{type,{11454,24},atom,[]}]}]]},{type,{11455,7},constraint,[{atom,{11455,7},is_subtype},[{var,{11455,7},'ResultItem'},{type,{11455,21},union,[{type,{11455,21},tuple,[{atom,{11455,22},registered_name},{ann_type,{11455,39},[{var,{11455,39},'RegisteredName'},{type,{11455,57},atom,[]}]}]},{type,{11456,7},tuple,[{atom,{11456,8},id},{ann_type,{11456,12},[{var,{11456,12},'Index'},{type,{11456,21},non_neg_integer,[]}]}]},{type,{11457,7},tuple,[{atom,{11457,8},connected},{ann_type,{11457,19},[{var,{11457,19},'Pid'},{type,{11457,26},pid,[]}]}]},{type,{11458,7},tuple,[{atom,{11458,8},links},{ann_type,{11458,15},[{var,{11458,15},'Pids'},{type,{11458,23},list,[{type,{11458,24},pid,[]}]}]}]},{type,{11459,7},tuple,[{atom,{11459,8},name},{ann_type,{11459,14},[{var,{11459,14},'String'},{type,{11459,24},string,[]}]}]},{type,{11460,7},tuple,[{atom,{11460,8},input},{ann_type,{11460,15},[{var,{11460,15},'Bytes'},{type,{11460,24},non_neg_integer,[]}]}]},{type,{11461,7},tuple,[{atom,{11461,8},output},{ann_type,{11461,16},[{var,{11461,16},'Bytes'},{type,{11461,25},non_neg_integer,[]}]}]},{type,{11462,7},tuple,[{atom,{11462,8},os_pid},{ann_type,{11462,16},[{var,{11462,16},'OsPid'},{type,{11462,25},union,[{type,{11462,25},non_neg_integer,[]},{atom,{11462,45},undefined}]}]}]}]}]]},{type,{11463,7},constraint,[{atom,{11463,7},is_subtype},[{var,{11463,7},'Result'},{type,{11463,17},union,[{type,{11463,17},list,[{var,{11463,18},'ResultItem'}]},{atom,{11463,32},undefined}]}]]}]]}]}}]}},{{function,port_call,3},{11378,2},[<<112,111,114,116,95,99,97,108,108,40,80,111,114,116,44,32,79,112,101,114,97,116,105,111,110,44,32,68,97,116,97,41>>],#{<<101,110>> => <<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,96,79,112,101,114,97,116,105,111,110,96,32,97,110,100,32,96,68,97,116,97,96,10,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,10,116,104,105,115,32,102,101,97,116,117,114,101,46,10,10,96,80,111,114,116,96,32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,114,101,102,101,114,114,105,110,103,32,116,111,32,97,32,100,114,105,118,101,114,46,10,10,96,79,112,101,114,97,116,105,111,110,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,100,114,105,118,101,114,46,10,10,96,68,97,116,97,96,32,105,115,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,46,32,84,104,105,115,32,100,97,116,97,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,98,105,110,97,114,121,32,116,101,114,109,32,102,111,114,109,97,116,32,97,110,100,32,115,101,110,116,10,116,111,32,116,104,101,32,112,111,114,116,46,10,10,82,101,116,117,114,110,115,32,97,32,116,101,114,109,32,102,114,111,109,32,116,104,101,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,10,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,101,114,97,116,105,111,110,96,32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,10,32,32,111,112,101,114,97,116,105,111,110,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,10,32,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32,96,79,112,101,114,97,116,105,111,110,96,32,111,114,32,96,68,97,116,97,96,41,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,99,97,108,108,32,96,112,111,114,116,95,99,97,108,108,96,32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32,96,80,111,114,116,96,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,10,32,32,62,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,10,32,32,62,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>},#{group => ports,specification => [{attribute,{11415,2},spec,{{port_call,3},[{type,{11415,16},bounded_fun,[{type,{11415,16},'fun',[{type,{11415,16},product,[{var,{11415,17},'Port'},{var,{11415,23},'Operation'},{var,{11415,34},'Data'}]},{type,{11415,43},term,[]}]},[{type,{11416,7},constraint,[{atom,{11416,7},is_subtype},[{var,{11416,7},'Port'},{type,{11416,15},union,[{type,{11416,15},port,[]},{type,{11416,24},atom,[]}]}]]},{type,{11417,7},constraint,[{atom,{11417,7},is_subtype},[{var,{11417,7},'Operation'},{type,{11417,20},integer,[]}]]},{type,{11418,7},constraint,[{atom,{11418,7},is_subtype},[{var,{11418,7},'Data'},{type,{11418,15},term,[]}]]}]]}]}}]}},{{function,port_call,2},{11364,2},[<<112,111,114,116,95,99,97,108,108,40,80,111,114,116,44,32,68,97,116,97,41>>],hidden,#{}},{{function,port_control,3},{11322,2},[<<112,111,114,116,95,99,111,110,116,114,111,108,40,80,111,114,116,44,32,79,112,101,114,97,116,105,111,110,44,32,68,97,116,97,41>>],#{<<101,110>> => <<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,96,79,112,101,114,97,116,105,111,110,96,10,97,110,100,32,96,68,97,116,97,96,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,10,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,99,111,110,116,114,111,108,32,102,101,97,116,117,114,101,46,10,10,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,53,53,44,32,111,114,32,97,32,98,105,110,97,114,121,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,10,112,111,114,116,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,111,112,101,110,32,112,111,114,116,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,10,32,32,112,111,114,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,101,114,97,116,105,111,110,96,32,99,97,110,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,10,32,32,111,112,101,114,97,116,105,111,110,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,10,32,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32,96,79,112,101,114,97,116,105,111,110,96,32,111,114,32,96,68,97,116,97,96,41,46,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,99,97,108,108,32,91,96,112,111,114,116,95,99,111,110,116,114,111,108,47,51,96,93,40,96,112,111,114,116,95,99,111,110,116,114,111,108,47,51,96,41,32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32,96,80,111,114,116,96,10,32,32,62,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,32,32,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,10,32,32,62,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>},#{group => ports,specification => [{attribute,{11350,2},spec,{{port_control,3},[{type,{11350,19},bounded_fun,[{type,{11350,19},'fun',[{type,{11350,19},product,[{var,{11350,20},'Port'},{var,{11350,26},'Operation'},{var,{11350,37},'Data'}]},{type,{11350,46},union,[{type,{11350,46},iodata,[]},{type,{11350,57},binary,[]}]}]},[{type,{11351,7},constraint,[{atom,{11351,7},is_subtype},[{var,{11351,7},'Port'},{type,{11351,15},union,[{type,{11351,15},port,[]},{type,{11351,24},atom,[]}]}]]},{type,{11352,7},constraint,[{atom,{11352,7},is_subtype},[{var,{11352,7},'Operation'},{type,{11352,20},integer,[]}]]},{type,{11353,7},constraint,[{atom,{11353,7},is_subtype},[{var,{11353,7},'Data'},{type,{11353,15},iodata,[]}]]}]]}]}}]}},{{function,port_close,1},{11278,2},[<<112,111,114,116,95,99,108,111,115,101,40,80,111,114,116,41>>],#{<<101,110>> => <<67,108,111,115,101,115,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125,96,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,10,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,40,115,101,101,32,98,101,108,111,119,41,44,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,95,110,111,116,95,10,114,101,112,108,121,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,108,111,115,101,100,125,96,46,10,10,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,119,105,116,104,32,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,44,32,110,111,116,32,111,110,108,121,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,10,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,32,114,101,116,117,114,110,115,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,100,111,101,115,10,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,10,73,102,32,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,10,114,101,112,108,105,101,115,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,108,111,115,101,100,125,96,32,119,104,101,110,32,97,108,108,32,98,117,102,102,101,114,115,32,104,97,118,101,32,98,101,101,110,32,102,108,117,115,104,101,100,32,97,110,100,32,116,104,101,32,112,111,114,116,10,114,101,97,108,108,121,32,99,108,111,115,101,115,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,32,111,119,110,101,114,95,10,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,117,115,105,110,103,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125,96,32,97,115,32,105,102,10,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125,96,32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,10,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,10,91,96,112,111,114,116,95,99,108,111,115,101,47,49,96,93,40,96,112,111,114,116,95,99,108,111,115,101,47,49,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,10,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,10,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>},#{group => ports,specification => [{attribute,{11310,2},spec,{{port_close,1},[{type,{11310,17},bounded_fun,[{type,{11310,17},'fun',[{type,{11310,17},product,[{var,{11310,18},'Port'}]},{atom,{11310,27},true}]},[{type,{11311,7},constraint,[{atom,{11311,7},is_subtype},[{var,{11311,7},'Port'},{type,{11311,15},union,[{type,{11311,15},port,[]},{type,{11311,24},atom,[]}]}]]}]]}]}}]}},{{function,port_connect,2},{11222,2},[<<112,111,114,116,95,99,111,110,110,101,99,116,40,80,111,114,116,44,32,80,105,100,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,111,114,116,41,32,116,111,32,96,80,105,100,96,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,10,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,84,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,44,32,115,101,101,32,98,101,108,111,119,46,10,45,32,84,104,101,32,112,111,114,116,32,100,111,101,115,32,95,110,111,116,95,32,114,101,112,108,121,32,119,105,116,104,32,96,123,80,111,114,116,44,99,111,110,110,101,99,116,101,100,125,96,46,10,45,32,96,112,111,114,116,95,99,111,110,110,101,99,116,47,49,96,32,105,115,32,115,121,110,99,104,114,111,110,111,117,115,44,32,115,101,101,32,98,101,108,111,119,46,10,45,32,84,104,101,32,110,101,119,32,112,111,114,116,32,111,119,110,101,114,32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46,10,10,84,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,115,116,97,121,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,97,110,100,32,109,117,115,116,32,99,97,108,108,10,91,96,117,110,108,105,110,107,40,80,111,114,116,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,100,101,115,105,114,101,100,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,116,111,32,98,101,32,97,110,121,32,112,114,111,99,101,115,115,32,119,105,116,104,32,91,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,93,40,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,41,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,32,105,102,10,96,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,10,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,10,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32,96,123,80,111,114,116,44,32,99,111,110,110,101,99,116,101,100,125,96,32,116,111,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,46,32,78,111,116,105,99,101,10,116,104,97,116,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,105,115,32,115,116,105,108,108,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,119,104,105,108,101,32,116,104,101,32,110,101,119,32,105,115,32,110,111,116,46,32,73,102,10,96,80,111,114,116,96,32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,10,111,119,110,101,114,95,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,32,97,108,115,111,32,105,102,32,96,80,105,100,96,32,105,115,10,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,117,115,105,110,103,10,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,10,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125,96,32,105,115,32,116,114,117,108,121,10,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,10,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,115,121,110,99,104,114,111,110,111,117,115,46,32,91,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,93,40,96,112,111,114,116,95,99,111,110,110,101,99,116,47,50,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,10,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,10,32,32,112,114,111,99,101,115,115,46>>},#{group => ports,specification => [{attribute,{11265,2},spec,{{port_connect,2},[{type,{11265,19},bounded_fun,[{type,{11265,19},'fun',[{type,{11265,19},product,[{var,{11265,20},'Port'},{var,{11265,26},'Pid'}]},{atom,{11265,34},true}]},[{type,{11266,7},constraint,[{atom,{11266,7},is_subtype},[{var,{11266,7},'Port'},{type,{11266,15},union,[{type,{11266,15},port,[]},{type,{11266,24},atom,[]}]}]]},{type,{11267,7},constraint,[{atom,{11267,7},is_subtype},[{var,{11267,7},'Pid'},{type,{11267,14},pid,[]}]]}]]}]}}]}},{{function,port_command,3},{11162,2},[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,91,93,41,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,51,96,41,32,101,113,117,97,108,115,10,91,96,112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,10,97,110,121,109,111,114,101,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,102,111,114,99,101,96,42,42,32,45,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,10,32,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,102,111,114,99,101,100,32,116,104,114,111,117,103,104,46,32,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,10,32,32,101,120,99,101,112,116,105,111,110,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,100,114,105,118,101,114,32,102,108,97,103,10,32,32,91,96,69,82,76,95,68,82,86,95,70,76,65,71,95,83,79,70,84,95,66,85,83,89,96,93,40,100,114,105,118,101,114,95,101,110,116,114,121,46,109,100,35,100,114,105,118,101,114,95,102,108,97,103,115,41,46,10,10,45,32,42,42,96,110,111,115,117,115,112,101,110,100,96,42,42,32,45,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,10,32,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,32,97,110,100,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,108,105,115,116,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,111,112,116,105,111,110,32,96,102,111,114,99,101,96,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,98,117,116,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,10,32,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,102,111,114,99,105,110,103,32,116,104,114,111,117,103,104,32,97,32,98,117,115,121,32,112,111,114,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>},#{group => ports,specification => [{attribute,{11206,2},spec,{{port_command,3},[{type,{11206,19},bounded_fun,[{type,{11206,19},'fun',[{type,{11206,19},product,[{var,{11206,20},'Port'},{var,{11206,26},'Data'},{var,{11206,32},'OptionList'}]},{type,{11206,47},boolean,[]}]},[{type,{11207,7},constraint,[{atom,{11207,7},is_subtype},[{var,{11207,7},'Port'},{type,{11207,15},union,[{type,{11207,15},port,[]},{type,{11207,24},atom,[]}]}]]},{type,{11208,7},constraint,[{atom,{11208,7},is_subtype},[{var,{11208,7},'Data'},{type,{11208,15},iodata,[]}]]},{type,{11209,7},constraint,[{atom,{11209,7},is_subtype},[{var,{11209,7},'Option'},{type,{11209,17},union,[{atom,{11209,17},force},{atom,{11209,25},nosuspend}]}]]},{type,{11210,7},constraint,[{atom,{11210,7},is_subtype},[{var,{11210,7},'OptionList'},{type,{11210,21},list,[{var,{11210,22},'Option'}]}]]}]]}]}}]}},{{function,port_command,2},{11109,2},[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41>>],#{<<101,110>> => <<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,83,97,109,101,32,97,115,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,101,120,99,101,112,116,32,102,111,114,10,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,97,110,100,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,32,119,105,116,104,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,44,10,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,10,10,70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,10,105,102,32,96,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,116,104,101,10,100,97,116,97,32,109,101,115,115,97,103,101,32,100,105,115,97,112,112,101,97,114,115,32,119,105,116,104,111,117,116,32,97,32,115,111,117,110,100,46,32,73,102,32,96,80,111,114,116,96,32,105,115,32,111,112,101,110,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,95,112,111,114,116,32,111,119,110,101,114,95,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,46,32,84,104,101,32,112,111,114,116,10,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,115,105,103,96,32,97,108,115,111,32,105,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,116,111,32,97,32,112,111,114,116,32,117,115,105,110,103,10,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46,10,10,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,10,97,110,121,32,109,111,114,101,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32,96,80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,105,115,32,116,114,117,108,121,10,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,10,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,115,121,110,99,104,114,111,110,111,117,115,46,32,91,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,93,40,96,112,111,114,116,95,99,111,109,109,97,110,100,47,50,96,41,32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,10,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,10,32,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,10,32,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,111,114,116,96,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,10,32,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,68,97,116,97,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,10,62,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>},#{group => ports,specification => [{attribute,{11149,2},spec,{{port_command,2},[{type,{11149,19},bounded_fun,[{type,{11149,19},'fun',[{type,{11149,19},product,[{var,{11149,20},'Port'},{var,{11149,26},'Data'}]},{atom,{11149,35},true}]},[{type,{11150,7},constraint,[{atom,{11150,7},is_subtype},[{var,{11150,7},'Port'},{type,{11150,15},union,[{type,{11150,15},port,[]},{type,{11150,24},atom,[]}]}]]},{type,{11151,7},constraint,[{atom,{11151,7},is_subtype},[{var,{11151,7},'Data'},{type,{11151,15},iodata,[]}]]}]]}]}}]}},{{function,localtime_to_universaltime,1},{11062,2},[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,44,32,105,102,32,115,117,112,112,111,114,116,101,100,10,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,32,97,110,100,32,96,76,111,99,97,108,116,105,109,101,96,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,111,99,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{11077,2},spec,{{localtime_to_universaltime,1},[{type,{11077,33},bounded_fun,[{type,{11077,33},'fun',[{type,{11077,33},product,[{var,{11077,34},'Localtime'}]},{var,{11077,48},'Universaltime'}]},[{type,{11078,7},constraint,[{atom,{11078,7},is_subtype},[{var,{11078,7},'Localtime'},{remote_type,{11078,20},[{atom,{11078,20},calendar},{atom,{11078,29},datetime},[]]}]]},{type,{11079,7},constraint,[{atom,{11079,7},is_subtype},[{var,{11079,7},'Universaltime'},{remote_type,{11079,24},[{atom,{11079,24},calendar},{atom,{11079,33},datetime},[]]}]]}]]}]}}]}},{{function,send_nosuspend,3},{11026,2},[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,32,124,32,79,112,116,105,111,110,115,93,41,96,93,40,96,115,101,110,100,47,51,96,41,44,32,98,117,116,10,119,105,116,104,32,97,32,66,111,111,108,101,97,110,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,108,105,107,101,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,93,40,96,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,41,44,32,98,117,116,10,116,97,107,101,115,32,97,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,44,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,111,110,108,121,32,111,112,116,105,111,110,32,105,115,32,96,110,111,99,111,110,110,101,99,116,96,44,10,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,117,114,114,101,110,116,108,121,10,114,101,97,99,104,97,98,108,101,32,98,121,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,32,105,115,32,116,111,32,116,114,121,32,116,111,32,99,111,110,110,101,99,116,32,116,111,32,116,104,101,10,110,111,100,101,44,32,119,104,105,99,104,32,99,97,110,32,115,116,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,97,32,115,104,111,114,116,32,112,101,114,105,111,100,46,32,84,104,101,32,117,115,101,32,111,102,32,111,112,116,105,111,110,10,96,110,111,99,111,110,110,101,99,116,96,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,103,101,116,32,116,104,101,32,115,108,105,103,104,116,101,115,116,32,100,101,108,97,121,32,119,104,101,110,10,115,101,110,100,105,110,103,32,116,111,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,101,115,112,101,99,105,97,108,108,121,32,117,115,101,102,117,108,32,119,104,101,110,32,99,111,109,109,117,110,105,99,97,116,105,110,103,32,119,105,116,104,10,110,111,100,101,115,32,116,104,97,116,32,101,120,112,101,99,116,32,116,111,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,99,111,110,110,101,99,116,105,110,103,32,112,97,114,116,32,40,116,104,97,116,32,105,115,44,32,110,111,100,101,115,32,119,114,105,116,116,101,110,32,105,110,32,67,10,111,114,32,74,97,118,97,41,46,10,10,87,104,101,110,101,118,101,114,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,40,101,105,116,104,101,114,32,119,104,101,110,32,97,32,115,117,115,112,101,110,100,32,119,111,117,108,100,32,111,99,99,117,114,32,111,114,32,119,104,101,110,10,96,110,111,99,111,110,110,101,99,116,96,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,116,104,101,32,110,111,100,101,32,119,97,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,110,110,101,99,116,101,100,41,44,32,116,104,101,32,109,101,115,115,97,103,101,10,105,115,32,103,117,97,114,97,110,116,101,101,100,32,95,110,111,116,95,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,101,110,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{11049,2},spec,{{send_nosuspend,3},[{type,{11049,21},bounded_fun,[{type,{11049,21},'fun',[{type,{11049,21},product,[{var,{11049,22},'Dest'},{var,{11049,28},'Msg'},{var,{11049,33},'Options'}]},{type,{11049,45},boolean,[]}]},[{type,{11050,7},constraint,[{atom,{11050,7},is_subtype},[{var,{11050,7},'Dest'},{user_type,{11050,15},send_destination,[]}]]},{type,{11051,7},constraint,[{atom,{11051,7},is_subtype},[{var,{11051,7},'Msg'},{type,{11051,14},term,[]}]]},{type,{11052,7},constraint,[{atom,{11052,7},is_subtype},[{var,{11052,7},'Options'},{type,{11052,18},list,[{atom,{11052,19},noconnect}]}]]}]]}]}}]}},{{function,send_nosuspend,2},{10976,2},[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,40,68,101,115,116,44,32,77,115,103,41>>],#{<<101,110>> => <<83,101,110,100,32,97,32,109,101,115,115,97,103,101,32,119,105,116,104,111,117,116,32,115,117,115,112,101,110,100,105,110,103,32,116,104,101,32,99,97,108,108,101,114,46,10,10,69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,93,41,96,93,40,96,115,101,110,100,47,51,96,41,44,32,98,117,116,32,114,101,116,117,114,110,115,10,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,115,101,110,116,32,97,110,100,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,110,111,116,32,115,101,110,116,32,98,101,99,97,117,115,101,10,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,104,97,100,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,110,32,117,110,114,101,108,105,97,98,108,101,32,114,101,109,111,116,101,32,110,111,100,101,10,119,105,116,104,111,117,116,32,101,118,101,114,32,98,108,111,99,107,105,110,103,32,116,104,101,32,115,101,110,100,105,110,103,32,40,69,114,108,97,110,103,41,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,10,114,101,109,111,116,101,32,110,111,100,101,32,40,117,115,117,97,108,108,121,32,110,111,116,32,97,32,114,101,97,108,32,69,114,108,97,110,103,32,110,111,100,101,44,32,98,117,116,32,97,32,110,111,100,101,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,32,105,115,10,111,118,101,114,108,111,97,100,101,100,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,95,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,95,32,97,110,100,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,84,104,101,32,115,97,109,101,32,111,99,99,117,114,115,32,105,102,32,96,68,101,115,116,96,32,114,101,102,101,114,115,32,116,111,32,97,32,108,111,99,97,108,32,112,111,114,116,32,116,104,97,116,32,105,115,32,98,117,115,121,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,10,100,101,115,116,105,110,97,116,105,111,110,115,32,40,97,108,108,111,119,101,100,32,102,111,114,32,116,104,101,32,111,114,100,105,110,97,114,121,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,96,39,33,39,96,41,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,115,101,110,100,115,10,116,104,101,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,32,119,104,101,114,101,32,97,32,112,114,111,99,101,115,115,10,99,111,109,109,117,110,105,99,97,116,101,115,32,119,105,116,104,32,69,114,108,97,110,103,32,110,111,100,101,115,32,116,104,97,116,32,99,97,110,32,100,105,115,97,112,112,101,97,114,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,97,99,101,44,32,99,97,117,115,105,110,103,32,116,104,101,10,84,67,80,32,98,117,102,102,101,114,115,32,97,110,100,32,116,104,101,32,100,114,105,118,101,114,115,32,113,117,101,117,101,32,116,111,32,98,101,32,111,118,101,114,45,102,117,108,108,32,98,101,102,111,114,101,32,116,104,101,32,110,111,100,101,32,105,115,32,115,104,117,116,32,100,111,119,110,10,40,98,101,99,97,117,115,101,32,111,102,32,116,105,99,107,32,116,105,109,101,45,111,117,116,115,41,32,98,121,32,96,110,101,116,95,107,101,114,110,101,108,96,46,32,84,104,101,32,110,111,114,109,97,108,32,114,101,97,99,116,105,111,110,32,116,111,32,116,97,107,101,32,119,104,101,110,10,116,104,105,115,32,111,99,99,117,114,115,32,105,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,112,114,101,109,97,116,117,114,101,32,115,104,117,116,100,111,119,110,32,111,102,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,105,103,110,111,114,105,110,103,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,117,108,100,32,114,101,115,117,108,116,32,105,110,32,97,110,10,95,117,110,114,101,108,105,97,98,108,101,95,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,44,32,119,104,105,99,104,32,105,115,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,10,109,111,100,101,108,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32,95,110,111,116,95,32,115,101,110,116,32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,73,110,32,109,97,110,121,32,115,121,115,116,101,109,115,44,32,116,114,97,110,115,105,101,110,116,32,115,116,97,116,101,115,32,111,102,32,111,118,101,114,108,111,97,100,101,100,32,113,117,101,117,101,115,32,97,114,101,32,110,111,114,109,97,108,46,32,65,108,116,104,111,117,103,104,32,116,104,105,115,10,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,100,111,101,115,32,110,111,116,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,10,110,111,110,45,114,101,115,112,111,110,115,105,118,101,44,32,105,116,32,99,111,117,108,100,32,98,101,32,97,32,116,101,109,112,111,114,97,114,121,32,111,118,101,114,108,111,97,100,46,32,65,108,115,111,44,32,97,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,96,116,114,117,101,96,10,100,111,101,115,32,111,110,108,121,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,109,101,115,115,97,103,101,32,99,97,110,32,98,101,32,115,101,110,116,32,111,110,32,116,104,101,32,40,84,67,80,41,32,99,104,97,110,110,101,108,32,119,105,116,104,111,117,116,10,98,108,111,99,107,105,110,103,59,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,114,114,105,118,101,32,97,116,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,70,111,114,32,97,10,100,105,115,99,111,110,110,101,99,116,101,100,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,32,110,111,100,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,96,116,114,117,101,96,32,40,109,105,109,105,99,115,32,116,104,101,10,98,101,104,97,118,105,111,114,32,111,102,32,111,112,101,114,97,116,111,114,32,96,33,96,41,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,97,110,100,32,116,104,101,32,97,99,116,105,111,110,115,32,116,111,32,116,97,107,101,32,119,104,101,110,10,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,97,114,101,32,97,112,112,108,105,99,97,116,105,111,110,45,32,97,110,100,32,104,97,114,100,119,97,114,101,45,115,112,101,99,105,102,105,99,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{11016,2},spec,{{send_nosuspend,2},[{type,{11016,21},bounded_fun,[{type,{11016,21},'fun',[{type,{11016,21},product,[{var,{11016,22},'Dest'},{var,{11016,28},'Msg'}]},{type,{11016,36},boolean,[]}]},[{type,{11017,7},constraint,[{atom,{11017,7},is_subtype},[{var,{11017,7},'Dest'},{user_type,{11017,15},send_destination,[]}]]},{type,{11018,7},constraint,[{atom,{11018,7},is_subtype},[{var,{11018,7},'Msg'},{type,{11018,14},term,[]}]]}]]}]}}]}},{{function,fun_info,1},{10869,2},[<<102,117,110,95,105,110,102,111,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,117,110,32,96,70,117,110,96,46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,10,116,117,112,108,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,10,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,98,117,116,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,98,101,32,117,115,101,102,117,108,32,105,110,10,62,32,108,105,98,114,97,114,121,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,110,101,101,100,32,116,111,32,118,101,114,105,102,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,46,10,10,84,119,111,32,116,121,112,101,115,32,111,102,32,102,117,110,115,32,104,97,118,101,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,115,101,109,97,110,116,105,99,115,58,10,10,45,32,65,32,102,117,110,32,99,114,101,97,116,101,100,32,98,121,32,96,102,117,110,32,77,58,70,47,65,96,32,105,115,32,99,97,108,108,101,100,32,97,110,32,95,101,120,116,101,114,110,97,108,95,32,102,117,110,46,32,67,97,108,108,105,110,103,32,105,116,32,119,105,108,108,10,32,32,97,108,119,97,121,115,32,99,97,108,108,32,116,104,101,32,102,117,110,99,116,105,111,110,32,96,70,96,32,119,105,116,104,32,97,114,105,116,121,32,96,65,96,32,105,110,32,116,104,101,32,108,97,116,101,115,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32,96,77,96,46,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,100,117,108,101,32,96,77,96,32,100,111,101,115,32,110,111,116,32,101,118,101,110,32,110,101,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,10,32,32,96,102,117,110,32,77,58,70,47,65,96,32,105,115,32,99,114,101,97,116,101,100,46,10,45,32,65,108,108,32,111,116,104,101,114,32,102,117,110,115,32,97,114,101,32,99,97,108,108,101,100,32,95,108,111,99,97,108,95,46,32,87,104,101,110,32,97,32,108,111,99,97,108,32,102,117,110,32,105,115,32,99,97,108,108,101,100,44,32,116,104,101,32,115,97,109,101,10,32,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,32,105,115,32,99,97,108,108,101,100,32,40,101,118,101,110,32,105,102,32,97,32,110,101,119,101,114,32,118,101,114,115,105,111,110,32,111,102,10,32,32,116,104,101,32,109,111,100,117,108,101,32,104,97,115,32,98,101,101,110,32,108,111,97,100,101,100,41,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,97,108,119,97,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,102,111,114,32,98,111,116,104,32,108,111,99,97,108,32,97,110,100,10,101,120,116,101,114,110,97,108,32,102,117,110,115,58,10,10,45,32,42,42,96,123,116,121,112,101,44,32,84,121,112,101,125,96,42,42,32,45,32,96,84,121,112,101,96,32,105,115,32,96,108,111,99,97,108,96,32,111,114,32,96,101,120,116,101,114,110,97,108,96,46,10,10,45,32,42,42,96,123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,32,40,97,110,32,97,116,111,109,41,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,102,117,110,32,105,115,32,100,101,102,105,110,101,100,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46,10,10,45,32,42,42,96,123,110,97,109,101,44,32,78,97,109,101,125,96,42,42,32,45,32,96,78,97,109,101,96,32,40,97,110,32,97,116,111,109,41,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,110,97,109,101,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,116,104,97,116,10,32,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,102,117,110,46,32,40,84,104,105,115,32,110,97,109,101,32,119,97,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,97,110,100,32,105,115,32,111,110,108,121,32,111,102,10,32,32,105,110,102,111,114,109,97,116,105,111,110,97,108,32,117,115,101,46,32,65,115,32,105,116,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,99,97,108,108,101,100,32,100,105,114,101,99,116,108,121,46,41,10,32,32,73,102,32,110,111,32,99,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,101,32,102,117,110,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,110,10,32,32,97,116,111,109,46,10,10,32,32,73,102,32,96,70,117,110,96,32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,96,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32,116,104,97,116,10,32,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46,10,10,45,32,42,42,96,123,97,114,105,116,121,44,32,65,114,105,116,121,125,96,42,42,32,45,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,102,117,110,32,105,115,32,116,111,10,32,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,46,10,10,45,32,42,42,96,123,101,110,118,44,32,69,110,118,125,96,42,42,32,45,32,96,69,110,118,96,32,40,97,32,108,105,115,116,41,32,105,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,114,32,102,114,101,101,32,118,97,114,105,97,98,108,101,115,32,102,111,114,32,116,104,101,10,32,32,102,117,110,46,32,70,111,114,32,101,120,116,101,114,110,97,108,32,102,117,110,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,105,115,32,97,108,119,97,121,115,32,101,109,112,116,121,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,110,108,121,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,105,102,32,96,70,117,110,96,32,105,115,32,108,111,99,97,108,58,10,10,45,32,42,42,96,123,112,105,100,44,32,80,105,100,125,96,42,42,32,45,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,96,105,110,105,116,96,32,112,114,111,99,101,115,115,32,111,110,10,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,83,116,97,114,116,105,110,103,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,50,55,44,32,96,80,105,100,96,32,97,108,119,97,121,115,32,112,111,105,110,116,115,32,116,111,32,116,104,101,32,108,111,99,97,108,32,96,105,110,105,116,96,32,112,114,111,99,101,115,115,44,10,32,32,62,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,105,99,104,32,112,114,111,99,101,115,115,32,111,114,32,110,111,100,101,32,116,104,101,32,102,117,110,32,119,97,115,32,111,114,105,103,105,110,97,108,108,121,32,99,114,101,97,116,101,100,32,111,110,46,10,32,32,62,10,32,32,62,32,83,101,101,10,32,32,62,32,91,85,112,99,111,109,105,110,103,32,80,111,116,101,110,116,105,97,108,32,73,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,32,93,40,96,101,58,103,101,110,101,114,97,108,95,105,110,102,111,58,117,112,99,111,109,105,110,103,95,105,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,46,109,100,35,102,117,110,45,99,114,101,97,116,111,114,45,112,105,100,45,119,105,108,108,45,97,108,119,97,121,115,45,98,101,45,108,111,99,97,108,45,105,110,105,116,45,112,114,111,99,101,115,115,96,41,46,10,10,45,32,42,42,96,123,105,110,100,101,120,44,32,73,110,100,101,120,125,96,42,42,32,45,32,96,73,110,100,101,120,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,10,32,32,116,97,98,108,101,46,10,10,45,32,42,42,96,123,110,101,119,95,105,110,100,101,120,44,32,73,110,100,101,120,125,96,42,42,32,45,32,96,73,110,100,101,120,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,10,32,32,102,117,110,32,116,97,98,108,101,46,10,10,45,32,42,42,96,123,110,101,119,95,117,110,105,113,44,32,85,110,105,113,125,96,42,42,32,45,32,96,85,110,105,113,96,32,40,97,32,98,105,110,97,114,121,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,73,116,10,32,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,123,117,110,105,113,44,32,85,110,105,113,125,96,42,42,32,45,32,96,85,110,105,113,96,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,65,115,10,32,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,10,32,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,119,97,115,32,98,97,115,101,100,32,111,110,32,111,110,108,121,32,116,104,101,32,98,111,100,121,10,32,32,111,102,32,116,104,101,32,102,117,110,46>>},#{group => terms,specification => [{attribute,{10945,2},spec,{{fun_info,1},[{type,{10945,15},bounded_fun,[{type,{10945,15},'fun',[{type,{10945,15},product,[{var,{10945,16},'Fun'}]},{type,{10945,24},list,[{type,{10945,25},tuple,[{var,{10945,26},'Item'},{var,{10945,32},'Info'}]}]}]},[{type,{10946,7},constraint,[{atom,{10946,7},is_subtype},[{var,{10946,7},'Fun'},{type,{10946,14},function,[]}]]},{type,{10947,7},constraint,[{atom,{10947,7},is_subtype},[{var,{10947,7},'Item'},{type,{10947,15},union,[{atom,{10947,15},arity},{atom,{10947,23},env},{atom,{10947,29},index},{atom,{10947,37},name},{atom,{10948,15},module},{atom,{10948,24},new_index},{atom,{10948,36},new_uniq},{atom,{10948,47},pid},{atom,{10948,53},type},{atom,{10948,60},uniq}]}]]},{type,{10949,7},constraint,[{atom,{10949,7},is_subtype},[{var,{10949,7},'Info'},{type,{10949,15},term,[]}]]}]]}]}}]}},{{function,disconnect_node,1},{10849,2},[<<100,105,115,99,111,110,110,101,99,116,95,110,111,100,101,40,78,111,100,101,41>>],#{<<101,110>> => <<70,111,114,99,101,115,32,116,104,101,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,111,102,32,97,32,110,111,100,101,46,10,10,68,111,105,110,103,32,116,104,105,115,32,109,97,107,101,115,32,105,116,32,97,112,112,101,97,114,115,32,116,111,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,32,97,115,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,104,97,115,32,99,114,97,115,104,101,100,46,10,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,110,101,116,119,111,114,107,32,97,117,116,104,101,110,116,105,99,97,116,105,111,110,32,112,114,111,116,111,99,111,108,115,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,32,73,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,10,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,105,103,110,111,114,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,121,32,114,101,116,117,114,110,32,98,101,102,111,114,101,32,91,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,115,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,104,97,118,101,10,62,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46>>},#{group => distribution,specification => [{attribute,{10864,2},spec,{{disconnect_node,1},[{type,{10864,22},bounded_fun,[{type,{10864,22},'fun',[{type,{10864,22},product,[{var,{10864,23},'Node'}]},{type,{10864,32},union,[{type,{10864,32},boolean,[]},{atom,{10864,44},ignored}]}]},[{type,{10865,7},constraint,[{atom,{10865,7},is_subtype},[{var,{10865,7},'Node'},{type,{10865,15},node,[]}]]}]]}]}}]}},{{function,nodes,2},{10776,2},[<<110,111,100,101,115,40,65,114,103,44,32,73,110,102,111,79,112,116,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,78,111,100,101,73,110,102,111,96,32,116,117,112,108,101,115,46,10,10,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,46,32,78,111,100,101,115,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,97,114,101,32,100,101,116,101,114,109,105,110,101,100,10,98,121,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,96,65,114,103,96,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,102,111,114,32,91,96,110,111,100,101,115,40,65,114,103,41,96,93,40,96,110,111,100,101,115,47,49,96,41,46,10,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,111,102,32,96,78,111,100,101,73,110,102,111,96,32,116,117,112,108,101,115,32,105,115,32,97,32,109,97,112,32,99,111,110,116,97,105,110,105,110,103,32,102,117,114,116,104,101,114,32,105,110,102,111,114,109,97,116,105,111,110,10,97,98,111,117,116,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,46,10,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,112,114,101,115,101,110,116,32,105,110,32,116,104,105,115,32,109,97,112,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,10,96,73,110,102,111,79,112,116,115,96,32,109,97,112,32,112,97,115,115,101,100,32,97,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,97,115,115,111,99,105,97,116,105,111,110,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,96,73,110,102,111,79,112,116,115,96,32,109,97,112,58,10,10,45,32,42,42,96,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,98,111,111,108,101,97,110,40,41,96,42,42,32,45,32,73,102,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,97,115,115,111,99,105,97,116,105,111,110,32,101,113,117,97,108,115,10,32,32,96,116,114,117,101,96,44,32,116,104,101,32,96,73,110,102,111,96,32,109,97,112,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,107,101,121,10,32,32,96,99,111,110,110,101,99,116,105,111,110,95,105,100,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,46,32,73,102,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,10,32,32,101,113,117,97,108,115,32,96,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,44,32,111,114,32,105,115,32,116,104,101,32,110,111,100,101,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,10,32,32,96,67,111,110,110,101,99,116,105,111,110,73,100,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,110,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,10,32,32,119,104,105,99,104,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,10,10,32,32,91,93,40,41,123,58,32,35,99,111,110,110,101,99,116,105,111,110,95,105,100,32,125,32,84,104,101,32,105,110,116,101,103,101,114,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,118,97,108,117,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,10,32,32,97,32,110,111,100,101,32,110,97,109,101,32,105,100,101,110,116,105,102,105,101,115,32,97,32,115,112,101,99,105,102,105,99,32,99,111,110,110,101,99,116,105,111,110,32,105,110,115,116,97,110,99,101,32,116,111,32,116,104,101,32,110,111,100,101,32,119,105,116,104,32,116,104,97,116,10,32,32,110,111,100,101,32,110,97,109,101,46,32,84,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,118,97,108,117,101,32,105,115,32,110,111,100,101,32,108,111,99,97,108,46,32,84,104,97,116,32,105,115,44,32,111,110,32,116,104,101,10,32,32,111,116,104,101,114,32,110,111,100,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,32,119,105,108,108,32,95,110,111,116,95,32,98,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,46,32,73,102,32,97,10,32,32,99,111,110,110,101,99,116,105,111,110,32,105,115,32,116,97,107,101,110,32,100,111,119,110,32,97,110,100,32,116,104,101,110,32,116,97,107,101,110,32,117,112,32,97,103,97,105,110,44,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,10,32,32,118,97,108,117,101,32,119,105,108,108,32,99,104,97,110,103,101,32,102,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,32,84,104,101,32,97,109,111,117,110,116,32,111,102,32,118,97,108,117,101,115,32,102,111,114,10,32,32,99,111,110,110,101,99,116,105,111,110,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,44,32,115,111,32,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,115,101,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,10,32,32,102,111,114,32,100,105,102,102,101,114,101,110,116,32,105,110,115,116,97,110,99,101,115,44,32,98,117,116,32,113,117,105,116,101,32,117,110,108,105,107,101,108,121,46,32,73,116,32,105,115,32,117,110,100,101,102,105,110,101,100,32,104,111,119,32,116,104,101,32,118,97,108,117,101,10,32,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,116,119,111,32,99,111,110,115,101,99,117,116,105,118,101,32,99,111,110,110,101,99,116,105,111,110,32,105,110,115,116,97,110,99,101,115,46,10,10,45,32,42,42,96,110,111,100,101,95,116,121,112,101,32,61,62,32,98,111,111,108,101,97,110,40,41,96,42,42,32,45,32,73,102,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,97,115,115,111,99,105,97,116,105,111,110,32,101,113,117,97,108,115,32,96,116,114,117,101,96,44,10,32,32,116,104,101,32,96,73,110,102,111,96,32,109,97,112,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32,107,101,121,32,96,110,111,100,101,95,116,121,112,101,96,10,32,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,78,111,100,101,84,121,112,101,73,110,102,111,96,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,110,111,100,101,32,116,121,112,101,115,10,32,32,101,120,105,115,116,58,10,10,32,32,45,32,42,42,96,118,105,115,105,98,108,101,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,32,32,32,32,116,104,114,111,117,103,104,32,97,110,32,111,114,100,105,110,97,114,121,32,118,105,115,105,98,108,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,119,111,117,108,100,32,97,112,112,101,97,114,10,32,32,32,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,98,121,32,96,110,111,100,101,115,47,48,96,46,10,10,32,32,45,32,42,42,96,104,105,100,100,101,110,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,32,32,32,32,116,104,114,111,117,103,104,32,97,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,119,111,117,108,100,32,95,110,111,116,95,32,97,112,112,101,97,114,32,105,110,10,32,32,32,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,98,121,32,96,110,111,100,101,115,47,48,96,46,10,10,32,32,45,32,42,42,96,116,104,105,115,96,42,42,32,45,32,84,104,105,115,32,105,115,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,32,32,45,32,42,42,96,107,110,111,119,110,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,111,110,110,101,99,116,101,100,32,98,117,116,32,107,110,111,119,110,32,116,111,32,116,104,101,32,110,111,100,101,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,32,32,112,114,111,99,101,115,115,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,40,97,64,108,111,99,97,108,104,111,115,116,41,49,62,32,110,111,100,101,115,40,91,116,104,105,115,44,32,99,111,110,110,101,99,116,101,100,93,44,32,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,61,62,116,114,117,101,44,32,110,111,100,101,95,116,121,112,101,61,62,116,114,117,101,125,41,46,10,91,123,99,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,49,51,56,57,50,49,48,56,44,110,111,100,101,95,116,121,112,101,32,61,62,32,104,105,100,100,101,110,125,125,44,10,32,123,98,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,51,48,54,55,53,53,51,44,110,111,100,101,95,116,121,112,101,32,61,62,32,118,105,115,105,98,108,101,125,125,44,10,32,123,97,64,108,111,99,97,108,104,111,115,116,44,35,123,99,111,110,110,101,99,116,105,111,110,95,105,100,32,61,62,32,117,110,100,101,102,105,110,101,100,44,110,111,100,101,95,116,121,112,101,32,61,62,32,116,104,105,115,125,125,93,10,40,97,64,108,111,99,97,108,104,111,115,116,41,50,62,10,96,96,96>>},#{group => distribution,specification => [{attribute,{10835,2},spec,{{nodes,2},[{type,{10835,12},bounded_fun,[{type,{10835,12},'fun',[{type,{10835,12},product,[{var,{10835,13},'Arg'},{var,{10835,18},'InfoOpts'}]},{type,{10835,31},list,[{var,{10835,32},'NodeInfo'}]}]},[{type,{10836,7},constraint,[{atom,{10836,7},is_subtype},[{var,{10836,7},'NodeType'},{type,{10836,19},union,[{atom,{10836,19},visible},{atom,{10836,29},hidden},{atom,{10836,38},connected},{atom,{10836,50},this},{atom,{10836,57},known}]}]]},{type,{10837,7},constraint,[{atom,{10837,7},is_subtype},[{var,{10837,7},'Arg'},{type,{10837,14},union,[{var,{10837,14},'NodeType'},{type,{10837,25},list,[{var,{10837,26},'NodeType'}]}]}]]},{type,{10838,7},constraint,[{atom,{10838,7},is_subtype},[{var,{10838,7},'InfoOpts'},{type,{10838,19},map,[{type,{10838,35},map_field_assoc,[{atom,{10838,21},connection_id},{type,{10838,38},boolean,[]}]},{type,{10839,31},map_field_assoc,[{atom,{10839,21},node_type},{type,{10839,34},boolean,[]}]}]}]]},{type,{10840,7},constraint,[{atom,{10840,7},is_subtype},[{var,{10840,7},'NodeTypeInfo'},{type,{10840,23},union,[{atom,{10840,23},visible},{atom,{10840,33},hidden},{atom,{10840,42},this},{atom,{10840,49},known}]}]]},{type,{10841,7},constraint,[{atom,{10841,7},is_subtype},[{var,{10841,7},'ConnectionId'},{type,{10841,23},union,[{atom,{10841,23},undefined},{type,{10841,35},integer,[]}]}]]},{type,{10842,7},constraint,[{atom,{10842,7},is_subtype},[{var,{10842,7},'Info'},{type,{10842,15},map,[{type,{10842,31},map_field_assoc,[{atom,{10842,17},connection_id},{var,{10842,34},'ConnectionId'}]},{type,{10843,27},map_field_assoc,[{atom,{10843,17},node_type},{var,{10843,30},'NodeTypeInfo'}]}]}]]},{type,{10844,7},constraint,[{atom,{10844,7},is_subtype},[{var,{10844,7},'NodeInfo'},{type,{10844,19},tuple,[{type,{10844,20},node,[]},{var,{10844,28},'Info'}]}]]}]]}]}}],since => <<79,84,80,32,50,53,46,49>>}},{{function,nodes,1},{10743,2},[<<110,111,100,101,115,40,65,114,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,10,114,101,115,117,108,116,44,32,119,104,101,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,44,32,105,115,32,116,104,101,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,115,97,116,105,115,102,121,105,110,103,32,116,104,101,10,100,105,115,106,117,110,99,116,105,111,110,40,115,41,32,111,102,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,46,10,10,96,78,111,100,101,84,121,112,101,96,115,58,10,10,45,32,42,42,96,118,105,115,105,98,108,101,96,123,58,32,35,110,111,100,101,115,95,118,105,115,105,98,108,101,32,125,42,42,32,45,32,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,10,32,32,99,111,110,110,101,99,116,105,111,110,115,46,10,10,45,32,42,42,96,104,105,100,100,101,110,96,42,42,32,45,32,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,46,10,10,45,32,42,42,96,99,111,110,110,101,99,116,101,100,96,42,42,32,45,32,65,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,46,10,10,45,32,42,42,96,116,104,105,115,96,42,42,32,45,32,84,104,105,115,32,110,111,100,101,46,10,10,45,32,42,42,96,107,110,111,119,110,96,42,42,32,45,32,78,111,100,101,115,32,116,104,97,116,32,97,114,101,32,107,110,111,119,110,32,116,111,32,116,104,105,115,32,110,111,100,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,32,97,110,100,10,32,32,110,111,100,101,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,10,32,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,84,104,101,32,115,101,116,32,111,102,32,107,110,111,119,110,32,110,111,100,101,115,32,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,10,32,32,116,104,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,99,97,110,32,98,101,32,100,101,108,97,121,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41,46,10,10,83,111,109,101,32,101,113,117,97,108,105,116,105,101,115,58,32,96,91,110,111,100,101,40,41,93,32,61,32,110,111,100,101,115,40,116,104,105,115,41,96,44,10,96,110,111,100,101,115,40,99,111,110,110,101,99,116,101,100,41,32,61,32,110,111,100,101,115,40,91,118,105,115,105,98,108,101,44,32,104,105,100,100,101,110,93,41,96,44,32,97,110,100,32,96,110,111,100,101,115,40,41,32,61,32,110,111,100,101,115,40,118,105,115,105,98,108,101,41,96,46>>},#{group => distribution,specification => [{attribute,{10769,2},spec,{{nodes,1},[{type,{10769,12},bounded_fun,[{type,{10769,12},'fun',[{type,{10769,12},product,[{var,{10769,13},'Arg'}]},{var,{10769,21},'Nodes'}]},[{type,{10770,7},constraint,[{atom,{10770,7},is_subtype},[{var,{10770,7},'Arg'},{type,{10770,14},union,[{var,{10770,14},'NodeType'},{type,{10770,25},list,[{var,{10770,26},'NodeType'}]}]}]]},{type,{10771,7},constraint,[{atom,{10771,7},is_subtype},[{var,{10771,7},'NodeType'},{type,{10771,19},union,[{atom,{10771,19},visible},{atom,{10771,29},hidden},{atom,{10771,38},connected},{atom,{10771,50},this},{atom,{10771,57},known}]}]]},{type,{10772,7},constraint,[{atom,{10772,7},is_subtype},[{var,{10772,7},'Nodes'},{type,{10772,16},list,[{type,{10772,17},node,[]}]}]]}]]}]}}]}},{{function,nodes,0},{10732,2},[<<110,111,100,101,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,10,40,116,104,97,116,32,105,115,44,32,91,104,105,100,100,101,110,32,110,111,100,101,115,93,40,96,101,58,115,121,115,116,101,109,58,100,105,115,116,114,105,98,117,116,101,100,46,109,100,35,104,105,100,100,101,110,45,110,111,100,101,115,96,41,32,97,114,101,32,110,111,116,10,108,105,115,116,101,100,41,46,32,83,97,109,101,32,97,115,32,91,110,111,100,101,115,40,118,105,115,105,98,108,101,41,93,40,35,110,111,100,101,115,95,118,105,115,105,98,108,101,41,46>>},#{group => distribution,specification => [{attribute,{10738,2},spec,{{nodes,0},[{type,{10738,12},bounded_fun,[{type,{10738,12},'fun',[{type,{10738,12},product,[]},{var,{10738,18},'Nodes'}]},[{type,{10739,7},constraint,[{atom,{10739,7},is_subtype},[{var,{10739,7},'Nodes'},{type,{10739,16},list,[{type,{10739,17},node,[]}]}]]}]]}]}}]}},{{function,yield,0},{10708,2},[<<121,105,101,108,100,40,41>>],#{<<101,110>> => <<84,114,105,101,115,32,116,111,32,103,105,118,101,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,111,114,32,104,105,103,104,101,114,32,112,114,105,111,114,105,116,121,32,40,105,102,32,97,110,121,41,32,97,32,99,104,97,110,99,101,10,116,111,32,101,120,101,99,117,116,101,32,98,101,102,111,114,101,32,114,101,116,117,114,110,105,110,103,46,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,32,114,117,110,115,10,98,101,116,119,101,101,110,32,116,104,101,32,105,110,118,111,99,97,116,105,111,110,32,97,110,100,32,114,101,116,117,114,110,32,111,102,32,96,101,114,108,97,110,103,58,121,105,101,108,100,47,48,96,46,10,10,83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,10,91,96,114,101,99,101,105,118,101,45,97,102,116,101,114,96,32,101,120,112,114,101,115,115,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,114,101,99,101,105,118,101,96,41,32,102,111,114,32,104,111,119,32,116,111,32,109,97,107,101,10,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,108,101,101,112,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,110,117,109,98,101,114,32,111,102,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,32,97,110,121,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,105,115,32,66,73,70,46,32,85,115,105,110,103,32,116,104,105,115,32,66,73,70,32,119,105,116,104,111,117,116,32,97,10,62,32,116,104,111,114,111,117,103,104,32,103,114,97,115,112,32,111,102,32,104,111,119,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,111,114,107,115,32,99,97,110,32,99,97,117,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,46,10,62,32,84,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,112,117,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,108,97,115,116,32,105,110,10,62,32,116,104,101,32,99,117,114,114,101,110,116,32,115,99,104,101,100,117,108,101,114,39,115,32,113,117,101,117,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,111,102,32,116,104,101,32,115,97,109,101,32,112,114,105,111,114,105,116,121,32,97,115,32,116,104,101,10,62,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{10726,2},spec,{{yield,0},[{type,{10726,12},'fun',[{type,{10726,12},product,[]},{atom,{10726,18},true}]}]}}]}},{{function,spawn_request_abandon,1},{10659,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,40,82,101,113,73,100,41>>],#{<<101,110>> => <<65,98,97,110,100,111,110,32,97,32,112,114,101,118,105,111,117,115,108,121,32,105,115,115,117,101,100,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,96,82,101,113,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,114,101,113,117,101,115,116,10,105,100,101,110,116,105,102,105,101,114,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,98,121,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,105,110,32,97,10,99,97,108,108,32,102,114,111,109,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,109,97,100,101,32,116,104,101,32,114,101,113,117,101,115,116,10,99,97,110,32,97,98,97,110,100,111,110,32,116,104,101,32,114,101,113,117,101,115,116,46,10,10,65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,111,110,108,121,32,98,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,10,99,111,109,112,108,101,116,101,100,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,10,110,111,116,32,98,101,32,101,102,102,101,99,116,101,100,32,98,121,32,102,117,116,117,114,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,116,115,101,108,102,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,105,116,32,119,105,108,108,32,110,111,116,32,114,101,99,101,105,118,101,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,101,32,114,101,113,117,101,115,116,32,105,115,32,104,111,119,101,118,101,114,32,110,111,116,10,119,105,116,104,100,114,97,119,110,44,32,115,111,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,101,32,114,101,113,117,101,115,116,46,32,73,102,32,97,10,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,97,102,116,101,114,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,44,32,110,111,32,109,111,110,105,116,111,114,115,32,110,111,114,10,108,105,110,107,115,32,119,105,108,108,32,98,101,32,115,101,116,32,117,112,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,41,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,73,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,110,99,108,117,100,101,100,32,116,104,101,32,96,108,105,110,107,96,32,111,112,116,105,111,110,44,32,116,104,101,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,105,115,10,114,101,113,117,101,115,116,32,119,105,108,108,32,98,101,32,115,101,110,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,105,116,115,32,112,97,114,101,110,116,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,10,96,97,98,97,110,100,111,110,101,100,96,32,119,104,101,110,32,105,116,32,105,115,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,97,98,97,110,100,111,110,101,100,32,109,97,121,10,62,32,99,111,109,109,117,110,105,99,97,116,101,32,119,105,116,104,32,105,116,115,32,112,97,114,101,110,116,32,97,115,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,73,116,32,105,115,32,95,111,110,108,121,95,32,116,104,101,32,100,105,114,101,99,116,10,62,32,101,102,102,101,99,116,115,32,111,110,32,116,104,101,32,112,97,114,101,110,116,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,115,112,97,119,110,32,114,101,113,117,101,115,116,44,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,97,110,99,101,108,101,100,32,98,121,10,62,32,97,98,97,110,100,111,110,105,110,103,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,10,82,101,116,117,114,110,32,118,97,108,117,101,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,46,32,84,104,101,32,96,82,101,113,73,100,96,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,10,32,32,100,105,100,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,110,32,111,117,116,115,116,97,110,100,105,110,103,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,115,117,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,105,116,104,101,114,58,10,10,32,32,45,32,96,82,101,113,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,112,114,101,118,105,111,117,108,115,121,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,32,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,99,111,109,112,108,101,116,101,100,32,97,110,100,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,104,97,115,32,97,108,114,101,97,100,121,10,32,32,32,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,108,101,115,115,32,116,104,101,32,115,112,97,119,110,32,114,101,112,108,121,32,119,97,115,32,100,105,115,97,98,108,101,100,32,105,110,10,32,32,32,32,116,104,101,32,114,101,113,117,101,115,116,46,10,32,32,45,32,96,82,101,113,73,100,96,32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,97,100,101,32,98,121,32,116,104,101,10,32,32,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,82,101,113,73,100,96,32,105,115,32,110,111,116,32,97,32,114,101,102,101,114,101,110,99,101,46>>},#{group => processes,specification => [{attribute,{10703,2},spec,{{spawn_request_abandon,1},[{type,{10703,28},'fun',[{type,{10703,28},product,[{ann_type,{10703,29},[{var,{10703,29},'ReqId'},{type,{10703,38},reference,[]}]}]},{type,{10703,54},boolean,[]}]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,5},{10478,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<65,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,82,101,116,117,114,110,115,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,96,82,101,113,73,100,96,46,10,10,91,93,40,41,123,58,32,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,32,125,10,10,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,78,111,100,101,96,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,10,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32,96,123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,111,107,44,32,80,105,100,125,96,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,10,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,96,82,101,112,108,121,84,97,103,96,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,116,104,101,32,97,116,111,109,10,96,115,112,97,119,110,95,114,101,112,108,121,96,32,117,110,108,101,115,115,32,109,111,100,105,102,105,101,100,32,98,121,32,116,104,101,32,96,123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125,96,32,111,112,116,105,111,110,46,32,84,104,101,32,110,101,119,10,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,10,10,91,93,40,41,123,58,32,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,32,125,10,10,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,32,101,105,116,104,101,114,32,105,102,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,102,97,105,108,101,100,32,111,114,32,105,102,32,116,104,101,10,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,105,110,116,101,114,114,117,112,116,101,100,32,98,121,32,97,32,99,111,110,110,101,99,116,105,111,110,32,102,97,105,108,117,114,101,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,10,102,97,105,108,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,10,96,123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,101,114,114,111,114,44,32,82,101,97,115,111,110,125,96,32,119,104,101,114,101,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,46,32,83,117,99,104,32,97,10,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,110,32,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,115,112,97,119,110,32,101,114,114,111,114,32,96,82,101,97,115,111,110,96,115,32,97,114,101,32,100,101,102,105,110,101,100,44,32,98,117,116,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,97,110,121,10,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,58,10,10,45,32,42,42,96,98,97,100,111,112,116,96,42,42,32,45,32,65,110,32,105,110,118,97,108,105,100,32,96,79,112,116,105,111,110,96,32,119,97,115,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,32,78,111,116,101,32,116,104,97,116,32,100,105,102,102,101,114,101,110,116,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,109,97,121,32,115,117,112,112,111,114,116,32,100,105,102,102,101,114,101,110,116,32,111,112,116,105,111,110,115,46,10,10,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,84,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,115,10,32,32,105,115,115,117,101,100,32,98,121,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,46,10,10,45,32,42,42,96,110,111,99,111,110,110,101,99,116,105,111,110,96,42,42,32,45,32,70,97,105,108,117,114,101,32,116,111,32,115,101,116,32,117,112,32,97,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,78,111,100,101,96,32,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,32,119,97,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,110,10,32,32,116,104,101,32,99,97,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,119,97,115,32,108,111,115,116,44,32,97,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,67,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,100,117,101,32,116,111,32,116,104,97,116,32,115,111,109,101,32,115,121,115,116,101,109,10,32,32,108,105,109,105,116,32,119,97,115,32,114,101,97,99,104,101,100,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,97,98,108,101,32,119,97,115,32,102,117,108,108,46,10,10,86,97,108,105,100,32,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,109,111,110,105,116,111,114,96,42,42,32,45,32,73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,10,32,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,10,32,32,99,97,108,108,101,100,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32,96,82,101,113,73,100,96,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,32,105,115,32,97,108,115,111,32,117,115,101,100,32,97,115,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,97,115,32,105,102,32,105,116,32,119,97,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,10,32,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,109,111,110,105,116,111,114,32,99,97,110,32,110,111,116,32,98,101,32,91,100,101,109,111,110,105,116,111,114,101,100,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,10,32,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,102,111,114,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,32,32,109,111,110,105,116,111,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,10,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,10,32,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,119,105,108,108,10,32,32,98,101,32,100,101,108,105,118,101,114,101,100,46,10,10,32,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,10,32,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,10,32,32,111,102,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125,96,42,42,32,45,32,73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,10,32,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,10,32,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,101,101,32,116,104,101,10,32,32,96,109,111,110,105,116,111,114,96,32,111,112,116,105,111,110,32,97,98,111,118,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,32,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,10,32,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,97,110,32,97,108,105,97,115,32,105,115,10,32,32,99,114,101,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,44,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,10,32,32,109,111,110,105,116,111,114,32,105,115,32,97,99,116,105,118,97,116,101,100,46,10,10,45,32,42,42,96,108,105,110,107,96,42,42,32,45,32,73,110,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,108,105,110,107,10,32,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32,91,96,108,105,110,107,40,80,105,100,41,96,93,40,96,108,105,110,107,47,49,96,41,32,119,104,101,114,101,32,96,80,105,100,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,10,10,32,32,84,104,101,32,108,105,110,107,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,10,32,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,108,105,110,107,32,99,97,110,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,10,32,32,115,117,99,99,101,101,100,101,100,46,32,65,110,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,10,32,32,98,101,102,111,114,101,32,97,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,116,104,97,116,10,32,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,101,120,105,116,10,32,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,46,10,10,32,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,10,32,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,10,32,32,111,102,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,32,73,102,32,105,116,32,104,97,115,10,32,32,98,101,101,110,32,99,114,101,97,116,101,100,44,32,105,116,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,97,110,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,10,32,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,46,10,10,45,32,42,42,96,123,114,101,112,108,121,44,32,82,101,112,108,121,125,96,42,42,32,45,32,86,97,108,105,100,32,96,82,101,112,108,121,96,32,118,97,108,117,101,115,58,10,10,32,32,45,32,42,42,96,121,101,115,96,42,42,32,45,32,65,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,10,32,32,32,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,32,99,97,108,108,32,116,111,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,41,96,10,32,32,32,32,114,101,116,117,114,110,115,32,119,105,116,104,111,117,116,32,114,97,105,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,116,104,101,32,96,114,101,112,108,121,96,32,111,112,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32,96,121,101,115,96,44,10,32,32,32,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,101,105,116,104,101,114,32,97,10,32,32,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,111,114,32,97,110,10,32,32,32,32,91,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,46,32,84,104,101,32,96,114,101,112,108,121,96,10,32,32,32,32,111,112,116,105,111,110,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,115,101,116,32,116,111,32,96,121,101,115,96,46,10,10,32,32,45,32,42,42,96,110,111,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,10,32,32,32,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,115,46,32,84,104,105,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,10,32,32,32,32,110,111,116,46,10,10,32,32,45,32,42,42,96,101,114,114,111,114,95,111,110,108,121,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,10,32,32,32,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,97,110,10,32,32,32,32,91,95,101,114,114,111,114,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,10,32,32,32,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,46,10,10,32,32,45,32,42,42,96,115,117,99,99,101,115,115,95,111,110,108,121,96,42,42,32,45,32,78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,10,32,32,32,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,98,117,116,32,97,10,32,32,32,32,91,95,115,117,99,99,101,115,115,32,109,101,115,115,97,103,101,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,32,119,105,108,108,32,98,101,32,115,101,110,116,10,32,32,32,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,46,10,10,45,32,42,42,96,123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,114,101,112,108,121,32,116,97,103,32,116,111,32,96,82,101,112,108,121,84,97,103,96,32,105,110,32,116,104,101,32,114,101,112,108,121,10,32,32,109,101,115,115,97,103,101,46,32,84,104,97,116,32,105,115,44,32,105,110,32,116,104,101,32,91,95,115,117,99,99,101,115,115,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101,41,10,32,32,111,114,32,91,95,101,114,114,111,114,95,93,40,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101,41,32,109,101,115,115,97,103,101,32,116,104,97,116,32,105,115,32,115,101,110,116,32,116,111,10,32,32,116,104,101,32,99,97,108,108,101,114,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,112,108,121,32,116,97,103,32,105,115,32,116,104,101,32,97,116,111,109,10,32,32,96,115,112,97,119,110,95,114,101,112,108,121,96,46,10,10,45,32,42,42,96,79,116,104,101,114,79,112,116,105,111,110,96,42,42,32,45,32,79,116,104,101,114,32,118,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,10,32,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,111,116,104,101,114,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,10,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,73,102,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,10,97,110,121,32,111,116,104,101,114,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,105,115,115,117,105,110,103,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,58,10,10,45,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,77,111,100,117,108,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,65,114,103,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46,10,45,32,96,79,112,116,105,111,110,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46,10,10,78,111,116,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,110,100,105,118,105,100,117,97,108,32,96,79,112,116,105,111,110,96,115,32,97,114,101,32,99,104,101,99,107,101,100,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,10,115,101,110,116,46,32,83,111,109,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,111,110,108,121,32,98,101,32,99,104,101,99,107,101,100,32,111,110,32,114,101,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,46,32,84,104,101,114,101,102,111,114,101,10,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,100,111,101,115,32,95,110,111,116,95,32,99,97,117,115,101,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,44,32,98,117,116,32,119,105,108,108,32,99,97,117,115,101,32,116,104,101,10,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32,96,98,97,100,111,112,116,96,46,10,10,65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,98,101,32,97,98,97,110,100,111,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32,96,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{10626,2},spec,{{spawn_request,5},[{type,{10626,20},bounded_fun,[{type,{10626,20},'fun',[{type,{10626,20},product,[{var,{10626,21},'Node'},{var,{10626,27},'Module'},{var,{10626,35},'Function'},{var,{10626,45},'Args'},{var,{10626,51},'Options'}]},{var,{10627,28},'ReqId'}]},[{type,{10628,7},constraint,[{atom,{10628,7},is_subtype},[{var,{10628,7},'Node'},{type,{10628,15},node,[]}]]},{type,{10629,7},constraint,[{atom,{10629,7},is_subtype},[{var,{10629,7},'Module'},{type,{10629,17},module,[]}]]},{type,{10630,7},constraint,[{atom,{10630,7},is_subtype},[{var,{10630,7},'Function'},{type,{10630,19},atom,[]}]]},{type,{10631,7},constraint,[{atom,{10631,7},is_subtype},[{var,{10631,7},'Args'},{type,{10631,15},list,[{type,{10631,16},term,[]}]}]]},{type,{10632,7},constraint,[{atom,{10632,7},is_subtype},[{var,{10632,7},'Options'},{type,{10632,18},list,[{var,{10632,19},'Option'}]}]]},{type,{10633,7},constraint,[{atom,{10633,7},is_subtype},[{var,{10633,7},'Option'},{type,{10633,17},union,[{atom,{10633,17},monitor},{type,{10634,17},tuple,[{atom,{10634,18},monitor},{type,{10634,27},list,[{user_type,{10634,28},monitor_option,[]}]}]},{atom,{10635,17},link},{type,{10636,17},tuple,[{atom,{10636,18},reply_tag},{var,{10636,29},'ReplyTag'}]},{type,{10637,17},tuple,[{atom,{10637,18},reply},{var,{10637,25},'Reply'}]},{var,{10638,17},'OtherOption'}]}]]},{type,{10639,7},constraint,[{atom,{10639,7},is_subtype},[{var,{10639,7},'ReplyTag'},{type,{10639,19},term,[]}]]},{type,{10640,7},constraint,[{atom,{10640,7},is_subtype},[{var,{10640,7},'Reply'},{type,{10640,16},union,[{atom,{10640,16},yes},{atom,{10640,22},no},{atom,{10640,27},error_only},{atom,{10640,40},success_only}]}]]},{type,{10641,7},constraint,[{atom,{10641,7},is_subtype},[{var,{10641,7},'OtherOption'},{type,{10641,22},term,[]}]]},{type,{10642,7},constraint,[{atom,{10642,7},is_subtype},[{var,{10642,7},'ReqId'},{type,{10642,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},{10423,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,79,114,77,111,100,117,108,101,44,32,77,111,100,117,108,101,79,114,70,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,79,114,65,114,103,115,44,32,65,114,103,115,79,114,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,10,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>},#{group => processes,specification => [{attribute,{10437,2},spec,{{spawn_request,4},[{type,{10437,20},bounded_fun,[{type,{10437,20},'fun',[{type,{10437,20},product,[{var,{10437,21},'Node'},{var,{10437,27},'Module'},{var,{10437,35},'Function'},{var,{10437,45},'Args'}]},{var,{10438,28},'ReqId'}]},[{type,{10439,7},constraint,[{atom,{10439,7},is_subtype},[{var,{10439,7},'Node'},{type,{10439,15},node,[]}]]},{type,{10440,7},constraint,[{atom,{10440,7},is_subtype},[{var,{10440,7},'Module'},{type,{10440,17},module,[]}]]},{type,{10441,7},constraint,[{atom,{10441,7},is_subtype},[{var,{10441,7},'Function'},{type,{10441,19},atom,[]}]]},{type,{10442,7},constraint,[{atom,{10442,7},is_subtype},[{var,{10442,7},'Args'},{type,{10442,15},list,[{type,{10442,16},term,[]}]}]]},{type,{10443,7},constraint,[{atom,{10443,7},is_subtype},[{var,{10443,7},'ReqId'},{type,{10443,16},reference,[]}]]}]]},{type,{10444,20},bounded_fun,[{type,{10444,20},'fun',[{type,{10444,20},product,[{var,{10444,21},'Module'},{var,{10444,29},'Function'},{var,{10444,39},'Args'},{var,{10444,45},'Options'}]},{var,{10445,28},'ReqId'}]},[{type,{10446,7},constraint,[{atom,{10446,7},is_subtype},[{var,{10446,7},'Module'},{type,{10446,17},module,[]}]]},{type,{10447,7},constraint,[{atom,{10447,7},is_subtype},[{var,{10447,7},'Function'},{type,{10447,19},atom,[]}]]},{type,{10448,7},constraint,[{atom,{10448,7},is_subtype},[{var,{10448,7},'Args'},{type,{10448,15},list,[{type,{10448,16},term,[]}]}]]},{type,{10449,7},constraint,[{atom,{10449,7},is_subtype},[{var,{10449,7},'Option'},{type,{10449,17},union,[{type,{10449,17},tuple,[{atom,{10449,18},reply_tag},{var,{10449,29},'ReplyTag'}]},{type,{10450,17},tuple,[{atom,{10450,18},reply},{var,{10450,25},'Reply'}]},{user_type,{10451,17},spawn_opt_option,[]}]}]]},{type,{10452,7},constraint,[{atom,{10452,7},is_subtype},[{var,{10452,7},'ReplyTag'},{type,{10452,19},term,[]}]]},{type,{10453,7},constraint,[{atom,{10453,7},is_subtype},[{var,{10453,7},'Reply'},{type,{10453,16},union,[{atom,{10453,16},yes},{atom,{10453,22},no},{atom,{10453,27},error_only},{atom,{10453,40},success_only}]}]]},{type,{10454,7},constraint,[{atom,{10454,7},is_subtype},[{var,{10454,7},'Options'},{type,{10454,18},list,[{var,{10454,19},'Option'}]}]]},{type,{10455,7},constraint,[{atom,{10455,7},is_subtype},[{var,{10455,7},'ReqId'},{type,{10455,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},{10362,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,79,114,77,111,100,117,108,101,44,32,70,117,110,79,114,70,117,110,99,116,105,111,110,44,32,79,112,116,105,111,110,115,79,114,65,114,103,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,101,114,108,97,110,103,44,97,112,112,108,121,44,91,70,117,110,44,91,93,93,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53,96,41,32,100,101,112,101,110,100,105,110,103,10,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,117,115,105,110,103,32,116,104,101,32,102,117,110,32,96,70,117,110,96,32,111,102,32,97,114,105,116,121,32,122,101,114,111,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,105,102,58,10,10,45,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,45,32,96,70,117,110,96,32,105,115,32,110,111,116,32,97,32,102,117,110,32,111,102,32,97,114,105,116,121,32,122,101,114,111,46,10,45,32,96,79,112,116,105,111,110,115,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>},#{group => processes,specification => [{attribute,{10383,2},spec,{{spawn_request,3},[{type,{10383,20},bounded_fun,[{type,{10383,20},'fun',[{type,{10383,20},product,[{var,{10383,21},'Node'},{var,{10383,27},'Fun'},{var,{10383,32},'Options'}]},{var,{10383,44},'ReqId'}]},[{type,{10384,7},constraint,[{atom,{10384,7},is_subtype},[{var,{10384,7},'Node'},{type,{10384,15},node,[]}]]},{type,{10385,7},constraint,[{atom,{10385,7},is_subtype},[{var,{10385,7},'Fun'},{type,{10385,14},function,[]}]]},{type,{10386,7},constraint,[{atom,{10386,7},is_subtype},[{var,{10386,7},'Options'},{type,{10386,18},list,[{var,{10386,19},'Option'}]}]]},{type,{10387,7},constraint,[{atom,{10387,7},is_subtype},[{var,{10387,7},'Option'},{type,{10387,17},union,[{atom,{10387,17},monitor},{type,{10388,17},tuple,[{atom,{10388,18},monitor},{type,{10388,27},list,[{user_type,{10388,28},monitor_option,[]}]}]},{atom,{10389,17},link},{type,{10390,17},tuple,[{atom,{10390,18},reply_tag},{var,{10390,29},'ReplyTag'}]},{type,{10391,17},tuple,[{atom,{10391,18},reply},{var,{10391,25},'Reply'}]},{var,{10392,17},'OtherOption'}]}]]},{type,{10393,7},constraint,[{atom,{10393,7},is_subtype},[{var,{10393,7},'ReplyTag'},{type,{10393,19},term,[]}]]},{type,{10394,7},constraint,[{atom,{10394,7},is_subtype},[{var,{10394,7},'Reply'},{type,{10394,16},union,[{atom,{10394,16},yes},{atom,{10394,22},no},{atom,{10394,27},error_only},{atom,{10394,40},success_only}]}]]},{type,{10395,7},constraint,[{atom,{10395,7},is_subtype},[{var,{10395,7},'OtherOption'},{type,{10395,22},term,[]}]]},{type,{10396,7},constraint,[{atom,{10396,7},is_subtype},[{var,{10396,7},'ReqId'},{type,{10396,16},reference,[]}]]}]]},{type,{10397,20},bounded_fun,[{type,{10397,20},'fun',[{type,{10397,20},product,[{var,{10397,21},'Module'},{var,{10397,29},'Function'},{var,{10397,39},'Args'}]},{var,{10398,28},'ReqId'}]},[{type,{10399,7},constraint,[{atom,{10399,7},is_subtype},[{var,{10399,7},'Module'},{type,{10399,17},module,[]}]]},{type,{10400,7},constraint,[{atom,{10400,7},is_subtype},[{var,{10400,7},'Function'},{type,{10400,19},atom,[]}]]},{type,{10401,7},constraint,[{atom,{10401,7},is_subtype},[{var,{10401,7},'Args'},{type,{10401,15},list,[{type,{10401,16},term,[]}]}]]},{type,{10402,7},constraint,[{atom,{10402,7},is_subtype},[{var,{10402,7},'ReqId'},{type,{10402,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},{10315,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,70,117,110,79,114,78,111,100,101,44,32,79,112,116,105,111,110,115,79,114,70,117,110,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,79,112,116,105,111,110,115,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,32,111,114,10,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,70,117,110,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,46,10,10,84,104,97,116,32,105,115,32,101,105,116,104,101,114,58,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,45,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{10327,2},spec,{{spawn_request,2},[{type,{10327,20},bounded_fun,[{type,{10327,20},'fun',[{type,{10327,20},product,[{var,{10327,21},'Fun'},{var,{10327,26},'Options'}]},{var,{10327,38},'ReqId'}]},[{type,{10328,7},constraint,[{atom,{10328,7},is_subtype},[{var,{10328,7},'Fun'},{type,{10328,14},function,[]}]]},{type,{10329,7},constraint,[{atom,{10329,7},is_subtype},[{var,{10329,7},'Option'},{type,{10329,17},union,[{type,{10329,17},tuple,[{atom,{10329,18},reply_tag},{var,{10329,29},'ReplyTag'}]},{type,{10330,17},tuple,[{atom,{10330,18},reply},{var,{10330,25},'Reply'}]},{user_type,{10331,17},spawn_opt_option,[]}]}]]},{type,{10332,7},constraint,[{atom,{10332,7},is_subtype},[{var,{10332,7},'ReplyTag'},{type,{10332,19},term,[]}]]},{type,{10333,7},constraint,[{atom,{10333,7},is_subtype},[{var,{10333,7},'Reply'},{type,{10333,16},union,[{atom,{10333,16},yes},{atom,{10333,22},no},{atom,{10333,27},error_only},{atom,{10333,40},success_only}]}]]},{type,{10334,7},constraint,[{atom,{10334,7},is_subtype},[{var,{10334,7},'Options'},{type,{10334,18},list,[{var,{10334,19},'Option'}]}]]},{type,{10335,7},constraint,[{atom,{10335,7},is_subtype},[{var,{10335,7},'ReqId'},{type,{10335,16},reference,[]}]]}]]},{type,{10336,20},bounded_fun,[{type,{10336,20},'fun',[{type,{10336,20},product,[{var,{10336,21},'Node'},{var,{10336,27},'Fun'}]},{var,{10336,35},'ReqId'}]},[{type,{10337,7},constraint,[{atom,{10337,7},is_subtype},[{var,{10337,7},'Node'},{type,{10337,15},node,[]}]]},{type,{10338,7},constraint,[{atom,{10338,7},is_subtype},[{var,{10338,7},'Fun'},{type,{10338,14},function,[]}]]},{type,{10339,7},constraint,[{atom,{10339,7},is_subtype},[{var,{10339,7},'ReqId'},{type,{10339,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,1},{10291,2},[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,70,117,110,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,32,91,96,115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,91,93,41,96,93,40,96,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51,96,41,46,32,84,104,97,116,10,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{10297,2},spec,{{spawn_request,1},[{type,{10297,20},bounded_fun,[{type,{10297,20},'fun',[{type,{10297,20},product,[{var,{10297,21},'Fun'}]},{var,{10297,29},'ReqId'}]},[{type,{10298,7},constraint,[{atom,{10298,7},is_subtype},[{var,{10298,7},'Fun'},{type,{10298,14},function,[]}]]},{type,{10299,7},constraint,[{atom,{10299,7},is_subtype},[{var,{10299,7},'ReqId'},{type,{10299,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_opt,5},{10226,2},[<<115,112,97,119,110,95,111,112,116,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,10,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46>>},#{group => processes,specification => [{attribute,{10236,2},spec,{{spawn_opt,5},[{type,{10236,16},bounded_fun,[{type,{10236,16},'fun',[{type,{10236,16},product,[{var,{10236,17},'Node'},{var,{10236,23},'Module'},{var,{10236,31},'Function'},{var,{10236,41},'Args'},{var,{10236,47},'Options'}]},{type,{10237,24},union,[{type,{10237,24},pid,[]},{type,{10237,32},tuple,[{type,{10237,33},pid,[]},{type,{10237,40},reference,[]}]}]}]},[{type,{10238,7},constraint,[{atom,{10238,7},is_subtype},[{var,{10238,7},'Node'},{type,{10238,15},node,[]}]]},{type,{10239,7},constraint,[{atom,{10239,7},is_subtype},[{var,{10239,7},'Module'},{type,{10239,17},module,[]}]]},{type,{10240,7},constraint,[{atom,{10240,7},is_subtype},[{var,{10240,7},'Function'},{type,{10240,19},atom,[]}]]},{type,{10241,7},constraint,[{atom,{10241,7},is_subtype},[{var,{10241,7},'Args'},{type,{10241,15},list,[{type,{10241,16},term,[]}]}]]},{type,{10242,7},constraint,[{atom,{10242,7},is_subtype},[{var,{10242,7},'Options'},{type,{10242,18},list,[{type,{10242,19},union,[{atom,{10242,19},monitor},{type,{10243,19},tuple,[{atom,{10243,20},monitor},{type,{10243,29},list,[{user_type,{10243,30},monitor_option,[]}]}]},{atom,{10244,19},link},{var,{10245,19},'OtherOption'}]}]}]]},{type,{10246,7},constraint,[{atom,{10246,7},is_subtype},[{var,{10246,7},'OtherOption'},{type,{10246,22},term,[]}]]}]]}]}}]}},{{function,spawn_opt,4},{10123,2},[<<115,112,97,119,110,95,111,112,116,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<87,111,114,107,115,32,97,115,32,96,115,112,97,119,110,47,51,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,10,116,104,101,32,112,114,111,99,101,115,115,46,10,10,73,102,32,111,112,116,105,111,110,32,96,109,111,110,105,116,111,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,10,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,108,105,110,107,96,42,42,32,45,32,83,101,116,115,32,97,32,108,105,110,107,32,116,111,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32,96,115,112,97,119,110,95,108,105,110,107,47,51,96,32,100,111,101,115,41,46,10,10,45,32,42,42,96,109,111,110,105,116,111,114,96,42,42,32,45,32,77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,40,108,105,107,101,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,32,100,111,101,115,41,46,32,65,32,96,123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125,96,32,116,117,112,108,101,32,119,105,108,108,10,32,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125,96,42,42,32,45,32,77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,40,108,105,107,101,10,32,32,91,96,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41,96,93,40,96,109,111,110,105,116,111,114,47,51,96,41,32,100,111,101,115,41,46,32,65,10,32,32,96,123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125,96,32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,10,32,32,101,120,101,99,117,116,105,110,103,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,10,32,32,105,110,32,116,104,101,32,115,116,97,114,116,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,112,114,105,111,114,105,116,121,32,105,115,32,115,101,116,10,32,32,98,101,102,111,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,46,10,10,45,32,42,42,96,123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,78,117,109,98,101,114,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,10,32,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,84,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,115,32,97,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,99,104,101,109,101,44,32,117,115,105,110,103,10,32,32,97,110,32,34,111,108,100,32,104,101,97,112,34,32,102,111,114,32,100,97,116,97,32,116,104,97,116,32,104,97,115,32,115,117,114,118,105,118,101,100,32,97,116,32,108,101,97,115,116,32,111,110,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,10,32,32,116,104,101,114,101,32,105,115,32,110,111,32,109,111,114,101,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,44,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,10,10,32,32,79,112,116,105,111,110,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,44,32,101,118,101,110,32,105,102,32,116,104,101,114,101,32,105,115,32,114,111,111,109,32,111,110,10,32,32,116,104,101,32,111,108,100,32,104,101,97,112,46,32,83,101,116,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,116,111,32,122,101,114,111,32,100,105,115,97,98,108,101,115,32,116,104,101,32,103,101,110,101,114,97,108,32,99,111,108,108,101,99,116,105,111,110,10,32,32,97,108,103,111,114,105,116,104,109,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,99,111,112,105,101,100,32,97,116,32,101,118,101,114,121,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,10,10,32,32,65,32,102,101,119,32,99,97,115,101,115,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,116,111,32,99,104,97,110,103,101,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,58,10,10,32,32,45,32,73,102,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,110,111,32,108,111,110,103,101,114,32,117,115,101,100,32,97,114,101,32,116,111,32,98,101,32,116,104,114,111,119,110,32,97,119,97,121,32,97,115,32,115,111,111,110,32,97,115,10,32,32,32,32,112,111,115,115,105,98,108,101,46,32,40,83,101,116,32,96,78,117,109,98,101,114,96,32,116,111,32,122,101,114,111,46,41,10,32,32,45,32,65,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,111,115,116,108,121,32,104,97,118,101,32,115,104,111,114,116,45,108,105,118,101,100,32,100,97,116,97,32,105,115,32,102,117,108,108,115,119,101,101,112,101,100,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,44,10,32,32,32,32,116,104,97,116,32,105,115,44,32,116,104,101,32,111,108,100,32,104,101,97,112,32,99,111,110,116,97,105,110,115,32,109,111,115,116,108,121,32,103,97,114,98,97,103,101,46,32,84,111,32,101,110,115,117,114,101,32,97,32,102,117,108,108,115,119,101,101,112,10,32,32,32,32,111,99,99,97,115,105,111,110,97,108,108,121,44,32,115,101,116,32,96,78,117,109,98,101,114,96,32,116,111,32,97,32,115,117,105,116,97,98,108,101,32,118,97,108,117,101,44,32,115,117,99,104,32,97,115,32,49,48,32,111,114,32,50,48,46,10,32,32,45,32,73,110,32,101,109,98,101,100,100,101,100,32,115,121,115,116,101,109,115,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,97,109,111,117,110,116,32,111,102,32,82,65,77,32,97,110,100,32,110,111,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,44,32,121,111,117,10,32,32,32,32,109,105,103,104,116,32,119,97,110,116,32,116,111,32,112,114,101,115,101,114,118,101,32,109,101,109,111,114,121,32,98,121,32,115,101,116,116,105,110,103,32,96,78,117,109,98,101,114,96,32,116,111,32,122,101,114,111,46,32,40,84,104,101,32,118,97,108,117,101,32,99,97,110,32,98,101,10,32,32,32,32,115,101,116,32,103,108,111,98,97,108,108,121,44,32,115,101,101,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,41,10,10,45,32,42,42,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,10,32,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,10,32,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,10,32,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,32,97,110,100,32,115,108,111,119,32,100,111,119,110,32,116,104,101,32,115,121,115,116,101,109,10,32,32,98,101,99,97,117,115,101,32,111,102,32,119,111,114,115,101,32,100,97,116,97,32,108,111,99,97,108,105,116,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,10,32,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,10,32,32,96,83,105,122,101,96,32,118,97,108,117,101,115,46,10,10,45,32,42,42,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,86,83,105,122,101,125,96,42,42,32,45,32,85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,10,32,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46,10,10,32,32,71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,10,32,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,46,10,32,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,10,32,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32,96,86,83,105,122,101,96,32,118,97,108,117,101,115,46,10,10,45,32,42,42,96,123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,84,104,101,10,32,32,100,101,102,97,117,108,116,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,104,109,97,120,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,10,32,32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,96,77,81,68,96,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,96,111,102,102,95,104,101,97,112,96,32,111,114,32,96,111,110,95,104,101,97,112,96,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,10,32,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,10,32,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,113,100,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,45,32,42,42,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,100,125,96,123,58,32,35,115,112,97,119,110,95,111,112,116,95,97,115,121,110,99,95,100,105,115,116,32,125,42,42,32,45,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,32,32,83,101,116,32,116,104,101,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,41,32,112,114,111,99,101,115,115,32,102,108,97,103,32,111,102,32,116,104,101,10,32,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,112,97,100,41,46>>},#{group => processes,specification => [{attribute,{10214,2},spec,{{spawn_opt,4},[{type,{10214,16},bounded_fun,[{type,{10214,16},'fun',[{type,{10214,16},product,[{var,{10214,17},'Module'},{var,{10214,25},'Function'},{var,{10214,35},'Args'},{var,{10214,41},'Options'}]},{type,{10215,11},union,[{var,{10215,11},'Pid'},{type,{10215,17},tuple,[{var,{10215,18},'Pid'},{var,{10215,23},'MonitorRef'}]}]}]},[{type,{10216,7},constraint,[{atom,{10216,7},is_subtype},[{var,{10216,7},'Module'},{type,{10216,17},module,[]}]]},{type,{10217,7},constraint,[{atom,{10217,7},is_subtype},[{var,{10217,7},'Function'},{type,{10217,19},atom,[]}]]},{type,{10218,7},constraint,[{atom,{10218,7},is_subtype},[{var,{10218,7},'Args'},{type,{10218,15},list,[{type,{10218,16},term,[]}]}]]},{type,{10219,7},constraint,[{atom,{10219,7},is_subtype},[{var,{10219,7},'Options'},{type,{10219,18},list,[{user_type,{10219,19},spawn_opt_option,[]}]}]]},{type,{10220,7},constraint,[{atom,{10220,7},is_subtype},[{var,{10220,7},'Pid'},{type,{10220,14},pid,[]}]]},{type,{10221,7},constraint,[{atom,{10221,7},is_subtype},[{var,{10221,7},'MonitorRef'},{type,{10221,21},reference,[]}]]}]]}]}}]}},{{function,spawn_monitor,4},{10068,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,10,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46,10,10,73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32,96,115,112,97,119,110,95,109,111,110,105,116,111,114,40,41,96,44,10,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,32,101,120,99,101,112,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{10078,2},spec,{{spawn_monitor,4},[{type,{10078,20},bounded_fun,[{type,{10078,20},'fun',[{type,{10078,20},product,[{var,{10078,21},'Node'},{var,{10078,27},'Module'},{var,{10078,35},'Function'},{var,{10078,45},'Args'}]},{type,{10078,54},tuple,[{type,{10078,55},pid,[]},{type,{10078,62},reference,[]}]}]},[{type,{10079,7},constraint,[{atom,{10079,7},is_subtype},[{var,{10079,7},'Node'},{type,{10079,15},node,[]}]]},{type,{10080,7},constraint,[{atom,{10080,7},is_subtype},[{var,{10080,7},'Module'},{type,{10080,17},module,[]}]]},{type,{10081,7},constraint,[{atom,{10081,7},is_subtype},[{var,{10081,7},'Function'},{type,{10081,19},atom,[]}]]},{type,{10082,7},constraint,[{atom,{10082,7},is_subtype},[{var,{10082,7},'Args'},{type,{10082,15},list,[{type,{10082,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_link,4},{10038,2},[<<115,112,97,119,110,95,108,105,110,107,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{10046,2},spec,{{spawn_link,4},[{type,{10046,17},bounded_fun,[{type,{10046,17},'fun',[{type,{10046,17},product,[{var,{10046,18},'Node'},{var,{10046,24},'Module'},{var,{10046,32},'Function'},{var,{10046,42},'Args'}]},{type,{10046,51},pid,[]}]},[{type,{10047,7},constraint,[{atom,{10047,7},is_subtype},[{var,{10047,7},'Node'},{type,{10047,15},node,[]}]]},{type,{10048,7},constraint,[{atom,{10048,7},is_subtype},[{var,{10048,7},'Module'},{type,{10048,17},module,[]}]]},{type,{10049,7},constraint,[{atom,{10049,7},is_subtype},[{var,{10049,7},'Function'},{type,{10049,19},atom,[]}]]},{type,{10050,7},constraint,[{atom,{10050,7},is_subtype},[{var,{10050,7},'Args'},{type,{10050,15},list,[{type,{10050,16},term,[]}]}]]}]]}]}}]}},{{function,spawn,4},{10010,2},[<<115,112,97,119,110,40,78,111,100,101,44,32,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{10016,2},spec,{{spawn,4},[{type,{10016,12},bounded_fun,[{type,{10016,12},'fun',[{type,{10016,12},product,[{var,{10016,13},'Node'},{var,{10016,19},'Module'},{var,{10016,27},'Function'},{var,{10016,37},'Args'}]},{type,{10016,46},pid,[]}]},[{type,{10017,7},constraint,[{atom,{10017,7},is_subtype},[{var,{10017,7},'Node'},{type,{10017,15},node,[]}]]},{type,{10018,7},constraint,[{atom,{10018,7},is_subtype},[{var,{10018,7},'Module'},{type,{10018,17},module,[]}]]},{type,{10019,7},constraint,[{atom,{10019,7},is_subtype},[{var,{10019,7},'Function'},{type,{10019,19},atom,[]}]]},{type,{10020,7},constraint,[{atom,{10020,7},is_subtype},[{var,{10020,7},'Args'},{type,{10020,15},list,[{type,{10020,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_opt,3},{9972,2},[<<115,112,97,119,110,95,111,112,116,40,78,111,100,101,44,32,70,117,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,10,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,78,111,100,101,96,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32,96,79,112,116,105,111,110,96,115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,10,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46>>},#{group => processes,specification => [{attribute,{9982,2},spec,{{spawn_opt,3},[{type,{9982,16},bounded_fun,[{type,{9982,16},'fun',[{type,{9982,16},product,[{var,{9982,17},'Node'},{var,{9982,23},'Fun'},{var,{9982,28},'Options'}]},{type,{9982,40},union,[{type,{9982,40},pid,[]},{type,{9982,48},tuple,[{type,{9982,49},pid,[]},{type,{9982,56},reference,[]}]}]}]},[{type,{9983,7},constraint,[{atom,{9983,7},is_subtype},[{var,{9983,7},'Node'},{type,{9983,15},node,[]}]]},{type,{9984,7},constraint,[{atom,{9984,7},is_subtype},[{var,{9984,7},'Fun'},{type,{9984,14},function,[]}]]},{type,{9985,7},constraint,[{atom,{9985,7},is_subtype},[{var,{9985,7},'Options'},{type,{9985,18},list,[{type,{9985,19},union,[{atom,{9985,19},monitor},{type,{9986,19},tuple,[{atom,{9986,20},monitor},{type,{9986,29},list,[{user_type,{9986,30},monitor_option,[]}]}]},{atom,{9987,19},link},{var,{9988,19},'OtherOption'}]}]}]]},{type,{9989,7},constraint,[{atom,{9989,7},is_subtype},[{var,{9989,7},'OtherOption'},{type,{9989,22},term,[]}]]}]]}]}}]}},{{function,spawn_opt,2},{9949,2},[<<115,112,97,119,110,95,111,112,116,40,70,117,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,95,111,112,116,47,52,96,46,10,10,73,102,32,111,112,116,105,111,110,32,96,109,111,110,105,116,111,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,10,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>},#{group => processes,specification => [{attribute,{9957,2},spec,{{spawn_opt,2},[{type,{9957,16},bounded_fun,[{type,{9957,16},'fun',[{type,{9957,16},product,[{var,{9957,17},'Fun'},{var,{9957,22},'Options'}]},{type,{9957,34},union,[{type,{9957,34},pid,[]},{type,{9957,42},tuple,[{type,{9957,43},pid,[]},{type,{9957,50},reference,[]}]}]}]},[{type,{9958,7},constraint,[{atom,{9958,7},is_subtype},[{var,{9958,7},'Fun'},{type,{9958,14},function,[]}]]},{type,{9959,7},constraint,[{atom,{9959,7},is_subtype},[{var,{9959,7},'Options'},{type,{9959,18},list,[{user_type,{9959,19},spawn_opt_option,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,3},{9906,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,32,84,104,101,10,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,10,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9912,2},spec,{{spawn_monitor,3},[{type,{9912,20},bounded_fun,[{type,{9912,20},'fun',[{type,{9912,20},product,[{var,{9912,21},'Module'},{var,{9912,29},'Function'},{var,{9912,39},'Args'}]},{type,{9912,48},tuple,[{type,{9912,49},pid,[]},{type,{9912,56},reference,[]}]}]},[{type,{9913,7},constraint,[{atom,{9913,7},is_subtype},[{var,{9913,7},'Module'},{type,{9913,17},module,[]}]]},{type,{9914,7},constraint,[{atom,{9914,7},is_subtype},[{var,{9914,7},'Function'},{type,{9914,19},atom,[]}]]},{type,{9915,7},constraint,[{atom,{9915,7},is_subtype},[{var,{9915,7},'Args'},{type,{9915,15},list,[{type,{9915,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,2},{9882,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,10,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46,10,10,73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32,96,115,112,97,119,110,95,109,111,110,105,116,111,114,40,41,96,44,10,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32,96,110,111,116,115,117,112,96,32,101,120,99,101,112,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{9892,2},spec,{{spawn_monitor,2},[{type,{9892,20},bounded_fun,[{type,{9892,20},'fun',[{type,{9892,20},product,[{var,{9892,21},'Node'},{var,{9892,27},'Fun'}]},{type,{9892,35},tuple,[{type,{9892,36},pid,[]},{type,{9892,43},reference,[]}]}]},[{type,{9893,7},constraint,[{atom,{9893,7},is_subtype},[{var,{9893,7},'Node'},{type,{9893,15},node,[]}]]},{type,{9894,7},constraint,[{atom,{9894,7},is_subtype},[{var,{9894,7},'Fun'},{type,{9894,14},function,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_monitor,1},{9869,2},[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9875,2},spec,{{spawn_monitor,1},[{type,{9875,20},bounded_fun,[{type,{9875,20},'fun',[{type,{9875,20},product,[{var,{9875,21},'Fun'}]},{type,{9875,29},tuple,[{type,{9875,30},pid,[]},{type,{9875,37},reference,[]}]}]},[{type,{9876,7},constraint,[{atom,{9876,7},is_subtype},[{var,{9876,7},'Fun'},{type,{9876,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,2},{9847,2},[<<115,112,97,119,110,95,108,105,110,107,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,10,111,102,32,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,10,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9855,2},spec,{{spawn_link,2},[{type,{9855,17},bounded_fun,[{type,{9855,17},'fun',[{type,{9855,17},product,[{var,{9855,18},'Node'},{var,{9855,24},'Fun'}]},{type,{9855,32},pid,[]}]},[{type,{9856,7},constraint,[{atom,{9856,7},is_subtype},[{var,{9856,7},'Node'},{type,{9856,15},node,[]}]]},{type,{9857,7},constraint,[{atom,{9857,7},is_subtype},[{var,{9857,7},'Fun'},{type,{9857,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,1},{9832,2},[<<115,112,97,119,110,95,108,105,110,107,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,10,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9838,2},spec,{{spawn_link,1},[{type,{9838,17},bounded_fun,[{type,{9838,17},'fun',[{type,{9838,17},product,[{var,{9838,18},'Fun'}]},{type,{9838,26},pid,[]}]},[{type,{9839,7},constraint,[{atom,{9839,7},is_subtype},[{var,{9839,7},'Fun'},{type,{9839,14},function,[]}]]}]]}]}}]}},{{function,spawn,2},{9814,2},[<<115,112,97,119,110,40,78,111,100,101,44,32,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,32,111,110,32,96,78,111,100,101,96,46,32,73,102,32,96,78,111,100,101,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,10,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9820,2},spec,{{spawn,2},[{type,{9820,12},bounded_fun,[{type,{9820,12},'fun',[{type,{9820,12},product,[{var,{9820,13},'Node'},{var,{9820,19},'Fun'}]},{type,{9820,27},pid,[]}]},[{type,{9821,7},constraint,[{atom,{9821,7},is_subtype},[{var,{9821,7},'Node'},{type,{9821,15},node,[]}]]},{type,{9822,7},constraint,[{atom,{9822,7},is_subtype},[{var,{9822,7},'Fun'},{type,{9822,14},function,[]}]]}]]}]}}]}},{{function,spawn,1},{9800,2},[<<115,112,97,119,110,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,70,117,110,96,32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{9805,2},spec,{{spawn,1},[{type,{9805,12},bounded_fun,[{type,{9805,12},'fun',[{type,{9805,12},product,[{var,{9805,13},'Fun'}]},{type,{9805,21},pid,[]}]},[{type,{9806,7},constraint,[{atom,{9806,7},is_subtype},[{var,{9806,7},'Fun'},{type,{9806,14},function,[]}]]}]]}]}}]}},{{function,apply,3},{9767,2},[<<97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32,96,70,117,110,99,116,105,111,110,96,32,105,110,32,96,77,111,100,117,108,101,96,32,116,111,32,96,65,114,103,115,96,46,32,84,104,101,32,97,112,112,108,105,101,100,10,102,117,110,99,116,105,111,110,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,102,114,111,109,32,96,77,111,100,117,108,101,96,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,108,101,110,103,116,104,10,111,102,32,96,65,114,103,115,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,112,112,108,121,40,108,105,115,116,115,44,32,114,101,118,101,114,115,101,44,32,91,91,97,44,32,98,44,32,99,93,93,41,46,10,91,99,44,98,44,97,93,10,62,32,97,112,112,108,121,40,101,114,108,97,110,103,44,32,97,116,111,109,95,116,111,95,108,105,115,116,44,32,91,39,69,114,108,97,110,103,39,93,41,46,10,34,69,114,108,97,110,103,34,10,96,96,96,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,10,97,115,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,44,32,65,114,103,78,41,96,46,10,10,70,97,105,108,117,114,101,58,32,96,101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51,96,32,105,115,32,99,97,108,108,101,100,32,105,102,32,116,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,10,105,115,32,110,111,116,32,101,120,112,111,114,116,101,100,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,46,32,73,102,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,105,102,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,115,111,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,109,111,100,117,108,101,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,32,101,114,114,111,114,32,119,105,116,104,32,114,101,97,115,111,110,10,96,117,110,100,101,102,96,32,105,115,32,103,101,110,101,114,97,116,101,100,46>>},#{group => processes,specification => [{attribute,{9791,2},spec,{{apply,3},[{type,{9791,12},bounded_fun,[{type,{9791,12},'fun',[{type,{9791,12},product,[{var,{9791,13},'Module'},{var,{9791,21},'Function'},{var,{9791,31},'Args'}]},{type,{9791,40},term,[]}]},[{type,{9792,7},constraint,[{atom,{9792,7},is_subtype},[{var,{9792,7},'Module'},{type,{9792,17},module,[]}]]},{type,{9793,7},constraint,[{atom,{9793,7},is_subtype},[{var,{9793,7},'Function'},{type,{9793,19},atom,[]}]]},{type,{9794,7},constraint,[{atom,{9794,7},is_subtype},[{var,{9794,7},'Args'},{type,{9794,15},list,[{type,{9794,16},term,[]}]}]]}]]}]}}]}},{{function,apply,2},{9747,2},[<<97,112,112,108,121,40,70,117,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<67,97,108,108,115,32,97,32,102,117,110,44,32,112,97,115,115,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32,96,65,114,103,115,96,32,97,115,32,97,114,103,117,109,101,110,116,115,46,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,10,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32,96,70,117,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,32,65,114,103,78,41,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,69,97,114,108,105,101,114,44,32,96,70,117,110,96,32,99,111,117,108,100,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,125,96,44,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,62,32,91,96,97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41,96,93,40,96,97,112,112,108,121,47,51,96,41,46,32,95,84,104,105,115,32,117,115,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,119,105,108,108,10,62,32,115,116,111,112,32,119,111,114,107,105,110,103,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,95>>},#{group => processes,specification => [{attribute,{9760,2},spec,{{apply,2},[{type,{9760,12},bounded_fun,[{type,{9760,12},'fun',[{type,{9760,12},product,[{var,{9760,13},'Fun'},{var,{9760,18},'Args'}]},{type,{9760,27},term,[]}]},[{type,{9761,7},constraint,[{atom,{9761,7},is_subtype},[{var,{9761,7},'Fun'},{type,{9761,14},function,[]}]]},{type,{9762,7},constraint,[{atom,{9762,7},is_subtype},[{var,{9762,7},'Args'},{type,{9762,15},list,[{type,{9762,16},term,[]}]}]]}]]}]}}]}},{{function,universaltime_to_localtime,1},{9718,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,85,110,105,118,101,114,115,97,108,116,105,109,101,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,10,105,110,32,116,104,101,32,102,111,114,109,32,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,10,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,44,32,97,110,100,32,96,85,110,105,118,101,114,115,97,108,116,105,109,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,55,125,44,123,49,53,44,49,56,44,52,51,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,85,110,105,118,101,114,115,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{9733,2},spec,{{universaltime_to_localtime,1},[{type,{9733,33},bounded_fun,[{type,{9733,33},'fun',[{type,{9733,33},product,[{var,{9733,34},'Universaltime'}]},{var,{9733,53},'Localtime'}]},[{type,{9734,7},constraint,[{atom,{9734,7},is_subtype},[{var,{9734,7},'Localtime'},{remote_type,{9734,20},[{atom,{9734,20},calendar},{atom,{9734,29},datetime},[]]}]]},{type,{9735,7},constraint,[{atom,{9735,7},is_subtype},[{var,{9735,7},'Universaltime'},{remote_type,{9735,24},[{atom,{9735,24},calendar},{atom,{9735,33},datetime},[]]}]]}]]}]}}]}},{{function,system_info,1},[{file,[46,46,47,46,46,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,95,115,121,115,116,101,109,95,105,110,102,111,46,109,100]},{location,{1,1}}],[<<115,121,115,116,101,109,95,105,110,102,111,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,10,10,84,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,98,114,111,107,101,110,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,105,110,10,111,114,100,101,114,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,111,32,110,97,118,105,103,97,116,101,46,10,10,45,32,91,96,77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,109,101,109,111,114,121,45,97,108,108,111,99,97,116,105,111,110,96,41,32,45,10,32,32,91,96,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,41,44,10,32,32,91,96,97,108,108,111,99,97,116,111,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,96,41,44,10,32,32,91,96,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,41,44,10,32,32,91,96,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,96,41,10,10,45,32,91,96,67,80,85,32,84,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,99,112,117,45,116,111,112,111,108,111,103,121,96,41,32,45,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,44,10,32,32,91,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,44,10,32,32,91,96,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,41,10,10,45,32,91,96,80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,112,114,111,99,101,115,115,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,41,44,10,32,32,91,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,41,44,10,32,32,91,96,104,101,97,112,95,115,105,122,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115,96,41,44,10,32,32,91,96,104,101,97,112,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101,96,41,44,10,32,32,91,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,41,44,10,32,32,91,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,41,44,10,32,32,91,96,112,114,111,99,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,76,105,109,105,116,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,108,105,109,105,116,115,96,41,32,45,10,32,32,91,96,97,116,111,109,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116,96,41,44,10,32,32,91,96,97,116,111,109,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116,96,41,44,10,32,32,91,96,101,116,115,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116,96,41,44,10,32,32,91,96,101,116,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,111,114,116,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116,96,41,44,10,32,32,91,96,112,111,114,116,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,114,111,99,101,115,115,95,99,111,117,110,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116,96,41,44,10,32,32,91,96,112,114,111,99,101,115,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,84,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,116,105,109,101,96,41,32,45,10,32,32,91,96,101,110,100,95,116,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,96,41,44,10,32,32,91,96,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,41,44,10,32,32,91,96,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,41,44,10,32,32,91,96,115,116,97,114,116,95,116,105,109,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,96,41,44,10,32,32,91,96,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,41,44,10,32,32,91,96,116,105,109,101,95,111,102,102,115,101,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,96,41,44,10,32,32,91,96,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,41,44,10,32,32,91,96,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,41,10,10,45,32,91,96,83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,99,104,101,100,117,108,101,114,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,105,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,96,41,44,10,32,32,91,96,115,99,104,101,100,117,108,101,114,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,115,109,112,95,115,117,112,112,111,114,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116,96,41,44,10,32,32,91,96,116,104,114,101,97,100,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115,96,41,44,10,32,32,91,96,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,41,10,10,45,32,91,96,68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,100,105,115,116,114,105,98,117,116,105,111,110,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,99,114,101,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,96,41,44,10,32,32,91,96,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,41,44,10,32,32,91,96,100,105,115,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,96,41,44,10,32,32,91,96,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,41,44,10,32,32,91,96,100,105,115,116,95,99,116,114,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108,96,41,10,10,45,32,91,96,83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,47,49,45,115,121,115,116,101,109,45,105,110,102,111,114,109,97,116,105,111,110,96,41,32,45,10,32,32,91,96,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,41,44,10,32,32,91,96,99,104,101,99,107,95,105,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111,96,41,44,10,32,32,91,96,99,111,109,112,97,116,95,114,101,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108,96,41,44,10,32,32,91,96,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,41,44,10,32,32,91,96,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,100,121,110,97,109,105,99,95,116,114,97,99,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,96,41,44,10,32,32,91,96,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,41,44,10,32,32,91,96,101,109,117,95,102,108,97,118,111,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114,96,41,44,10,32,32,91,96,101,109,117,95,116,121,112,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101,96,41,44,10,32,32,91,96,105,110,102,111,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111,96,41,44,10,32,32,91,96,107,101,114,110,101,108,95,112,111,108,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108,96,41,44,10,32,32,91,96,108,111,97,100,101,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100,96,41,44,10,32,32,91,96,109,97,99,104,105,110,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101,96,41,44,10,32,32,91,96,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,41,44,10,32,32,91,96,110,105,102,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,111,116,112,95,114,101,108,101,97,115,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101,96,41,44,10,32,32,91,96,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,41,44,10,32,32,91,96,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114,96,41,44,10,32,32,91,96,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,41,44,10,32,32,91,96,118,101,114,115,105,111,110,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110,96,41,44,10,32,32,91,96,119,111,114,100,115,105,122,101,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101,96,41,10,10,35,35,32,77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,111,114,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,42,32,95,95,96,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,96,95,95,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,32,125,32,45,32,82,101,116,117,114,110,115,32,96,91,116,117,112,108,101,40,41,93,96,32,119,105,116,104,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,97,114,101,97,115,46,10,10,32,32,69,97,99,104,32,116,117,112,108,101,32,99,111,110,116,97,105,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,116,121,112,101,32,111,102,32,109,101,109,111,114,121,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,97,110,100,10,32,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,87,104,101,110,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,97,98,111,117,116,32,97,108,108,111,99,97,116,101,100,32,97,110,100,32,117,115,101,100,32,109,101,109,111,114,121,32,105,115,32,112,114,101,115,101,110,116,44,32,97,108,115,111,32,97,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,112,114,101,115,101,110,116,44,10,32,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,117,115,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,46,10,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,41,96,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,97,110,100,32,116,104,101,32,99,111,110,116,101,110,116,10,32,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,115,32,116,104,101,114,101,102,111,114,101,10,32,32,99,104,97,110,103,101,115,32,119,104,101,110,32,110,101,101,100,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,32,105,115,32,95,110,111,116,95,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,10,32,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,111,109,101,32,118,97,108,117,101,115,32,97,114,101,32,112,97,114,116,32,111,102,32,111,116,104,101,114,32,118,97,108,117,101,115,44,32,97,110,100,32,115,111,109,101,10,32,32,109,101,109,111,114,121,32,97,114,101,97,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,10,32,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,44,49,96,93,40,96,101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,96,41,46,10,10,45,32,96,97,108,108,111,99,97,116,111,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,96,96,10,32,32,123,65,108,108,111,99,97,116,111,114,32,58,58,32,117,110,100,101,102,105,110,101,100,32,124,32,103,108,105,98,99,44,10,32,32,32,86,101,114,115,105,111,110,32,58,58,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,44,10,32,32,32,70,101,97,116,117,114,101,115,32,58,58,32,91,97,116,111,109,40,41,93,44,10,32,32,32,83,101,116,116,105,110,103,115,32,58,58,32,91,123,83,117,98,115,121,115,116,101,109,32,58,58,32,97,116,111,109,40,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,80,97,114,97,109,101,116,101,114,32,58,58,32,97,116,111,109,40,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,86,97,108,117,101,32,58,58,32,116,101,114,109,40,41,125,93,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,125,93,10,32,32,125,10,32,32,96,96,96,10,10,32,32,119,104,101,114,101,10,10,32,32,45,32,96,65,108,108,111,99,97,116,111,114,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,32,73,102,10,32,32,32,32,96,65,108,108,111,99,97,116,111,114,96,32,101,113,117,97,108,115,32,96,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,32,99,97,110,110,111,116,32,98,101,10,32,32,32,32,105,100,101,110,116,105,102,105,101,100,46,32,96,103,108,105,98,99,96,32,99,97,110,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46,10,32,32,45,32,96,86,101,114,115,105,111,110,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,40,98,117,116,32,110,111,116,32,97,32,115,116,114,105,110,103,41,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,10,32,32,32,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,96,109,97,108,108,111,99,40,41,96,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,10,32,32,45,32,96,70,101,97,116,117,114,101,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,32,117,115,101,100,46,10,32,32,45,32,96,83,101,116,116,105,110,103,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,117,98,115,121,115,116,101,109,115,44,32,116,104,101,105,114,32,99,111,110,102,105,103,117,114,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,44,32,97,110,100,32,117,115,101,100,10,32,32,32,32,118,97,108,117,101,115,46,32,83,101,116,116,105,110,103,115,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,99,111,109,98,105,110,97,116,105,111,110,115,32,111,102,32,112,108,97,116,102,111,114,109,115,44,10,32,32,32,32,97,108,108,111,99,97,116,111,114,115,44,32,97,110,100,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,46,32,77,101,109,111,114,121,32,115,105,122,101,115,32,97,114,101,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,32,34,83,121,115,116,101,109,32,70,108,97,103,115,32,69,102,102,101,99,116,105,110,103,32,101,114,116,115,95,97,108,108,111,99,34,32,105,110,10,32,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,102,108,97,103,115,41,46,10,10,45,32,96,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,49,44,32,116,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,32,105,115,32,97,32,108,105,115,116,32,111,102,32,96,123,105,110,115,116,97,110,99,101,44,32,73,110,115,116,97,110,99,101,78,111,44,32,73,110,115,116,97,110,99,101,73,110,102,111,125,96,32,116,117,112,108,101,115,44,32,119,104,101,114,101,10,32,32,96,73,110,115,116,97,110,99,101,73,110,102,111,96,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,115,112,101,99,105,102,105,99,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,10,32,32,97,108,108,111,99,97,116,111,114,46,32,73,102,32,96,65,108,108,111,99,96,32,105,115,32,110,111,116,32,97,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46,32,73,102,32,96,65,108,108,111,99,96,32,105,115,32,100,105,115,97,98,108,101,100,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,97,110,100,10,32,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,116,32,119,97,115,32,105,110,105,116,105,97,108,108,121,10,32,32,105,110,116,101,110,100,101,100,32,97,115,32,97,32,116,111,111,108,32,119,104,101,110,32,100,101,118,101,108,111,112,105,110,103,32,110,101,119,32,97,108,108,111,99,97,116,111,114,115,44,32,98,117,116,32,97,115,32,105,116,32,99,97,110,32,98,101,32,111,102,10,32,32,105,110,116,101,114,101,115,116,32,102,111,114,32,111,116,104,101,114,115,32,105,116,32,104,97,115,32,98,101,101,110,32,98,114,105,101,102,108,121,32,100,111,99,117,109,101,110,116,101,100,46,10,10,32,32,84,104,101,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,108,105,115,116,101,100,32,105,110,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,46,10,32,32,73,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,117,112,101,114,32,99,97,114,114,105,101,114,115,32,99,97,110,32,98,101,32,111,98,116,97,105,110,101,100,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,119,105,116,104,10,32,32,96,123,97,108,108,111,99,97,116,111,114,44,32,101,114,116,115,95,109,109,97,112,125,96,32,111,114,32,102,114,111,109,32,69,82,84,83,32,53,46,49,48,46,52,59,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,119,104,101,110,32,99,97,108,108,105,110,103,10,32,32,119,105,116,104,32,96,123,97,108,108,111,99,97,116,111,114,44,32,109,115,101,103,95,97,108,108,111,99,125,96,32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,97,110,32,96,123,101,114,116,115,95,109,109,97,112,44,32,95,125,96,32,116,117,112,108,101,32,97,115,32,111,110,101,10,32,32,101,108,101,109,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46,10,10,32,32,65,102,116,101,114,32,114,101,97,100,105,110,103,32,116,104,101,32,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,109,111,114,101,10,32,32,111,114,32,108,101,115,115,32,115,112,101,97,107,115,32,102,111,114,32,105,116,115,101,108,102,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,119,111,114,116,104,32,101,120,112,108,97,105,110,105,110,103,32,115,111,109,101,32,116,104,105,110,103,115,46,32,67,97,108,108,10,32,32,99,111,117,110,116,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,44,32,116,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,103,105,103,97,32,99,97,108,108,115,44,32,97,110,100,32,116,104,101,10,32,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,99,97,108,108,115,46,32,96,109,98,99,115,96,32,97,110,100,32,96,115,98,99,115,96,32,100,101,110,111,116,101,32,109,117,108,116,105,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,97,110,100,10,32,32,115,105,110,103,108,101,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,83,105,122,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,98,121,116,101,115,46,32,87,104,101,110,32,97,10,32,32,115,105,122,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,101,100,44,32,105,116,32,105,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,111,109,101,116,104,105,110,103,46,32,83,105,122,101,115,32,97,110,100,32,97,109,111,117,110,116,115,32,97,114,101,10,32,32,111,102,116,101,110,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,114,101,101,32,118,97,108,117,101,115,58,10,10,32,32,45,32,84,104,101,32,102,105,114,115,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,10,32,32,45,32,84,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,99,97,108,108,32,116,111,10,32,32,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41,96,46,10,32,32,45,32,84,104,101,32,116,104,105,114,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,10,10,32,32,73,102,32,111,110,108,121,32,111,110,101,32,118,97,108,117,101,32,105,115,32,112,114,101,115,101,110,116,44,32,105,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,32,96,102,105,120,95,97,108,108,111,99,96,32,109,101,109,111,114,121,10,32,32,98,108,111,99,107,32,116,121,112,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,46,32,84,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,112,111,111,108,10,32,32,115,105,122,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,117,115,101,100,32,109,101,109,111,114,121,32,115,105,122,101,46,10,10,45,32,96,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,97,108,108,111,99,97,116,111,114,115,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,32,96,97,108,108,111,99,95,117,116,105,108,96,10,32,32,102,114,97,109,101,119,111,114,107,32,97,115,32,97,116,111,109,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,84,104,101,32,97,108,108,111,99,95,117,116,105,108,32,102,114,97,109,101,119,111,114,107,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,97,108,108,111,99,95,117,116,105,108,41,32,105,110,32,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,46,10,10,45,32,96,123,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,44,32,65,108,108,111,99,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,118,97,114,105,111,117,115,32,115,105,122,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,114,101,116,117,114,110,101,100,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101,96,41,46,10,10,35,35,32,67,80,85,32,84,111,112,111,108,111,103,121,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,99,112,117,95,116,111,112,111,108,111,103,121,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,10,32,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,117,115,101,100,32,105,115,32,116,104,101,10,32,32,91,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100,96,41,44,32,105,102,10,32,32,115,117,99,104,32,101,120,105,115,116,115,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,32,32,91,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,96,41,44,10,32,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,46,32,73,102,32,110,111,32,67,80,85,32,116,111,112,111,108,111,103,121,32,101,120,105,115,116,115,44,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,102,105,110,101,100,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,99,116,41,32,105,110,32,96,101,114,108,40,49,41,96,32,97,110,100,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,116,101,99,116,101,100,125,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,96,116,58,99,112,117,95,116,111,112,111,108,111,103,121,40,41,96,46,32,84,104,101,32,101,109,117,108,97,116,111,114,32,100,101,116,101,99,116,115,32,116,104,101,10,32,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,110,32,115,111,109,101,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,46,32,79,110,10,32,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,32,119,105,116,104,32,109,111,114,101,32,116,104,97,110,32,51,50,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,110,111,116,10,32,32,100,101,116,101,99,116,101,100,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,117,115,101,100,125,96,32,45,32,82,101,116,117,114,110,115,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,70,111,114,10,32,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,99,112,117,95,116,111,112,111,108,111,103,121,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,96,41,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,10,32,32,100,101,116,101,99,116,32,116,104,101,32,99,111,110,102,105,103,117,114,101,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,10,32,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,10,32,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,10,32,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,10,32,32,111,110,108,105,110,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,46,10,10,45,32,96,99,112,117,95,113,117,111,116,97,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,67,80,85,32,113,117,111,116,97,10,32,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,108,105,109,105,116,101,100,32,98,121,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,115,97,121,105,110,103,32,104,111,119,32,109,97,110,121,10,32,32,112,114,111,99,101,115,115,111,114,115,39,32,119,111,114,116,104,32,111,102,32,114,117,110,116,105,109,101,32,119,101,32,103,101,116,32,40,98,101,116,119,101,101,110,32,49,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,10,32,32,112,114,111,99,101,115,115,111,114,115,41,44,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,107,110,111,119,110,96,32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,97,32,113,117,111,116,97,46,10,10,45,32,96,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111,32,125,32,45,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,114,101,114,101,97,100,115,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,117,112,100,97,116,101,115,32,105,116,115,32,105,110,116,101,114,110,97,108,108,121,32,115,116,111,114,101,100,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,32,32,91,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100,96,41,32,97,110,100,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,10,32,32,91,99,111,110,102,105,103,117,114,101,100,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,96,41,44,10,32,32,91,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,97,118,97,105,108,97,98,108,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,41,44,32,97,110,100,10,32,32,91,99,112,117,32,113,117,111,116,97,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97,96,41,46,10,10,32,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,114,101,97,100,44,32,116,104,101,32,97,116,111,109,10,32,32,96,99,104,97,110,103,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32,96,117,110,99,104,97,110,103,101,100,96,46,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,104,97,115,32,99,104,97,110,103,101,100,44,32,121,111,117,32,112,114,111,98,97,98,108,121,32,119,97,110,116,32,116,111,10,32,32,91,97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,89,111,117,32,116,121,112,105,99,97,108,108,121,32,119,97,110,116,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,97,115,10,32,32,91,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,52,66,10,10,35,35,32,80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,101,102,97,117,108,116,32,112,114,111,99,101,115,115,32,104,101,97,112,32,115,101,116,116,105,110,103,115,58,10,10,45,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,32,117,115,101,100,32,98,121,32,100,101,102,97,117,108,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,116,58,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,100,101,102,97,117,108,116,115,47,48,96,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,101,102,97,117,108,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,10,32,32,65,32,112,114,111,99,101,115,115,32,115,112,97,119,110,101,100,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,98,121,32,97,32,96,115,112,97,119,110,96,32,111,114,32,96,115,112,97,119,110,95,108,105,110,107,96,32,117,115,101,115,32,116,104,101,115,101,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,117,115,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,10,32,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,101,114,108,97,110,103,58,115,112,97,119,110,95,111,112,116,47,52,96,41,32,99,97,110,32,115,112,97,119,110,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,10,32,32,117,115,101,32,116,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,46,10,10,45,32,96,104,101,97,112,95,115,105,122,101,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,118,97,108,105,100,32,104,101,97,112,32,115,105,122,101,115,32,105,110,32,119,111,114,100,115,46,32,65,108,108,32,69,114,108,97,110,103,32,104,101,97,112,115,32,97,114,101,32,115,105,122,101,100,32,102,114,111,109,32,115,105,122,101,115,10,32,32,105,110,32,116,104,105,115,32,108,105,115,116,46,10,10,45,32,96,104,101,97,112,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,112,32,116,121,112,101,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,46,32,79,110,101,32,104,101,97,112,32,116,121,112,101,32,101,120,105,115,116,115,58,10,10,32,32,45,32,96,112,114,105,118,97,116,101,96,32,45,32,69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,104,101,97,112,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,116,115,32,117,115,101,32,97,110,100,32,110,111,10,32,32,32,32,114,101,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,32,104,101,97,112,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,77,101,115,115,97,103,101,115,10,32,32,32,32,112,97,115,115,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,99,111,112,105,101,100,32,98,101,116,119,101,101,110,32,104,101,97,112,115,46,10,10,45,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,97,120,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,115,121,115,116,101,109,45,119,105,100,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,115,101,116,116,105,110,103,10,32,32,99,97,110,32,98,101,32,115,101,116,32,117,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,104,109,97,120,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,41,44,10,32,32,91,96,43,104,109,97,120,107,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,107,41,44,32,91,96,43,104,109,97,120,101,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,101,108,41,32,97,110,100,10,32,32,91,96,43,104,109,97,120,105,98,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,97,120,105,98,41,32,105,110,32,96,101,114,108,40,49,41,96,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,116,105,109,101,10,32,32,117,115,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,46,10,32,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,10,32,32,96,111,102,102,95,104,101,97,112,96,32,111,114,32,96,111,110,95,104,101,97,112,96,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,10,32,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,104,109,113,100,41,32,105,110,32,96,101,114,108,40,49,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,105,110,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125,96,44,32,119,104,101,114,101,32,96,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,112,114,111,99,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,112,114,111,99,101,115,115,32,97,110,100,32,112,111,114,116,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,35,35,32,83,121,115,116,101,109,32,76,105,109,105,116,115,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,108,105,109,105,116,115,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,97,116,111,109,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,48,46,48,10,10,45,32,96,97,116,111,109,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,97,116,111,109,115,32,97,108,108,111,119,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,105,110,99,114,101,97,115,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,116,95,115,105,122,101,41,32,116,111,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,48,46,48,10,10,45,32,96,101,116,115,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,49,46,49,10,10,45,32,96,101,116,115,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,102,111,114,32,110,117,109,98,101,114,32,111,102,10,32,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,91,112,97,114,116,105,97,108,108,121,32,111,98,115,111,108,101,116,101,93,40,96,109,58,101,116,115,35,109,97,120,95,101,116,115,95,116,97,98,108,101,115,96,41,32,97,110,100,10,32,32,110,117,109,98,101,114,32,111,102,32,116,97,98,108,101,115,32,97,114,101,32,111,110,108,121,32,108,105,109,105,116,101,100,32,98,121,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,48,51,10,10,45,32,96,112,111,114,116,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,10,32,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,108,101,110,103,116,104,40,101,114,108,97,110,103,58,112,111,114,116,115,40,41,41,96,44,32,98,117,116,32,109,111,114,101,10,32,32,101,102,102,105,99,105,101,110,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,10,45,32,96,112,111,114,116,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,32,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,10,32,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,81,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,81,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,32,79,84,80,32,82,49,54,66,10,10,45,32,96,112,114,111,99,101,115,115,95,99,111,117,110,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,10,32,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,108,101,110,103,116,104,40,112,114,111,99,101,115,115,101,115,40,41,41,96,44,32,98,117,116,10,32,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,45,32,96,112,114,111,99,101,115,115,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,10,32,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,10,32,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,80,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,80,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,35,35,32,83,121,115,116,101,109,32,84,105,109,101,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,116,105,109,101,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,101,110,100,95,116,105,109,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,32,125,32,45,32,84,104,101,32,108,97,115,116,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,32,105,110,32,96,110,97,116,105,118,101,96,10,32,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,105,110,116,101,114,110,97,108,108,121,32,105,110,10,32,32,116,104,101,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,91,115,116,97,114,116,32,116,105,109,101,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,96,41,32,97,110,100,32,116,104,101,32,101,110,100,32,116,105,109,101,32,105,115,32,97,116,32,108,101,97,115,116,32,97,10,32,32,113,117,97,114,116,101,114,32,111,102,32,97,32,109,105,108,108,101,110,110,105,117,109,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,10,32,32,91,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,73,102,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,110,111,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,10,32,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32,96,75,101,121,96,115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32,96,86,97,108,117,101,96,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,10,32,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58,10,10,32,32,45,32,96,123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125,96,32,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,10,32,32,32,32,84,104,105,115,32,116,117,112,108,101,32,97,108,119,97,121,115,32,101,120,105,115,116,115,32,105,102,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,32,32,115,121,115,116,101,109,46,10,10,32,32,45,32,96,123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125,96,32,45,32,84,104,105,115,32,116,117,112,108,101,32,111,110,108,121,32,101,120,105,115,116,115,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,99,97,110,32,98,101,32,117,115,101,100,10,32,32,32,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32,96,67,108,111,99,107,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,10,32,32,32,32,119,104,101,110,32,99,97,108,108,105,110,103,32,96,70,117,110,99,116,105,111,110,96,46,10,10,32,32,45,32,96,123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,10,32,32,32,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,10,32,32,32,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,10,32,32,32,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,10,32,32,32,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,96,70,117,110,99,116,105,111,110,96,115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,10,32,32,32,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,10,32,32,32,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,97,108,105,103,110,115,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,10,32,32,32,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,117,115,101,100,95,114,101,115,111,108,117,116,105,111,110,44,32,85,115,101,100,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,84,104,101,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,118,101,114,121,32,111,102,116,101,110,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,72,111,119,101,118,101,114,44,32,111,110,32,115,111,109,101,32,115,121,115,116,101,109,115,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,104,97,115,32,116,111,10,32,32,32,32,98,101,32,114,101,100,117,99,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,114,101,108,105,97,98,108,121,32,112,114,111,100,117,99,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,116,97,109,112,115,46,32,65,110,32,101,120,97,109,112,108,101,32,111,102,10,32,32,32,32,116,104,105,115,32,105,115,32,119,104,101,110,32,96,81,117,101,114,121,80,101,114,102,111,114,109,97,110,99,101,67,111,117,110,116,101,114,40,41,96,32,105,115,32,117,115,101,100,32,97,115,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,10,32,32,32,32,115,111,117,114,99,101,32,111,110,32,87,105,110,100,111,119,115,46,32,73,102,32,115,117,99,104,32,97,32,114,101,100,117,99,116,105,111,110,32,111,102,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,104,97,115,32,98,101,101,110,32,100,111,110,101,44,10,32,32,32,32,96,85,115,101,100,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,119,105,108,108,32,98,101,32,115,109,97,108,108,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,101,120,116,101,110,100,101,100,44,32,69,120,116,101,110,100,101,100,125,96,32,45,32,96,69,120,116,101,110,100,101,100,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,105,109,101,10,32,32,32,32,118,97,108,117,101,115,32,104,97,115,32,98,101,101,110,32,101,120,116,101,110,100,101,100,59,32,111,116,104,101,114,119,105,115,101,32,96,69,120,116,101,110,100,101,100,96,32,101,113,117,97,108,115,32,96,110,111,96,46,32,84,104,101,32,114,97,110,103,101,32,109,117,115,116,10,32,32,32,32,98,101,32,101,120,116,101,110,100,101,100,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,114,101,116,117,114,110,115,32,118,97,108,117,101,115,32,116,104,97,116,32,119,114,97,112,32,102,97,115,116,46,32,84,104,105,115,32,116,121,112,105,99,97,108,108,121,32,105,115,10,32,32,32,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,51,50,45,98,105,116,32,118,97,108,117,101,46,10,10,32,32,45,32,96,123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125,96,32,45,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,99,97,108,108,101,100,10,32,32,32,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,10,32,32,32,32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,110,111,96,46,10,10,32,32,45,32,96,123,116,105,109,101,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,125,96,32,45,32,96,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,96,32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,10,32,32,32,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,10,32,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32,96,75,101,121,96,115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32,96,86,97,108,117,101,96,115,32,97,115,10,32,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,10,32,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58,10,10,32,32,45,32,96,123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125,96,32,45,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,10,10,32,32,45,32,96,123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125,96,32,45,32,69,120,105,115,116,115,32,111,110,108,121,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,10,32,32,32,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32,96,67,108,111,99,107,73,100,96,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,10,32,32,32,32,99,97,108,108,105,110,103,32,96,70,117,110,99,116,105,111,110,96,46,10,10,32,32,45,32,96,123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125,96,32,45,32,72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,10,32,32,32,32,91,114,101,115,111,108,117,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,114,101,115,111,108,117,116,105,111,110,41,32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,10,32,32,32,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,10,32,32,32,32,102,114,111,109,32,116,104,101,32,79,83,44,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,10,32,32,32,32,117,110,105,116,32,111,102,32,96,70,117,110,99,116,105,111,110,96,115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,10,32,32,32,32,108,111,119,101,114,32,116,104,97,110,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,10,32,32,32,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32,91,97,99,99,117,114,97,99,121,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,97,99,99,117,114,97,99,121,41,32,111,114,10,32,32,32,32,119,104,101,116,104,101,114,32,116,104,101,32,91,112,114,101,99,105,115,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,112,114,101,99,105,115,105,111,110,41,32,100,111,32,97,108,105,103,110,32,119,105,116,104,32,116,104,101,10,32,32,32,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,10,32,32,32,32,96,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,96,46,10,10,32,32,45,32,96,123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125,96,32,45,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,121,101,115,96,32,105,102,32,96,70,117,110,99,116,105,111,110,96,32,105,115,32,99,97,108,108,101,100,10,32,32,32,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,10,32,32,32,32,99,97,108,108,115,32,110,101,101,100,115,32,116,111,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32,96,80,97,114,97,108,108,101,108,96,32,101,113,117,97,108,115,32,96,110,111,96,46,10,10,32,32,45,32,96,123,116,105,109,101,44,32,79,115,83,121,115,116,101,109,84,105,109,101,125,96,32,45,32,96,79,115,83,121,115,116,101,109,84,105,109,101,96,32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,105,110,10,32,32,32,32,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,115,116,97,114,116,95,116,105,109,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,32,125,32,45,32,84,104,101,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,32,105,110,32,96,110,97,116,105,118,101,96,10,32,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,32,97,116,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,115,116,97,114,116,101,100,46,10,10,32,32,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,101,110,100,95,116,105,109,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,96,116,58,98,111,111,108,101,97,110,40,41,96,10,32,32,118,97,108,117,101,32,105,110,100,105,99,97,116,105,110,103,32,119,104,101,116,104,101,114,32,91,116,105,109,101,32,99,111,114,114,101,99,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,99,111,114,114,101,99,116,105,111,110,41,10,32,32,105,115,32,101,110,97,98,108,101,100,32,111,114,32,110,111,116,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,111,102,102,115,101,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,116,105,109,101,10,32,32,111,102,102,115,101,116,58,10,10,32,32,45,32,96,112,114,101,108,105,109,105,110,97,114,121,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,112,114,101,108,105,109,105,110,97,114,121,44,32,97,110,100,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,97,110,100,10,32,32,32,32,102,105,110,97,108,105,122,101,100,32,108,97,116,101,114,46,32,84,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,112,114,101,108,105,109,105,110,97,114,121,10,32,32,32,32,112,104,97,115,101,32,111,102,32,116,104,101,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,46,10,10,32,32,45,32,96,102,105,110,97,108,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,102,105,110,97,108,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,10,32,32,32,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,44,32,111,114,10,32,32,32,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,104,97,118,101,32,98,101,101,110,32,102,105,110,97,108,105,122,101,100,32,119,104,101,110,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,118,111,108,97,116,105,108,101,96,32,45,32,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,118,111,108,97,116,105,108,101,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,99,104,97,110,103,101,32,97,116,32,97,110,121,10,32,32,32,32,116,105,109,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,105,109,101,95,119,97,114,112,95,109,111,100,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,118,97,108,117,101,10,32,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,101,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,116,104,97,116,32,105,115,10,32,32,117,115,101,100,58,10,10,32,32,45,32,96,110,111,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,115,105,110,103,108,101,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,45,32,96,109,117,108,116,105,95,116,105,109,101,95,119,97,114,112,96,32,45,32,84,104,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121,32,125,32,45,32,82,101,116,117,114,110,115,32,119,104,101,116,104,101,114,10,32,32,97,32,112,114,101,32,69,82,84,83,32,55,46,48,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,108,101,32,99,111,109,112,101,110,115,97,116,105,111,110,32,102,111,114,32,115,117,100,100,101,110,32,99,104,97,110,103,101,115,32,111,102,32,115,121,115,116,101,109,10,32,32,116,105,109,101,32,105,115,32,96,101,110,97,98,108,101,100,96,32,111,114,32,96,100,105,115,97,98,108,101,100,96,46,32,83,117,99,104,32,99,111,109,112,101,110,115,97,116,105,111,110,32,105,115,32,96,101,110,97,98,108,101,100,96,32,119,104,101,110,32,116,104,101,10,32,32,91,116,105,109,101,32,111,102,102,115,101,116,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116,96,41,32,105,115,32,96,102,105,110,97,108,96,44,32,97,110,100,10,32,32,91,116,105,109,101,32,99,111,114,114,101,99,116,105,111,110,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,96,41,32,105,115,32,101,110,97,98,108,101,100,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,49,10,10,35,35,32,83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,44,32,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,68,105,114,116,121,32,67,80,85,10,32,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,67,80,85,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,44,32,108,105,110,107,101,100,45,105,110,10,32,32,100,114,105,118,101,114,32,99,111,100,101,44,32,97,110,100,32,66,73,70,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,10,32,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,10,32,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,10,32,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,10,32,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,83,68,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,99,112,117,41,10,32,32,111,114,32,91,96,43,83,68,80,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,80,99,112,117,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,10,32,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,10,32,32,115,97,116,105,115,102,105,101,115,32,96,49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78,96,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,10,32,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,32,97,110,100,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,83,68,99,112,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,99,112,117,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,68,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,10,32,32,73,47,79,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,32,97,110,100,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,119,104,105,99,104,10,32,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,83,68,105,111,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,83,68,105,111,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,48,10,10,45,32,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,32,125,32,45,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,10,32,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,96,100,105,115,97,98,108,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,116,97,114,116,101,100,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,10,32,32,32,32,116,104,114,101,97,100,46,10,10,32,32,45,32,96,98,108,111,99,107,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,10,32,32,32,32,116,104,114,101,97,100,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,115,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,45,32,96,98,108,111,99,107,101,100,95,110,111,114,109,97,108,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,10,32,32,32,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,100,105,114,116,121,10,32,32,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,110,111,116,32,98,108,111,99,107,101,100,44,32,97,110,100,32,99,97,110,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,10,32,32,32,32,110,97,116,105,118,101,32,99,111,100,101,46,10,10,32,32,45,32,96,101,110,97,98,108,101,100,96,32,45,32,84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,97,110,100,32,110,111,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,97,108,108,32,97,118,97,105,108,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,10,32,32,32,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,80,105,100,96,115,32,119,104,101,110,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,10,32,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,96,80,105,100,96,115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,10,32,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32,96,80,105,100,96,32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,10,32,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,123,58,10,32,32,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,96,80,105,100,96,115,10,32,32,119,104,101,110,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,32,40,116,104,97,116,32,105,115,44,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,10,32,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,41,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,96,80,105,100,96,115,32,105,110,32,116,104,101,10,32,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,10,32,32,65,32,96,80,105,100,96,32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,10,32,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,57,46,48,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,96,116,58,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,96,44,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,32,111,114,32,110,111,116,32,98,111,117,110,100,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,97,108,116,104,111,117,103,104,32,97,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,44,32,116,104,101,121,32,99,97,110,10,32,32,115,105,108,101,110,116,108,121,32,104,97,118,101,32,102,97,105,108,101,100,32,116,111,32,98,105,110,100,46,32,84,111,32,105,110,115,112,101,99,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,44,32,99,97,108,108,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,98,116,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,46,10,10,32,32,65,32,116,117,112,108,101,32,111,102,32,97,32,115,105,122,101,32,101,113,117,97,108,32,116,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,111,114,32,116,104,101,32,97,116,111,109,32,96,117,110,98,111,117,110,100,96,46,32,76,111,103,105,99,97,108,10,32,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,105,110,116,101,103,101,114,115,46,32,84,104,101,32,96,78,96,116,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,10,32,32,116,117,112,108,101,32,101,113,117,97,108,115,32,116,104,101,32,99,117,114,114,101,110,116,32,98,105,110,100,105,110,103,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,105,116,104,32,116,104,101,32,115,99,104,101,100,117,108,101,114,10,32,32,105,100,101,110,116,105,102,105,101,114,32,101,113,117,97,108,32,116,111,32,96,78,96,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,44,10,32,32,96,101,108,101,109,101,110,116,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,44,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,41,96,10,32,32,114,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,111,110,108,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,98,116,41,32,105,110,10,32,32,96,101,114,108,40,49,41,96,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,95,105,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,73,68,10,32,32,40,96,83,99,104,101,100,117,108,101,114,73,100,96,41,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,96,83,99,104,101,100,117,108,101,114,73,100,96,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,119,104,101,114,101,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,10,32,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,69,114,108,97,110,103,32,112,111,114,116,115,44,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,32,97,110,100,32,69,114,108,97,110,103,32,108,105,110,107,101,100,45,105,110,10,32,32,100,114,105,118,101,114,32,99,111,100,101,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,10,32,32,98,101,32,99,104,97,110,103,101,100,32,108,97,116,101,114,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,10,32,32,97,110,121,32,116,105,109,101,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,96,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,96,41,46,10,10,45,32,96,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,10,32,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,108,97,116,105,111,110,115,104,105,112,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,96,41,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,96,41,46,10,10,45,32,96,115,109,112,95,115,117,112,112,111,114,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,45,32,96,116,104,114,101,97,100,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,46,10,10,45,32,96,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,10,32,32,97,115,121,110,99,32,116,104,114,101,97,100,32,112,111,111,108,32,117,115,101,100,32,102,111,114,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,114,105,118,101,114,32,99,97,108,108,115,10,32,32,40,91,32,96,101,114,108,95,100,114,105,118,101,114,58,100,114,105,118,101,114,95,97,115,121,110,99,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,100,114,105,118,101,114,95,97,115,121,110,99,41,41,46,32,84,104,101,32,118,97,108,117,101,32,105,115,10,32,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,10,10,35,35,32,68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,97,115,121,110,99,95,100,105,115,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,43,112,97,100,32,60,98,111,111,108,101,97,110,62,93,40,101,114,108,95,99,109,100,46,109,100,35,43,112,97,100,41,32,119,104,105,99,104,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,46,32,84,104,105,115,32,118,97,108,117,101,10,32,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,96,109,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,96,41,10,32,32,118,97,108,117,101,32,102,111,114,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,45,32,96,99,114,101,97,116,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,34,99,114,101,97,116,105,111,110,34,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,46,10,32,32,84,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,111,100,101,32,105,115,32,115,116,111,114,101,100,32,105,110,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,10,32,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,105,115,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,105,100,101,110,116,105,102,105,101,114,115,32,102,114,111,109,10,32,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,46,32,67,114,101,97,116,105,111,110,32,118,97,108,117,101,115,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,51,50,45,98,105,116,10,32,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,44,32,98,117,116,32,116,104,105,115,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,10,32,32,97,108,105,118,101,44,32,96,48,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,105,110,32,115,101,99,111,110,100,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,110,32,101,110,116,114,121,32,105,110,32,97,32,110,111,100,101,32,116,97,98,108,101,10,32,32,105,115,32,100,101,108,97,121,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,111,110,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,10,32,32,91,96,43,122,100,110,116,103,99,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,100,110,116,103,99,41,32,116,111,32,96,101,114,108,40,49,41,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,56,46,48,10,10,45,32,96,100,105,115,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,118,97,108,117,101,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,10,32,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,122,100,98,98,108,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,100,98,98,108,41,32,116,111,10,32,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,52,66,48,49,10,10,45,32,96,100,105,115,116,95,99,116,114,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,10,32,32,96,123,78,111,100,101,32,58,58,32,110,111,100,101,40,41,44,32,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,32,58,58,32,112,111,114,116,40,41,32,124,32,112,105,100,40,41,125,96,44,32,111,110,101,32,101,110,116,114,121,32,102,111,114,32,101,97,99,104,10,32,32,99,111,110,110,101,99,116,101,100,32,114,101,109,111,116,101,32,110,111,100,101,46,32,96,78,111,100,101,96,32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,32,96,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,96,32,105,115,32,116,104,101,10,32,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,10,32,32,77,111,114,101,32,115,112,101,99,105,102,105,99,97,108,108,121,44,32,96,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,96,32,102,111,114,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,84,67,80,47,73,80,32,40,116,104,101,10,32,32,110,111,114,109,97,108,32,99,97,115,101,41,32,105,115,32,116,104,101,32,115,111,99,107,101,116,32,117,115,101,100,32,105,110,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,99,32,110,111,100,101,46,10,10,35,35,32,83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110,10,10,82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,58,10,10,45,32,96,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,116,119,111,45,116,117,112,108,101,10,32,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,67,32,99,111,109,112,105,108,101,114,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,105,108,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,102,105,114,115,116,10,32,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,10,32,32,117,110,107,110,111,119,110,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,101,114,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,10,32,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,117,110,107,110,111,119,110,46,10,10,45,32,96,99,104,101,99,107,95,105,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,109,117,108,97,116,111,114,115,32,105,110,116,101,114,110,97,108,32,73,47,79,32,99,104,101,99,107,105,110,103,46,32,78,111,116,105,99,101,10,32,32,116,104,97,116,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,118,97,114,121,32,98,101,116,119,101,101,110,32,112,108,97,116,102,111,114,109,115,32,97,110,100,32,111,118,101,114,10,32,32,116,105,109,101,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,96,99,111,109,112,97,116,95,114,101,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,10,32,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,10,32,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,101,116,32,116,111,32,98,101,32,98,97,99,107,119,97,114,100,10,32,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,46,32,84,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,82,96,93,40,101,114,108,95,99,109,100,46,109,100,35,99,111,109,112,97,116,95,114,101,108,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,10,45,32,96,100,101,98,117,103,95,99,111,109,112,105,108,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,98,117,103,45,99,111,109,112,105,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,45,32,96,100,114,105,118,101,114,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,10,32,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,118,101,114,115,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,104,97,115,32,116,104,101,10,32,32,102,111,114,109,32,91,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,118,101,114,115,105,111,110,95,109,97,110,97,103,101,109,101,110,116,41,46,10,10,45,32,96,100,121,110,97,109,105,99,95,116,114,97,99,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,10,32,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,102,114,97,109,101,119,111,114,107,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,46,32,73,116,10,32,32,99,97,110,32,98,101,32,96,100,116,114,97,99,101,96,44,32,96,115,121,115,116,101,109,116,97,112,96,44,32,111,114,32,96,110,111,110,101,96,46,32,70,111,114,32,97,32,99,111,109,109,101,114,99,105,97,108,32,111,114,32,115,116,97,110,100,97,114,100,32,98,117,105,108,100,44,10,32,32,105,116,32,105,115,32,97,108,119,97,121,115,32,96,110,111,110,101,96,46,32,84,104,101,32,111,116,104,101,114,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,105,110,100,105,99,97,116,101,32,97,32,99,117,115,116,111,109,32,99,111,110,102,105,103,117,114,97,116,105,111,110,10,32,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,96,46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,100,121,110,97,109,105,99,45,116,114,97,99,101,61,100,116,114,97,99,101,96,41,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,44,32,115,101,101,32,91,96,100,121,110,116,114,97,99,101,40,51,41,96,93,40,96,109,58,100,121,110,116,114,97,99,101,96,41,32,109,97,110,117,97,108,10,32,32,112,97,103,101,32,97,110,100,32,116,104,101,32,96,82,69,65,68,77,69,46,100,116,114,97,99,101,96,47,96,82,69,65,68,77,69,46,115,121,115,116,101,109,116,97,112,96,32,102,105,108,101,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,115,111,117,114,99,101,10,32,32,99,111,100,101,32,116,111,112,32,100,105,114,101,99,116,111,114,121,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,96,116,58,98,111,111,108,101,97,110,40,41,96,32,105,110,100,105,99,97,116,105,110,103,32,105,102,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,112,114,111,98,101,115,32,40,96,100,116,114,97,99,101,96,32,111,114,32,96,115,121,115,116,101,109,116,97,112,96,41,32,97,114,101,10,32,32,98,117,105,108,116,32,105,110,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,98,101,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,119,97,115,10,32,32,98,117,105,108,116,32,102,111,114,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,32,40,116,104,97,116,32,105,115,44,32,96,115,121,115,116,101,109,95,105,110,102,111,40,100,121,110,97,109,105,99,95,116,114,97,99,101,41,96,32,114,101,116,117,114,110,115,10,32,32,96,100,116,114,97,99,101,96,32,111,114,32,96,115,121,115,116,101,109,116,97,112,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,101,109,117,95,102,108,97,118,111,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,10,32,32,102,108,97,118,111,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,101,105,116,104,101,114,32,96,101,109,117,96,32,111,114,32,96,106,105,116,96,46,32,80,111,115,115,105,98,108,101,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,48,10,10,45,32,96,101,109,117,95,116,121,112,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,10,32,32,98,117,105,108,100,32,116,121,112,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,104,101,32,97,116,111,109,32,96,111,112,116,96,32,102,111,114,10,32,32,111,112,116,105,109,105,122,101,100,46,32,79,116,104,101,114,32,112,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32,96,100,101,98,117,103,96,44,32,96,103,99,111,118,96,44,32,96,118,97,108,103,114,105,110,100,96,44,10,32,32,96,103,112,114,111,102,96,44,32,97,110,100,32,96,108,99,110,116,96,46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,10,32,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,48,10,10,45,32,96,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,42,104,97,108,116,32,102,108,117,115,104,32,116,105,109,101,111,117,116,42,32,115,101,116,32,98,121,32,116,104,101,32,96,101,114,108,96,10,32,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,55,46,48,10,10,45,32,96,105,110,102,111,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,115,121,115,116,101,109,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,107,101,114,110,101,108,95,112,111,108,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108,32,125,32,45,32,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,32,117,115,101,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,107,101,114,110,101,108,45,112,111,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,45,32,96,108,111,97,100,101,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,10,32,32,108,111,97,100,101,100,32,109,111,100,117,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,32,32,91,72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,109,97,99,104,105,110,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,110,97,109,101,46,10,10,45,32,96,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108,32,125,32,45,32,82,101,116,117,114,110,115,10,32,32,116,104,101,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,45,108,101,118,101,108,32,40,97,110,32,96,116,58,105,110,116,101,103,101,114,40,41,96,41,32,105,102,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,10,32,32,111,116,104,101,114,119,105,115,101,32,96,117,110,100,101,102,105,110,101,100,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,44,32,115,101,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,84,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,84,95,108,101,118,101,108,41,32,105,110,32,96,101,114,108,40,49,41,96,10,10,45,32,96,110,105,102,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,10,32,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,78,73,70,32,105,110,116,101,114,102,97,99,101,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,10,32,32,116,104,101,32,102,111,114,109,32,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,49,55,46,52,10,10,45,32,96,111,116,112,95,114,101,108,101,97,115,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,10,32,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,69,82,84,83,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,112,97,114,116,32,111,102,46,10,10,32,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,49,55,44,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,109,97,106,111,114,32,79,84,80,10,32,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,46,32,78,111,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,41,96,32,97,114,103,117,109,101,110,116,32,103,105,118,101,115,32,116,104,101,32,101,120,97,99,116,32,79,84,80,10,32,32,118,101,114,115,105,111,110,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,32,105,115,10,32,32,100,105,102,102,105,99,117,108,116,32,116,111,32,100,101,116,101,114,109,105,110,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,101,114,115,105,111,110,115,10,32,32,105,110,32,91,83,121,115,116,101,109,32,112,114,105,110,99,105,112,108,101,115,93,40,96,101,58,115,121,115,116,101,109,58,118,101,114,115,105,111,110,115,46,109,100,96,41,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,46,10,10,45,32,96,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,123,58,10,32,32,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,111,110,32,116,104,101,10,32,32,97,109,111,117,110,116,32,111,102,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,109,97,100,101,32,98,121,32,97,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,32,111,114,99,104,101,115,116,114,97,116,105,110,103,32,115,121,115,116,101,109,10,32,32,119,105,100,101,32,99,104,97,110,103,101,115,46,32,83,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,44,32,76,105,109,105,116,41,96,93,40,96,109,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,96,41,10,32,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,52,46,50,10,10,45,32,96,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,115,99,104,101,100,117,108,105,110,103,32,104,105,110,116,32,117,115,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,112,112,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,115,112,112,41,32,105,110,32,96,101,114,108,40,49,41,96,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,82,49,54,66,10,10,45,32,96,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101,32,125,32,45,32,82,101,116,117,114,110,115,32,97,10,32,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,111,114,32,97,110,100,32,79,83,32,97,114,99,104,105,116,101,99,116,117,114,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,98,117,105,108,116,10,32,32,102,111,114,46,10,10,45,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,32,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,32,97,115,32,115,101,116,32,98,121,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,10,32,32,42,41,96,93,40,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,46,10,32,32,10,32,32,83,105,110,99,101,58,32,79,84,80,32,50,49,46,51,10,10,45,32,96,115,121,115,116,101,109,95,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,10,32,32,99,111,110,116,97,105,110,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,97,110,100,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,46,10,10,45,32,96,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,32,125,32,45,32,82,101,116,117,114,110,115,32,116,104,101,10,32,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,10,32,32,96,103,101,116,95,116,99,119,96,32,105,110,32,115,101,99,116,105,111,110,32,91,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,93,40,109,97,116,99,104,95,115,112,101,99,46,109,100,35,103,101,116,95,116,99,119,41,10,32,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,45,32,96,118,101,114,115,105,111,110,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110,32,125,32,45,32,82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,10,32,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,46,10,10,45,32,96,119,111,114,100,115,105,122,101,96,123,58,32,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101,32,125,32,45,32,83,97,109,101,32,97,115,32,96,123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125,96,46,10,10,45,32,96,123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125,96,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,115,105,122,101,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,32,119,111,114,100,115,32,105,110,32,98,121,116,101,115,32,97,115,10,32,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,97,110,100,32,56,32,105,115,10,32,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,46,10,10,45,32,96,123,119,111,114,100,115,105,122,101,44,32,101,120,116,101,114,110,97,108,125,96,32,45,32,82,101,116,117,114,110,115,32,116,104,101,32,116,114,117,101,32,119,111,114,100,32,115,105,122,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,116,104,97,116,10,32,32,105,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,97,32,112,111,105,110,116,101,114,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,79,110,32,97,10,32,32,112,117,114,101,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,56,32,105,115,10,32,32,114,101,116,117,114,110,101,100,46>>},#{group => system,specification => [{attribute,{9615,2},spec,{{system_info,1},[{type,{9616,10},'fun',[{type,{9616,10},product,[{atom,{9616,11},allocated_areas}]},{type,{9616,31},list,[{type,{9616,33},tuple,any}]}]},{type,{9617,10},bounded_fun,[{type,{9617,10},'fun',[{type,{9617,10},product,[{atom,{9617,11},allocator}]},{type,{9618,18},tuple,[{var,{9618,19},'Allocator'},{var,{9618,30},'Version'},{var,{9618,39},'Features'},{var,{9618,49},'Settings'}]}]},[{type,{9619,7},constraint,[{atom,{9619,7},is_subtype},[{var,{9619,7},'Allocator'},{type,{9619,20},union,[{atom,{9619,20},undefined},{atom,{9619,32},glibc}]}]]},{type,{9620,7},constraint,[{atom,{9620,7},is_subtype},[{var,{9620,7},'Version'},{type,{9620,18},list,[{type,{9620,19},non_neg_integer,[]}]}]]},{type,{9621,7},constraint,[{atom,{9621,7},is_subtype},[{var,{9621,7},'Features'},{type,{9621,19},list,[{type,{9621,20},atom,[]}]}]]},{type,{9622,7},constraint,[{atom,{9622,7},is_subtype},[{var,{9622,7},'Settings'},{type,{9622,19},list,[{type,{9622,20},tuple,[{ann_type,{9622,21},[{var,{9622,21},'Subsystem'},{type,{9622,34},atom,[]}]},{type,{9623,21},list,[{type,{9623,22},tuple,[{ann_type,{9623,23},[{var,{9623,23},'Parameter'},{type,{9623,36},atom,[]}]},{ann_type,{9624,23},[{var,{9624,23},'Value'},{type,{9624,32},term,[]}]}]}]}]}]}]]}]]},{type,{9625,10},bounded_fun,[{type,{9625,10},'fun',[{type,{9625,10},product,[{type,{9625,11},tuple,[{atom,{9625,12},allocator},{var,{9625,23},'Alloc'}]}]},{type,{9625,34},list,[{var,{9625,35},'_'}]}]},[{type,{9626,7},constraint,[{atom,{9626,7},is_subtype},[{var,{9626,7},'Alloc'},{type,{9626,16},atom,[]}]]}]]},{type,{9627,10},bounded_fun,[{type,{9627,10},'fun',[{type,{9627,10},product,[{atom,{9627,11},alloc_util_allocators}]},{type,{9627,37},list,[{var,{9627,38},'Alloc'}]}]},[{type,{9628,7},constraint,[{atom,{9628,7},is_subtype},[{var,{9628,7},'Alloc'},{type,{9628,16},atom,[]}]]}]]},{type,{9629,10},bounded_fun,[{type,{9629,10},'fun',[{type,{9629,10},product,[{type,{9629,11},tuple,[{atom,{9629,12},allocator_sizes},{var,{9629,29},'Alloc'}]}]},{type,{9629,40},list,[{var,{9629,41},'_'}]}]},[{type,{9630,7},constraint,[{atom,{9630,7},is_subtype},[{var,{9630,7},'Alloc'},{type,{9630,16},atom,[]}]]}]]},{type,{9631,10},'fun',[{type,{9631,10},product,[{atom,{9631,11},atom_count}]},{type,{9631,26},pos_integer,[]}]},{type,{9632,10},'fun',[{type,{9632,10},product,[{atom,{9632,11},atom_limit}]},{type,{9632,26},pos_integer,[]}]},{type,{9633,10},'fun',[{type,{9633,10},product,[{atom,{9633,11},build_type}]},{type,{9633,26},union,[{atom,{9633,26},opt},{atom,{9633,32},debug},{atom,{9634,26},gcov},{atom,{9634,33},valgrind},{atom,{9634,44},gprof},{atom,{9634,52},lcnt},{atom,{9634,59},frmptr}]}]},{type,{9635,10},'fun',[{type,{9635,10},product,[{atom,{9635,11},c_compiler_used}]},{type,{9635,31},tuple,[{type,{9635,32},atom,[]},{type,{9635,40},term,[]}]}]},{type,{9636,10},'fun',[{type,{9636,10},product,[{atom,{9636,11},check_io}]},{type,{9636,24},list,[{var,{9636,25},'_'}]}]},{type,{9637,10},'fun',[{type,{9637,10},product,[{atom,{9637,11},compat_rel}]},{type,{9637,26},integer,[]}]},{type,{9638,10},bounded_fun,[{type,{9638,10},'fun',[{type,{9638,10},product,[{atom,{9638,11},cpu_topology}]},{var,{9638,29},'CpuTopology'}]},[{type,{9639,7},constraint,[{atom,{9639,7},is_subtype},[{var,{9639,7},'CpuTopology'},{user_type,{9639,22},cpu_topology,[]}]]}]]},{type,{9640,10},bounded_fun,[{type,{9640,10},'fun',[{type,{9640,10},product,[{type,{9640,11},tuple,[{atom,{9640,12},cpu_topology},{type,{9640,26},union,[{atom,{9640,26},defined},{atom,{9640,36},detected},{atom,{9640,47},used}]}]}]},{var,{9640,57},'CpuTopology'}]},[{type,{9641,7},constraint,[{atom,{9641,7},is_subtype},[{var,{9641,7},'CpuTopology'},{user_type,{9641,22},cpu_topology,[]}]]}]]},{type,{9642,10},'fun',[{type,{9642,10},product,[{atom,{9642,11},cpu_quota}]},{type,{9642,25},union,[{type,{9642,25},pos_integer,[]},{atom,{9642,41},unknown}]}]},{type,{9643,10},'fun',[{type,{9643,10},product,[{atom,{9643,11},creation}]},{type,{9643,24},integer,[]}]},{type,{9644,10},'fun',[{type,{9644,10},product,[{atom,{9644,11},debug_compiled}]},{type,{9644,30},boolean,[]}]},{type,{9645,10},'fun',[{type,{9645,10},product,[{atom,{9645,11},delayed_node_table_gc}]},{type,{9645,37},union,[{atom,{9645,37},infinity},{type,{9645,48},non_neg_integer,[]}]}]},{type,{9646,10},'fun',[{type,{9646,10},product,[{atom,{9646,11},dirty_cpu_schedulers}]},{type,{9646,36},non_neg_integer,[]}]},{type,{9647,10},'fun',[{type,{9647,10},product,[{atom,{9647,11},dirty_cpu_schedulers_online}]},{type,{9647,43},non_neg_integer,[]}]},{type,{9648,10},'fun',[{type,{9648,10},product,[{atom,{9648,11},dirty_io_schedulers}]},{type,{9648,35},non_neg_integer,[]}]},{type,{9649,10},'fun',[{type,{9649,10},product,[{atom,{9649,11},dist}]},{type,{9649,20},binary,[]}]},{type,{9650,10},'fun',[{type,{9650,10},product,[{atom,{9650,11},dist_buf_busy_limit}]},{type,{9650,35},non_neg_integer,[]}]},{type,{9651,10},'fun',[{type,{9651,10},product,[{atom,{9651,11},dist_ctrl}]},{type,{9651,25},list,[{type,{9651,26},tuple,[{ann_type,{9651,27},[{var,{9651,27},'Node'},{type,{9651,35},node,[]}]},{ann_type,{9652,27},[{var,{9652,27},'ControllingEntity'},{type,{9652,48},union,[{type,{9652,48},port,[]},{type,{9652,57},pid,[]}]}]}]}]}]},{type,{9653,10},'fun',[{type,{9653,10},product,[{atom,{9653,11},driver_version}]},{type,{9653,30},string,[]}]},{type,{9654,10},'fun',[{type,{9654,10},product,[{atom,{9654,11},dynamic_trace}]},{type,{9654,29},union,[{atom,{9654,29},none},{atom,{9654,36},dtrace},{atom,{9654,45},systemtap}]}]},{type,{9655,10},'fun',[{type,{9655,10},product,[{atom,{9655,11},dynamic_trace_probes}]},{type,{9655,36},boolean,[]}]},{type,{9656,10},'fun',[{type,{9656,10},product,[{atom,{9656,11},eager_check_io}]},{type,{9656,30},boolean,[]}]},{type,{9657,10},'fun',[{type,{9657,10},product,[{atom,{9657,11},emu_flavor}]},{type,{9657,26},union,[{atom,{9657,26},emu},{atom,{9657,32},jit}]}]},{type,{9658,10},'fun',[{type,{9658,10},product,[{atom,{9658,11},emu_type}]},{type,{9658,24},union,[{atom,{9658,24},opt},{atom,{9658,30},debug},{atom,{9658,38},gcov},{atom,{9658,45},valgrind},{atom,{9658,56},gprof},{atom,{9658,64},lcnt},{atom,{9658,71},frmptr}]}]},{type,{9659,10},'fun',[{type,{9659,10},product,[{atom,{9659,11},end_time}]},{type,{9659,24},non_neg_integer,[]}]},{type,{9660,10},'fun',[{type,{9660,10},product,[{atom,{9660,11},ets_count}]},{type,{9660,25},pos_integer,[]}]},{type,{9661,10},'fun',[{type,{9661,10},product,[{atom,{9661,11},ets_limit}]},{type,{9661,25},pos_integer,[]}]},{type,{9662,10},'fun',[{type,{9662,10},product,[{atom,{9662,11},fullsweep_after}]},{type,{9662,31},tuple,[{atom,{9662,32},fullsweep_after},{type,{9662,49},non_neg_integer,[]}]}]},{type,{9663,10},'fun',[{type,{9663,10},product,[{atom,{9663,11},garbage_collection}]},{user_type,{9663,34},garbage_collection_defaults,[]}]},{type,{9664,10},'fun',[{type,{9664,10},product,[{atom,{9664,11},heap_sizes}]},{type,{9664,26},list,[{type,{9664,27},non_neg_integer,[]}]}]},{type,{9665,10},'fun',[{type,{9665,10},product,[{atom,{9665,11},heap_type}]},{atom,{9665,25},private}]},{type,{9666,10},'fun',[{type,{9666,10},product,[{atom,{9666,11},info}]},{type,{9666,20},binary,[]}]},{type,{9667,10},'fun',[{type,{9667,10},product,[{atom,{9667,11},kernel_poll}]},{type,{9667,27},boolean,[]}]},{type,{9668,10},'fun',[{type,{9668,10},product,[{atom,{9668,11},loaded}]},{type,{9668,22},binary,[]}]},{type,{9669,10},'fun',[{type,{9669,10},product,[{type,{9669,11},union,[{atom,{9669,11},logical_processors},{atom,{9670,11},logical_processors_available},{atom,{9671,11},logical_processors_online}]}]},{type,{9671,41},union,[{atom,{9671,41},unknown},{type,{9671,51},pos_integer,[]}]}]},{type,{9672,10},'fun',[{type,{9672,10},product,[{atom,{9672,11},machine}]},{type,{9672,23},string,[]}]},{type,{9673,10},'fun',[{type,{9673,10},product,[{atom,{9673,11},max_heap_size}]},{type,{9673,29},tuple,[{atom,{9673,30},max_heap_size},{ann_type,{9673,45},[{var,{9673,45},'MaxHeapSize'},{user_type,{9673,60},max_heap_size,[]}]}]}]},{type,{9674,10},'fun',[{type,{9674,10},product,[{atom,{9674,11},message_queue_data}]},{user_type,{9674,34},message_queue_data,[]}]},{type,{9675,10},'fun',[{type,{9675,10},product,[{atom,{9675,11},min_heap_size}]},{type,{9675,29},tuple,[{atom,{9675,30},min_heap_size},{ann_type,{9675,45},[{var,{9675,45},'MinHeapSize'},{type,{9675,60},pos_integer,[]}]}]}]},{type,{9676,10},'fun',[{type,{9676,10},product,[{atom,{9676,11},min_bin_vheap_size}]},{type,{9676,34},tuple,[{atom,{9676,35},min_bin_vheap_size},{ann_type,{9677,35},[{var,{9677,35},'MinBinVHeapSize'},{type,{9677,54},pos_integer,[]}]}]}]},{type,{9678,10},'fun',[{type,{9678,10},product,[{atom,{9678,11},modified_timing_level}]},{type,{9678,37},union,[{type,{9678,37},integer,[]},{atom,{9678,49},undefined}]}]},{type,{9679,10},'fun',[{type,{9679,10},product,[{atom,{9679,11},multi_scheduling}]},{type,{9679,32},union,[{atom,{9679,32},disabled},{atom,{9679,43},blocked},{atom,{9679,53},blocked_normal},{atom,{9679,70},enabled}]}]},{type,{9680,10},'fun',[{type,{9680,10},product,[{atom,{9680,11},multi_scheduling_blockers}]},{type,{9680,41},list,[{ann_type,{9680,42},[{var,{9680,42},'Pid'},{type,{9680,49},pid,[]}]}]}]},{type,{9681,10},'fun',[{type,{9681,10},product,[{atom,{9681,11},nif_version}]},{type,{9681,27},string,[]}]},{type,{9682,10},'fun',[{type,{9682,10},product,[{atom,{9682,11},normal_multi_scheduling_blockers}]},{type,{9682,48},list,[{ann_type,{9682,49},[{var,{9682,49},'Pid'},{type,{9682,56},pid,[]}]}]}]},{type,{9683,10},'fun',[{type,{9683,10},product,[{atom,{9683,11},otp_release}]},{type,{9683,27},string,[]}]},{type,{9684,10},'fun',[{type,{9684,10},product,[{atom,{9684,11},os_monotonic_time_source}]},{type,{9684,40},list,[{type,{9684,41},tuple,[{type,{9684,42},atom,[]},{type,{9684,49},term,[]}]}]}]},{type,{9685,10},'fun',[{type,{9685,10},product,[{atom,{9685,11},os_system_time_source}]},{type,{9685,37},list,[{type,{9685,38},tuple,[{type,{9685,39},atom,[]},{type,{9685,46},term,[]}]}]}]},{type,{9686,10},'fun',[{type,{9686,10},product,[{atom,{9686,11},outstanding_system_requests_limit}]},{type,{9686,49},range,[{integer,{9686,49},1},{integer,{9686,52},134217727}]}]},{type,{9687,10},'fun',[{type,{9687,10},product,[{atom,{9687,11},port_parallelism}]},{type,{9687,32},boolean,[]}]},{type,{9688,10},'fun',[{type,{9688,10},product,[{atom,{9688,11},port_count}]},{type,{9688,26},non_neg_integer,[]}]},{type,{9689,10},'fun',[{type,{9689,10},product,[{atom,{9689,11},port_limit}]},{type,{9689,26},pos_integer,[]}]},{type,{9690,10},'fun',[{type,{9690,10},product,[{atom,{9690,11},process_count}]},{type,{9690,29},pos_integer,[]}]},{type,{9691,10},'fun',[{type,{9691,10},product,[{atom,{9691,11},process_limit}]},{type,{9691,29},pos_integer,[]}]},{type,{9692,10},'fun',[{type,{9692,10},product,[{atom,{9692,11},procs}]},{type,{9692,21},binary,[]}]},{type,{9693,10},'fun',[{type,{9693,10},product,[{atom,{9693,11},scheduler_bind_type}]},{user_type,{9693,35},scheduler_bind_type,[]}]},{type,{9694,10},'fun',[{type,{9694,10},product,[{atom,{9694,11},scheduler_bindings}]},{type,{9694,35},tuple,any}]},{type,{9695,10},'fun',[{type,{9695,10},product,[{atom,{9695,11},scheduler_id}]},{ann_type,{9695,28},[{var,{9695,28},'SchedulerId'},{type,{9695,43},pos_integer,[]}]}]},{type,{9696,10},'fun',[{type,{9696,10},product,[{type,{9696,11},union,[{atom,{9696,11},schedulers},{atom,{9696,24},schedulers_online}]}]},{type,{9696,46},pos_integer,[]}]},{type,{9697,10},'fun',[{type,{9697,10},product,[{atom,{9697,11},smp_support}]},{type,{9697,27},boolean,[]}]},{type,{9698,10},'fun',[{type,{9698,10},product,[{atom,{9698,11},start_time}]},{type,{9698,26},integer,[]}]},{type,{9699,10},'fun',[{type,{9699,10},product,[{atom,{9699,11},system_architecture}]},{type,{9699,35},string,[]}]},{type,{9700,10},'fun',[{type,{9700,10},product,[{atom,{9700,11},system_logger}]},{type,{9700,29},union,[{atom,{9700,29},logger},{atom,{9700,38},undefined},{type,{9700,50},pid,[]}]}]},{type,{9701,10},'fun',[{type,{9701,10},product,[{atom,{9701,11},system_version}]},{type,{9701,30},string,[]}]},{type,{9702,10},'fun',[{type,{9702,10},product,[{atom,{9702,11},threads}]},{type,{9702,23},boolean,[]}]},{type,{9703,10},'fun',[{type,{9703,10},product,[{atom,{9703,11},thread_pool_size}]},{type,{9703,32},non_neg_integer,[]}]},{type,{9704,10},'fun',[{type,{9704,10},product,[{atom,{9704,11},time_correction}]},{type,{9704,31},union,[{atom,{9704,31},true},{atom,{9704,38},false}]}]},{type,{9705,10},'fun',[{type,{9705,10},product,[{atom,{9705,11},time_offset}]},{type,{9705,27},union,[{atom,{9705,27},preliminary},{atom,{9705,41},final},{atom,{9705,49},volatile}]}]},{type,{9706,10},'fun',[{type,{9706,10},product,[{atom,{9706,11},time_warp_mode}]},{type,{9706,30},union,[{atom,{9706,30},no_time_warp},{atom,{9706,45},single_time_warp},{atom,{9706,64},multi_time_warp}]}]},{type,{9707,10},'fun',[{type,{9707,10},product,[{atom,{9707,11},tolerant_timeofday}]},{type,{9707,34},union,[{atom,{9707,34},enabled},{atom,{9707,44},disabled}]}]},{type,{9708,10},'fun',[{type,{9708,10},product,[{atom,{9708,11},trace_control_word}]},{type,{9708,34},non_neg_integer,[]}]},{type,{9709,10},'fun',[{type,{9709,10},product,[{atom,{9709,11},update_cpu_info}]},{type,{9709,31},union,[{atom,{9709,31},changed},{atom,{9709,41},unchanged}]}]},{type,{9710,10},'fun',[{type,{9710,10},product,[{atom,{9710,11},version}]},{type,{9710,23},string,[]}]},{type,{9711,10},'fun',[{type,{9711,10},product,[{type,{9711,11},union,[{atom,{9711,11},wordsize},{type,{9711,22},tuple,[{atom,{9711,23},wordsize},{atom,{9711,33},internal}]},{type,{9711,45},tuple,[{atom,{9711,46},wordsize},{atom,{9711,56},external}]}]}]},{type,{9711,70},union,[{integer,{9711,70},4},{integer,{9711,74},8}]}]},{type,{9712,10},'fun',[{type,{9712,10},product,[{atom,{9712,11},async_dist}]},{type,{9712,26},boolean,[]}]},{type,{9713,10},'fun',[{type,{9713,10},product,[{atom,{9713,11},halt_flush_timeout}]},{type,{9713,34},union,[{type,{9713,34},non_neg_integer,[]},{atom,{9713,54},infinity}]}]}]}}]}},{{function,tuple_to_list,1},{9557,2},[<<116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,117,112,108,101,96,46,32,96,84,117,112,108,101,96,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,117,112,108,101,95,116,111,95,108,105,115,116,40,123,115,104,97,114,101,44,32,123,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,125,125,41,46,10,91,115,104,97,114,101,44,123,39,69,114,105,99,115,115,111,110,95,66,39,44,49,54,51,125,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{9567,2},spec,{{tuple_to_list,1},[{type,{9567,20},bounded_fun,[{type,{9567,20},'fun',[{type,{9567,20},product,[{var,{9567,21},'Tuple'}]},{type,{9567,31},list,[{type,{9567,32},term,[]}]}]},[{type,{9568,7},constraint,[{atom,{9568,7},is_subtype},[{var,{9568,7},'Tuple'},{type,{9568,16},tuple,any}]]}]]}]}}]}},{{function,trace_pattern,3},{9514,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,40,77,70,65,44,32,77,97,116,99,104,83,112,101,99,44,32,70,108,97,103,76,105,115,116,41>>],#{<<101,110>> => <<83,101,116,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32,99,97,108,108,44,32,115,101,110,100,32,97,110,100,32,114,101,99,101,105,118,101,32,116,114,97,99,105,110,103,32,111,110,32,116,104,101,32,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,10,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,44,32,96,116,114,97,99,101,58,115,101,110,100,47,51,96,32,97,110,100,10,32,32,62,32,96,116,114,97,99,101,58,114,101,99,118,47,51,96,32,116,104,97,116,32,111,112,101,114,97,116,101,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,115,101,115,115,105,111,110,115,46,10,10,65,114,103,117,109,101,110,116,32,96,70,108,97,103,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,116,119,111,32,97,100,100,105,116,105,111,110,97,108,32,111,112,116,105,111,110,115,32,102,111,114,32,99,97,108,108,32,116,114,97,99,105,110,103,58,10,10,45,32,42,42,96,123,109,101,116,97,44,32,80,105,100,125,32,124,32,123,109,101,116,97,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125,96,42,42,32,45,32,84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,10,32,32,109,101,116,97,45,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,116,111,32,116,104,101,10,32,32,116,114,97,99,101,114,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,110,111,32,116,114,97,99,101,114,32,105,115,10,32,32,115,112,101,99,105,102,105,101,100,44,32,96,115,101,108,102,47,48,96,32,105,115,32,117,115,101,100,32,97,115,32,97,32,100,101,102,97,117,108,116,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,46,10,10,70,111,114,32,102,117,114,116,104,101,114,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,101,101,32,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,32,44,32,96,116,114,97,99,101,58,115,101,110,100,47,51,96,32,97,110,100,10,96,116,114,97,99,101,58,114,101,99,118,47,51,96,46>>},#{group => trace,specification => [{attribute,{9534,2},spec,{{trace_pattern,3},[{type,{9534,20},bounded_fun,[{type,{9534,20},'fun',[{type,{9534,20},product,[{atom,{9534,21},send},{var,{9534,27},'MatchSpec'},{type,{9534,38},nil,[]}]},{type,{9534,45},non_neg_integer,[]}]},[{type,{9535,7},constraint,[{atom,{9535,7},is_subtype},[{var,{9535,7},'MatchSpec'},{type,{9535,21},union,[{ann_type,{9535,21},[{var,{9535,21},'MatchSpecList'},{user_type,{9535,38},trace_match_spec,[]}]},{type,{9536,20},boolean,[]}]}]]}]]},{type,{9537,20},bounded_fun,[{type,{9537,20},'fun',[{type,{9537,20},product,[{atom,{9537,21},'receive'},{var,{9537,32},'MatchSpec'},{type,{9537,43},nil,[]}]},{type,{9537,50},non_neg_integer,[]}]},[{type,{9538,7},constraint,[{atom,{9538,7},is_subtype},[{var,{9538,7},'MatchSpec'},{type,{9538,21},union,[{ann_type,{9538,21},[{var,{9538,21},'MatchSpecList'},{user_type,{9538,38},trace_match_spec,[]}]},{type,{9539,20},boolean,[]}]}]]}]]},{type,{9540,20},bounded_fun,[{type,{9540,20},'fun',[{type,{9540,20},product,[{var,{9540,21},'MFA'},{var,{9540,26},'MatchSpec'},{var,{9540,37},'FlagList'}]},{type,{9540,50},non_neg_integer,[]}]},[{type,{9541,7},constraint,[{atom,{9541,7},is_subtype},[{var,{9541,7},'MFA'},{user_type,{9541,14},trace_pattern_mfa,[]}]]},{type,{9542,7},constraint,[{atom,{9542,7},is_subtype},[{var,{9542,7},'MatchSpec'},{type,{9542,21},union,[{ann_type,{9542,21},[{var,{9542,21},'MatchSpecList'},{user_type,{9542,38},trace_match_spec,[]}]},{type,{9543,20},boolean,[]},{atom,{9544,20},restart},{atom,{9545,20},pause}]}]]},{type,{9546,7},constraint,[{atom,{9546,7},is_subtype},[{var,{9546,7},'FlagList'},{type,{9546,19},list,[{user_type,{9546,21},trace_pattern_flag,[]}]}]]}]]}]}}]}},{{function,trace_pattern,2},{9488,2},[<<116,114,97,99,101,95,112,97,116,116,101,114,110,40,77,70,65,44,32,77,97,116,99,104,83,112,101,99,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,69,118,101,110,116,44,32,77,97,116,99,104,83,112,101,99,44,32,91,93,41,96,93,40,96,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51,96,41,44,10,114,101,116,97,105,110,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>},#{group => trace,specification => [{attribute,{9493,2},spec,{{trace_pattern,2},[{type,{9493,20},bounded_fun,[{type,{9493,20},'fun',[{type,{9493,20},product,[{var,{9493,21},'MFA'},{var,{9493,26},'MatchSpec'}]},{type,{9493,40},non_neg_integer,[]}]},[{type,{9494,7},constraint,[{atom,{9494,7},is_subtype},[{var,{9494,7},'MFA'},{type,{9494,14},union,[{user_type,{9494,14},trace_pattern_mfa,[]},{atom,{9494,36},send},{atom,{9494,43},'receive'}]}]]},{type,{9495,7},constraint,[{atom,{9495,7},is_subtype},[{var,{9495,7},'MatchSpec'},{type,{9495,21},union,[{ann_type,{9495,21},[{var,{9495,21},'MatchSpecList'},{user_type,{9495,38},trace_match_spec,[]}]},{type,{9496,20},boolean,[]},{atom,{9497,20},restart},{atom,{9498,20},pause}]}]]}]]}]}}]}},{{function,tl,1},{9446,2},[<<116,108,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,116,97,105,108,32,111,102,32,96,76,105,115,116,96,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,108,105,115,116,32,109,105,110,117,115,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,10,10,73,116,32,119,111,114,107,115,32,119,105,116,104,32,105,109,112,114,111,112,101,114,32,108,105,115,116,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,93,41,46,10,91,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,108,40,91,103,101,101,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,105,109,112,114,111,112,101,114,95,101,110,100,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,105,115,116,96,32,105,115,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46>>},#{group => terms,specification => [{attribute,{9476,2},spec,{{tl,1},[{type,{9476,9},bounded_fun,[{type,{9476,9},'fun',[{type,{9476,9},product,[{var,{9476,10},'List'}]},{var,{9476,19},'Tail'}]},[{type,{9477,7},constraint,[{atom,{9477,7},is_subtype},[{var,{9477,7},'List'},{type,{9477,15},nonempty_maybe_improper_list,[]}]]},{type,{9478,7},constraint,[{atom,{9478,7},is_subtype},[{var,{9478,7},'Tail'},{type,{9478,15},term,[]}]]}]]}]}}]}},{{function,term_to_iovec,2},{9415,2},[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,10,96,116,58,101,120,116,95,105,111,118,101,99,47,48,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,10,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,10,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,115,41,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,32,119,105,108,108,10,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,10,91,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,115,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,41,46,10,10,67,117,114,114,101,110,116,108,121,32,114,101,99,111,103,110,105,115,101,100,32,111,112,116,105,111,110,115,32,97,114,101,32,97,108,108,32,111,112,116,105,111,110,115,32,114,101,99,111,103,110,105,115,101,100,32,98,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46,10,10,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41,96,10,112,114,111,118,105,100,101,46,32,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,10,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46>>},#{group => terms,specification => [{attribute,{9435,2},spec,{{term_to_iovec,2},[{type,{9435,20},bounded_fun,[{type,{9435,20},'fun',[{type,{9435,20},product,[{var,{9435,21},'Term'},{var,{9435,27},'Options'}]},{user_type,{9435,39},ext_iovec,[]}]},[{type,{9436,7},constraint,[{atom,{9436,7},is_subtype},[{var,{9436,7},'Term'},{type,{9436,15},term,[]}]]},{type,{9437,7},constraint,[{atom,{9437,7},is_subtype},[{var,{9437,7},'Options'},{type,{9437,18},list,[{type,{9437,19},union,[{atom,{9437,19},compressed},{type,{9438,10},tuple,[{atom,{9438,11},compressed},{ann_type,{9438,23},[{var,{9438,23},'Level'},{type,{9438,32},range,[{integer,{9438,32},0},{integer,{9438,35},9}]}]}]},{atom,{9439,10},deterministic},{type,{9440,10},tuple,[{atom,{9440,11},minor_version},{ann_type,{9440,26},[{var,{9440,26},'Version'},{type,{9440,37},range,[{integer,{9440,37},0},{integer,{9440,40},2}]}]}]},{atom,{9441,10},local}]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_iovec,1},{9392,2},[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,10,96,116,58,101,120,116,95,105,111,118,101,99,47,48,96,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,10,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,10,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,32,119,105,108,108,32,112,114,111,100,117,99,101,10,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,99,97,108,108,10,91,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,10,10,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41,96,10,112,114,111,118,105,100,101,46,32,96,116,101,114,109,95,116,111,95,105,111,118,101,99,40,41,96,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,10,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,46>>},#{group => terms,specification => [{attribute,{9410,2},spec,{{term_to_iovec,1},[{type,{9410,20},bounded_fun,[{type,{9410,20},'fun',[{type,{9410,20},product,[{var,{9410,21},'Term'}]},{user_type,{9410,30},ext_iovec,[]}]},[{type,{9411,7},constraint,[{atom,{9411,7},is_subtype},[{var,{9411,7},'Term'},{type,{9411,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_binary,2},{9254,2},[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,10,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,67,117,114,114,101,110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,99,111,109,112,114,101,115,115,101,100,96,42,42,32,45,32,67,111,109,112,114,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,99,111,109,112,114,101,115,115,101,100,32,102,111,114,109,97,116,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,32,97,115,32,102,114,111,109,10,32,32,69,114,108,97,110,103,47,79,84,80,32,82,55,66,46,10,10,45,32,42,42,96,123,99,111,109,112,114,101,115,115,101,100,44,32,76,101,118,101,108,125,96,42,42,32,45,32,67,111,109,112,114,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,116,111,32,97,32,103,105,118,101,110,10,32,32,108,101,118,101,108,46,32,84,104,101,32,99,111,109,112,114,101,115,115,105,111,110,32,108,101,118,101,108,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,76,101,118,101,108,96,32,119,104,105,99,104,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,105,110,10,32,32,116,104,101,32,114,97,110,103,101,32,48,46,46,57,44,32,119,104,101,114,101,58,10,10,32,32,45,32,42,42,96,48,96,42,42,32,45,32,78,111,32,99,111,109,112,114,101,115,115,105,111,110,32,105,115,32,100,111,110,101,32,40,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,103,105,118,105,110,103,32,110,111,32,96,99,111,109,112,114,101,115,115,101,100,96,10,32,32,32,32,111,112,116,105,111,110,41,46,10,10,32,32,45,32,42,42,96,49,96,42,42,32,45,32,84,97,107,101,115,32,108,101,97,115,116,32,116,105,109,101,32,98,117,116,32,109,97,121,32,110,111,116,32,99,111,109,112,114,101,115,115,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,104,105,103,104,101,114,10,32,32,32,32,108,101,118,101,108,115,46,10,10,32,32,45,32,42,42,96,54,96,42,42,32,45,32,68,101,102,97,117,108,116,32,108,101,118,101,108,32,119,104,101,110,32,111,112,116,105,111,110,32,96,99,111,109,112,114,101,115,115,101,100,96,32,105,115,32,112,114,111,118,105,100,101,100,46,10,10,32,32,45,32,42,42,96,57,96,42,42,32,45,32,84,97,107,101,115,32,109,111,115,116,32,116,105,109,101,32,97,110,100,32,116,114,105,101,115,32,116,111,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,46,32,78,111,116,105,99,101,10,32,32,32,32,34,116,114,105,101,115,34,32,105,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,101,110,116,101,110,99,101,59,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,105,110,112,117,116,32,116,101,114,109,44,32,108,101,118,101,108,32,57,10,32,32,32,32,99,111,109,112,114,101,115,115,105,111,110,32,101,105,116,104,101,114,32,100,111,101,115,32,111,114,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,32,116,104,97,110,32,108,101,118,101,108,32,49,10,32,32,32,32,99,111,109,112,114,101,115,115,105,111,110,46,10,10,45,32,42,42,96,123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125,96,42,42,40,83,105,110,99,101,32,82,49,49,66,45,52,41,32,32,10,32,32,84,104,101,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,111,110,116,114,111,108,32,115,111,109,101,32,101,110,99,111,100,105,110,103,32,100,101,116,97,105,108,115,46,32,86,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,10,32,32,96,86,101,114,115,105,111,110,96,32,97,114,101,58,10,10,32,32,45,32,42,42,96,48,96,42,42,32,45,32,70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,32,32,32,32,65,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,108,97,116,105,110,49,10,32,32,32,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,10,32,32,32,32,117,116,102,56,46,10,10,32,32,45,32,42,42,96,49,96,42,42,32,45,32,70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,97,32,109,111,114,101,32,115,112,97,99,101,45,101,102,102,105,99,105,101,110,116,32,97,110,100,32,101,120,97,99,116,32,119,97,121,32,40,110,97,109,101,108,121,10,32,32,32,32,105,110,32,116,104,101,32,54,52,45,98,105,116,32,73,69,69,69,32,102,111,114,109,97,116,44,32,114,97,116,104,101,114,32,116,104,97,110,32,99,111,110,118,101,114,116,101,100,32,116,111,32,97,32,116,101,120,116,117,97,108,10,32,32,32,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,41,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,44,10,32,32,32,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,32,32,32,32,65,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,108,97,116,105,110,49,10,32,32,32,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,10,32,32,32,32,117,116,102,56,46,10,10,32,32,45,32,42,42,96,50,96,42,42,32,45,32,84,104,105,115,32,105,115,32,97,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,32,50,54,46,48,32,116,104,101,32,95,100,101,102,97,117,108,116,95,46,32,65,116,111,109,115,32,97,114,101,10,32,32,32,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46,32,69,114,108,97,110,103,47,79,84,80,32,115,121,115,116,101,109,115,32,97,115,32,111,102,32,82,49,54,66,32,99,97,110,32,100,101,99,111,100,101,10,32,32,32,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,10,10,45,32,42,42,96,100,101,116,101,114,109,105,110,105,115,116,105,99,96,42,42,40,83,105,110,99,101,32,79,84,80,32,50,52,46,49,41,32,32,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,44,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,109,97,106,111,114,32,114,101,108,101,97,115,101,32,111,102,10,32,32,69,114,108,97,110,103,47,79,84,80,44,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46,10,32,32,84,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,114,101,109,97,105,110,115,32,116,104,101,32,115,97,109,101,10,32,32,98,101,116,119,101,101,110,32,109,97,106,111,114,32,114,101,108,101,97,115,101,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,46,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,108,111,99,97,108,96,91,93,40,41,123,58,32,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,95,108,111,99,97,108,32,125,32,42,42,40,83,105,110,99,101,32,79,84,80,32,50,54,46,48,41,32,32,10,32,32,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,101,110,99,111,100,105,110,103,32,111,102,32,96,84,101,114,109,96,32,116,111,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,108,111,99,97,108,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,10,32,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,119,104,105,99,104,32,119,104,101,110,32,100,101,99,111,100,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,119,105,108,108,10,32,32,112,114,111,100,117,99,101,32,97,32,116,101,114,109,32,105,100,101,110,116,105,99,97,108,32,116,111,32,116,104,101,32,101,110,99,111,100,101,100,32,116,101,114,109,32,101,118,101,110,32,119,104,101,110,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,47,111,114,32,91,99,114,101,97,116,105,111,110,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110,41,10,32,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,104,97,118,101,32,99,104,97,110,103,101,100,32,98,101,116,119,101,101,110,32,101,110,99,111,100,105,110,103,32,97,110,100,32,100,101,99,111,100,105,110,103,46,10,32,32,87,104,101,110,32,101,110,99,111,100,105,110,103,32,119,105,116,104,111,117,116,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,108,111,99,97,108,32,105,100,101,110,116,105,102,105,101,114,115,32,115,117,99,104,32,97,115,32,91,112,105,100,115,93,40,96,116,58,112,105,100,47,48,96,41,44,10,32,32,91,112,111,114,116,115,93,40,96,116,58,112,111,114,116,47,48,96,41,32,97,110,100,32,91,114,101,102,101,114,101,110,99,101,115,93,40,96,116,58,114,101,102,101,114,101,110,99,101,47,48,96,41,32,119,105,108,108,32,110,111,116,32,98,101,32,116,104,101,32,115,97,109,101,32,105,102,32,110,111,100,101,10,32,32,110,97,109,101,32,97,110,100,47,111,114,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,104,97,110,103,101,100,32,98,101,116,119,101,101,110,32,101,110,99,111,100,105,110,103,10,32,32,97,110,100,32,100,101,99,111,100,105,110,103,46,32,84,104,105,115,32,115,105,110,99,101,32,115,117,99,104,32,105,100,101,110,116,105,102,105,101,114,115,32,114,101,102,101,114,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,110,111,100,101,32,98,121,32,110,111,100,101,32,110,97,109,101,10,32,32,97,110,100,32,99,114,101,97,116,105,111,110,46,10,10,32,32,78,111,100,101,32,110,97,109,101,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,104,97,110,103,101,32,119,104,101,110,32,116,104,101,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,32,111,114,32,115,116,111,112,112,101,100,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32,116,104,101,32,91,96,45,110,97,109,101,96,93,40,101,114,108,95,99,109,100,46,109,100,35,110,97,109,101,41,32,111,114,10,32,32,91,96,45,115,110,97,109,101,96,93,40,101,114,108,95,99,109,100,46,109,100,35,115,110,97,109,101,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,97,99,116,117,97,108,10,32,32,115,116,97,114,116,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,104,97,112,112,101,110,115,32,97,102,116,101,114,32,111,116,104,101,114,32,99,111,100,101,32,105,110,32,116,104,101,32,115,116,97,114,116,117,112,32,112,104,97,115,101,32,104,97,115,10,32,32,98,101,103,117,110,32,101,120,101,99,117,116,105,110,103,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,116,97,114,116,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,96,110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,50,96,32,97,110,100,32,115,116,111,112,112,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,49,96,93,40,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48,96,41,32,105,102,32,105,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,97,114,116,101,100,32,118,105,97,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,46,10,10,32,32,84,104,101,32,100,101,99,111,100,105,110,103,32,111,102,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,119,105,116,104,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,117,115,105,110,103,32,102,111,114,32,101,120,97,109,112,108,101,10,32,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,41,96,93,40,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,41,44,32,119,105,108,108,32,116,114,121,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,116,101,114,109,10,32,32,97,99,116,117,97,108,108,121,32,119,97,115,32,101,110,99,111,100,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,44,32,97,110,100,32,119,105,108,108,32,105,110,32,116,104,101,32,118,97,115,116,10,32,32,109,97,106,111,114,105,116,121,32,111,102,32,99,97,115,101,115,32,102,97,105,108,32,105,102,32,116,104,101,32,101,110,99,111,100,105,110,103,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,98,121,32,97,110,111,116,104,101,114,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,105,110,115,116,97,110,99,101,46,32,89,111,117,32,115,104,111,117,108,100,32,104,111,119,101,118,101,114,32,95,110,111,116,95,32,116,114,117,115,116,32,116,104,97,116,32,116,104,105,115,32,118,101,114,105,102,105,99,97,116,105,111,110,32,119,105,108,108,32,119,111,114,107,32,105,110,10,32,32,97,108,108,32,99,97,115,101,115,46,32,89,111,117,32,95,115,104,111,117,108,100,95,32,109,97,107,101,32,115,117,114,101,32,116,111,32,95,111,110,108,121,95,32,100,101,99,111,100,101,32,116,101,114,109,115,32,101,110,99,111,100,101,100,32,119,105,116,104,32,116,104,101,10,32,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,115,32,116,104,101,32,111,110,101,32,116,104,97,116,10,32,32,101,110,99,111,100,101,100,32,116,104,101,32,116,101,114,109,115,46,10,10,32,32,83,105,110,99,101,32,105,116,32,105,115,32,111,110,108,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,104,97,116,32,101,110,99,111,100,101,100,32,97,32,116,101,114,109,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,10,32,32,111,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,100,101,99,111,100,101,32,105,116,44,32,116,104,101,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,105,115,32,116,121,112,105,99,97,108,108,121,32,112,105,101,99,101,100,32,116,111,103,101,116,104,101,114,10,32,32,119,105,116,104,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,111,32,112,114,111,100,117,99,101,32,97,32,114,101,112,108,121,32,116,111,32,119,104,101,114,101,32,116,104,101,32,96,108,111,99,97,108,96,32,101,110,99,111,100,105,110,103,10,32,32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,46,32,73,102,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,32,105,116,115,10,32,32,108,101,97,100,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,44,32,105,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,116,101,114,109,32,40,102,111,114,32,101,120,97,109,112,108,101,10,32,32,97,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32,97,32,116,117,112,108,101,41,32,119,104,101,110,32,101,110,99,111,100,105,110,103,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,117,115,105,110,103,44,32,102,111,114,10,32,32,101,120,97,109,112,108,101,44,32,91,101,105,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,96,41,46,32,73,110,32,116,104,101,32,96,101,105,96,32,99,97,115,101,44,32,121,111,117,32,119,111,117,108,100,32,115,116,114,105,112,32,105,116,10,32,32,111,102,32,116,104,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,117,115,105,110,103,10,32,32,91,96,101,105,95,100,101,99,111,100,101,95,118,101,114,115,105,111,110,40,41,96,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,35,101,105,95,100,101,99,111,100,101,95,118,101,114,115,105,111,110,96,41,32,97,110,100,32,116,104,101,110,10,32,32,97,100,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,116,111,32,119,104,97,116,32,121,111,117,32,97,114,101,32,101,110,99,111,100,105,110,103,32,117,115,105,110,103,32,102,111,114,32,101,120,97,109,112,108,101,10,32,32,91,96,101,105,95,120,95,97,112,112,101,110,100,95,98,117,102,40,41,96,93,40,96,101,58,101,114,108,95,105,110,116,101,114,102,97,99,101,58,101,105,46,109,100,35,101,105,95,120,95,97,112,112,101,110,100,95,98,117,102,96,41,46,10,10,32,32,65,32,103,111,111,100,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,105,115,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,109,97,107,101,32,97,32,114,101,113,117,101,115,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,116,111,32,97,32,112,111,114,116,32,91,100,114,105,118,101,114,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,41,32,97,110,100,32,117,116,105,108,105,122,101,10,32,32,116,104,101,10,32,32,91,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,102,102,95,103,117,105,100,101,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,45,109,101,115,115,97,103,101,115,96,41,10,32,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,116,104,101,32,114,101,112,108,121,46,32,73,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,121,111,117,32,119,97,110,116,32,116,111,32,99,114,101,97,116,101,32,97,32,114,101,102,101,114,101,110,99,101,44,10,32,32,115,101,114,105,97,108,105,122,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,10,32,32,112,97,115,115,32,116,104,105,115,32,116,111,32,116,104,101,32,100,114,105,118,101,114,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,44,32,97,110,100,32,116,104,101,110,32,119,97,105,116,32,102,111,114,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,110,10,32,32,97,32,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,109,97,116,99,104,105,110,103,32,111,110,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,84,104,101,32,100,114,105,118,101,114,32,115,104,111,117,108,100,32,115,101,110,100,32,116,104,101,10,32,32,114,101,112,108,121,32,117,115,105,110,103,32,101,105,116,104,101,114,10,32,32,91,96,101,114,108,95,100,114,118,95,111,117,116,112,117,116,95,116,101,114,109,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,111,117,116,112,117,116,95,116,101,114,109,41,32,111,114,10,32,32,91,96,101,114,108,95,100,114,118,95,115,101,110,100,95,116,101,114,109,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,115,101,110,100,95,116,101,114,109,41,32,117,115,105,110,103,32,116,104,101,32,116,101,114,109,32,116,121,112,101,10,32,32,91,96,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,41,32,102,111,114,32,116,104,101,44,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,44,10,32,32,112,114,101,118,105,111,117,115,108,121,32,114,101,99,101,105,118,101,100,32,114,101,102,101,114,101,110,99,101,32,111,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,78,111,116,101,32,116,104,97,116,32,121,111,117,10,32,32,115,104,111,117,108,100,32,110,111,116,32,115,116,114,105,112,32,116,104,101,32,108,101,97,100,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,101,110,99,111,100,105,110,103,32,119,104,101,110,32,117,115,105,110,103,10,32,32,116,104,101,32,116,101,114,109,32,116,121,112,101,32,96,69,82,76,95,68,82,86,95,69,88,84,50,84,69,82,77,96,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,97,108,105,116,121,46,32,73,102,32,121,111,117,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,10,32,32,100,111,32,110,111,116,32,101,110,99,111,100,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,117,115,105,110,103,32,116,104,101,32,96,108,111,99,97,108,96,32,111,112,116,105,111,110,44,32,97,110,100,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,115,10,32,32,115,116,97,114,116,101,100,32,111,114,32,115,116,111,112,112,101,100,32,119,104,105,108,101,32,116,104,101,32,114,101,113,117,101,115,116,32,105,115,32,111,110,103,111,105,110,103,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,97,100,101,32,116,104,101,10,32,32,114,101,113,117,101,115,116,32,119,105,108,108,32,104,97,110,103,32,105,110,100,101,102,105,110,105,116,101,108,121,32,115,105,110,99,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,10,32,32,110,101,118,101,114,32,109,97,116,99,104,46,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,96,100,101,116,101,114,109,105,110,105,115,116,105,99,96,32,111,112,116,105,111,110,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,91,96,76,79,67,65,76,95,69,88,84,96,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,35,108,111,99,97,108,95,101,120,116,41,32,116,97,103,32,105,110,10,32,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,83,101,101,32,97,108,115,111,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,46>>},#{group => terms,specification => [{attribute,{9382,2},spec,{{term_to_binary,2},[{type,{9382,21},bounded_fun,[{type,{9382,21},'fun',[{type,{9382,21},product,[{var,{9382,22},'Term'},{var,{9382,28},'Options'}]},{user_type,{9382,40},ext_binary,[]}]},[{type,{9383,7},constraint,[{atom,{9383,7},is_subtype},[{var,{9383,7},'Term'},{type,{9383,15},term,[]}]]},{type,{9384,7},constraint,[{atom,{9384,7},is_subtype},[{var,{9384,7},'Options'},{type,{9384,18},list,[{type,{9384,19},union,[{atom,{9384,19},compressed},{type,{9385,10},tuple,[{atom,{9385,11},compressed},{ann_type,{9385,23},[{var,{9385,23},'Level'},{type,{9385,32},range,[{integer,{9385,32},0},{integer,{9385,35},9}]}]}]},{atom,{9386,10},deterministic},{type,{9387,10},tuple,[{atom,{9387,11},minor_version},{ann_type,{9387,26},[{var,{9387,26},'Version'},{type,{9387,37},range,[{integer,{9387,37},0},{integer,{9387,40},2}]}]}]},{atom,{9388,10},local}]}]}]]}]]}]}}]}},{{function,term_to_binary,1},{9226,2},[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32,96,84,101,114,109,96,32,97,99,99,111,114,100,105,110,103,32,116,111,10,116,104,101,32,91,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,41,10,10,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,112,117,114,112,111,115,101,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,119,114,105,116,105,110,103,32,97,32,116,101,114,109,32,116,111,32,97,32,102,105,108,101,32,105,110,10,97,110,32,101,102,102,105,99,105,101,110,116,32,119,97,121,44,32,111,114,32,115,101,110,100,105,110,103,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,111,32,115,111,109,101,32,116,121,112,101,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,115,10,99,104,97,110,110,101,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111,10,96,96,96,10,10,83,101,101,32,97,108,115,111,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46>>},#{group => terms,specification => [{attribute,{9249,2},spec,{{term_to_binary,1},[{type,{9249,21},bounded_fun,[{type,{9249,21},'fun',[{type,{9249,21},product,[{var,{9249,22},'Term'}]},{user_type,{9249,31},ext_binary,[]}]},[{type,{9250,7},constraint,[{atom,{9250,7},is_subtype},[{var,{9250,7},'Term'},{type,{9250,15},term,[]}]]}]]}]}}]}},{{function,system_flag,2},{8701,2},[<<115,121,115,116,101,109,95,102,108,97,103,40,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,97,32,115,121,115,116,101,109,32,102,108,97,103,32,116,111,32,116,104,101,32,103,105,118,101,110,32,118,97,108,117,101,46,10,10,84,104,101,32,112,111,115,115,105,98,108,101,32,102,108,97,103,115,32,116,111,32,115,101,116,32,97,114,101,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,98,97,99,107,116,114,97,99,101,95,100,101,112,116,104,115,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,32,83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,105,110,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,101,108,101,109,101,110,116,32,111,102,10,32,32,96,39,69,88,73,84,39,96,32,116,117,112,108,101,115,46,32,84,104,101,32,102,108,97,103,32,97,108,115,111,32,108,105,109,105,116,115,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,32,105,116,101,109,32,91,96,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,41,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,99,112,117,95,116,111,112,111,108,111,103,121,44,32,99,112,117,95,116,111,112,111,108,111,103,121,40,41,41,32,45,62,32,99,112,117,95,116,111,112,111,108,111,103,121,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,99,112,117,95,116,111,112,111,108,111,103,121,32,125,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,95,84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,10,32,32,62,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,32,32,62,10,32,32,62,32,87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,67,80,85,32,116,111,112,111,108,111,103,121,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,10,32,32,62,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46,10,10,32,32,83,101,116,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,96,67,112,117,84,111,112,111,108,111,103,121,96,46,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,118,101,114,114,105,100,101,115,32,97,110,121,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,46,32,66,121,32,112,97,115,115,105,110,103,32,96,117,110,100,101,102,105,110,101,100,96,32,97,115,32,96,67,112,117,84,111,112,111,108,111,103,121,96,44,10,32,32,116,104,101,32,115,121,115,116,101,109,32,114,101,118,101,114,116,115,32,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,10,32,32,118,97,108,117,101,32,101,113,117,97,108,115,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41,96,32,98,101,102,111,114,101,10,32,32,116,104,101,32,99,104,97,110,103,101,32,119,97,115,32,109,97,100,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,73,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,108,114,101,97,100,121,32,98,111,117,110,100,32,119,104,101,110,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,99,104,97,110,103,101,100,44,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,10,32,32,97,114,101,32,115,101,110,116,32,97,32,114,101,113,117,101,115,116,32,116,111,32,114,101,98,105,110,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,110,101,119,32,67,80,85,32,116,111,112,111,108,111,103,121,46,10,10,32,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,121,112,101,32,96,67,112,117,84,111,112,111,108,111,103,121,96,32,97,110,100,32,109,111,114,101,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,41,32,97,115,10,32,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,97,110,100,10,32,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,112,111,115,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,112,111,115,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,10,32,32,96,49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78,96,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,10,32,32,118,97,108,117,101,115,32,111,102,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,32,97,110,100,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,10,32,32,111,110,108,105,110,101,32,99,104,97,110,103,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,10,32,32,111,110,108,105,110,101,44,32,97,110,100,32,91,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,10,32,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,55,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,101,114,116,115,95,97,108,108,111,99,44,32,123,65,108,108,111,99,32,58,58,32,97,116,111,109,40,41,44,32,70,32,58,58,32,97,116,111,109,40,41,44,32,86,32,58,58,32,105,110,116,101,103,101,114,40,41,125,41,32,45,62,10,32,32,32,32,111,107,32,124,32,110,111,116,115,117,112,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,115,32,102,111,114,32,91,96,101,114,116,115,95,97,108,108,111,99,40,51,41,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,41,46,32,96,65,108,108,111,99,96,32,105,115,32,116,104,101,32,97,108,108,111,99,97,116,111,114,10,32,32,116,111,32,97,102,102,101,99,116,44,32,102,111,114,32,101,120,97,109,112,108,101,32,96,98,105,110,97,114,121,95,97,108,108,111,99,96,46,32,96,70,96,32,105,115,32,116,104,101,32,102,108,97,103,32,116,111,32,99,104,97,110,103,101,32,97,110,100,32,96,86,96,32,105,115,32,116,104,101,10,32,32,110,101,119,32,118,97,108,117,101,46,10,10,32,32,79,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,97,108,108,32,96,101,114,116,115,95,97,108,108,111,99,96,32,102,108,97,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,32,116,105,109,101,46,32,84,104,105,115,32,115,117,98,115,101,116,10,32,32,105,115,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,116,104,101,32,102,108,97,103,32,91,96,115,98,99,116,96,93,40,101,114,116,115,95,97,108,108,111,99,46,109,100,35,77,95,115,98,99,116,41,46,10,10,32,32,82,101,116,117,114,110,115,32,96,111,107,96,32,105,102,32,116,104,101,32,102,108,97,103,32,119,97,115,32,115,101,116,32,111,114,32,96,110,111,116,115,117,112,96,32,105,102,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,96,101,114,116,115,95,97,108,108,111,99,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,50,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,32,96,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,96,46,32,96,78,117,109,98,101,114,96,32,105,115,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,10,32,32,105,110,100,105,99,97,116,105,110,103,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,100,111,110,101,32,119,105,116,104,111,117,116,10,32,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,32,99,111,108,108,101,99,116,105,111,110,46,32,84,104,101,32,118,97,108,117,101,32,97,112,112,108,105,101,115,32,116,111,32,110,101,119,32,112,114,111,99,101,115,115,101,115,44,32,119,104,105,108,101,10,32,32,112,114,111,99,101,115,115,101,115,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,73,110,32,108,111,119,45,109,101,109,111,114,121,32,115,121,115,116,101,109,115,32,40,101,115,112,101,99,105,97,108,108,121,32,119,105,116,104,111,117,116,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,41,44,32,115,101,116,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,116,111,10,32,32,96,48,96,32,99,97,110,32,104,101,108,112,32,116,111,32,99,111,110,115,101,114,118,101,32,109,101,109,111,114,121,46,10,10,32,32,84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,116,104,114,111,117,103,104,32,40,79,83,41,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,10,32,32,96,69,82,76,95,70,85,76,76,83,87,69,69,80,95,65,70,84,69,82,96,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,44,32,116,114,117,101,32,124,32,102,97,108,115,101,32,124,32,114,101,115,101,116,41,32,45,62,32,98,111,111,108,101,97,110,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,32,125,10,10,32,32,84,117,114,110,115,32,111,110,47,111,102,102,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,109,101,97,115,117,114,101,109,101,110,116,115,46,32,87,104,101,110,32,112,97,115,115,105,110,103,32,114,101,115,101,116,44,32,97,108,108,10,32,32,99,111,117,110,116,101,114,115,32,97,114,101,32,114,101,115,101,116,32,116,111,32,48,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,10,32,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,10,32,32,111,102,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,10,32,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32,96,115,112,97,119,110,95,111,112,116,47,52,96,32,111,114,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,10,32,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,105,110,95,98,105,110,95,118,104,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,10,32,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,96,32,99,97,110,10,32,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,111,114,10,32,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,51,66,48,52,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,41,32,45,62,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,10,32,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,10,32,32,99,104,97,110,103,101,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,96,109,97,120,95,104,101,97,112,95,115,105,122,101,96,32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,10,32,32,91,96,115,112,97,119,110,95,111,112,116,47,50,44,51,44,52,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,111,114,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,70,111,114,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,101,32,104,101,97,112,32,103,114,111,119,115,44,32,115,101,101,10,32,32,91,83,105,122,105,110,103,32,116,104,101,32,104,101,97,112,93,40,71,97,114,98,97,103,101,67,111,108,108,101,99,116,105,111,110,46,109,100,35,115,105,122,105,110,103,45,116,104,101,45,104,101,97,112,41,32,105,110,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,32,45,62,32,79,108,100,66,108,111,99,107,83,116,97,116,101,32,119,104,101,110,10,32,32,32,32,66,108,111,99,107,83,116,97,116,101,32,58,58,32,98,108,111,99,107,32,124,32,117,110,98,108,111,99,107,32,124,32,98,108,111,99,107,95,110,111,114,109,97,108,32,124,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108,44,10,32,32,32,32,79,108,100,66,108,111,99,107,83,116,97,116,101,32,58,58,32,98,108,111,99,107,101,100,32,124,32,100,105,115,97,98,108,101,100,32,124,32,101,110,97,98,108,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,32,125,10,10,32,32,73,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,10,32,32,101,109,117,108,97,116,111,114,46,32,77,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,99,97,110,32,98,101,32,98,108,111,99,107,101,100,32,105,110,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,69,105,116,104,101,114,32,97,108,108,10,32,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,44,32,111,114,32,97,108,108,32,95,110,111,114,109,97,108,95,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,46,10,32,32,87,104,101,110,32,111,110,108,121,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,108,111,99,107,101,100,44,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,102,114,101,101,32,116,111,32,99,111,110,116,105,110,117,101,10,32,32,116,111,32,115,99,104,101,100,117,108,101,32,112,114,111,99,101,115,115,101,115,46,10,10,32,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,96,44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,101,32,97,110,100,32,111,110,108,121,10,32,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,46,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,96,32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,10,32,32,98,108,111,99,107,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46,10,10,32,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,95,110,111,114,109,97,108,96,44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,10,32,32,111,110,108,121,32,111,110,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,98,117,116,32,109,117,108,116,105,112,108,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,10,32,32,101,120,101,99,117,116,101,46,32,73,102,32,96,66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108,96,32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46,10,10,32,32,79,110,101,32,112,114,111,99,101,115,115,32,99,97,110,32,98,108,111,99,107,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,109,117,108,116,105,112,108,101,10,32,32,116,105,109,101,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,44,32,105,116,32,109,117,115,116,32,117,110,98,108,111,99,107,32,101,120,97,99,116,108,121,32,97,115,32,109,97,110,121,10,32,32,116,105,109,101,115,32,97,115,32,105,116,32,104,97,115,32,98,108,111,99,107,101,100,32,98,101,102,111,114,101,32,105,116,32,104,97,115,32,114,101,108,101,97,115,101,100,32,105,116,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,98,108,111,99,107,46,32,73,102,32,97,10,32,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,111,114,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,101,120,105,116,115,44,32,105,116,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,108,101,97,115,101,115,32,105,116,115,32,98,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,10,32,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32,96,100,105,115,97,98,108,101,100,96,44,32,96,98,108,111,99,107,101,100,96,44,32,96,98,108,111,99,107,101,100,95,110,111,114,109,97,108,96,44,32,111,114,32,96,101,110,97,98,108,101,100,96,46,32,84,104,101,10,32,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,115,116,97,116,101,32,106,117,115,116,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,111,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41,96,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,70,111,114,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,110,111,114,109,97,108,108,121,32,110,111,116,10,32,32,62,32,110,101,101,100,101,100,46,32,73,102,32,121,111,117,32,102,101,101,108,32,116,104,97,116,32,121,111,117,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,101,115,101,32,102,101,97,116,117,114,101,115,44,32,99,111,110,115,105,100,101,114,32,105,116,32,97,32,102,101,119,10,32,32,62,32,109,111,114,101,32,116,105,109,101,115,32,97,103,97,105,110,46,32,66,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,97,115,32,97,32,108,97,115,116,10,32,32,62,32,114,101,115,111,114,116,44,32,97,115,32,105,116,32,105,115,32,109,111,115,116,32,108,105,107,101,108,121,32,97,32,95,118,101,114,121,32,105,110,101,102,102,105,99,105,101,110,116,95,32,119,97,121,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,114,111,98,108,101,109,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41,44,10,32,32,97,110,100,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,44,32,49,46,46,49,51,52,50,49,55,55,50,55,41,32,45,62,32,49,46,46,49,51,52,50,49,55,55,50,55,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,32,125,10,10,32,32,83,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,109,97,100,101,32,98,121,32,97,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,10,32,32,111,114,99,104,101,115,116,114,97,116,105,110,103,32,115,121,115,116,101,109,32,119,105,100,101,32,99,104,97,110,103,101,115,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,114,101,32,97,114,101,32,116,119,111,32,115,117,99,104,32,112,114,111,99,101,115,115,101,115,58,10,10,32,32,45,32,42,42,84,104,101,32,67,111,100,101,32,80,117,114,103,101,114,42,42,32,45,32,84,104,101,32,99,111,100,101,32,112,117,114,103,101,114,32,111,114,99,104,101,115,116,114,97,116,101,115,32,99,104,101,99,107,105,110,103,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,10,32,32,32,32,111,108,100,32,99,111,100,101,32,98,101,102,111,114,101,32,111,108,100,32,99,111,100,101,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,45,32,42,42,84,104,101,32,76,105,116,101,114,97,108,32,65,114,101,97,32,67,111,108,108,101,99,116,111,114,42,42,32,45,32,84,104,101,32,108,105,116,101,114,97,108,32,97,114,101,97,32,99,111,108,108,101,99,116,111,114,32,111,114,99,104,101,115,116,114,97,116,101,115,10,32,32,32,32,99,111,112,121,105,110,103,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,102,114,111,109,32,111,108,100,32,108,105,116,101,114,97,108,32,97,114,101,97,115,32,98,101,102,111,114,101,32,114,101,109,111,118,97,108,32,111,102,32,115,117,99,104,32,97,114,101,97,115,32,102,114,111,109,10,32,32,32,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,69,97,99,104,32,111,102,32,116,104,101,115,101,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,111,117,116,115,116,97,110,100,105,110,103,32,114,101,113,117,101,115,116,115,32,97,115,32,116,104,105,115,10,32,32,108,105,109,105,116,32,105,115,32,115,101,116,32,116,111,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,105,115,32,108,105,109,105,116,32,105,115,32,115,101,116,32,116,111,32,116,119,105,99,101,32,116,104,101,32,97,109,111,117,110,116,32,111,102,10,32,32,91,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,101,110,115,117,114,101,10,32,32,116,104,97,116,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,101,110,111,117,103,104,32,119,111,114,107,32,115,99,104,101,100,117,108,101,100,32,116,111,32,112,101,114,102,111,114,109,32,116,104,101,115,101,32,111,112,101,114,97,116,105,111,110,115,32,97,115,10,32,32,113,117,105,99,107,108,121,32,97,115,32,112,111,115,115,105,98,108,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,111,116,104,101,114,32,119,111,114,107,32,119,105,108,108,32,98,101,32,105,110,116,101,114,108,101,97,118,101,100,32,119,105,116,104,32,116,104,105,115,10,32,32,119,111,114,107,46,32,67,117,114,114,101,110,116,108,121,32,117,115,101,100,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,104,101,99,107,101,100,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,111,117,116,115,116,97,110,100,105,110,103,95,115,121,115,116,101,109,95,114,101,113,117,101,115,116,115,95,108,105,109,105,116,41,46,10,10,32,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,122,111,115,114,108,32,60,76,105,109,105,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,122,111,115,114,108,41,32,116,111,32,96,101,114,108,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,52,46,50,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,32,124,32,100,101,102,97,117,108,116,95,98,105,110,100,41,32,45,62,10,32,32,32,32,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,32,125,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,95,84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,10,32,32,62,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,32,87,104,101,110,10,32,32,62,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,10,32,32,62,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46,10,10,32,32,67,111,110,116,114,111,108,115,32,105,102,32,97,110,100,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,87,104,101,110,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,72,111,119,41,96,32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,10,32,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,44,32,99,97,117,115,105,110,103,32,116,104,101,109,32,116,111,32,116,114,121,32,116,111,32,98,105,110,100,32,111,114,32,117,110,98,105,110,100,10,32,32,97,115,32,114,101,113,117,101,115,116,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,102,97,105,108,115,32,116,111,32,98,105,110,100,44,32,116,104,105,115,32,105,115,32,111,102,116,101,110,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,44,32,97,115,32,105,116,32,105,115,32,110,111,116,10,32,32,62,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,32,116,111,32,118,101,114,105,102,121,32,118,97,108,105,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,46,32,73,102,32,97,110,32,101,114,114,111,114,32,105,115,10,32,32,62,32,114,101,112,111,114,116,101,100,44,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,105,115,32,108,111,103,103,101,100,46,32,84,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,111,117,110,100,10,32,32,62,32,97,115,32,114,101,113,117,101,115,116,101,100,44,32,99,97,108,108,10,32,32,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,46,10,10,32,32,83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,111,110,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,44,10,32,32,98,117,116,32,109,111,114,101,32,115,121,115,116,101,109,115,32,119,105,108,108,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46,10,10,32,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,98,101,32,97,98,108,101,32,116,111,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,10,32,32,109,117,115,116,32,98,101,32,107,110,111,119,110,46,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,102,97,105,108,115,32,116,111,32,100,101,116,101,99,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,105,116,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,67,80,85,10,32,32,116,111,112,111,108,111,103,121,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,10,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,32,98,121,32,100,101,102,97,117,108,116,32,95,110,111,116,95,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,102,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,116,104,101,32,111,110,108,121,32,79,83,32,112,114,111,99,101,115,115,32,98,105,110,100,105,110,103,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,10,32,32,62,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,105,109,112,114,111,118,101,115,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,111,119,101,118,101,114,44,32,105,102,10,32,32,62,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,101,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,110,111,116,104,101,114,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,108,115,111,32,98,105,110,100,10,32,32,62,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,105,110,115,116,101,97,100,46,10,32,32,62,32,83,111,109,101,116,105,109,101,115,32,116,104,105,115,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,99,97,110,32,98,101,32,115,101,118,101,114,101,46,32,73,102,32,115,111,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,10,32,32,62,32,110,111,116,32,98,105,110,100,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,105,110,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,65,114,103,117,109,101,110,116,32,96,72,111,119,96,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,97,110,100,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,42,42,96,117,110,98,111,117,110,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,117,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,10,32,32,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,110,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,10,32,32,32,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,116,104,114,101,97,100,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,116,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,98,116,32,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,10,32,32,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,110,111,100,101,95,116,104,114,101,97,100,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,110,110,116,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,110,110,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,116,104,114,101,97,100,95,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,116,110,110,112,115,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,45,32,42,42,96,100,101,102,97,117,108,116,95,98,105,110,100,96,42,42,32,45,32,83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,32,32,91,96,43,115,98,116,32,100,98,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32,96,72,111,119,96,32,98,101,102,111,114,101,32,102,108,97,103,32,96,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,96,32,119,97,115,32,99,104,97,110,103,101,100,46,10,10,32,32,70,97,105,108,117,114,101,115,58,10,10,32,32,45,32,42,42,96,110,111,116,115,117,112,96,42,42,32,45,32,73,102,32,98,105,110,100,105,110,103,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,10,10,32,32,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,72,111,119,96,32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,46,10,10,32,32,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,46,10,10,32,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,10,32,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41,44,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,44,10,32,32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32,91,96,43,115,98,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,116,41,32,97,110,100,10,32,32,91,96,43,115,99,116,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,99,116,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,98,111,111,108,101,97,110,40,41,41,32,45,62,32,98,111,111,108,101,97,110,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,32,125,10,10,32,32,84,114,121,32,101,110,97,98,108,101,32,111,114,32,100,105,115,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,98,121,32,112,97,115,115,105,110,103,32,96,66,111,111,108,101,97,110,96,32,97,115,10,32,32,101,105,116,104,101,114,32,96,116,114,117,101,96,32,111,114,32,96,102,97,108,115,101,96,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,111,32,117,115,101,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,44,32,115,101,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,10,32,32,83,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,104,97,115,32,97,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,46,32,73,116,32,105,115,32,101,105,116,104,101,114,32,101,110,97,98,108,101,100,10,32,32,102,111,114,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,111,110,32,116,104,101,32,110,111,100,101,32,111,114,32,100,105,115,97,98,108,101,100,32,102,111,114,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46,32,69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,10,32,32,108,111,103,105,99,97,108,32,99,111,117,110,116,101,114,32,105,110,105,116,105,97,108,105,122,101,100,32,97,115,32,122,101,114,111,46,32,65,32,99,97,108,108,32,119,105,116,104,32,96,66,111,111,108,101,97,110,96,32,97,115,32,96,116,114,117,101,96,32,119,105,108,108,10,32,32,105,110,99,114,101,97,115,101,32,116,104,97,116,32,99,111,117,110,116,101,114,32,111,110,101,32,115,116,101,112,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,65,32,99,97,108,108,32,119,105,116,104,32,96,102,97,108,115,101,96,32,119,105,108,108,10,32,32,100,101,99,114,101,97,115,101,32,105,116,32,111,110,101,32,115,116,101,112,32,117,110,108,101,115,115,32,105,116,32,97,108,114,101,97,100,121,32,105,115,32,122,101,114,111,46,32,84,104,101,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,32,102,111,114,10,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,119,105,108,108,32,98,101,32,101,110,97,98,108,101,100,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,114,101,32,105,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,112,114,111,99,101,115,115,10,32,32,97,108,105,118,101,32,119,105,116,104,32,97,32,99,111,117,110,116,101,114,32,118,97,108,117,101,32,108,97,114,103,101,114,32,116,104,97,110,32,122,101,114,111,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,44,32,105,116,115,10,32,32,99,111,117,110,116,101,114,32,119,105,108,108,32,97,108,115,111,32,100,105,115,97,112,112,101,97,114,46,32,84,111,32,101,110,115,117,114,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,107,101,112,116,32,101,110,97,98,108,101,100,44,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,101,110,97,98,108,101,100,32,105,116,32,109,117,115,116,32,116,104,101,114,101,102,111,114,101,32,98,101,32,107,101,112,116,32,97,108,105,118,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,103,108,111,98,97,108,32,115,116,97,116,101,44,32,96,116,114,117,101,96,32,105,102,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,10,32,32,109,101,97,115,117,114,101,109,101,110,116,115,32,119,101,114,101,32,101,110,97,98,108,101,100,44,32,96,102,97,108,115,101,96,32,105,102,32,105,116,32,119,101,114,101,32,100,105,115,97,98,108,101,100,46,10,10,32,32,83,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,32,100,111,32,99,111,110,115,117,109,101,32,115,111,109,101,32,99,112,117,32,111,118,101,114,104,101,97,100,32,97,110,100,32,115,104,111,117,108,100,32,110,111,116,32,98,101,10,32,32,108,101,102,116,32,116,117,114,110,101,100,32,111,110,32,117,110,108,101,115,115,32,117,115,101,100,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,112,111,115,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,112,111,115,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,32,125,10,10,32,32,83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,10,32,32,96,49,32,60,61,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,73,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,32,115,117,112,112,111,114,116,32,102,111,114,10,32,32,91,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,44,32,99,104,97,110,103,105,110,103,10,32,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,97,108,115,111,32,99,104,97,110,103,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,10,32,32,111,110,108,105,110,101,44,32,97,110,100,32,91,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,93,40,96,115,121,115,116,101,109,95,102,108,97,103,47,50,96,41,32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,10,32,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,97,110,100,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,32,108,111,103,103,101,114,32,124,32,117,110,100,101,102,105,110,101,100,32,124,32,112,105,100,40,41,41,32,45,62,32,108,111,103,103,101,114,32,124,32,117,110,100,101,102,105,110,101,100,32,124,32,112,105,100,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,119,105,108,108,32,114,101,99,101,105,118,101,32,116,104,101,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,46,32,73,102,10,32,32,115,101,116,32,116,111,32,96,117,110,100,101,102,105,110,101,100,96,44,32,97,108,108,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,84,104,101,10,32,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,105,110,32,116,104,101,32,102,111,114,109,97,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,108,111,103,44,76,101,118,101,108,44,70,111,114,109,97,116,44,65,114,103,76,105,115,116,44,77,101,116,97,100,97,116,97,125,32,119,104,101,114,101,10,10,32,32,76,101,118,101,108,32,61,32,97,116,111,109,40,41,44,10,32,32,70,111,114,109,97,116,32,61,32,115,116,114,105,110,103,40,41,44,10,32,32,65,114,103,76,105,115,116,32,61,32,108,105,115,116,40,116,101,114,109,40,41,41,44,10,32,32,77,101,116,97,100,97,116,97,32,61,32,35,123,32,112,105,100,32,61,62,32,112,105,100,40,41,44,10,32,32,32,32,32,103,114,111,117,112,95,108,101,97,100,101,114,32,61,62,32,112,105,100,40,41,44,10,32,32,32,32,32,116,105,109,101,32,58,61,32,108,111,103,103,101,114,58,116,105,109,101,115,116,97,109,112,40,41,44,10,32,32,32,32,32,101,114,114,111,114,95,108,111,103,103,101,114,32,58,61,32,35,123,32,101,109,117,108,97,116,111,114,32,58,61,32,116,114,117,101,44,32,116,97,103,32,58,61,32,97,116,111,109,40,41,32,125,10,32,32,96,96,96,10,10,32,32,73,102,32,116,104,101,32,96,115,121,115,116,101,109,95,108,111,103,103,101,114,96,32,112,114,111,99,101,115,115,32,100,105,101,115,44,32,116,104,105,115,32,102,108,97,103,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,96,108,111,103,103,101,114,96,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,97,109,101,100,32,96,108,111,103,103,101,114,96,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,116,104,101,32,75,69,82,78,69,76,32,96,109,58,108,111,103,103,101,114,96,46,32,66,101,32,99,97,114,101,102,117,108,32,105,102,10,32,32,62,32,121,111,117,32,99,104,97,110,103,101,32,105,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,97,115,32,108,111,103,32,109,101,115,115,97,103,101,115,32,109,97,121,32,98,101,32,108,111,115,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,62,32,105,110,116,101,114,99,101,112,116,32,101,109,117,108,97,116,111,114,32,108,111,103,32,109,101,115,115,97,103,101,115,44,32,100,111,32,105,116,32,98,121,32,97,100,100,105,110,103,32,97,32,115,112,101,99,105,97,108,105,122,101,100,32,104,97,110,100,108,101,114,32,116,111,32,116,104,101,10,32,32,62,32,75,69,82,78,69,76,32,108,111,103,103,101,114,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,49,46,50,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,10,32,32,83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,32,116,111,32,96,84,67,87,96,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,97,110,10,32,32,117,110,115,105,103,110,101,100,32,105,110,116,101,103,101,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,115,101,116,95,116,99,119,96,93,40,109,97,116,99,104,95,115,112,101,99,46,109,100,35,115,101,116,95,116,99,119,41,32,105,110,32,115,101,99,116,105,111,110,32,34,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,34,10,32,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41,32,45,62,32,112,114,101,108,105,109,105,110,97,114,121,32,124,32,102,105,110,97,108,32,124,32,118,111,108,97,116,105,108,101,10,32,32,96,96,96,10,32,32,123,58,32,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116,32,125,10,10,32,32,70,105,110,97,108,105,122,101,115,32,116,104,101,32,91,116,105,109,101,32,111,102,102,115,101,116,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,32,119,104,101,110,10,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,32,73,102,10,32,32,97,110,111,116,104,101,114,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,32,105,115,32,117,115,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,115,116,97,116,101,32,105,115,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,46,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,115,116,97,116,101,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,73,102,32,96,112,114,101,108,105,109,105,110,97,114,121,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,105,110,97,108,105,122,97,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,97,110,100,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,10,32,32,32,32,105,115,32,110,111,119,32,102,105,110,97,108,46,10,32,32,45,32,73,102,32,96,102,105,110,97,108,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,116,104,101,32,102,105,110,97,108,32,115,116,97,116,101,46,32,84,104,105,115,10,32,32,32,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,97,110,111,116,104,101,114,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41,96,32,99,97,108,108,32,111,114,10,32,32,32,32,98,101,99,97,117,115,101,32,91,110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,110,111,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,45,32,73,102,32,96,118,111,108,97,116,105,108,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,110,111,116,32,98,101,32,102,105,110,97,108,105,122,101,100,32,98,101,99,97,117,115,101,10,32,32,32,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,48>>},#{group => system,specification => [{attribute,{9161,2},spec,{{system_flag,2},[{type,{9161,18},bounded_fun,[{type,{9161,18},'fun',[{type,{9161,18},product,[{atom,{9161,19},backtrace_depth},{var,{9161,36},'Depth'}]},{var,{9161,46},'OldDepth'}]},[{type,{9162,7},constraint,[{atom,{9162,7},is_subtype},[{var,{9162,7},'Depth'},{type,{9162,16},non_neg_integer,[]}]]},{type,{9163,7},constraint,[{atom,{9163,7},is_subtype},[{var,{9163,7},'OldDepth'},{type,{9163,19},non_neg_integer,[]}]]}]]},{type,{9164,25},bounded_fun,[{type,{9164,25},'fun',[{type,{9164,25},product,[{atom,{9164,26},cpu_topology},{var,{9164,40},'CpuTopology'}]},{var,{9164,56},'OldCpuTopology'}]},[{type,{9165,7},constraint,[{atom,{9165,7},is_subtype},[{var,{9165,7},'CpuTopology'},{user_type,{9165,22},cpu_topology,[]}]]},{type,{9166,7},constraint,[{atom,{9166,7},is_subtype},[{var,{9166,7},'OldCpuTopology'},{user_type,{9166,25},cpu_topology,[]}]]}]]},{type,{9167,25},bounded_fun,[{type,{9167,25},'fun',[{type,{9167,25},product,[{atom,{9167,26},dirty_cpu_schedulers_online},{var,{9167,55},'DirtyCPUSchedulersOnline'}]},{var,{9168,33},'OldDirtyCPUSchedulersOnline'}]},[{type,{9169,7},constraint,[{atom,{9169,7},is_subtype},[{var,{9169,7},'DirtyCPUSchedulersOnline'},{type,{9169,35},pos_integer,[]}]]},{type,{9170,7},constraint,[{atom,{9170,7},is_subtype},[{var,{9170,7},'OldDirtyCPUSchedulersOnline'},{type,{9170,38},pos_integer,[]}]]}]]},{type,{9171,25},bounded_fun,[{type,{9171,25},'fun',[{type,{9171,25},product,[{atom,{9171,26},erts_alloc},{type,{9171,38},tuple,[{var,{9171,39},'Alloc'},{var,{9171,46},'F'},{var,{9171,49},'V'}]}]},{type,{9171,56},union,[{atom,{9171,56},ok},{atom,{9171,61},notsup}]}]},[{type,{9172,7},constraint,[{atom,{9172,7},is_subtype},[{var,{9172,7},'Alloc'},{type,{9172,16},atom,[]}]]},{type,{9173,7},constraint,[{atom,{9173,7},is_subtype},[{var,{9173,7},'F'},{type,{9173,12},atom,[]}]]},{type,{9174,7},constraint,[{atom,{9174,7},is_subtype},[{var,{9174,7},'V'},{type,{9174,12},integer,[]}]]}]]},{type,{9175,25},bounded_fun,[{type,{9175,25},'fun',[{type,{9175,25},product,[{atom,{9175,26},fullsweep_after},{var,{9175,43},'Number'}]},{var,{9175,54},'OldNumber'}]},[{type,{9176,7},constraint,[{atom,{9176,7},is_subtype},[{var,{9176,7},'Number'},{type,{9176,17},non_neg_integer,[]}]]},{type,{9177,7},constraint,[{atom,{9177,7},is_subtype},[{var,{9177,7},'OldNumber'},{type,{9177,20},non_neg_integer,[]}]]}]]},{type,{9178,25},bounded_fun,[{type,{9178,25},'fun',[{type,{9178,25},product,[{atom,{9178,26},microstate_accounting},{var,{9178,49},'Action'}]},{var,{9178,60},'OldState'}]},[{type,{9179,7},constraint,[{atom,{9179,7},is_subtype},[{var,{9179,7},'Action'},{type,{9179,17},union,[{atom,{9179,17},true},{atom,{9179,24},false},{atom,{9179,32},reset}]}]]},{type,{9180,7},constraint,[{atom,{9180,7},is_subtype},[{var,{9180,7},'OldState'},{type,{9180,19},union,[{atom,{9180,19},true},{atom,{9180,26},false}]}]]}]]},{type,{9181,25},bounded_fun,[{type,{9181,25},'fun',[{type,{9181,25},product,[{atom,{9181,26},min_heap_size},{var,{9181,41},'MinHeapSize'}]},{var,{9181,57},'OldMinHeapSize'}]},[{type,{9182,7},constraint,[{atom,{9182,7},is_subtype},[{var,{9182,7},'MinHeapSize'},{type,{9182,22},non_neg_integer,[]}]]},{type,{9183,7},constraint,[{atom,{9183,7},is_subtype},[{var,{9183,7},'OldMinHeapSize'},{type,{9183,25},non_neg_integer,[]}]]}]]},{type,{9184,25},bounded_fun,[{type,{9184,25},'fun',[{type,{9184,25},product,[{atom,{9184,26},min_bin_vheap_size},{var,{9184,46},'MinBinVHeapSize'}]},{var,{9185,33},'OldMinBinVHeapSize'}]},[{type,{9186,7},constraint,[{atom,{9186,7},is_subtype},[{var,{9186,7},'MinBinVHeapSize'},{type,{9186,26},non_neg_integer,[]}]]},{type,{9187,7},constraint,[{atom,{9187,7},is_subtype},[{var,{9187,7},'OldMinBinVHeapSize'},{type,{9187,29},non_neg_integer,[]}]]}]]},{type,{9188,25},bounded_fun,[{type,{9188,25},'fun',[{type,{9188,25},product,[{atom,{9188,26},max_heap_size},{var,{9188,41},'MaxHeapSize'}]},{var,{9188,57},'OldMaxHeapSize'}]},[{type,{9189,7},constraint,[{atom,{9189,7},is_subtype},[{var,{9189,7},'MaxHeapSize'},{user_type,{9189,22},max_heap_size,[]}]]},{type,{9190,7},constraint,[{atom,{9190,7},is_subtype},[{var,{9190,7},'OldMaxHeapSize'},{user_type,{9190,25},max_heap_size,[]}]]}]]},{type,{9191,25},bounded_fun,[{type,{9191,25},'fun',[{type,{9191,25},product,[{atom,{9191,26},multi_scheduling},{var,{9191,44},'BlockState'}]},{var,{9191,59},'OldBlockState'}]},[{type,{9192,7},constraint,[{atom,{9192,7},is_subtype},[{var,{9192,7},'BlockState'},{type,{9192,21},union,[{atom,{9192,21},block},{atom,{9192,29},unblock},{atom,{9192,39},block_normal},{atom,{9192,54},unblock_normal}]}]]},{type,{9193,7},constraint,[{atom,{9193,7},is_subtype},[{var,{9193,7},'OldBlockState'},{type,{9193,24},union,[{atom,{9193,24},blocked},{atom,{9193,34},disabled},{atom,{9193,45},enabled}]}]]}]]},{type,{9194,25},bounded_fun,[{type,{9194,25},'fun',[{type,{9194,25},product,[{atom,{9194,26},outstanding_system_requests_limit},{var,{9194,61},'NewLimit'}]},{var,{9195,11},'OldLimit'}]},[{type,{9196,7},constraint,[{atom,{9196,7},is_subtype},[{var,{9196,7},'NewLimit'},{type,{9196,19},range,[{integer,{9196,19},1},{integer,{9196,22},134217727}]}]]},{type,{9197,7},constraint,[{atom,{9197,7},is_subtype},[{var,{9197,7},'OldLimit'},{type,{9197,19},range,[{integer,{9197,19},1},{integer,{9197,22},134217727}]}]]}]]},{type,{9198,25},bounded_fun,[{type,{9198,25},'fun',[{type,{9198,25},product,[{atom,{9198,26},scheduler_bind_type},{var,{9198,47},'How'}]},{var,{9198,55},'OldBindType'}]},[{type,{9199,7},constraint,[{atom,{9199,7},is_subtype},[{var,{9199,7},'How'},{type,{9199,14},union,[{user_type,{9199,14},scheduler_bind_type,[]},{atom,{9199,38},default_bind}]}]]},{type,{9200,7},constraint,[{atom,{9200,7},is_subtype},[{var,{9200,7},'OldBindType'},{user_type,{9200,22},scheduler_bind_type,[]}]]}]]},{type,{9201,25},bounded_fun,[{type,{9201,25},'fun',[{type,{9201,25},product,[{atom,{9201,26},scheduler_wall_time},{var,{9201,47},'Boolean'}]},{var,{9201,60},'OldBoolean'}]},[{type,{9202,7},constraint,[{atom,{9202,7},is_subtype},[{var,{9202,7},'Boolean'},{type,{9202,18},boolean,[]}]]},{type,{9203,7},constraint,[{atom,{9203,7},is_subtype},[{var,{9203,7},'OldBoolean'},{type,{9203,21},boolean,[]}]]}]]},{type,{9204,25},bounded_fun,[{type,{9204,25},'fun',[{type,{9204,25},product,[{atom,{9204,26},schedulers_online},{var,{9204,45},'SchedulersOnline'}]},{var,{9205,33},'OldSchedulersOnline'}]},[{type,{9206,7},constraint,[{atom,{9206,7},is_subtype},[{var,{9206,7},'SchedulersOnline'},{type,{9206,27},pos_integer,[]}]]},{type,{9207,7},constraint,[{atom,{9207,7},is_subtype},[{var,{9207,7},'OldSchedulersOnline'},{type,{9207,30},pos_integer,[]}]]}]]},{type,{9208,25},bounded_fun,[{type,{9208,25},'fun',[{type,{9208,25},product,[{atom,{9208,26},system_logger},{var,{9208,41},'Logger'}]},{var,{9208,52},'PrevLogger'}]},[{type,{9209,7},constraint,[{atom,{9209,7},is_subtype},[{var,{9209,7},'Logger'},{type,{9209,17},union,[{atom,{9209,17},logger},{atom,{9209,26},undefined},{type,{9209,38},pid,[]}]}]]},{type,{9210,7},constraint,[{atom,{9210,7},is_subtype},[{var,{9210,7},'PrevLogger'},{type,{9210,21},union,[{atom,{9210,21},logger},{atom,{9210,30},undefined},{type,{9210,42},pid,[]}]}]]}]]},{type,{9211,25},bounded_fun,[{type,{9211,25},'fun',[{type,{9211,25},product,[{atom,{9211,26},trace_control_word},{var,{9211,46},'TCW'}]},{var,{9211,54},'OldTCW'}]},[{type,{9212,7},constraint,[{atom,{9212,7},is_subtype},[{var,{9212,7},'TCW'},{type,{9212,14},non_neg_integer,[]}]]},{type,{9213,7},constraint,[{atom,{9213,7},is_subtype},[{var,{9213,7},'OldTCW'},{type,{9213,17},non_neg_integer,[]}]]}]]},{type,{9214,4},bounded_fun,[{type,{9214,4},'fun',[{type,{9214,4},product,[{atom,{9214,5},time_offset},{atom,{9214,18},finalize}]},{var,{9214,31},'OldState'}]},[{type,{9215,7},constraint,[{atom,{9215,7},is_subtype},[{var,{9215,7},'OldState'},{type,{9215,19},union,[{atom,{9215,19},preliminary},{atom,{9215,33},final},{atom,{9215,41},volatile}]}]]}]]},{type,{9217,4},'fun',[{type,{9217,4},product,[{atom,{9217,5},internal_cpu_topology},{type,{9217,28},term,[]}]},{type,{9217,39},term,[]}]},{type,{9218,25},bounded_fun,[{type,{9218,25},'fun',[{type,{9218,25},product,[{atom,{9218,26},sequential_tracer},{var,{9218,45},'Tracer'}]},{type,{9218,56},union,[{var,{9218,56},'PrevTracer'},{atom,{9218,69},false}]}]},[{type,{9219,7},constraint,[{atom,{9219,7},is_subtype},[{var,{9219,7},'Tracer'},{type,{9219,17},union,[{type,{9219,17},pid,[]},{type,{9219,25},port,[]},{type,{9219,34},tuple,[{type,{9219,35},module,[]},{type,{9219,45},term,[]}]},{atom,{9219,55},false}]}]]},{type,{9220,7},constraint,[{atom,{9220,7},is_subtype},[{var,{9220,7},'PrevTracer'},{type,{9220,21},union,[{type,{9220,21},pid,[]},{type,{9220,29},port,[]},{type,{9220,38},tuple,[{type,{9220,39},module,[]},{type,{9220,49},term,[]}]},{atom,{9220,59},false}]}]]}]]},{type,{9221,25},'fun',[{type,{9221,25},product,[{atom,{9221,26},reset_seq_trace},{atom,{9221,42},true}]},{atom,{9221,51},true}]}]}}]}},{{function,subtract,2},{8685,2},[<<115,117,98,116,114,97,99,116,47,50>>],hidden,#{}},{{function,statistics,1},{8066,2},[<<115,116,97,116,105,115,116,105,99,115,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,115,116,97,116,105,115,116,105,99,115,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,10,10,84,104,101,32,112,111,115,115,105,98,108,101,32,102,108,97,103,115,32,97,114,101,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,119,105,116,104,10,32,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,10,32,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,97,115,107,115,32,116,104,97,116,32,97,114,101,10,32,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,32,125,10,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,99,116,105,118,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,10,32,32,112,111,114,116,115,32,111,110,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,32,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,97,114,101,32,114,101,97,100,121,32,116,111,32,114,117,110,44,32,111,114,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,114,117,110,110,105,110,103,46,32,86,97,108,117,101,115,32,102,111,114,10,32,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,110,100,32,116,104,101,105,114,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,10,32,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,10,32,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,97,110,32,101,108,101,109,101,110,116,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,10,32,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,32,97,110,100,32,116,104,101,110,32,97,115,32,108,97,115,116,10,32,32,101,108,101,109,101,110,116,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,73,79,10,32,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,10,32,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,10,32,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,10,32,32,62,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,10,32,32,62,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32,95,110,111,116,95,32,109,105,103,114,97,116,101,10,32,32,62,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,10,32,32,62,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,10,32,32,62,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,97,110,100,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,99,111,110,116,101,120,116,95,115,119,105,116,99,104,101,115,41,32,45,62,32,123,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,48,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,99,111,110,116,101,120,116,95,115,119,105,116,99,104,101,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,101,115,32,115,105,110,99,101,32,116,104,101,32,115,121,115,116,101,109,32,115,116,97,114,116,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,120,97,99,116,32,114,101,100,117,99,116,105,111,110,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,91,96,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,96,93,40,96,115,116,97,116,105,115,116,105,99,115,47,49,96,41,32,105,115,32,97,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,111,112,101,114,97,116,105,111,110,10,32,32,62,32,116,104,97,110,32,91,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,32,45,62,10,32,32,32,32,123,32,78,117,109,101,114,79,102,71,67,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,87,111,114,100,115,82,101,99,108,97,105,109,101,100,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,48,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,46,10,32,32,123,56,53,44,50,51,57,54,49,44,48,125,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,102,111,114,32,115,111,109,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,105,111,41,32,45,62,32,123,123,105,110,112,117,116,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,44,32,123,111,117,116,112,117,116,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,96,73,110,112,117,116,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,99,101,105,118,101,100,32,116,104,114,111,117,103,104,32,112,111,114,116,115,44,32,97,110,100,10,32,32,96,79,117,116,112,117,116,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,111,117,116,112,117,116,32,116,111,32,112,111,114,116,115,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,32,45,62,32,91,77,83,65,99,99,95,84,104,114,101,97,100,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,32,125,10,10,32,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,101,97,115,117,114,101,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,115,112,101,110,100,115,32,100,111,105,110,103,32,118,97,114,105,111,117,115,32,116,97,115,107,115,46,32,73,116,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,97,115,32,108,105,103,104,116,119,101,105,103,104,116,32,97,115,10,32,32,112,111,115,115,105,98,108,101,44,32,98,117,116,32,115,111,109,101,32,111,118,101,114,104,101,97,100,32,101,120,105,115,116,115,32,119,104,101,110,32,116,104,105,115,32,105,115,32,101,110,97,98,108,101,100,46,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,10,32,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,97,32,112,114,111,102,105,108,105,110,103,32,116,111,111,108,32,116,111,32,104,101,108,112,32,102,105,110,100,105,110,103,32,112,101,114,102,111,114,109,97,110,99,101,32,98,111,116,116,108,101,110,101,99,107,115,46,32,84,111,10,32,32,96,115,116,97,114,116,96,47,96,115,116,111,112,96,47,96,114,101,115,101,116,96,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,44,32,117,115,101,32,115,121,115,116,101,109,32,102,108,97,103,10,32,32,91,96,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,96,93,40,96,115,116,97,116,105,115,116,105,99,115,47,49,96,41,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,109,97,112,115,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115,111,109,101,32,111,102,32,116,104,101,32,79,83,32,116,104,114,101,97,100,115,32,119,105,116,104,105,110,32,69,82,84,83,46,32,69,97,99,104,32,109,97,112,32,99,111,110,116,97,105,110,115,32,96,116,121,112,101,96,32,97,110,100,10,32,32,96,105,100,96,32,102,105,101,108,100,115,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,119,104,97,116,32,116,104,114,101,97,100,32,105,116,32,105,115,44,32,97,110,100,32,97,108,115,111,32,97,32,99,111,117,110,116,101,114,115,10,32,32,102,105,101,108,100,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,100,97,116,97,32,97,98,111,117,116,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,104,97,115,32,98,101,101,110,32,115,112,101,110,116,32,105,110,32,116,104,101,32,118,97,114,105,111,117,115,10,32,32,115,116,97,116,101,115,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,32,32,91,35,123,99,111,117,110,116,101,114,115,32,61,62,32,35,123,97,117,120,32,61,62,32,49,56,57,57,49,56,50,57,49,52,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,104,101,99,107,95,105,111,32,61,62,32,50,54,48,53,56,54,51,54,48,50,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,109,117,108,97,116,111,114,32,61,62,32,52,53,55,51,49,56,56,48,52,54,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,99,32,61,62,32,49,53,49,50,50,48,54,57,49,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,116,104,101,114,32,61,62,32,53,52,50,49,51,51,56,52,53,54,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,111,114,116,32,61,62,32,50,50,49,54,51,49,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,108,101,101,112,32,61,62,32,53,49,53,48,50,57,52,49,48,48,125,44,10,32,32,32,32,32,105,100,32,61,62,32,49,44,10,32,32,32,32,32,116,121,112,101,32,61,62,32,115,99,104,101,100,117,108,101,114,125,124,46,46,46,93,10,32,32,96,96,96,10,10,32,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48,96,46,32,83,111,44,32,116,111,32,99,111,110,118,101,114,116,32,105,116,10,32,32,116,111,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,121,111,117,32,99,97,110,32,100,111,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,116,104,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,108,105,115,116,115,58,109,97,112,40,10,32,32,32,32,102,117,110,40,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,67,110,116,32,125,32,61,32,77,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,77,115,67,110,116,32,61,32,109,97,112,115,58,109,97,112,40,102,117,110,40,95,75,44,32,80,101,114,102,67,111,117,110,116,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,80,101,114,102,67,111,117,110,116,44,32,112,101,114,102,95,99,111,117,110,116,101,114,44,32,49,48,48,48,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,32,67,110,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,77,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,77,115,67,110,116,32,125,10,32,32,32,32,101,110,100,44,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,41,46,10,32,32,96,96,96,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,118,97,108,117,101,115,32,97,114,101,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,116,104,101,32,101,120,97,99,116,32,116,105,109,101,32,115,112,101,110,116,32,105,110,32,101,97,99,104,10,32,32,115,116,97,116,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,118,97,114,105,111,117,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,100,111,110,101,32,116,111,32,107,101,101,112,32,116,104,101,32,111,118,101,114,104,101,97,100,32,97,115,10,32,32,115,109,97,108,108,32,97,115,32,112,111,115,115,105,98,108,101,46,10,10,32,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,84,121,112,101,96,115,58,10,10,32,32,45,32,42,42,96,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,109,97,105,110,32,101,120,101,99,117,116,105,111,110,32,116,104,114,101,97,100,115,32,116,104,97,116,32,100,111,32,109,111,115,116,32,111,102,32,116,104,101,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,83,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,99,112,117,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,10,32,32,32,32,83,101,101,32,91,101,114,108,32,43,83,68,99,112,117,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,68,99,112,117,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,73,47,79,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,83,68,105,111,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,83,68,105,111,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,97,115,121,110,99,96,42,42,32,45,32,65,115,121,110,99,32,116,104,114,101,97,100,115,32,97,114,101,32,117,115,101,100,32,98,121,32,118,97,114,105,111,117,115,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,115,32,40,109,97,105,110,108,121,32,116,104,101,10,32,32,32,32,102,105,108,101,32,100,114,105,118,101,114,115,41,32,100,111,32,111,102,102,108,111,97,100,32,110,111,110,45,67,80,85,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,65,93,40,101,114,108,95,99,109,100,46,109,100,35,97,115,121,110,99,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,45,32,42,42,96,97,117,120,96,42,42,32,45,32,84,97,107,101,115,32,99,97,114,101,32,111,102,32,97,110,121,32,119,111,114,107,32,116,104,97,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,99,97,108,108,121,32,97,115,115,105,103,110,101,100,32,116,111,32,97,10,32,32,32,32,115,99,104,101,100,117,108,101,114,46,10,10,32,32,45,32,42,42,96,112,111,108,108,96,42,42,32,45,32,68,111,101,115,32,116,104,101,32,73,79,32,112,111,108,108,105,110,103,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,101,101,10,32,32,32,32,91,101,114,108,32,43,73,79,116,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,73,79,116,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101,96,115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,65,108,108,32,115,116,97,116,101,115,32,97,114,101,32,101,120,99,108,117,115,105,118,101,44,10,32,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,116,104,114,101,97,100,32,99,97,110,110,111,116,32,98,101,32,105,110,32,116,119,111,32,115,116,97,116,101,115,32,97,116,32,111,110,99,101,46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,116,104,101,10,32,32,110,117,109,98,101,114,115,32,111,102,32,97,108,108,32,99,111,117,110,116,101,114,115,32,105,110,32,97,32,116,104,114,101,97,100,44,32,121,111,117,32,103,101,116,32,116,104,101,32,116,111,116,97,108,32,114,117,110,116,105,109,101,32,102,111,114,32,116,104,97,116,32,116,104,114,101,97,100,46,10,10,32,32,45,32,42,42,96,97,117,120,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,104,97,110,100,108,105,110,103,32,97,117,120,105,108,105,97,114,121,32,106,111,98,115,46,10,10,32,32,45,32,42,42,96,99,104,101,99,107,95,105,111,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,99,104,101,99,107,105,110,103,32,102,111,114,32,110,101,119,32,73,47,79,32,101,118,101,110,116,115,46,10,10,32,32,45,32,42,42,96,101,109,117,108,97,116,111,114,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,10,10,32,32,45,32,42,42,96,103,99,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,101,120,116,114,97,32,115,116,97,116,101,115,32,97,114,101,32,101,110,97,98,108,101,100,10,32,32,32,32,116,104,105,115,32,105,115,32,116,104,101,32,116,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,110,111,110,45,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,46,10,10,32,32,45,32,42,42,96,111,116,104,101,114,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,117,110,97,99,99,111,117,110,116,101,100,32,116,104,105,110,103,115,46,10,10,32,32,45,32,42,42,96,112,111,114,116,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,112,111,114,116,115,46,10,10,32,32,45,32,42,42,96,115,108,101,101,112,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,115,108,101,101,112,105,110,103,46,10,10,32,32,77,111,114,101,32,102,105,110,101,45,103,114,97,105,110,101,100,32,96,77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,104,114,111,117,103,104,32,99,111,110,102,105,103,117,114,101,32,40,115,117,99,104,32,97,115,10,32,32,96,46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,109,105,99,114,111,115,116,97,116,101,45,97,99,99,111,117,110,116,105,110,103,61,101,120,116,114,97,96,41,46,32,69,110,97,98,108,105,110,103,32,116,104,101,115,101,32,115,116,97,116,101,115,32,99,97,117,115,101,115,10,32,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,32,119,104,101,110,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,32,97,110,100,32,105,110,99,114,101,97,115,101,115,10,32,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,104,101,110,32,105,116,32,105,115,32,116,117,114,110,101,100,32,111,110,46,10,10,32,32,45,32,42,42,96,97,108,108,111,99,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,109,101,109,111,114,121,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,115,112,114,101,97,100,32,111,117,116,32,111,118,101,114,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,46,10,10,32,32,45,32,42,42,96,98,105,102,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,98,117,115,121,95,119,97,105,116,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,98,117,115,121,32,119,97,105,116,105,110,103,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,97,10,32,32,32,32,115,99,104,101,100,117,108,101,114,32,110,111,32,108,111,110,103,101,114,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,105,115,32,97,99,116,105,118,101,32,119,104,101,110,32,117,115,105,110,103,10,32,32,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,32,32,32,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,32,98,117,116,32,116,104,105,115,32,97,110,100,32,115,108,101,101,112,44,32,97,110,100,32,116,104,101,110,32,100,105,118,105,100,101,32,116,104,97,116,32,98,121,10,32,32,32,32,97,108,108,32,116,105,109,101,32,105,110,32,116,104,101,32,116,104,114,101,97,100,44,32,121,111,117,32,115,104,111,117,108,100,32,103,101,116,32,115,111,109,101,116,104,105,110,103,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,116,104,101,10,32,32,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,102,114,97,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,111,116,104,101,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,101,116,115,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,84,83,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,112,97,114,116,32,111,102,32,116,104,101,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,103,99,95,102,117,108,108,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,10,32,32,32,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,96,103,99,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,110,105,102,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,78,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,115,101,110,100,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,40,112,114,111,99,101,115,115,101,115,32,111,110,108,121,41,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,10,32,32,32,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,96,101,109,117,108,97,116,111,114,96,32,115,116,97,116,101,46,10,10,32,32,45,32,42,42,96,116,105,109,101,114,115,96,42,42,32,45,32,84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,116,105,109,101,114,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,10,32,32,32,32,112,97,114,116,32,111,102,32,116,104,101,32,96,111,116,104,101,114,96,32,115,116,97,116,101,46,10,10,32,32,84,104,101,32,117,116,105,108,105,116,121,32,109,111,100,117,108,101,32,96,109,58,109,115,97,99,99,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,114,101,32,101,97,115,105,108,121,32,97,110,97,108,121,115,101,32,116,104,101,115,101,10,32,32,115,116,97,116,105,115,116,105,99,115,46,10,10,32,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,115,121,115,116,101,109,32,102,108,97,103,10,32,32,91,96,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,32,105,115,10,32,32,116,117,114,110,101,100,32,111,102,102,46,10,10,32,32,84,104,101,32,108,105,115,116,32,111,102,32,116,104,114,101,97,100,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,10,32,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,116,104,114,101,97,100,115,32,97,110,100,32,115,116,97,116,101,115,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,119,105,116,104,111,117,116,32,97,110,121,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,32,45,62,32,123,82,101,100,117,99,116,105,111,110,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,101,100,117,99,116,105,111,110,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,46,10,32,32,123,50,48,52,54,44,49,49,125,10,32,32,96,96,96,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,53,32,40,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,41,44,32,116,104,105,115,32,118,97,108,117,101,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,114,101,100,117,99,116,105,111,110,115,10,32,32,62,32,112,101,114,102,111,114,109,101,100,32,105,110,32,99,117,114,114,101,110,116,32,116,105,109,101,32,115,108,105,99,101,115,32,111,102,32,99,117,114,114,101,110,116,108,121,32,115,99,104,101,100,117,108,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,102,32,97,110,32,101,120,97,99,116,10,32,32,62,32,118,97,108,117,101,32,105,115,32,119,97,110,116,101,100,44,32,117,115,101,10,32,32,62,32,91,96,115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,108,101,110,103,116,104,32,111,102,32,97,108,108,32,110,111,114,109,97,108,32,97,110,100,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,97,116,32,105,115,44,32,113,117,101,117,101,100,10,32,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,10,32,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,105,115,10,32,32,109,117,99,104,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,99,111,109,112,97,114,101,100,32,116,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,97,32,108,97,114,103,101,32,97,109,111,117,110,116,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,117,115,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,32,125,10,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,10,32,32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,105,115,32,112,97,114,116,32,111,102,10,32,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,114,117,110,32,113,117,101,117,101,115,32,119,105,116,104,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,10,32,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,32,45,62,32,91,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,93,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,32,125,10,10,32,32,82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,10,32,32,114,101,97,100,121,32,116,111,32,114,117,110,32,102,111,114,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,10,32,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,32,111,102,10,32,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,118,97,108,117,101,115,32,102,111,114,10,32,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,102,111,108,108,111,119,32,40,105,110,32,116,104,97,116,32,111,114,100,101,114,41,32,97,116,32,116,104,101,10,32,32,101,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,10,32,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,10,32,32,103,97,116,104,101,114,101,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,10,32,32,62,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,10,32,32,62,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32,95,110,111,116,95,32,109,105,103,114,97,116,101,10,32,32,62,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,10,32,32,62,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,10,32,32,62,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46,10,10,32,32,83,101,101,32,97,108,115,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,44,32,97,110,100,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,44,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,117,110,116,105,109,101,44,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,32,32,84,104,105,115,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,102,111,114,32,97,108,108,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,10,32,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,118,97,108,117,101,32,109,105,103,104,116,32,119,114,97,112,32,100,117,101,32,116,111,32,108,105,109,105,116,97,116,105,111,110,115,32,105,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,10,32,32,62,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,104,97,116,32,105,115,32,117,115,101,100,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,46,10,32,32,123,49,54,57,48,44,49,54,50,48,125,10,32,32,96,96,96,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,45,62,10,32,32,32,32,91,123,73,100,32,58,58,32,112,111,115,95,105,110,116,101,103,101,114,44,10,32,32,32,32,32,32,65,99,116,105,118,101,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,10,32,32,32,32,32,32,84,111,116,97,108,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,93,32,124,10,32,32,32,32,117,110,100,101,102,105,110,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,100,101,115,99,114,105,98,105,110,103,32,104,111,119,32,109,117,99,104,32,116,105,109,101,10,32,32,91,110,111,114,109,97,108,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,32,97,110,100,10,32,32,91,100,105,114,116,121,32,67,80,85,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,115,99,104,101,100,117,108,101,114,115,32,105,110,32,116,104,101,10,32,32,115,121,115,116,101,109,32,104,97,118,101,32,98,101,101,110,32,98,117,115,121,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,114,109,97,108,108,121,32,97,32,98,101,116,116,101,114,32,105,110,100,105,99,97,116,111,114,32,111,102,32,104,111,119,32,109,117,99,104,10,32,32,108,111,97,100,32,97,110,32,69,114,108,97,110,103,32,110,111,100,101,32,105,115,32,117,110,100,101,114,32,105,110,115,116,101,97,100,32,111,102,32,108,111,111,107,105,110,103,32,97,116,32,116,104,101,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,112,114,111,118,105,100,101,100,10,32,32,98,121,32,116,111,111,108,115,32,115,117,99,104,32,97,115,32,96,116,111,112,96,32,111,114,32,96,115,121,115,115,116,97,116,96,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,97,108,115,111,10,32,32,105,110,99,108,117,100,101,115,32,116,105,109,101,32,119,104,101,114,101,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,97,105,116,105,110,103,32,102,111,114,32,115,111,109,101,32,111,116,104,101,114,32,114,101,97,115,111,117,114,99,101,32,40,115,117,99,104,32,97,115,10,32,32,97,110,32,105,110,116,101,114,110,97,108,32,109,117,116,101,120,41,32,116,111,32,98,101,32,97,118,97,105,108,97,98,108,101,32,98,117,116,32,100,111,101,115,32,110,111,116,32,117,115,101,32,116,104,101,32,67,80,85,46,32,73,110,32,111,114,100,101,114,32,116,111,32,98,101,116,116,101,114,10,32,32,117,110,100,101,114,115,116,97,110,100,32,119,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,98,117,115,121,32,100,111,105,110,103,32,121,111,117,32,99,97,110,32,117,115,101,10,32,32,91,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,93,40,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,10,32,32,84,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,98,117,115,121,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,104,101,110,32,105,116,32,105,115,32,110,111,116,32,105,100,108,101,32,97,110,100,32,110,111,116,10,32,32,91,98,117,115,121,32,119,97,105,116,105,110,103,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,98,119,116,41,32,102,111,114,32,110,101,119,32,119,111,114,107,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,32,99,111,100,101,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,111,114,32,78,73,70,32,99,111,100,101,10,32,32,45,32,69,120,101,99,117,116,105,110,103,32,66,73,70,115,44,32,111,114,32,97,110,121,32,111,116,104,101,114,32,114,117,110,116,105,109,101,32,104,97,110,100,108,105,110,103,10,32,32,45,32,71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,10,32,32,45,32,72,97,110,100,108,105,110,103,32,97,110,121,32,111,116,104,101,114,32,109,101,109,111,114,121,32,109,97,110,97,103,101,109,101,110,116,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,99,97,110,32,97,108,115,111,32,98,101,32,98,117,115,121,32,101,118,101,110,32,105,102,32,116,104,101,32,79,83,32,104,97,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,116,104,101,10,32,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,73,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,117,115,101,32,116,104,101,32,109,111,100,117,108,101,32,96,109,58,115,99,104,101,100,117,108,101,114,96,32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,10,32,32,62,32,100,105,114,101,99,116,108,121,32,97,115,32,105,116,32,112,114,111,118,105,100,101,115,32,97,110,32,101,97,115,105,101,114,32,119,97,121,32,116,111,32,103,101,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,116,32,121,111,117,32,117,115,117,97,108,108,121,10,32,32,62,32,119,97,110,116,46,10,10,32,32,73,102,32,91,101,110,97,98,108,101,100,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,10,32,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32,96,123,83,99,104,101,100,117,108,101,114,73,100,44,32,65,99,116,105,118,101,84,105,109,101,44,32,84,111,116,97,108,84,105,109,101,125,96,44,32,119,104,101,114,101,32,96,83,99,104,101,100,117,108,101,114,73,100,96,10,32,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,73,68,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,44,32,96,65,99,116,105,118,101,84,105,109,101,96,32,105,115,32,116,104,101,32,100,117,114,97,116,105,111,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,10,32,32,104,97,115,32,98,101,101,110,32,98,117,115,121,44,32,97,110,100,32,96,84,111,116,97,108,84,105,109,101,96,32,105,115,32,116,104,101,32,116,111,116,97,108,32,116,105,109,101,32,100,117,114,97,116,105,111,110,32,115,105,110,99,101,10,32,32,91,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,97,99,116,105,118,97,116,105,111,110,10,32,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,46,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,116,117,114,110,101,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,99,97,110,32,98,101,10,32,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,114,101,108,101,97,115,101,115,44,32,79,83,115,44,32,97,110,100,32,115,121,115,116,101,109,32,114,101,115,116,97,114,116,115,46,10,32,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,97,108,99,117,108,97,116,101,32,114,101,108,97,116,105,118,101,32,118,97,108,117,101,115,32,102,111,114,10,32,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,84,104,101,32,96,65,99,116,105,118,101,84,105,109,101,96,32,99,97,110,32,110,101,118,101,114,32,101,120,99,101,101,100,32,96,84,111,116,97,108,84,105,109,101,96,46,32,84,104,101,32,108,105,115,116,10,32,32,111,102,32,115,99,104,101,100,117,108,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,10,32,32,99,97,108,108,115,46,10,10,32,32,84,104,101,32,91,100,105,115,97,98,108,101,100,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,10,32,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,32,32,84,104,101,32,97,99,116,105,118,97,116,105,111,110,32,116,105,109,101,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,100,105,114,116,121,10,32,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,32,119,104,105,108,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,10,32,32,115,111,109,101,32,116,105,109,101,32,97,102,116,101,114,32,116,104,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,110,97,98,108,101,100,46,10,10,32,32,79,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,104,97,110,100,108,101,32,67,80,85,32,98,111,117,110,100,32,119,111,114,107,32,105,115,10,32,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,102,32,121,111,117,32,97,108,115,111,32,119,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,10,32,32,97,98,111,117,116,32,91,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,44,32,117,115,101,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,10,32,32,105,110,115,116,101,97,100,46,10,10,32,32,78,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,96,49,32,61,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,32,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,104,97,110,100,108,101,32,115,112,101,99,105,102,105,99,32,116,121,112,101,115,32,111,102,32,106,111,98,115,46,32,69,118,101,114,121,32,106,111,98,32,105,115,10,32,32,62,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,32,116,121,112,101,46,32,74,111,98,115,32,99,97,110,32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,44,32,98,117,116,32,110,101,118,101,114,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,46,10,32,32,62,32,84,104,105,115,32,102,97,99,116,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,117,110,100,101,114,32,99,111,110,115,105,100,101,114,97,116,105,111,110,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,10,32,32,62,32,114,101,116,117,114,110,101,100,46,10,10,32,32,89,111,117,32,99,97,110,32,117,115,101,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,116,111,32,99,97,108,99,117,108,97,116,101,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,70,105,114,115,116,32,121,111,117,10,32,32,116,97,107,101,32,97,32,115,97,109,112,108,101,32,111,102,32,116,104,101,32,118,97,108,117,101,115,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,96,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,46,10,32,32,102,97,108,115,101,10,32,32,62,32,84,115,48,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,32,32,111,107,10,32,32,96,96,96,10,10,32,32,83,111,109,101,32,116,105,109,101,32,108,97,116,101,114,32,116,104,101,32,117,115,101,114,32,116,97,107,101,115,32,97,110,111,116,104,101,114,32,115,110,97,112,115,104,111,116,32,97,110,100,32,99,97,108,99,117,108,97,116,101,115,32,115,99,104,101,100,117,108,101,114,10,32,32,117,116,105,108,105,122,97,116,105,111,110,32,112,101,114,32,115,99,104,101,100,117,108,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,84,115,49,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,32,32,111,107,10,32,32,62,32,108,105,115,116,115,58,109,97,112,40,102,117,110,40,123,123,73,44,32,65,48,44,32,84,48,125,44,32,123,73,44,32,65,49,44,32,84,49,125,125,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,123,73,44,32,40,65,49,32,45,32,65,48,41,47,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,46,10,32,32,91,123,49,44,48,46,57,55,52,51,52,55,52,55,51,48,49,55,55,53,52,56,125,44,10,32,32,32,123,50,44,48,46,57,55,52,52,56,52,51,55,56,50,55,53,49,52,52,52,125,44,10,32,32,32,123,51,44,48,46,57,57,57,53,57,48,50,51,54,49,54,54,57,48,52,53,125,44,10,32,32,32,123,52,44,48,46,57,55,51,56,48,49,50,53,57,54,53,55,50,49,54,49,125,44,10,32,32,32,123,53,44,48,46,57,55,49,55,57,53,54,54,54,55,48,49,56,49,48,51,125,44,10,32,32,32,123,54,44,48,46,57,55,51,57,50,51,53,56,52,54,52,50,48,55,52,49,125,44,10,32,32,32,123,55,44,48,46,57,55,51,50,51,55,48,51,51,48,55,55,56,55,54,125,44,10,32,32,32,123,56,44,48,46,57,55,52,49,50,57,55,50,57,51,50,52,56,54,53,54,125,93,10,32,32,96,96,96,10,10,32,32,85,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,110,97,112,115,104,111,116,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,97,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,123,65,44,32,84,125,32,61,32,108,105,115,116,115,58,102,111,108,100,108,40,102,117,110,40,123,123,95,44,32,65,48,44,32,84,48,125,44,32,123,95,44,32,65,49,44,32,84,49,125,125,44,32,123,65,105,44,84,105,125,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,123,65,105,32,43,32,40,65,49,32,45,32,65,48,41,44,32,84,105,32,43,32,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,123,48,44,32,48,125,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,44,10,32,32,32,32,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,65,47,84,46,10,32,32,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53,10,32,32,96,96,96,10,10,32,32,84,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,101,113,117,97,108,32,96,49,46,48,96,32,119,104,101,110,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,101,101,110,10,32,32,97,99,116,105,118,101,32,97,108,108,32,116,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32,116,119,111,32,109,101,97,115,117,114,101,109,101,110,116,115,46,10,10,32,32,65,110,111,116,104,101,114,32,40,112,114,111,98,97,98,108,121,32,109,111,114,101,41,32,117,115,101,102,117,108,32,118,97,108,117,101,32,105,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,10,32,32,119,101,105,103,104,116,101,100,32,97,103,97,105,110,115,116,32,109,97,120,105,109,117,109,32,97,109,111,117,110,116,32,111,102,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,87,101,105,103,104,116,101,100,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,40,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,41,46,10,32,32,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,119,101,105,103,104,116,101,100,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,114,101,97,99,104,32,96,49,46,48,96,32,119,104,101,110,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,101,10,32,32,116,104,101,32,115,97,109,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,97,115,32,109,97,120,105,109,117,109,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,46,32,73,102,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,10,32,32,116,104,97,110,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,118,97,108,117,101,32,109,97,121,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,96,49,46,48,96,46,10,10,32,32,65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,97,115,32,100,101,102,97,117,108,116,32,104,97,118,101,32,109,111,114,101,10,32,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,110,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,105,115,32,100,117,101,32,116,111,32,116,104,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,96,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,96,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,100,105,115,97,98,108,101,100,46,32,84,111,32,101,110,97,98,108,101,32,105,116,44,32,117,115,101,10,32,32,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,82,49,53,66,48,49,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41,32,45,62,10,32,32,32,32,91,123,73,100,32,58,58,32,112,111,115,95,105,110,116,101,103,101,114,44,10,32,32,32,32,32,32,65,99,116,105,118,101,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,10,32,32,32,32,32,32,84,111,116,97,108,84,105,109,101,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,93,32,124,10,32,32,32,32,117,110,100,101,102,105,110,101,100,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,10,32,32,91,96,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,44,10,32,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,115,111,32,105,110,99,108,117,100,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,46,10,10,32,32,68,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,10,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,41,96,43,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,96,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,43,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,78,111,116,101,32,116,104,97,116,32,119,111,114,107,32,101,120,101,99,117,116,105,110,103,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,109,97,105,110,108,121,32,119,97,105,116,10,32,32,62,32,102,111,114,32,73,47,79,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,121,111,117,32,103,101,116,32,104,105,103,104,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,111,110,32,100,105,114,116,121,32,73,47,79,10,32,32,62,32,115,99,104,101,100,117,108,101,114,115,44,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,105,115,32,95,110,111,116,95,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,104,105,103,104,32,100,117,101,32,116,111,32,116,104,105,115,32,119,111,114,107,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,51,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,32,45,62,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,32,125,10,10,32,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,32,32,96,108,105,115,116,115,58,115,117,109,40,96,91,96,115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,93,40,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41,96,41,96,44,10,32,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,50,48,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,115,116,97,116,105,115,116,105,99,115,40,119,97,108,108,95,99,108,111,99,107,41,32,45,62,32,123,84,111,116,97,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,83,105,110,99,101,76,97,115,116,67,97,108,108,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,125,10,32,32,96,96,96,10,32,32,123,58,32,35,115,116,97,116,105,115,116,105,99,115,95,119,97,108,108,95,99,108,111,99,107,32,125,10,10,32,32,82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,119,97,108,108,32,99,108,111,99,107,46,32,96,119,97,108,108,95,99,108,111,99,107,96,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,115,97,109,101,10,32,32,109,97,110,110,101,114,32,97,115,32,96,114,117,110,116,105,109,101,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,114,101,97,108,32,116,105,109,101,32,105,115,32,109,101,97,115,117,114,101,100,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,114,117,110,116,105,109,101,32,111,114,10,32,32,67,80,85,32,116,105,109,101,46>>},#{group => system,specification => [{attribute,{8621,2},spec,{{statistics,1},[{type,{8621,17},bounded_fun,[{type,{8621,17},'fun',[{type,{8621,17},product,[{atom,{8621,18},active_tasks}]},{type,{8621,35},list,[{var,{8621,36},'ActiveTasks'}]}]},[{type,{8622,7},constraint,[{atom,{8622,7},is_subtype},[{var,{8622,7},'ActiveTasks'},{type,{8622,22},non_neg_integer,[]}]]}]]},{type,{8623,3},bounded_fun,[{type,{8623,3},'fun',[{type,{8623,3},product,[{atom,{8623,4},active_tasks_all}]},{type,{8623,25},list,[{var,{8623,26},'ActiveTasks'}]}]},[{type,{8624,7},constraint,[{atom,{8624,7},is_subtype},[{var,{8624,7},'ActiveTasks'},{type,{8624,22},non_neg_integer,[]}]]}]]},{type,{8625,3},bounded_fun,[{type,{8625,3},'fun',[{type,{8625,3},product,[{atom,{8625,4},context_switches}]},{type,{8625,25},tuple,[{var,{8625,26},'ContextSwitches'},{integer,{8625,42},0}]}]},[{type,{8626,7},constraint,[{atom,{8626,7},is_subtype},[{var,{8626,7},'ContextSwitches'},{type,{8626,26},non_neg_integer,[]}]]}]]},{type,{8627,17},bounded_fun,[{type,{8627,17},'fun',[{type,{8627,17},product,[{atom,{8627,18},exact_reductions}]},{type,{8627,39},tuple,[{var,{8627,40},'Total_Exact_Reductions'},{var,{8628,40},'Exact_Reductions_Since_Last_Call'}]}]},[{type,{8629,7},constraint,[{atom,{8629,7},is_subtype},[{var,{8629,7},'Total_Exact_Reductions'},{type,{8629,33},non_neg_integer,[]}]]},{type,{8630,7},constraint,[{atom,{8630,7},is_subtype},[{var,{8630,7},'Exact_Reductions_Since_Last_Call'},{type,{8630,43},non_neg_integer,[]}]]}]]},{type,{8631,17},bounded_fun,[{type,{8631,17},'fun',[{type,{8631,17},product,[{atom,{8631,18},garbage_collection}]},{type,{8631,41},tuple,[{var,{8631,42},'Number_of_GCs'},{var,{8631,57},'Words_Reclaimed'},{integer,{8631,74},0}]}]},[{type,{8632,7},constraint,[{atom,{8632,7},is_subtype},[{var,{8632,7},'Number_of_GCs'},{type,{8632,24},non_neg_integer,[]}]]},{type,{8633,7},constraint,[{atom,{8633,7},is_subtype},[{var,{8633,7},'Words_Reclaimed'},{type,{8633,26},non_neg_integer,[]}]]}]]},{type,{8634,17},bounded_fun,[{type,{8634,17},'fun',[{type,{8634,17},product,[{atom,{8634,18},io}]},{type,{8634,25},tuple,[{type,{8634,26},tuple,[{atom,{8634,27},input},{var,{8634,34},'Input'}]},{type,{8634,42},tuple,[{atom,{8634,43},output},{var,{8634,51},'Output'}]}]}]},[{type,{8635,7},constraint,[{atom,{8635,7},is_subtype},[{var,{8635,7},'Input'},{type,{8635,16},non_neg_integer,[]}]]},{type,{8636,7},constraint,[{atom,{8636,7},is_subtype},[{var,{8636,7},'Output'},{type,{8636,17},non_neg_integer,[]}]]}]]},{type,{8637,17},bounded_fun,[{type,{8637,17},'fun',[{type,{8637,17},product,[{atom,{8637,18},microstate_accounting}]},{type,{8637,44},union,[{type,{8637,44},list,[{var,{8637,45},'MSAcc_Thread'}]},{atom,{8637,61},undefined}]}]},[{type,{8638,7},constraint,[{atom,{8638,7},is_subtype},[{var,{8638,7},'MSAcc_Thread'},{type,{8638,23},map,[{type,{8638,31},map_field_exact,[{atom,{8638,26},type},{var,{8638,34},'MSAcc_Thread_Type'}]},{type,{8639,28},map_field_exact,[{atom,{8639,25},id},{var,{8639,31},'MSAcc_Thread_Id'}]},{type,{8640,34},map_field_exact,[{atom,{8640,25},counters},{var,{8640,37},'MSAcc_Counters'}]}]}]]},{type,{8641,7},constraint,[{atom,{8641,7},is_subtype},[{var,{8641,7},'MSAcc_Thread_Type'},{type,{8641,28},union,[{atom,{8641,28},async},{atom,{8641,36},aux},{atom,{8641,42},dirty_io_scheduler},{atom,{8642,28},dirty_cpu_scheduler},{atom,{8642,50},poll},{atom,{8642,57},scheduler}]}]]},{type,{8643,7},constraint,[{atom,{8643,7},is_subtype},[{var,{8643,7},'MSAcc_Thread_Id'},{type,{8643,26},non_neg_integer,[]}]]},{type,{8644,7},constraint,[{atom,{8644,7},is_subtype},[{var,{8644,7},'MSAcc_Counters'},{type,{8644,25},map,[{type,{8644,47},map_field_assoc,[{var,{8644,28},'MSAcc_Thread_State'},{type,{8644,50},non_neg_integer,[]}]}]}]]},{type,{8645,7},constraint,[{atom,{8645,7},is_subtype},[{var,{8645,7},'MSAcc_Thread_State'},{type,{8645,29},union,[{atom,{8645,29},alloc},{atom,{8645,37},aux},{atom,{8645,43},bif},{atom,{8645,49},busy_wait},{atom,{8645,61},check_io},{atom,{8646,29},emulator},{atom,{8646,40},ets},{atom,{8646,46},gc},{atom,{8646,51},gc_fullsweep},{atom,{8646,66},nif},{atom,{8647,29},other},{atom,{8647,37},port},{atom,{8647,44},send},{atom,{8647,51},sleep},{atom,{8647,59},timers}]}]]}]]},{type,{8648,17},bounded_fun,[{type,{8648,17},'fun',[{type,{8648,17},product,[{atom,{8648,18},reductions}]},{type,{8648,33},tuple,[{var,{8648,34},'Total_Reductions'},{var,{8649,34},'Reductions_Since_Last_Call'}]}]},[{type,{8650,7},constraint,[{atom,{8650,7},is_subtype},[{var,{8650,7},'Total_Reductions'},{type,{8650,27},non_neg_integer,[]}]]},{type,{8651,7},constraint,[{atom,{8651,7},is_subtype},[{var,{8651,7},'Reductions_Since_Last_Call'},{type,{8651,37},non_neg_integer,[]}]]}]]},{type,{8652,17},'fun',[{type,{8652,17},product,[{atom,{8652,18},run_queue}]},{type,{8652,32},non_neg_integer,[]}]},{type,{8653,17},bounded_fun,[{type,{8653,17},'fun',[{type,{8653,17},product,[{atom,{8653,18},run_queue_lengths}]},{type,{8653,40},list,[{var,{8653,41},'RunQueueLength'}]}]},[{type,{8654,7},constraint,[{atom,{8654,7},is_subtype},[{var,{8654,7},'RunQueueLength'},{type,{8654,25},non_neg_integer,[]}]]}]]},{type,{8655,17},bounded_fun,[{type,{8655,17},'fun',[{type,{8655,17},product,[{atom,{8655,18},run_queue_lengths_all}]},{type,{8655,44},list,[{var,{8655,45},'RunQueueLength'}]}]},[{type,{8656,7},constraint,[{atom,{8656,7},is_subtype},[{var,{8656,7},'RunQueueLength'},{type,{8656,25},non_neg_integer,[]}]]}]]},{type,{8657,17},bounded_fun,[{type,{8657,17},'fun',[{type,{8657,17},product,[{atom,{8657,18},runtime}]},{type,{8657,30},tuple,[{var,{8657,31},'Total_Run_Time'},{var,{8657,47},'Time_Since_Last_Call'}]}]},[{type,{8658,7},constraint,[{atom,{8658,7},is_subtype},[{var,{8658,7},'Total_Run_Time'},{type,{8658,25},non_neg_integer,[]}]]},{type,{8659,7},constraint,[{atom,{8659,7},is_subtype},[{var,{8659,7},'Time_Since_Last_Call'},{type,{8659,31},non_neg_integer,[]}]]}]]},{type,{8660,17},bounded_fun,[{type,{8660,17},'fun',[{type,{8660,17},product,[{atom,{8660,18},scheduler_wall_time}]},{type,{8660,42},union,[{type,{8660,42},list,[{type,{8660,43},tuple,[{var,{8660,44},'SchedulerId'},{var,{8660,57},'ActiveTime'},{var,{8660,69},'TotalTime'}]}]},{atom,{8660,83},undefined}]}]},[{type,{8661,7},constraint,[{atom,{8661,7},is_subtype},[{var,{8661,7},'SchedulerId'},{type,{8661,22},pos_integer,[]}]]},{type,{8662,7},constraint,[{atom,{8662,7},is_subtype},[{var,{8662,7},'ActiveTime'},{type,{8662,22},non_neg_integer,[]}]]},{type,{8663,7},constraint,[{atom,{8663,7},is_subtype},[{var,{8663,7},'TotalTime'},{type,{8663,22},non_neg_integer,[]}]]}]]},{type,{8664,17},bounded_fun,[{type,{8664,17},'fun',[{type,{8664,17},product,[{atom,{8664,18},scheduler_wall_time_all}]},{type,{8664,46},union,[{type,{8664,46},list,[{type,{8664,47},tuple,[{var,{8664,48},'SchedulerId'},{var,{8664,61},'ActiveTime'},{var,{8664,73},'TotalTime'}]}]},{atom,{8664,87},undefined}]}]},[{type,{8665,7},constraint,[{atom,{8665,7},is_subtype},[{var,{8665,7},'SchedulerId'},{type,{8665,22},pos_integer,[]}]]},{type,{8666,7},constraint,[{atom,{8666,7},is_subtype},[{var,{8666,7},'ActiveTime'},{type,{8666,22},non_neg_integer,[]}]]},{type,{8667,7},constraint,[{atom,{8667,7},is_subtype},[{var,{8667,7},'TotalTime'},{type,{8667,22},non_neg_integer,[]}]]}]]},{type,{8668,3},bounded_fun,[{type,{8668,3},'fun',[{type,{8668,3},product,[{atom,{8668,4},total_active_tasks}]},{var,{8668,27},'ActiveTasks'}]},[{type,{8669,7},constraint,[{atom,{8669,7},is_subtype},[{var,{8669,7},'ActiveTasks'},{type,{8669,22},non_neg_integer,[]}]]}]]},{type,{8670,3},bounded_fun,[{type,{8670,3},'fun',[{type,{8670,3},product,[{atom,{8670,4},total_active_tasks_all}]},{var,{8670,31},'ActiveTasks'}]},[{type,{8671,7},constraint,[{atom,{8671,7},is_subtype},[{var,{8671,7},'ActiveTasks'},{type,{8671,22},non_neg_integer,[]}]]}]]},{type,{8672,17},bounded_fun,[{type,{8672,17},'fun',[{type,{8672,17},product,[{atom,{8672,18},total_run_queue_lengths}]},{var,{8672,46},'TotalRunQueueLengths'}]},[{type,{8673,7},constraint,[{atom,{8673,7},is_subtype},[{var,{8673,7},'TotalRunQueueLengths'},{type,{8673,31},non_neg_integer,[]}]]}]]},{type,{8674,17},bounded_fun,[{type,{8674,17},'fun',[{type,{8674,17},product,[{atom,{8674,18},total_run_queue_lengths_all}]},{var,{8674,50},'TotalRunQueueLengths'}]},[{type,{8675,7},constraint,[{atom,{8675,7},is_subtype},[{var,{8675,7},'TotalRunQueueLengths'},{type,{8675,31},non_neg_integer,[]}]]}]]},{type,{8676,17},bounded_fun,[{type,{8676,17},'fun',[{type,{8676,17},product,[{atom,{8676,18},wall_clock}]},{type,{8676,33},tuple,[{var,{8676,34},'Total_Wallclock_Time'},{var,{8677,34},'Wallclock_Time_Since_Last_Call'}]}]},[{type,{8678,7},constraint,[{atom,{8678,7},is_subtype},[{var,{8678,7},'Total_Wallclock_Time'},{type,{8678,31},non_neg_integer,[]}]]},{type,{8679,7},constraint,[{atom,{8679,7},is_subtype},[{var,{8679,7},'Wallclock_Time_Since_Last_Call'},{type,{8679,41},non_neg_integer,[]}]]}]]}]}}]}},{{function,setelement,3},{8045,2},[<<115,101,116,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,116,104,97,116,32,105,115,32,97,32,99,111,112,121,32,111,102,32,97,114,103,117,109,101,110,116,32,96,84,117,112,108,101,49,96,32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,115,112,101,99,105,102,105,101,100,10,98,121,32,105,110,116,101,103,101,114,32,97,114,103,117,109,101,110,116,32,96,73,110,100,101,120,96,32,40,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,101,108,101,109,101,110,116,32,119,105,116,104,32,105,110,100,101,120,32,49,41,10,114,101,112,108,97,99,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32,96,86,97,108,117,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,101,116,101,108,101,109,101,110,116,40,50,44,32,123,49,48,44,32,103,114,101,101,110,44,32,98,111,116,116,108,101,115,125,44,32,114,101,100,41,46,10,123,49,48,44,114,101,100,44,98,111,116,116,108,101,115,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{8058,2},spec,{{setelement,3},[{type,{8058,17},bounded_fun,[{type,{8058,17},'fun',[{type,{8058,17},product,[{var,{8058,18},'Index'},{var,{8058,25},'Tuple1'},{var,{8058,33},'Value'}]},{var,{8058,43},'Tuple2'}]},[{type,{8059,7},constraint,[{atom,{8059,7},is_subtype},[{var,{8059,7},'Index'},{type,{8059,16},pos_integer,[]}]]},{type,{8060,7},constraint,[{atom,{8060,7},is_subtype},[{var,{8060,7},'Tuple1'},{type,{8060,17},tuple,any}]]},{type,{8061,7},constraint,[{atom,{8061,7},is_subtype},[{var,{8061,7},'Tuple2'},{type,{8061,17},tuple,any}]]},{type,{8062,7},constraint,[{atom,{8062,7},is_subtype},[{var,{8062,7},'Value'},{type,{8062,16},term,[]}]]}]]}]}}]}},{{function,seq_trace_info,1},{8032,2},[<<115,101,113,95,116,114,97,99,101,95,105,110,102,111,40,87,104,97,116,41>>],hidden,#{}},{{function,send,3},{7997,2},[<<115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,105,116,104,101,114,32,115,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,111,107,96,44,32,111,114,32,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,32,98,117,116,10,114,101,116,117,114,110,115,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,40,115,101,101,32,98,101,108,111,119,41,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,115,97,109,101,32,97,115,10,91,96,101,114,108,97,110,103,58,115,101,110,100,47,50,96,93,40,96,115,101,110,100,47,50,96,41,46,10,10,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,101,120,112,108,97,110,97,116,105,111,110,32,97,110,100,32,119,97,114,110,105,110,103,115,44,32,115,101,101,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51,96,93,40,96,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,96,41,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,110,111,115,117,115,112,101,110,100,96,42,42,32,45,32,73,102,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,10,32,32,96,110,111,115,117,115,112,101,110,100,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46,10,10,45,32,42,42,96,110,111,99,111,110,110,101,99,116,96,42,42,32,45,32,73,102,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,110,111,100,101,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,97,117,116,111,45,99,111,110,110,101,99,116,101,100,32,116,111,10,32,32,100,111,32,116,104,101,32,115,101,110,100,44,32,96,110,111,99,111,110,110,101,99,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,65,115,32,119,105,116,104,32,96,101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51,96,58,32,117,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>},#{group => processes,specification => [{attribute,{8023,2},spec,{{send,3},[{type,{8023,11},bounded_fun,[{type,{8023,11},'fun',[{type,{8023,11},product,[{var,{8023,12},'Dest'},{var,{8023,18},'Msg'},{var,{8023,23},'Options'}]},{var,{8023,35},'Res'}]},[{type,{8024,7},constraint,[{atom,{8024,7},is_subtype},[{var,{8024,7},'Dest'},{user_type,{8024,15},send_destination,[]}]]},{type,{8025,7},constraint,[{atom,{8025,7},is_subtype},[{var,{8025,7},'Msg'},{type,{8025,14},term,[]}]]},{type,{8026,7},constraint,[{atom,{8026,7},is_subtype},[{var,{8026,7},'Options'},{type,{8026,18},list,[{type,{8026,19},union,[{atom,{8026,19},nosuspend},{atom,{8026,31},noconnect}]}]}]]},{type,{8027,7},constraint,[{atom,{8027,7},is_subtype},[{var,{8027,7},'Res'},{type,{8027,14},union,[{atom,{8027,14},ok},{atom,{8027,19},nosuspend},{atom,{8027,31},noconnect}]}]]}]]}]}}]}},{{function,send,2},{7972,2},[<<115,101,110,100,40,68,101,115,116,44,32,77,115,103,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32,96,77,115,103,96,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,117,115,105,110,103,32,116,104,101,10,91,115,101,110,100,32,111,112,101,114,97,116,111,114,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,115,101,110,100,96,41,58,32,96,68,101,115,116,32,33,32,77,115,103,96,46,10,10,96,68,101,115,116,96,32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,32,97,108,105,97,115,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,10,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,10,97,110,111,116,104,101,114,32,110,111,100,101,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,114,117,110,45,116,105,109,101,32,101,114,114,111,114,32,105,102,32,96,68,101,115,116,96,32,105,115,32,97,110,32,97,116,111,109,32,110,97,109,101,44,32,98,117,116,10,116,104,105,115,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,111,110,108,121,32,99,97,115,101,32,119,104,101,110,32,96,115,101,110,100,96,32,102,97,105,108,115,32,102,111,114,32,97,110,10,117,110,114,101,97,99,104,97,98,108,101,32,100,101,115,116,105,110,97,116,105,111,110,32,96,68,101,115,116,96,32,40,111,102,32,99,111,114,114,101,99,116,32,116,121,112,101,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{7991,2},spec,{{send,2},[{type,{7991,11},bounded_fun,[{type,{7991,11},'fun',[{type,{7991,11},product,[{var,{7991,12},'Dest'},{var,{7991,18},'Msg'}]},{var,{7991,26},'Msg'}]},[{type,{7992,7},constraint,[{atom,{7992,7},is_subtype},[{var,{7992,7},'Dest'},{user_type,{7992,15},send_destination,[]}]]},{type,{7993,7},constraint,[{atom,{7993,7},is_subtype},[{var,{7993,7},'Msg'},{type,{7993,14},term,[]}]]}]]}]}}]}},{{function,process_info,2},{7739,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,73,116,101,109,83,112,101,99,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,10,96,73,116,101,109,96,32,111,114,32,96,73,116,101,109,76,105,115,116,96,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,108,105,118,101,32,97,110,100,32,97,32,115,105,110,103,108,101,32,96,73,116,101,109,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,10,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,110,102,111,84,117,112,108,101,96,44,32,117,110,108,101,115,115,32,96,73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,10,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,96,91,93,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,115,116,114,97,110,103,101,32,98,101,104,97,118,105,111,114,32,105,115,10,98,101,99,97,117,115,101,32,111,102,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,97,110,100,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,73,102,32,96,73,116,101,109,76,105,115,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,46,32,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,105,110,10,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,32,97,114,101,32,105,110,99,108,117,100,101,100,32,119,105,116,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,116,101,109,96,115,32,105,110,32,116,104,101,32,115,97,109,101,32,111,114,100,101,114,32,97,115,10,116,104,101,32,96,73,116,101,109,96,115,32,119,101,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32,96,73,116,101,109,76,105,115,116,96,46,32,86,97,108,105,100,32,96,73,116,101,109,96,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,109,117,108,116,105,112,108,101,10,116,105,109,101,115,32,105,110,32,96,73,116,101,109,76,105,115,116,96,46,10,10,71,101,116,116,105,110,103,32,112,114,111,99,101,115,115,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,10,116,104,101,32,91,80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,112,97,114,116,32,111,102,32,96,73,116,101,109,76,105,115,116,96,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,110,97,109,101,10,62,32,114,101,103,105,115,116,101,114,101,100,44,32,97,32,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,91,93,125,96,44,32,96,73,110,102,111,84,117,112,108,101,96,32,95,119,105,108,108,95,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,10,62,32,114,101,115,117,108,116,105,110,103,32,96,73,110,102,111,84,117,112,108,101,76,105,115,116,96,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,97,32,115,105,110,103,108,101,10,62,32,96,73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,119,104,101,110,10,62,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,96,93,40,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,96,41,32,105,115,32,117,115,101,100,46,10,10,86,97,108,105,100,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,96,73,116,101,109,96,115,58,10,10,45,32,42,42,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,100,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,32,125,42,42,32,45,32,83,105,110,99,101,58,32,79,84,80,32,50,53,46,51,10,10,32,32,67,117,114,114,101,110,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,91,96,97,115,121,110,99,95,100,105,115,116,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,41,10,32,32,112,114,111,99,101,115,115,32,102,108,97,103,46,10,10,45,32,42,42,96,123,98,97,99,107,116,114,97,99,101,44,32,66,105,110,125,96,42,42,32,45,32,66,105,110,97,114,121,32,96,66,105,110,96,32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,116,104,101,10,32,32,111,117,116,112,117,116,32,102,114,111,109,32,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,98,97,99,107,116,114,97,99,101,41,96,46,32,85,115,101,10,32,32,91,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,111,98,116,97,105,110,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,32,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,46,10,10,45,32,42,42,96,123,98,105,110,97,114,121,44,32,66,105,110,73,110,102,111,125,96,42,42,32,45,32,96,66,105,110,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,98,105,110,97,114,105,101,115,32,111,110,32,116,104,101,32,104,101,97,112,32,111,102,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,10,32,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,110,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,10,32,32,96,66,105,110,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,46,32,84,104,101,32,116,117,112,108,101,115,32,99,111,110,116,97,105,110,59,32,96,66,105,110,97,114,121,73,100,96,44,32,96,66,105,110,97,114,121,83,105,122,101,96,44,10,32,32,96,66,105,110,97,114,121,82,101,102,99,67,111,117,110,116,96,46,10,10,32,32,68,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,91,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,32,112,114,111,99,101,115,115,10,32,32,102,108,97,103,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,109,97,121,32,98,101,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,46,10,10,45,32,42,42,96,123,99,97,116,99,104,108,101,118,101,108,44,32,67,97,116,99,104,76,101,118,101,108,125,96,42,42,32,45,32,96,67,97,116,99,104,76,101,118,101,108,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,99,117,114,114,101,110,116,108,121,10,32,32,97,99,116,105,118,101,32,99,97,116,99,104,101,115,32,105,110,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,10,32,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,32,124,32,117,110,100,101,102,105,110,101,100,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,10,32,32,96,70,117,110,99,116,105,111,110,96,44,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,118,97,108,117,101,10,32,32,96,117,110,100,101,102,105,110,101,100,96,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,110,97,116,105,118,101,10,32,32,99,111,109,112,105,108,101,100,32,99,111,100,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,108,111,99,97,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,44,32,76,111,99,97,116,105,111,110,125,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,10,32,32,96,70,117,110,99,116,105,111,110,96,44,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,96,76,111,99,97,116,105,111,110,96,32,105,115,10,32,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,108,111,99,97,116,105,111,110,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46,10,10,45,32,42,42,96,123,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,44,32,83,116,97,99,107,125,96,42,42,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,32,125,32,45,10,32,32,82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,10,32,32,40,95,115,116,97,99,107,116,114,97,99,101,95,41,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,116,97,99,107,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,115,32,105,110,32,116,104,101,32,96,99,97,116,99,104,96,10,32,32,112,97,114,116,32,111,102,32,97,32,96,116,114,121,96,46,32,83,101,101,10,32,32,91,84,104,101,32,99,97,108,108,45,115,116,97,99,107,32,98,97,99,107,32,116,114,97,99,101,32,40,115,116,97,99,107,116,114,97,99,101,41,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,115,116,97,99,107,116,114,97,99,101,96,41,46,32,84,104,101,10,32,32,100,101,112,116,104,32,111,102,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,96,98,97,99,107,116,114,97,99,101,95,100,101,112,116,104,96,32,115,121,115,116,101,109,10,32,32,102,108,97,103,32,115,101,116,116,105,110,103,46,10,10,45,32,42,42,96,123,100,105,99,116,105,111,110,97,114,121,44,32,68,105,99,116,105,111,110,97,114,121,125,96,42,42,32,45,32,96,68,105,99,116,105,111,110,97,114,121,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,45,32,42,42,96,123,123,100,105,99,116,105,111,110,97,114,121,44,32,75,101,121,125,44,32,86,97,108,117,101,125,96,42,42,32,45,32,96,86,97,108,117,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,110,32,116,104,101,10,32,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,45,32,42,42,96,123,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,77,111,100,117,108,101,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,32,105,115,32,116,104,101,32,96,109,58,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,109,111,100,117,108,101,32,117,115,101,100,32,98,121,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,40,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46,10,10,45,32,42,42,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,44,32,71,67,73,110,102,111,125,96,42,42,32,45,32,96,71,67,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,10,32,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,10,32,32,99,111,110,116,101,110,116,32,111,102,32,96,71,67,73,110,102,111,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,44,32,71,67,73,110,102,111,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,32,125,42,42,32,45,10,32,32,96,71,67,73,110,102,111,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,100,101,116,97,105,108,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,96,71,67,73,110,102,111,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,10,32,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,101,97,99,104,32,105,116,101,109,44,32,115,101,101,10,32,32,91,96,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,93,40,96,109,58,116,114,97,99,101,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116,96,41,32,105,110,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,46,10,10,45,32,42,42,96,123,103,114,111,117,112,95,108,101,97,100,101,114,44,32,71,114,111,117,112,76,101,97,100,101,114,125,96,42,42,32,45,32,96,71,114,111,117,112,76,101,97,100,101,114,96,32,105,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,10,32,32,73,47,79,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,121,111,117,110,103,101,115,116,32,104,101,97,112,10,32,32,103,101,110,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,103,101,110,101,114,97,116,105,111,110,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,105,115,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,10,32,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,99,104,97,110,103,101,115,46,10,10,45,32,42,42,96,123,105,110,105,116,105,97,108,95,99,97,108,108,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,125,96,42,42,32,45,32,96,77,111,100,117,108,101,96,44,32,96,70,117,110,99,116,105,111,110,96,44,10,32,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,105,110,105,116,105,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,97,119,110,101,100,46,10,10,45,32,42,42,96,123,108,105,110,107,115,44,32,80,105,100,115,65,110,100,80,111,114,116,115,125,96,42,42,32,45,32,96,80,105,100,115,65,110,100,80,111,114,116,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,10,32,32,97,110,100,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,116,111,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,108,105,110,107,46,10,10,45,32,42,42,96,123,108,97,115,116,95,99,97,108,108,115,44,32,102,97,108,115,101,124,67,97,108,108,115,125,96,42,42,32,45,32,84,104,101,32,118,97,108,117,101,32,105,115,32,96,102,97,108,115,101,96,32,105,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,110,111,116,10,32,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,51,96,41,46,32,73,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,97,99,116,105,118,101,44,32,97,10,32,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,32,119,104,105,99,104,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,99,97,108,108,101,100,46,10,10,45,32,42,42,96,123,109,101,109,111,114,121,44,32,83,105,122,101,125,96,42,42,32,45,32,91,93,40,41,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,109,101,109,111,114,121,32,125,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,10,32,32,98,121,116,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,99,97,108,108,32,115,116,97,99,107,44,32,104,101,97,112,44,32,97,110,100,32,105,110,116,101,114,110,97,108,32,115,116,114,117,99,116,117,114,101,115,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,44,32,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,125,96,42,42,32,45,32,96,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,10,32,32,111,102,32,109,101,115,115,97,103,101,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,116,104,101,32,108,101,110,103,116,104,10,32,32,111,102,32,116,104,101,32,108,105,115,116,32,96,77,101,115,115,97,103,101,81,117,101,117,101,96,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,116,101,109,32,96,109,101,115,115,97,103,101,115,96,32,40,115,101,101,10,32,32,98,101,108,111,119,41,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,115,44,32,77,101,115,115,97,103,101,81,117,101,117,101,125,96,42,42,32,45,32,96,77,101,115,115,97,103,101,81,117,101,117,101,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,109,101,115,115,97,103,101,115,32,116,111,10,32,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,104,97,118,101,32,110,111,116,32,121,101,116,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46,10,10,45,32,42,42,96,123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125,96,42,42,32,45,32,96,77,105,110,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,10,32,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125,96,42,42,32,45,32,96,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,96,32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,10,32,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125,96,42,42,32,45,32,65,32,108,105,115,116,32,111,102,32,105,100,101,110,116,105,102,105,101,114,115,32,102,111,114,32,97,108,108,32,116,104,101,10,32,32,112,114,111,99,101,115,115,101,115,44,32,112,111,114,116,115,32,97,110,100,32,78,73,70,32,114,101,115,111,117,114,99,101,115,44,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125,96,42,42,32,45,32,65,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,115,32,40,115,116,97,114,116,101,100,32,98,121,10,32,32,91,96,109,111,110,105,116,111,114,47,50,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,41,32,116,104,97,116,32,97,114,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,97,32,108,111,99,97,108,10,32,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,111,114,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,98,121,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,108,105,115,116,10,32,32,99,111,110,115,105,115,116,115,32,111,102,58,10,10,32,32,45,32,42,42,96,123,112,114,111,99,101,115,115,44,32,80,105,100,125,96,42,42,32,45,32,80,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,105,100,46,10,10,32,32,45,32,42,42,96,123,112,114,111,99,101,115,115,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125,96,42,42,32,45,32,76,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,10,32,32,32,32,110,97,109,101,46,10,10,32,32,45,32,42,42,96,123,112,111,114,116,44,32,80,111,114,116,73,100,125,96,42,42,32,45,32,76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,111,114,116,32,105,100,46,10,10,32,32,45,32,42,42,96,123,112,111,114,116,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125,96,42,42,32,45,32,76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46,32,80,108,101,97,115,101,10,32,32,32,32,110,111,116,101,44,32,116,104,97,116,32,114,101,109,111,116,101,32,112,111,114,116,32,109,111,110,105,116,111,114,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,115,111,32,96,78,111,100,101,96,32,119,105,108,108,32,97,108,119,97,121,115,32,98,101,10,32,32,32,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,46,10,10,45,32,42,42,96,123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125,96,42,42,32,45,32,96,77,81,68,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,32,111,102,32,116,104,101,10,32,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,96,111,102,102,95,104,101,97,112,96,32,111,114,10,32,32,96,111,110,95,104,101,97,112,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,46,10,10,45,32,42,42,96,123,112,97,114,101,110,116,44,32,80,105,100,125,96,42,42,32,45,32,96,80,105,100,96,32,105,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,44,32,116,104,101,32,111,110,101,10,32,32,116,104,97,116,32,115,112,97,119,110,101,100,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,97,32,112,97,114,101,110,116,10,32,32,96,117,110,100,101,102,105,110,101,100,96,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,108,121,32,116,104,101,32,105,110,105,116,105,97,108,32,112,114,111,99,101,115,115,32,40,96,105,110,105,116,96,41,32,111,110,32,97,32,110,111,100,101,32,108,97,99,107,115,32,97,10,32,32,112,97,114,101,110,116,44,32,116,104,111,117,103,104,46,10,10,45,32,42,42,96,123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125,96,42,42,32,45,32,96,76,101,118,101,108,96,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,32,102,111,114,32,116,104,101,10,32,32,112,114,111,99,101,115,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,41,46,10,10,45,32,42,42,96,123,114,101,100,117,99,116,105,111,110,115,44,32,78,117,109,98,101,114,125,96,42,42,32,45,32,96,78,117,109,98,101,114,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,101,120,101,99,117,116,101,100,32,98,121,10,32,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,65,116,111,109,125,96,42,42,32,45,32,96,65,116,111,109,96,32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,110,97,109,101,46,32,73,102,32,116,104,101,10,32,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,116,104,105,115,32,116,117,112,108,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46,10,10,45,32,42,42,96,123,115,101,113,117,101,110,116,105,97,108,95,116,114,97,99,101,95,116,111,107,101,110,44,32,91,93,32,124,32,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,125,96,42,42,32,45,10,32,32,96,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,96,32,105,115,32,116,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,10,32,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,115,116,97,99,107,95,115,105,122,101,44,32,83,105,122,101,125,96,42,42,32,45,32,96,83,105,122,101,96,32,105,115,32,116,104,101,32,115,116,97,99,107,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,123,115,116,97,116,117,115,44,32,83,116,97,116,117,115,125,96,42,42,32,45,32,96,83,116,97,116,117,115,96,32,105,115,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,110,100,32,105,115,32,111,110,101,32,111,102,10,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,96,101,120,105,116,105,110,103,96,10,32,32,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,110,103,96,10,32,32,45,32,96,119,97,105,116,105,110,103,96,32,40,102,111,114,32,97,32,109,101,115,115,97,103,101,41,10,32,32,45,32,96,114,117,110,110,105,110,103,96,10,32,32,45,32,96,114,117,110,110,97,98,108,101,96,32,40,114,101,97,100,121,32,116,111,32,114,117,110,44,32,98,117,116,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,115,32,114,117,110,110,105,110,103,41,10,32,32,45,32,96,115,117,115,112,101,110,100,101,100,96,32,40,115,117,115,112,101,110,100,101,100,32,111,110,32,97,32,34,98,117,115,121,34,32,112,111,114,116,32,111,114,32,98,121,32,116,104,101,32,66,73,70,10,32,32,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,44,50,96,41,10,10,45,32,42,42,96,123,115,117,115,112,101,110,100,105,110,103,44,32,83,117,115,112,101,110,100,101,101,76,105,115,116,125,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,76,105,115,116,96,32,105,115,32,97,32,108,105,115,116,32,111,102,10,32,32,96,123,83,117,115,112,101,110,100,101,101,44,32,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,44,32,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,125,96,32,116,117,112,108,101,115,46,32,96,83,117,115,112,101,110,100,101,101,96,10,32,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,101,101,110,44,32,111,114,32,105,115,32,116,111,32,98,101,44,32,115,117,115,112,101,110,100,101,100,10,32,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,116,104,114,111,117,103,104,32,116,104,101,32,66,73,70,10,32,32,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,32,111,114,10,32,32,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,41,46,10,10,32,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,10,32,32,96,80,105,100,96,46,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,110,111,116,32,121,101,116,32,99,111,109,112,108,101,116,101,100,32,115,117,115,112,101,110,100,10,32,32,114,101,113,117,101,115,116,115,32,115,101,110,116,32,98,121,32,96,80,105,100,96,44,32,116,104,97,116,32,105,115,58,10,10,32,32,45,32,73,102,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48,96,44,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,10,32,32,32,32,115,116,97,116,101,46,10,32,32,45,32,73,102,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48,96,44,32,111,112,116,105,111,110,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,102,10,32,32,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,101,101,32,104,97,115,32,110,111,116,32,121,101,116,32,98,101,101,110,10,32,32,32,32,115,117,115,112,101,110,100,101,100,32,98,121,32,96,80,105,100,96,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,96,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,96,32,97,110,100,32,96,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,96,32,97,114,101,32,110,111,116,32,116,104,101,10,32,32,116,111,116,97,108,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,44,32,111,110,108,121,32,116,104,101,32,112,97,114,116,115,32,99,111,110,116,114,105,98,117,116,101,100,32,98,121,32,96,80,105,100,96,46,10,10,45,32,42,42,96,123,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125,96,123,58,32,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,32,125,42,42,32,45,32,96,83,105,122,101,96,32,105,115,10,32,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,97,108,108,32,104,101,97,112,32,102,114,97,103,109,101,110,116,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,32,97,110,100,32,97,110,121,32,117,110,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,10,32,32,111,102,32,116,104,101,32,104,101,97,112,46,10,10,45,32,42,42,96,123,116,114,97,99,101,44,32,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,125,96,42,42,32,45,32,96,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,105,110,116,101,114,110,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,96,73,110,102,111,84,117,112,108,101,96,32,99,97,110,32,98,101,10,32,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,10,10,45,32,42,42,96,123,116,114,97,112,95,101,120,105,116,44,32,66,111,111,108,101,97,110,125,96,42,42,32,45,32,96,66,111,111,108,101,97,110,96,32,105,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,116,114,97,112,112,105,110,103,10,32,32,101,120,105,116,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,115,117,112,112,111,114,116,32,97,108,108,32,116,104,101,115,101,32,96,73,116,101,109,96,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,73,116,101,109,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,105,116,101,109,46>>},#{group => processes,specification => [{attribute,{7958,2},spec,{{process_info,2},[{type,{7958,19},bounded_fun,[{type,{7958,19},'fun',[{type,{7958,19},product,[{var,{7958,20},'Pid'},{var,{7958,25},'Item'}]},{type,{7959,27},union,[{var,{7959,27},'InfoTuple'},{type,{7959,39},nil,[]},{atom,{7959,44},undefined}]}]},[{type,{7960,7},constraint,[{atom,{7960,7},is_subtype},[{var,{7960,7},'Pid'},{type,{7960,14},pid,[]}]]},{type,{7961,7},constraint,[{atom,{7961,7},is_subtype},[{var,{7961,7},'Item'},{user_type,{7961,15},process_info_item,[]}]]},{type,{7962,7},constraint,[{atom,{7962,7},is_subtype},[{var,{7962,7},'InfoTuple'},{user_type,{7962,20},process_info_result_item,[]}]]}]]},{type,{7963,19},bounded_fun,[{type,{7963,19},'fun',[{type,{7963,19},product,[{var,{7963,20},'Pid'},{var,{7963,25},'ItemList'}]},{type,{7963,38},union,[{var,{7963,38},'InfoTupleList'},{type,{7963,54},nil,[]},{atom,{7963,59},undefined}]}]},[{type,{7964,7},constraint,[{atom,{7964,7},is_subtype},[{var,{7964,7},'Pid'},{type,{7964,14},pid,[]}]]},{type,{7965,7},constraint,[{atom,{7965,7},is_subtype},[{var,{7965,7},'ItemList'},{type,{7965,19},list,[{var,{7965,20},'Item'}]}]]},{type,{7966,7},constraint,[{atom,{7966,7},is_subtype},[{var,{7966,7},'Item'},{user_type,{7966,15},process_info_item,[]}]]},{type,{7967,7},constraint,[{atom,{7967,7},is_subtype},[{var,{7967,7},'InfoTupleList'},{type,{7967,24},list,[{var,{7967,25},'InfoTuple'}]}]]},{type,{7968,7},constraint,[{atom,{7968,7},is_subtype},[{var,{7968,7},'InfoTuple'},{user_type,{7968,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,process_flag,2},{7308,2},[<<112,114,111,99,101,115,115,95,102,108,97,103,40,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,110,100,105,99,97,116,101,100,32,116,111,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,118,97,108,117,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,10,111,102,32,116,104,101,32,102,108,97,103,46,10,10,96,70,108,97,103,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,97,115,121,110,99,95,100,105,115,116,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,97,115,121,110,99,95,100,105,115,116,32,125,10,32,32,10,32,32,69,110,97,98,108,101,32,111,114,32,100,105,115,97,98,108,101,32,95,102,117,108,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,105,110,103,95,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,100,105,115,97,98,108,101,100,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,101,110,100,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,101,100,10,32,32,115,105,103,110,97,108,32,119,105,108,108,32,98,108,111,99,107,32,105,110,32,116,104,101,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,32,105,102,32,116,104,101,32,98,117,102,102,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,10,32,32,99,104,97,110,110,101,108,32,114,101,97,99,104,32,116,104,101,32,91,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,122,100,98,98,108,41,46,32,84,104,101,10,32,32,112,114,111,99,101,115,115,32,119,105,108,108,32,114,101,109,97,105,110,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,98,117,102,102,101,114,32,115,104,114,105,110,107,115,32,101,110,111,117,103,104,46,32,84,104,105,115,32,109,105,103,104,116,32,105,110,32,115,111,109,101,10,32,32,99,97,115,101,115,32,116,97,107,101,32,97,32,115,117,98,115,116,97,110,116,105,97,108,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,46,32,87,104,101,110,32,96,97,115,121,110,99,95,100,105,115,116,96,32,105,115,32,101,110,97,98,108,101,100,44,32,115,101,110,100,10,32,32,111,112,101,114,97,116,105,111,110,115,32,111,102,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,32,119,105,108,108,32,97,108,119,97,121,115,32,98,117,102,102,101,114,32,116,104,101,32,115,105,103,110,97,108,32,111,110,32,116,104,101,32,111,117,116,103,111,105,110,103,10,32,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,97,110,100,32,116,104,101,110,32,105,109,109,101,100,105,97,116,101,108,121,32,114,101,116,117,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,115,101,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,10,32,32,119,105,108,108,32,95,110,101,118,101,114,95,32,98,108,111,99,107,32,116,104,101,32,115,101,110,100,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,83,105,110,99,101,32,110,111,32,102,108,111,119,32,99,111,110,116,114,111,108,32,105,115,32,101,110,102,111,114,99,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,104,101,110,32,96,97,115,121,110,99,95,100,105,115,116,96,10,32,32,62,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,101,110,97,98,108,101,100,44,32,121,111,117,32,110,101,101,100,32,116,111,32,109,97,107,101,32,115,117,114,101,32,116,104,97,116,32,102,108,111,119,32,99,111,110,116,114,111,108,32,102,111,114,32,115,117,99,104,32,100,97,116,97,10,32,32,62,32,105,115,32,105,109,112,108,101,109,101,110,116,101,100,44,32,111,114,32,116,104,97,116,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,117,99,104,32,100,97,116,97,32,105,115,32,107,110,111,119,110,32,116,111,32,97,108,119,97,121,115,32,98,101,32,108,105,109,105,116,101,100,46,10,32,32,62,32,85,110,108,105,109,105,116,101,100,32,115,105,103,110,97,108,105,110,103,32,119,105,116,104,32,96,97,115,121,110,99,95,100,105,115,116,96,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,102,108,111,119,32,99,111,110,116,114,111,108,10,32,32,62,32,119,105,108,108,32,116,121,112,105,99,97,108,108,121,32,99,97,117,115,101,32,116,104,101,32,115,101,110,100,105,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,99,114,97,115,104,32,111,110,32,97,110,32,111,117,116,32,111,102,32,109,101,109,111,114,121,10,32,32,62,32,99,111,110,100,105,116,105,111,110,46,10,32,32,10,32,32,66,108,111,99,107,105,110,103,32,100,117,101,32,116,111,32,100,105,115,97,98,108,101,100,32,96,97,115,121,110,99,95,100,105,115,116,96,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,98,121,10,32,32,91,96,116,114,97,99,101,58,115,121,115,116,101,109,40,41,96,93,40,96,116,114,97,99,101,58,115,121,115,116,101,109,47,51,96,41,32,117,115,105,110,103,32,116,104,101,10,32,32,91,96,98,117,115,121,95,100,105,115,116,95,112,111,114,116,96,93,40,96,109,58,116,114,97,99,101,35,98,117,115,121,95,100,105,115,116,95,112,111,114,116,96,41,32,111,112,116,105,111,110,46,32,79,110,108,121,32,100,97,116,97,32,98,117,102,102,101,114,101,100,32,98,121,10,32,32,112,114,111,99,101,115,115,101,115,32,119,104,105,99,104,32,40,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,115,101,110,100,105,110,103,32,97,32,115,105,103,110,97,108,41,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,96,97,115,121,110,99,95,100,105,115,116,96,10,32,32,119,105,108,108,32,98,101,32,99,111,117,110,116,101,100,32,119,104,101,110,32,100,101,116,101,114,109,105,110,105,110,103,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,97,110,32,111,112,101,114,97,116,105,111,110,32,115,104,111,117,108,100,32,98,108,111,99,107,32,116,104,101,10,32,32,99,97,108,108,101,114,46,10,32,32,10,32,32,84,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,111,110,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,105,116,32,117,115,105,110,103,10,32,32,116,104,101,32,91,96,115,112,97,119,110,95,111,112,116,40,41,96,93,40,96,115,112,97,119,110,95,111,112,116,47,52,96,41,32,66,73,70,32,119,105,116,104,32,116,104,101,32,111,112,116,105,111,110,10,32,32,91,96,123,97,115,121,110,99,95,100,105,115,116,44,32,69,110,97,98,108,101,125,96,93,40,35,115,112,97,119,110,95,111,112,116,95,97,115,121,110,99,95,100,105,115,116,41,46,32,84,104,101,32,100,101,102,97,117,108,116,10,32,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,116,111,32,117,115,101,32,111,110,32,110,101,119,108,121,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,10,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,112,97,100,41,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,10,32,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,102,32,116,104,101,32,96,43,112,97,100,32,60,98,111,111,108,101,97,110,62,96,32,99,111,109,109,97,110,100,32,108,105,110,101,32,97,114,103,117,109,101,110,116,32,105,115,32,110,111,116,32,112,97,115,115,101,100,44,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,102,108,97,103,32,119,105,108,108,32,98,101,32,96,102,97,108,115,101,96,46,10,32,32,10,32,32,89,111,117,32,99,97,110,32,105,110,115,112,101,99,116,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,96,97,115,121,110,99,95,100,105,115,116,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,111,102,32,97,32,112,114,111,99,101,115,115,32,98,121,10,32,32,99,97,108,108,105,110,103,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,97,115,121,110,99,95,100,105,115,116,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,97,115,121,110,99,95,100,105,115,116,41,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,116,114,97,112,95,101,120,105,116,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,32,125,10,32,32,10,32,32,87,104,101,110,32,96,116,114,97,112,95,101,120,105,116,96,32,105,115,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,114,105,118,105,110,103,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,114,101,10,32,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,99,101,105,118,101,100,32,97,115,10,32,32,111,114,100,105,110,97,114,121,32,109,101,115,115,97,103,101,115,46,32,73,102,32,96,116,114,97,112,95,101,120,105,116,96,32,105,115,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,105,102,32,105,116,10,32,32,114,101,99,101,105,118,101,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,111,116,104,101,114,32,116,104,97,110,32,96,110,111,114,109,97,108,96,32,97,110,100,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,116,111,10,32,32,105,116,115,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,65,112,112,108,105,99,97,116,105,111,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,116,111,32,116,114,97,112,32,101,120,105,116,115,46,10,32,32,10,32,32,83,101,101,32,97,108,115,111,32,96,101,120,105,116,47,50,96,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,109,111,100,117,108,101,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,101,114,114,111,114,95,104,97,110,100,108,101,114,32,125,10,32,32,10,32,32,85,115,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,116,111,32,114,101,100,101,102,105,110,101,32,116,104,101,32,96,109,58,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,110,100,10,32,32,117,110,100,101,102,105,110,101,100,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,101,115,46,32,85,115,101,32,116,104,105,115,32,102,108,97,103,32,119,105,116,104,32,115,117,98,115,116,97,110,116,105,97,108,32,99,97,117,116,105,111,110,44,32,97,115,32,99,111,100,101,10,32,32,97,117,116,111,45,108,111,97,100,105,110,103,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,99,111,114,114,101,99,116,32,111,112,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,109,111,100,117,108,101,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,10,32,32,102,117,108,108,115,119,101,101,112,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101,32,125,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,32,125,10,32,32,10,32,32,84,104,105,115,32,102,108,97,103,32,115,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,102,32,96,77,97,120,72,101,97,112,83,105,122,101,96,10,32,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32,96,107,105,108,108,96,32,97,110,100,32,96,101,114,114,111,114,95,108,111,103,103,101,114,96,32,97,114,101,32,117,115,101,100,46,10,32,32,10,32,32,70,111,114,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,101,32,104,101,97,112,32,103,114,111,119,115,44,32,115,101,101,10,32,32,91,83,105,122,105,110,103,32,116,104,101,32,104,101,97,112,93,40,71,97,114,98,97,103,101,67,111,108,108,101,99,116,105,111,110,46,109,100,35,115,105,122,105,110,103,45,116,104,101,45,104,101,97,112,41,32,105,110,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,10,32,32,10,32,32,45,32,42,42,96,115,105,122,101,96,42,42,32,45,32,84,104,101,32,109,97,120,105,109,117,109,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,115,101,116,32,116,111,32,122,101,114,111,44,32,116,104,101,10,32,32,32,32,104,101,97,112,32,115,105,122,101,32,108,105,109,105,116,32,105,115,32,100,105,115,97,98,108,101,100,46,32,96,98,97,100,97,114,103,96,32,105,115,32,98,101,32,116,104,114,111,119,110,32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,115,32,115,109,97,108,108,101,114,10,32,32,32,32,116,104,97,110,32,91,96,109,105,110,95,104,101,97,112,95,115,105,122,101,96,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101,41,46,32,84,104,101,32,115,105,122,101,32,99,104,101,99,107,10,32,32,32,32,105,115,32,111,110,108,121,32,100,111,110,101,32,119,104,101,110,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,10,32,32,10,32,32,32,32,96,115,105,122,101,96,32,105,115,32,116,104,101,32,101,110,116,105,114,101,32,104,101,97,112,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,10,32,32,32,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,97,108,108,32,103,101,110,101,114,97,116,105,111,110,97,108,32,104,101,97,112,115,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,44,32,97,110,121,10,32,32,32,32,91,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,41,44,10,32,32,32,32,97,110,100,32,97,110,121,32,101,120,116,114,97,32,109,101,109,111,114,121,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,111,114,32,110,101,101,100,115,32,100,117,114,105,110,103,32,99,111,108,108,101,99,116,105,111,110,46,10,32,32,10,32,32,32,32,96,115,105,122,101,96,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,117,115,105,110,103,10,32,32,32,32,91,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41,44,10,32,32,32,32,111,114,32,98,121,32,97,100,100,105,110,103,32,96,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,44,32,96,111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101,96,32,97,110,100,32,96,109,98,117,102,95,115,105,122,101,96,32,102,114,111,109,10,32,32,32,32,91,96,101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41,96,93,40,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41,46,10,32,32,10,32,32,45,32,42,42,96,107,105,108,108,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,101,110,100,115,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,10,32,32,32,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,10,32,32,32,32,84,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,96,107,105,108,108,96,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,100,44,32,105,110,115,116,101,97,100,32,116,104,101,10,32,32,32,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,87,104,101,110,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,10,32,32,32,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,105,110,115,116,101,97,100,32,105,116,32,99,111,110,116,105,110,117,101,115,32,101,120,101,99,117,116,105,110,103,46,10,32,32,10,32,32,32,32,73,102,32,96,107,105,108,108,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,119,105,108,108,32,98,101,32,117,115,101,100,46,32,84,104,101,10,32,32,32,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,116,114,117,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,111,112,116,105,111,110,10,32,32,32,32,91,92,43,104,109,97,120,107,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,107,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,45,32,42,42,96,101,114,114,111,114,95,108,111,103,103,101,114,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,108,111,103,115,32,97,110,32,101,114,114,111,114,10,32,32,32,32,101,118,101,110,116,32,118,105,97,32,96,109,58,108,111,103,103,101,114,96,44,32,99,111,110,116,97,105,110,105,110,103,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,116,104,101,32,109,97,120,105,109,117,109,10,32,32,32,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,79,110,101,32,108,111,103,32,101,118,101,110,116,32,105,115,32,115,101,110,116,32,101,97,99,104,32,116,105,109,101,32,116,104,101,32,108,105,109,105,116,32,105,115,32,114,101,97,99,104,101,100,46,10,32,32,10,32,32,32,32,73,102,32,96,101,114,114,111,114,95,108,111,103,103,101,114,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,117,115,101,100,46,32,84,104,101,10,32,32,32,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,116,114,117,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,32,111,112,116,105,111,110,10,32,32,32,32,91,92,43,104,109,97,120,101,108,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,101,108,41,32,105,110,116,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,45,32,42,42,96,105,110,99,108,117,100,101,95,115,104,97,114,101,100,95,98,105,110,97,114,105,101,115,96,42,42,32,45,32,87,104,101,110,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,97,114,101,10,32,32,32,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,116,111,116,97,108,32,115,117,109,32,99,111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,96,115,105,122,101,96,32,108,105,109,105,116,46,32,79,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,10,32,32,32,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,108,97,114,103,101,114,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,109,97,121,32,98,101,32,115,104,97,114,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,10,32,32,32,32,111,102,32,97,32,115,104,97,114,101,100,32,98,105,110,97,114,121,32,105,115,32,105,110,99,108,117,100,101,100,32,98,121,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,114,105,110,103,32,105,116,46,32,65,108,115,111,44,10,32,32,32,32,116,104,101,32,101,110,116,105,114,101,32,115,105,122,101,32,111,102,32,97,32,108,97,114,103,101,32,98,105,110,97,114,121,32,109,97,121,32,98,101,32,105,110,99,108,117,100,101,100,32,101,118,101,110,32,105,102,32,111,110,108,121,32,97,32,115,109,97,108,108,101,114,32,112,97,114,116,10,32,32,32,32,111,102,32,105,116,32,105,115,32,114,101,102,101,114,114,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,32,32,73,102,32,96,105,110,99,108,117,100,101,95,115,104,97,114,101,100,95,98,105,110,97,114,105,101,115,96,32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,10,32,32,32,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,96,102,97,108,115,101,96,46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,10,32,32,32,32,111,112,116,105,111,110,32,91,92,43,104,109,97,120,105,98,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,97,120,105,98,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,44,32,111,114,10,32,32,32,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41,96,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101,41,46,10,32,32,10,32,32,84,104,101,32,104,101,97,112,32,115,105,122,101,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,113,117,105,116,101,32,104,97,114,100,32,116,111,32,112,114,101,100,105,99,116,44,32,101,115,112,101,99,105,97,108,108,121,32,116,104,101,32,97,109,111,117,110,116,32,111,102,10,32,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,99,111,110,116,101,109,112,108,97,116,105,110,103,32,117,115,105,110,103,32,116,104,105,115,10,32,32,111,112,116,105,111,110,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,102,105,114,115,116,32,114,117,110,32,105,116,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,119,105,116,104,32,96,107,105,108,108,96,32,115,101,116,32,116,111,10,32,32,96,102,97,108,115,101,96,32,97,110,100,32,105,110,115,112,101,99,116,32,116,104,101,32,108,111,103,32,101,118,101,110,116,115,32,116,111,32,115,101,101,32,119,104,97,116,32,116,104,101,32,110,111,114,109,97,108,32,112,101,97,107,32,115,105,122,101,115,32,111,102,32,116,104,101,10,32,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,97,110,100,32,116,104,101,110,32,116,117,110,101,32,116,104,101,32,118,97,108,117,101,32,97,99,99,111,114,100,105,110,103,108,121,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,32,125,10,32,32,10,32,32,68,101,116,101,114,109,105,110,101,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,114,101,32,115,116,111,114,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58,10,32,32,10,32,32,45,32,42,42,96,111,102,102,95,104,101,97,112,96,42,42,32,45,32,95,65,108,108,95,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,115,116,111,114,101,100,32,111,117,116,115,105,100,101,10,32,32,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32,95,110,111,95,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,10,32,32,32,32,112,97,114,116,32,111,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,45,32,42,42,96,111,110,95,104,101,97,112,96,42,42,32,45,32,65,108,108,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,98,101,32,112,108,97,99,101,100,32,111,110,10,32,32,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,101,121,32,99,97,110,44,32,104,111,119,101,118,101,114,44,32,98,101,32,116,101,109,112,111,114,97,114,105,108,121,32,115,116,111,114,101,100,32,111,102,102,32,116,104,101,32,104,101,97,112,46,32,84,104,105,115,10,32,32,32,32,105,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,97,108,119,97,121,115,32,98,101,101,110,32,115,116,111,114,101,100,32,117,112,32,117,110,116,105,108,32,69,82,84,83,32,56,46,48,46,10,32,32,10,32,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,96,32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,10,32,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,104,109,113,100,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,104,109,113,100,41,32,105,110,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,32,32,10,32,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,109,97,121,32,112,111,116,101,110,116,105,97,108,108,121,32,97,99,99,117,109,117,108,97,116,101,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,105,110,32,105,116,115,10,32,32,113,117,101,117,101,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,115,101,116,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,116,111,32,96,111,102,102,95,104,101,97,112,96,46,32,84,104,105,115,32,105,115,32,100,117,101,32,116,111,32,116,104,101,10,32,32,102,97,99,116,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,10,32,32,109,101,115,115,97,103,101,115,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,32,99,97,110,32,98,101,99,111,109,101,32,101,120,116,114,101,109,101,108,121,32,101,120,112,101,110,115,105,118,101,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,110,10,32,32,99,111,110,115,117,109,101,32,108,97,114,103,101,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,46,32,84,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,10,32,32,105,115,44,32,104,111,119,101,118,101,114,44,32,103,101,110,101,114,97,108,108,121,32,98,101,116,116,101,114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,105,115,32,96,111,110,95,104,101,97,112,96,46,10,32,32,10,32,32,67,104,97,110,103,105,110,103,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,99,97,117,115,101,115,32,97,110,121,32,101,120,105,115,116,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,98,101,32,109,111,118,101,100,46,32,84,104,101,32,109,111,118,101,10,32,32,111,112,101,114,97,116,105,111,110,32,105,115,32,105,110,105,116,105,97,116,101,100,44,32,98,117,116,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,99,111,109,112,108,101,116,101,100,44,32,98,121,32,116,104,101,32,116,105,109,101,32,116,104,101,32,102,117,110,99,116,105,111,110,10,32,32,114,101,116,117,114,110,115,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121,32,125,10,32,32,10,32,32,83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,46,32,96,76,101,118,101,108,96,32,105,115,32,97,110,32,97,116,111,109,46,32,70,111,117,114,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,115,32,101,120,105,115,116,58,10,32,32,96,108,111,119,96,44,32,96,110,111,114,109,97,108,96,44,32,96,104,105,103,104,96,44,32,97,110,100,32,96,109,97,120,96,46,32,68,101,102,97,117,108,116,32,105,115,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,80,114,105,111,114,105,116,121,32,108,101,118,101,108,32,96,109,97,120,96,32,105,115,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,110,116,101,114,110,97,108,32,117,115,101,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,62,32,115,121,115,116,101,109,44,32,97,110,100,32,105,115,32,95,110,111,116,95,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,111,116,104,101,114,115,46,10,32,32,10,32,32,73,110,116,101,114,110,97,108,108,121,32,105,110,32,101,97,99,104,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,44,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,115,99,104,101,100,117,108,101,100,32,105,110,32,97,32,114,111,117,110,100,32,114,111,98,105,110,10,32,32,102,97,115,104,105,111,110,46,10,32,32,10,32,32,69,120,101,99,117,116,105,111,110,32,111,102,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,32,97,110,100,32,96,108,111,119,96,32,97,114,101,32,105,110,116,101,114,108,101,97,118,101,100,46,32,80,114,111,99,101,115,115,101,115,10,32,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,108,101,115,115,32,102,114,101,113,117,101,110,116,108,121,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,10,32,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,10,32,32,111,114,32,96,110,111,114,109,97,108,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,116,104,105,115,32,100,111,101,115,32,95,110,111,116,95,32,109,101,97,110,10,32,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,32,111,114,32,96,110,111,114,109,97,108,96,32,99,97,110,32,114,117,110,32,119,104,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,10,32,32,114,117,110,110,105,110,103,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,87,104,101,110,32,117,115,105,110,103,32,109,117,108,116,105,112,108,101,32,115,99,104,101,100,117,108,101,114,115,44,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,99,97,110,10,32,32,98,101,32,114,117,110,110,105,110,103,32,105,110,32,112,97,114,97,108,108,101,108,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,84,104,97,116,32,105,115,44,32,97,32,96,108,111,119,96,32,97,110,100,32,97,10,32,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,110,32,101,120,101,99,117,116,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,10,32,32,10,32,32,87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,109,97,120,96,32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,108,111,119,96,44,10,32,32,96,110,111,114,109,97,108,96,44,32,111,114,32,96,104,105,103,104,96,32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,65,115,32,119,105,116,104,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,44,10,32,32,112,114,111,99,101,115,115,101,115,32,111,110,32,108,111,119,101,114,32,112,114,105,111,114,105,116,105,101,115,32,99,97,110,32,101,120,101,99,117,116,101,32,105,110,32,112,97,114,97,108,108,101,108,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,10,32,32,96,109,97,120,96,46,10,32,32,10,32,32,83,99,104,101,100,117,108,105,110,103,32,105,115,32,112,114,101,45,101,109,112,116,105,118,101,46,32,82,101,103,97,114,100,108,101,115,115,32,111,102,32,112,114,105,111,114,105,116,121,44,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,114,101,45,101,109,112,116,101,100,32,119,104,101,110,10,32,32,105,116,32,104,97,115,32,99,111,110,115,117,109,101,100,32,109,111,114,101,32,116,104,97,110,32,97,32,99,101,114,116,97,105,110,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,10,32,32,119,97,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,10,32,32,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,115,99,104,101,100,117,108,105,110,103,32,116,111,32,114,101,109,97,105,110,32,101,120,97,99,116,108,121,32,97,115,32,105,116,32,105,115,32,116,111,100,97,121,46,32,83,99,104,101,100,117,108,105,110,103,10,32,32,62,32,105,115,32,108,105,107,101,108,121,32,116,111,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,32,116,111,32,117,115,101,32,97,118,97,105,108,97,98,108,101,32,112,114,111,99,101,115,115,111,114,32,99,111,114,101,115,10,32,32,62,32,98,101,116,116,101,114,46,10,32,32,10,32,32,84,104,101,114,101,32,105,115,32,95,110,111,95,32,97,117,116,111,109,97,116,105,99,32,109,101,99,104,97,110,105,115,109,32,102,111,114,32,97,118,111,105,100,105,110,103,32,112,114,105,111,114,105,116,121,32,105,110,118,101,114,115,105,111,110,44,32,115,117,99,104,32,97,115,10,32,32,112,114,105,111,114,105,116,121,32,105,110,104,101,114,105,116,97,110,99,101,32,111,114,32,112,114,105,111,114,105,116,121,32,99,101,105,108,105,110,103,115,46,32,87,104,101,110,32,117,115,105,110,103,32,112,114,105,111,114,105,116,105,101,115,44,32,116,97,107,101,32,116,104,105,115,32,105,110,116,111,10,32,32,97,99,99,111,117,110,116,32,97,110,100,32,104,97,110,100,108,101,32,115,117,99,104,32,115,99,101,110,97,114,105,111,115,32,98,121,32,121,111,117,114,115,101,108,102,46,10,32,32,10,32,32,77,97,107,105,110,103,32,99,97,108,108,115,32,102,114,111,109,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,105,110,116,111,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,115,32,110,111,32,99,111,110,116,114,111,108,10,32,32,111,118,101,114,32,99,97,110,32,99,97,117,115,101,32,116,104,101,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,111,32,119,97,105,116,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,119,105,116,104,32,108,111,119,101,114,10,32,32,112,114,105,111,114,105,116,121,46,32,84,104,97,116,32,105,115,44,32,101,102,102,101,99,116,105,118,101,108,121,32,100,101,99,114,101,97,115,105,110,103,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,10,32,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,46,32,69,118,101,110,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,32,119,105,116,104,32,111,110,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,10,32,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,118,101,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,44,32,105,116,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,10,32,32,105,116,46,32,84,104,105,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,111,99,99,117,114,32,105,102,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,114,105,103,103,101,114,115,32,99,111,100,101,10,32,32,108,111,97,100,105,110,103,44,32,97,115,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,114,117,110,115,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,32,32,79,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,116,104,97,110,32,96,110,111,114,109,97,108,96,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,87,104,101,110,32,111,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,10,32,32,97,114,101,32,117,115,101,100,44,32,117,115,101,32,116,104,101,109,32,119,105,116,104,32,99,97,114,101,44,32,95,101,115,112,101,99,105,97,108,108,121,95,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,46,32,65,32,112,114,111,99,101,115,115,32,111,110,10,32,32,112,114,105,111,114,105,116,121,32,96,104,105,103,104,96,32,105,115,32,111,110,108,121,32,116,111,32,112,101,114,102,111,114,109,32,119,111,114,107,32,102,111,114,32,115,104,111,114,116,32,112,101,114,105,111,100,115,46,32,66,117,115,121,32,108,111,111,112,105,110,103,32,102,111,114,32,108,111,110,103,10,32,32,112,101,114,105,111,100,115,32,105,110,32,97,32,96,104,105,103,104,96,32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,117,115,101,115,32,109,111,115,116,32,108,105,107,101,108,121,32,112,114,111,98,108,101,109,115,44,32,97,115,32,105,109,112,111,114,116,97,110,116,10,32,32,79,84,80,32,115,101,114,118,101,114,115,32,114,117,110,32,111,110,32,112,114,105,111,114,105,116,121,32,96,110,111,114,109,97,108,96,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,115,97,118,101,95,99,97,108,108,115,44,32,48,46,46,49,48,48,48,48,41,10,32,32,96,96,96,10,32,32,10,32,32,96,78,96,32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32,48,46,46,49,48,48,48,48,46,32,73,102,32,96,78,96,32,62,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,109,97,100,101,10,32,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,78,96,32,109,111,115,116,32,114,101,99,101,110,116,10,32,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,66,73,70,32,99,97,108,108,115,44,32,115,101,110,100,115,44,32,97,110,100,32,114,101,99,101,105,118,101,115,32,109,97,100,101,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,10,32,32,115,97,118,101,100,32,105,110,32,97,32,108,105,115,116,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,10,32,32,91,96,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,108,97,115,116,95,99,97,108,108,115,41,96,93,40,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,41,46,32,65,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,105,115,10,32,32,111,110,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,109,111,100,117,108,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,109,101,110,116,105,111,110,101,100,46,32,79,110,108,121,32,97,32,102,105,120,101,100,10,32,32,97,109,111,117,110,116,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,115,97,118,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58,10,32,32,10,32,32,45,32,65,32,116,117,112,108,101,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,96,32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,10,32,32,45,32,84,104,101,32,97,116,111,109,115,32,96,115,101,110,100,96,44,32,96,39,114,101,99,101,105,118,101,39,96,44,32,97,110,100,32,96,116,105,109,101,111,117,116,96,32,102,111,114,32,115,101,110,100,115,32,97,110,100,32,114,101,99,101,105,118,101,115,10,32,32,32,32,40,96,39,114,101,99,101,105,118,101,39,96,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,97,110,100,32,96,116,105,109,101,111,117,116,96,32,119,104,101,110,32,97,32,114,101,99,101,105,118,101,32,116,105,109,101,115,10,32,32,32,32,111,117,116,41,10,32,32,10,32,32,73,102,32,96,78,96,32,61,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,32,32,87,104,101,110,101,118,101,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,115,101,116,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,114,101,115,101,116,46,10,32,32,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,98,111,111,108,101,97,110,40,41,41,10,32,32,96,96,96,10,32,32,10,32,32,83,101,116,115,32,111,114,32,99,108,101,97,114,115,32,102,108,97,103,32,96,115,101,110,115,105,116,105,118,101,96,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,10,32,32,109,97,114,107,101,100,32,97,115,32,115,101,110,115,105,116,105,118,101,32,98,121,32,99,97,108,108,105,110,103,10,32,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,116,114,117,101,41,96,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,102,101,97,116,117,114,101,115,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,101,120,97,109,105,110,105,110,103,32,116,104,101,32,100,97,116,97,32,111,114,32,105,110,110,101,114,32,119,111,114,107,105,110,103,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,97,114,101,32,115,105,108,101,110,116,108,121,32,100,105,115,97,98,108,101,100,46,10,32,32,10,32,32,70,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,100,105,115,97,98,108,101,100,32,105,110,99,108,117,100,101,32,40,98,117,116,32,97,114,101,32,110,111,116,32,108,105,109,105,116,101,100,32,116,111,41,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,32,32,10,32,32,45,32,84,114,97,99,105,110,103,46,32,84,114,97,99,101,32,102,108,97,103,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,98,117,116,32,110,111,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,10,32,32,32,32,111,102,32,97,110,121,32,107,105,110,100,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,32,40,73,102,32,102,108,97,103,32,96,115,101,110,115,105,116,105,118,101,96,32,105,115,32,116,117,114,110,101,100,32,111,102,102,44,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,10,32,32,32,32,97,114,101,32,97,103,97,105,110,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,110,121,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,115,101,116,46,41,10,32,32,45,32,83,101,113,117,101,110,116,105,97,108,32,116,114,97,99,105,110,103,46,32,84,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,110,111,10,32,32,32,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,10,32,32,10,32,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,49,44,50,96,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,32,116,111,32,114,101,97,100,32,111,117,116,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,100,105,99,116,105,111,110,97,114,121,32,40,98,111,116,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,101,109,112,116,121,32,108,105,115,116,115,41,46,10,32,32,10,32,32,83,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,99,97,110,110,111,116,32,98,101,32,100,105,115,112,108,97,121,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,10,32,32,10,32,32,73,110,32,99,114,97,115,104,32,100,117,109,112,115,44,32,116,104,101,32,115,116,97,99,107,44,32,109,101,115,115,97,103,101,115,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,114,101,32,111,109,105,116,116,101,100,46,10,32,32,10,32,32,73,102,32,96,123,115,97,118,101,95,99,97,108,108,115,44,78,125,96,32,104,97,115,32,98,101,101,110,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,110,111,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,115,97,118,101,100,32,116,111,10,32,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,46,32,40,84,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,110,111,116,32,99,108,101,97,114,101,100,46,32,65,108,115,111,44,32,115,101,110,100,44,32,114,101,99,101,105,118,101,44,10,32,32,97,110,100,32,116,105,109,101,45,111,117,116,32,101,118,101,110,116,115,32,97,114,101,32,115,116,105,108,108,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,46,41>>},#{group => processes,specification => [{attribute,{7604,2},spec,{{process_flag,2},[{type,{7604,19},bounded_fun,[{type,{7604,19},'fun',[{type,{7604,19},product,[{atom,{7604,20},async_dist},{var,{7604,32},'Boolean'}]},{var,{7604,44},'OldBoolean'}]},[{type,{7605,7},constraint,[{atom,{7605,7},is_subtype},[{var,{7605,7},'Boolean'},{type,{7605,18},boolean,[]}]]},{type,{7606,7},constraint,[{atom,{7606,7},is_subtype},[{var,{7606,7},'OldBoolean'},{type,{7606,21},boolean,[]}]]}]]},{type,{7607,19},bounded_fun,[{type,{7607,19},'fun',[{type,{7607,19},product,[{atom,{7607,20},trap_exit},{var,{7607,31},'Boolean'}]},{var,{7607,43},'OldBoolean'}]},[{type,{7608,7},constraint,[{atom,{7608,7},is_subtype},[{var,{7608,7},'Boolean'},{type,{7608,18},boolean,[]}]]},{type,{7609,7},constraint,[{atom,{7609,7},is_subtype},[{var,{7609,7},'OldBoolean'},{type,{7609,21},boolean,[]}]]}]]},{type,{7610,19},bounded_fun,[{type,{7610,19},'fun',[{type,{7610,19},product,[{atom,{7610,20},error_handler},{var,{7610,35},'Module'}]},{var,{7610,46},'OldModule'}]},[{type,{7611,7},constraint,[{atom,{7611,7},is_subtype},[{var,{7611,7},'Module'},{type,{7611,17},atom,[]}]]},{type,{7612,7},constraint,[{atom,{7612,7},is_subtype},[{var,{7612,7},'OldModule'},{type,{7612,20},atom,[]}]]}]]},{type,{7613,19},bounded_fun,[{type,{7613,19},'fun',[{type,{7613,19},product,[{atom,{7613,20},fullsweep_after},{var,{7613,37},'FullsweepAfter'}]},{var,{7613,56},'OldFullsweepAfter'}]},[{type,{7614,7},constraint,[{atom,{7614,7},is_subtype},[{var,{7614,7},'FullsweepAfter'},{type,{7614,25},non_neg_integer,[]}]]},{type,{7615,7},constraint,[{atom,{7615,7},is_subtype},[{var,{7615,7},'OldFullsweepAfter'},{type,{7615,28},non_neg_integer,[]}]]}]]},{type,{7616,19},bounded_fun,[{type,{7616,19},'fun',[{type,{7616,19},product,[{atom,{7616,20},min_heap_size},{var,{7616,35},'MinHeapSize'}]},{var,{7616,51},'OldMinHeapSize'}]},[{type,{7617,7},constraint,[{atom,{7617,7},is_subtype},[{var,{7617,7},'MinHeapSize'},{type,{7617,22},non_neg_integer,[]}]]},{type,{7618,7},constraint,[{atom,{7618,7},is_subtype},[{var,{7618,7},'OldMinHeapSize'},{type,{7618,25},non_neg_integer,[]}]]}]]},{type,{7619,19},bounded_fun,[{type,{7619,19},'fun',[{type,{7619,19},product,[{atom,{7619,20},min_bin_vheap_size},{var,{7619,40},'MinBinVHeapSize'}]},{var,{7619,60},'OldMinBinVHeapSize'}]},[{type,{7620,7},constraint,[{atom,{7620,7},is_subtype},[{var,{7620,7},'MinBinVHeapSize'},{type,{7620,26},non_neg_integer,[]}]]},{type,{7621,7},constraint,[{atom,{7621,7},is_subtype},[{var,{7621,7},'OldMinBinVHeapSize'},{type,{7621,29},non_neg_integer,[]}]]}]]},{type,{7622,19},bounded_fun,[{type,{7622,19},'fun',[{type,{7622,19},product,[{atom,{7622,20},max_heap_size},{var,{7622,35},'MaxHeapSize'}]},{var,{7622,51},'OldMaxHeapSize'}]},[{type,{7623,7},constraint,[{atom,{7623,7},is_subtype},[{var,{7623,7},'MaxHeapSize'},{user_type,{7623,22},max_heap_size,[]}]]},{type,{7624,7},constraint,[{atom,{7624,7},is_subtype},[{var,{7624,7},'OldMaxHeapSize'},{user_type,{7624,25},max_heap_size,[]}]]}]]},{type,{7625,19},bounded_fun,[{type,{7625,19},'fun',[{type,{7625,19},product,[{atom,{7625,20},message_queue_data},{var,{7625,40},'MQD'}]},{var,{7625,48},'OldMQD'}]},[{type,{7626,7},constraint,[{atom,{7626,7},is_subtype},[{var,{7626,7},'MQD'},{user_type,{7626,14},message_queue_data,[]}]]},{type,{7627,7},constraint,[{atom,{7627,7},is_subtype},[{var,{7627,7},'OldMQD'},{user_type,{7627,17},message_queue_data,[]}]]}]]},{type,{7628,19},bounded_fun,[{type,{7628,19},'fun',[{type,{7628,19},product,[{atom,{7628,20},priority},{var,{7628,30},'Level'}]},{var,{7628,40},'OldLevel'}]},[{type,{7629,7},constraint,[{atom,{7629,7},is_subtype},[{var,{7629,7},'Level'},{user_type,{7629,16},priority_level,[]}]]},{type,{7630,7},constraint,[{atom,{7630,7},is_subtype},[{var,{7630,7},'OldLevel'},{user_type,{7630,19},priority_level,[]}]]}]]},{type,{7631,19},bounded_fun,[{type,{7631,19},'fun',[{type,{7631,19},product,[{atom,{7631,20},save_calls},{var,{7631,32},'N'}]},{var,{7631,38},'OldN'}]},[{type,{7632,7},constraint,[{atom,{7632,7},is_subtype},[{var,{7632,7},'N'},{type,{7632,12},range,[{integer,{7632,12},0},{integer,{7632,15},10000}]}]]},{type,{7633,7},constraint,[{atom,{7633,7},is_subtype},[{var,{7633,7},'OldN'},{type,{7633,15},range,[{integer,{7633,15},0},{integer,{7633,18},10000}]}]]}]]},{type,{7634,19},bounded_fun,[{type,{7634,19},'fun',[{type,{7634,19},product,[{atom,{7634,20},sensitive},{var,{7634,31},'Boolean'}]},{var,{7634,43},'OldBoolean'}]},[{type,{7635,7},constraint,[{atom,{7635,7},is_subtype},[{var,{7635,7},'Boolean'},{type,{7635,18},boolean,[]}]]},{type,{7636,7},constraint,[{atom,{7636,7},is_subtype},[{var,{7636,7},'OldBoolean'},{type,{7636,21},boolean,[]}]]}]]},{type,{7638,19},'fun',[{type,{7638,19},product,[{type,{7638,20},tuple,[{atom,{7638,21},monitor_nodes},{type,{7638,36},term,[]}]},{type,{7638,45},term,[]}]},{type,{7638,56},term,[]}]},{type,{7639,19},'fun',[{type,{7639,19},product,[{atom,{7639,20},monitor_nodes},{type,{7639,35},term,[]}]},{type,{7639,46},term,[]}]}]}}]}},{{function,open_port,2},{6964,2},[<<111,112,101,110,95,112,111,114,116,40,80,111,114,116,78,97,109,101,44,32,80,111,114,116,83,101,116,116,105,110,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,111,112,101,110,105,110,103,32,97,32,110,101,119,32,69,114,108,97,110,103,32,112,111,114,116,46,32,65,32,112,111,114,116,32,99,97,110,10,98,101,32,115,101,101,110,32,97,115,32,97,110,32,101,120,116,101,114,110,97,108,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,99,100,96,44,32,96,101,110,118,96,44,10,96,97,114,103,115,96,44,32,97,110,100,32,96,97,114,103,48,96,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,105,102,32,116,104,101,32,115,121,115,116,101,109,32,105,115,10,114,117,110,110,105,110,103,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,46,32,84,111,32,97,118,111,105,100,32,116,114,97,110,115,108,97,116,105,111,110,32,111,114,32,116,111,32,102,111,114,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,10,85,84,70,45,56,44,32,115,117,112,112,108,121,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,110,100,47,111,114,32,97,114,103,117,109,101,110,116,115,32,97,115,32,97,32,98,105,110,97,114,121,32,105,110,32,116,104,101,32,99,111,114,114,101,99,116,10,101,110,99,111,100,105,110,103,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32,116,104,101,32,109,111,100,117,108,101,32,96,109,58,102,105,108,101,96,44,32,116,104,101,32,102,117,110,99,116,105,111,110,10,96,102,105,108,101,58,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48,96,32,105,110,32,75,101,114,110,101,108,44,32,97,110,100,32,116,104,101,10,91,96,85,115,105,110,103,32,85,110,105,99,111,100,101,32,105,110,32,69,114,108,97,110,103,96,93,40,96,101,58,115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101,46,109,100,96,41,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,110,97,109,101,32,40,105,102,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,41,32,99,97,110,32,111,110,108,121,32,98,101,32,62,32,50,53,53,32,105,102,32,116,104,101,10,62,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,109,111,100,101,46,10,62,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,105,115,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,10,62,32,115,101,116,46,10,10,96,80,111,114,116,78,97,109,101,96,115,58,10,10,45,32,42,42,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,42,42,32,45,32,83,116,97,114,116,115,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,46,32,96,67,111,109,109,97,110,100,96,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,10,32,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,116,111,32,98,101,32,114,117,110,46,32,96,67,111,109,109,97,110,100,96,32,114,117,110,115,32,111,117,116,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,10,32,32,117,110,108,101,115,115,32,97,110,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,96,67,111,109,109,97,110,100,96,32,105,115,32,102,111,117,110,100,46,32,73,102,32,102,111,117,110,100,44,32,116,104,97,116,10,32,32,100,114,105,118,101,114,32,105,115,32,115,116,97,114,116,101,100,46,32,65,32,100,114,105,118,101,114,32,114,117,110,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,97,116,32,105,116,10,32,32,105,115,32,108,105,110,107,101,100,32,119,105,116,104,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,32,32,70,111,114,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,44,32,96,80,65,84,72,96,32,105,115,32,115,101,97,114,99,104,101,100,32,40,111,114,32,97,110,32,101,113,117,105,118,97,108,101,110,116,32,109,101,116,104,111,100,32,105,115,32,117,115,101,100,32,116,111,10,32,32,102,105,110,100,32,112,114,111,103,114,97,109,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,79,83,41,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,98,121,32,105,110,118,111,107,105,110,103,32,116,104,101,32,115,104,101,108,108,32,111,110,10,32,32,99,101,114,116,97,105,110,32,112,108,97,116,102,111,114,109,115,46,32,84,104,101,32,102,105,114,115,116,32,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,105,115,10,32,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,40,111,114,32,100,114,105,118,101,114,41,46,32,84,104,105,115,32,40,97,109,111,110,103,32,111,116,104,101,114,10,32,32,116,104,105,110,103,115,41,32,109,97,107,101,115,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,115,117,105,116,97,98,108,101,32,102,111,114,32,114,117,110,110,105,110,103,32,112,114,111,103,114,97,109,115,32,119,105,116,104,32,115,112,97,99,101,115,32,105,110,10,32,32,102,105,108,101,110,97,109,101,115,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,46,32,73,102,32,115,112,97,99,101,115,32,105,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,100,101,115,105,114,101,100,44,10,32,32,117,115,101,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,96,32,105,110,115,116,101,97,100,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,79,110,32,85,110,105,120,32,115,121,115,116,101,109,115,44,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,112,97,115,115,101,100,32,116,111,32,97,32,110,101,119,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,32,97,115,10,32,32,62,32,97,110,32,97,114,114,97,121,32,111,102,32,115,116,114,105,110,103,115,32,98,117,116,32,111,110,32,87,105,110,100,111,119,115,32,105,116,32,105,115,32,117,112,32,116,111,32,116,104,101,32,99,104,105,108,100,32,112,114,111,99,101,115,115,32,116,111,32,112,97,114,115,101,10,32,32,62,32,116,104,101,109,32,97,110,100,32,115,111,109,101,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,115,32,109,97,121,32,97,112,112,108,121,32,116,104,101,105,114,32,111,119,110,32,114,117,108,101,115,44,32,119,104,105,99,104,32,97,114,101,10,32,32,62,32,105,110,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,32,116,104,101,32,115,116,97,110,100,97,114,100,32,67,32,114,117,110,116,105,109,101,32,96,97,114,103,118,96,32,112,97,114,115,105,110,103,46,10,32,32,62,10,32,32,62,32,84,104,105,115,32,105,115,32,112,97,114,116,105,99,117,108,97,114,108,121,32,116,114,111,117,98,108,101,115,111,109,101,32,119,104,101,110,32,105,110,118,111,107,105,110,103,32,96,46,98,97,116,96,44,32,96,46,99,109,100,96,44,32,111,114,32,96,46,99,111,109,96,10,32,32,62,32,102,105,108,101,115,32,97,115,32,116,104,101,115,101,32,114,117,110,32,105,109,112,108,105,99,105,116,108,121,32,116,104,114,111,117,103,104,32,96,99,109,100,46,101,120,101,96,44,32,119,104,111,115,101,32,97,114,103,117,109,101,110,116,32,112,97,114,115,105,110,103,32,105,115,10,32,32,62,32,118,117,108,110,101,114,97,98,108,101,32,116,111,32,109,97,108,105,99,105,111,117,115,32,105,110,112,117,116,32,97,110,100,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,114,117,110,32,97,114,98,105,116,114,97,114,121,32,115,104,101,108,108,10,32,32,62,32,99,111,109,109,97,110,100,115,46,10,32,32,62,10,32,32,62,32,84,104,101,114,101,102,111,114,101,44,32,105,102,32,121,111,117,32,97,114,101,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,32,97,110,100,32,121,111,117,32,101,120,101,99,117,116,101,32,98,97,116,99,104,32,102,105,108,101,115,32,111,114,10,32,32,62,32,96,46,99,111,109,96,32,97,112,112,108,105,99,97,116,105,111,110,115,44,32,121,111,117,32,109,117,115,116,32,110,111,116,32,112,97,115,115,32,117,110,116,114,117,115,116,101,100,32,105,110,112,117,116,32,97,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,10,32,32,62,32,112,114,111,103,114,97,109,46,32,84,104,105,115,32,97,102,102,101,99,116,115,32,98,111,116,104,32,96,115,112,97,119,110,96,32,97,110,100,32,96,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,96,46,10,10,45,32,42,42,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,42,42,32,45,32,87,111,114,107,115,32,108,105,107,101,32,96,123,115,112,97,119,110,44,32,70,105,108,101,78,97,109,101,125,96,44,32,98,117,116,32,111,110,108,121,10,32,32,114,117,110,115,32,101,120,116,101,114,110,97,108,32,101,120,101,99,117,116,97,98,108,101,115,46,32,96,70,105,108,101,78,97,109,101,96,32,105,110,32,105,116,115,32,119,104,111,108,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,10,32,32,101,120,101,99,117,116,97,98,108,101,44,32,105,110,99,108,117,100,105,110,103,32,97,110,121,32,115,112,97,99,101,115,46,32,73,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,116,111,32,98,101,32,112,97,115,115,101,100,44,32,116,104,101,10,32,32,96,80,111,114,116,83,101,116,116,105,110,103,115,96,32,96,97,114,103,115,96,32,97,110,100,32,96,97,114,103,48,96,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,32,32,84,104,101,32,115,104,101,108,108,32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32,105,110,118,111,107,101,100,32,116,111,32,115,116,97,114,116,32,116,104,101,32,112,114,111,103,114,97,109,44,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,10,32,32,100,105,114,101,99,116,108,121,46,32,96,80,65,84,72,96,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,105,115,32,110,111,116,32,115,101,97,114,99,104,101,100,46,32,84,111,32,102,105,110,100,32,97,32,112,114,111,103,114,97,109,32,105,110,32,96,80,65,84,72,96,10,32,32,116,111,32,101,120,101,99,117,116,101,44,32,117,115,101,32,96,111,115,58,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49,96,46,10,10,32,32,79,110,108,121,32,105,102,32,97,32,115,104,101,108,108,32,115,99,114,105,112,116,32,111,114,32,96,46,98,97,116,96,32,102,105,108,101,32,105,115,32,101,120,101,99,117,116,101,100,44,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,109,109,97,110,100,10,32,32,105,110,116,101,114,112,114,101,116,101,114,32,105,115,32,105,110,118,111,107,101,100,32,105,109,112,108,105,99,105,116,108,121,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,99,111,109,109,97,110,100,45,97,114,103,117,109,101,110,116,10,32,32,101,120,112,97,110,115,105,111,110,32,111,114,32,105,109,112,108,105,99,105,116,32,96,80,65,84,72,96,32,115,101,97,114,99,104,46,10,10,32,32,73,102,32,96,70,105,108,101,78,97,109,101,96,32,99,97,110,110,111,116,32,98,101,32,114,117,110,44,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105,115,101,100,44,32,119,105,116,104,32,116,104,101,32,80,79,83,73,88,10,32,32,101,114,114,111,114,32,99,111,100,101,32,97,115,32,116,104,101,32,114,101,97,115,111,110,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,79,83,115,46,32,84,121,112,105,99,97,108,108,121,10,32,32,116,104,101,32,101,114,114,111,114,32,96,101,110,111,101,110,116,96,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,114,117,110,32,97,32,112,114,111,103,114,97,109,32,116,104,97,116,32,105,115,10,32,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,96,101,97,99,99,101,115,96,32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,105,108,101,32,105,115,32,110,111,116,32,101,120,101,99,117,116,97,98,108,101,46,10,10,45,32,42,42,96,123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,67,111,109,109,97,110,100,125,96,42,42,32,45,32,87,111,114,107,115,32,108,105,107,101,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,98,117,116,32,100,101,109,97,110,100,115,32,116,104,101,10,32,32,102,105,114,115,116,32,40,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,41,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,116,111,32,98,101,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,97,100,101,100,10,32,32,100,114,105,118,101,114,46,32,73,102,32,110,111,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,97,116,32,110,97,109,101,32,105,115,32,108,111,97,100,101,100,44,32,97,32,96,98,97,100,97,114,103,96,32,101,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,45,32,42,42,96,123,102,100,44,32,73,110,44,32,79,117,116,125,96,42,42,32,45,32,65,108,108,111,119,115,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,111,32,97,99,99,101,115,115,32,97,110,121,32,99,117,114,114,101,110,116,108,121,32,111,112,101,110,101,100,10,32,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,117,115,101,100,32,98,121,32,69,114,108,97,110,103,46,32,84,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,96,73,110,96,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,10,32,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,44,32,97,110,100,32,116,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,96,79,117,116,96,32,102,111,114,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,32,73,116,32,105,115,32,111,110,108,121,10,32,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,115,101,114,118,101,114,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,79,83,32,40,96,115,104,101,108,108,96,32,97,110,100,32,96,117,115,101,114,96,41,46,32,72,101,110,99,101,44,32,105,116,115,32,117,115,101,10,32,32,105,115,32,108,105,109,105,116,101,100,46,10,10,96,80,111,114,116,83,101,116,116,105,110,103,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,101,116,116,105,110,103,115,32,102,111,114,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,118,97,108,105,100,32,115,101,116,116,105,110,103,115,32,97,114,101,32,97,115,10,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,123,112,97,99,107,101,116,44,32,78,125,96,42,42,32,45,32,77,101,115,115,97,103,101,115,32,97,114,101,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,101,105,114,32,108,101,110,103,116,104,44,32,115,101,110,116,32,105,110,32,96,78,96,32,98,121,116,101,115,44,10,32,32,119,105,116,104,32,116,104,101,32,109,111,115,116,32,115,105,103,110,105,102,105,99,97,110,116,32,98,121,116,101,32,102,105,114,115,116,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32,96,78,96,32,97,114,101,32,49,44,32,50,44,10,32,32,97,110,100,32,52,46,10,10,45,32,42,42,96,115,116,114,101,97,109,96,42,42,32,45,32,79,117,116,112,117,116,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,105,116,104,111,117,116,32,112,97,99,107,101,116,32,108,101,110,103,116,104,115,46,32,65,32,117,115,101,114,45,100,101,102,105,110,101,100,10,32,32,112,114,111,116,111,99,111,108,32,109,117,115,116,32,98,101,32,117,115,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,111,98,106,101,99,116,46,10,10,45,32,42,42,96,123,108,105,110,101,44,32,76,125,96,42,42,32,45,32,77,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,111,110,32,97,32,112,101,114,32,108,105,110,101,32,98,97,115,105,115,46,32,69,97,99,104,32,108,105,110,101,10,32,32,40,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,32,105,115,32,100,101,108,105,118,101,114,101,100,32,105,110,32,97,32,115,105,110,103,108,101,10,32,32,109,101,115,115,97,103,101,46,32,84,104,101,32,109,101,115,115,97,103,101,32,100,97,116,97,32,102,111,114,109,97,116,32,105,115,32,96,123,70,108,97,103,44,32,76,105,110,101,125,96,44,32,119,104,101,114,101,32,96,70,108,97,103,96,32,105,115,32,96,101,111,108,96,32,111,114,10,32,32,96,110,111,101,111,108,96,44,32,97,110,100,32,96,76,105,110,101,96,32,105,115,32,116,104,101,32,100,97,116,97,32,100,101,108,105,118,101,114,101,100,32,40,119,105,116,104,111,117,116,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,46,10,10,32,32,96,76,96,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,108,105,110,101,32,108,101,110,103,116,104,32,105,110,32,98,121,116,101,115,46,32,76,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,105,115,32,97,114,101,10,32,32,100,101,108,105,118,101,114,101,100,32,105,110,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,109,101,115,115,97,103,101,44,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,32,116,111,32,96,110,111,101,111,108,96,32,102,111,114,32,97,108,108,32,98,117,116,32,116,104,101,10,32,32,108,97,115,116,32,109,101,115,115,97,103,101,46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,97,110,121,119,104,101,114,101,32,101,108,115,101,32,116,104,97,110,32,105,109,109,101,100,105,97,116,101,108,121,10,32,32,102,111,108,108,111,119,105,110,103,32,97,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,116,104,101,32,108,97,115,116,32,108,105,110,101,32,105,115,32,97,108,115,111,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,10,32,32,116,111,32,96,110,111,101,111,108,96,46,32,79,116,104,101,114,119,105,115,101,32,108,105,110,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32,96,70,108,97,103,96,32,115,101,116,32,116,111,32,96,101,111,108,96,46,10,10,32,32,84,104,101,32,96,123,112,97,99,107,101,116,44,32,78,125,96,32,97,110,100,32,96,123,108,105,110,101,44,32,76,125,96,32,115,101,116,116,105,110,103,115,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46,10,10,45,32,42,42,96,123,99,100,44,32,68,105,114,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,32,97,110,100,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,32,84,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,115,116,97,114,116,115,32,117,115,105,110,103,32,96,68,105,114,96,32,97,115,32,105,116,115,10,32,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,46,32,96,68,105,114,96,32,109,117,115,116,32,98,101,32,97,32,115,116,114,105,110,103,46,10,10,45,32,42,42,96,123,101,110,118,44,32,69,110,118,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,97,110,100,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,10,32,32,84,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,116,104,101,32,115,116,97,114,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,101,120,116,101,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,10,32,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,96,69,110,118,96,46,10,10,32,32,96,69,110,118,96,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,96,123,78,97,109,101,44,32,86,97,108,125,96,44,32,119,104,101,114,101,32,96,78,97,109,101,96,32,105,115,32,97,32,96,116,58,111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,47,48,96,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,97,110,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,44,32,97,110,100,32,96,86,97,108,96,32,105,115,32,97,32,96,116,58,111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,47,48,96,10,32,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,105,116,32,105,115,32,116,111,32,104,97,118,101,32,105,110,32,116,104,101,32,115,112,97,119,110,101,100,32,112,111,114,116,32,112,114,111,99,101,115,115,46,32,66,111,116,104,32,96,78,97,109,101,96,32,97,110,100,32,96,86,97,108,96,32,109,117,115,116,10,32,32,98,101,32,115,116,114,105,110,103,115,46,10,10,32,32,73,102,32,96,86,97,108,96,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,97,116,111,109,32,96,102,97,108,115,101,96,32,111,114,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,40,116,104,97,116,32,105,115,32,96,34,34,96,32,111,114,32,96,91,93,96,41,44,32,111,112,101,110,95,112,111,114,116,10,32,32,119,105,108,108,32,99,111,110,115,105,100,101,114,32,116,104,111,115,101,32,118,97,114,105,97,98,108,101,115,32,117,110,115,101,116,32,106,117,115,116,32,97,115,32,105,102,32,96,111,115,58,117,110,115,101,116,101,110,118,47,49,96,32,104,97,100,32,98,101,101,110,32,99,97,108,108,101,100,46,10,10,32,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,110,99,111,100,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,115,44,32,115,101,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,121,112,101,115,10,32,32,102,111,114,32,96,78,97,109,101,96,32,97,110,100,32,96,86,97,108,96,46,10,10,45,32,42,42,96,123,97,114,103,115,44,32,91,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,32,93,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,97,110,100,32,115,112,101,99,105,102,105,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,69,97,99,104,10,32,32,97,114,103,117,109,101,110,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,115,116,114,105,110,103,32,97,110,100,32,40,111,110,32,85,110,105,120,41,32,101,118,101,110,116,117,97,108,108,121,32,101,110,100,115,32,117,112,32,97,115,10,32,32,111,110,101,32,101,108,101,109,101,110,116,32,101,97,99,104,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,46,32,79,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,97,32,115,105,109,105,108,97,114,10,32,32,98,101,104,97,118,105,111,114,32,105,115,32,109,105,109,105,99,107,101,100,46,10,10,32,32,84,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,101,120,112,97,110,100,101,100,32,98,121,32,116,104,101,32,115,104,101,108,108,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,10,32,32,101,120,101,99,117,116,97,98,108,101,46,32,77,111,115,116,32,110,111,116,97,98,108,121,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,102,105,108,101,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,10,32,32,111,99,99,117,114,46,32,84,111,32,101,120,112,97,110,100,32,119,105,108,100,99,97,114,100,115,32,102,111,114,32,116,104,101,32,97,114,103,117,109,101,110,116,115,44,32,117,115,101,32,96,102,105,108,101,108,105,98,58,119,105,108,100,99,97,114,100,47,49,96,46,32,78,111,116,105,99,101,10,32,32,116,104,97,116,32,101,118,101,110,32,105,102,32,116,104,101,32,112,114,111,103,114,97,109,32,105,115,32,97,32,85,110,105,120,32,115,104,101,108,108,32,115,99,114,105,112,116,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,115,104,101,108,108,10,32,32,117,108,116,105,109,97,116,101,108,121,32,105,115,32,105,110,118,111,107,101,100,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,44,32,97,110,100,32,116,104,101,32,115,99,114,105,112,116,32,105,115,10,32,32,112,114,111,118,105,100,101,100,32,119,105,116,104,32,116,104,101,32,117,110,116,111,117,99,104,101,100,32,97,114,103,117,109,101,110,116,115,46,32,79,110,32,87,105,110,100,111,119,115,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,105,115,10,32,32,97,108,119,97,121,115,32,117,112,32,116,111,32,116,104,101,32,112,114,111,103,114,97,109,32,105,116,115,101,108,102,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,105,115,32,110,111,116,32,97,110,32,105,115,115,117,101,46,10,10,32,32,84,104,101,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,40,97,108,115,111,32,107,110,111,119,110,32,97,115,32,96,97,114,103,118,91,48,93,96,41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,105,115,10,32,32,108,105,115,116,46,32,84,104,101,32,112,114,111,112,101,114,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,115,101,100,32,97,115,32,96,97,114,103,118,91,48,93,96,44,32,119,104,101,114,101,10,32,32,97,112,112,108,105,99,97,98,108,101,46,10,10,32,32,73,102,32,121,111,117,32,101,120,112,108,105,99,105,116,108,121,32,119,97,110,116,32,116,111,32,115,101,116,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,44,32,111,112,116,105,111,110,10,32,32,96,97,114,103,48,96,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,45,32,42,42,96,123,97,114,103,48,44,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,125,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,97,110,100,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,10,32,32,97,114,103,117,109,101,110,116,32,119,104,101,110,32,114,117,110,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,46,32,84,104,105,115,32,99,97,110,32,105,110,32,115,111,109,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,111,110,32,115,111,109,101,10,32,32,79,83,115,44,32,98,101,32,100,101,115,105,114,97,98,108,101,46,32,72,111,119,32,116,104,101,32,112,114,111,103,114,97,109,32,114,101,115,112,111,110,100,115,32,116,111,32,116,104,105,115,32,105,115,32,104,105,103,104,108,121,32,115,121,115,116,101,109,45,100,101,112,101,110,100,101,110,116,10,32,32,97,110,100,32,110,111,32,115,112,101,99,105,102,105,99,32,101,102,102,101,99,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,46,10,10,45,32,42,42,96,101,120,105,116,95,115,116,97,116,117,115,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,44,32,119,104,101,114,101,32,96,67,111,109,109,97,110,100,96,32,114,101,102,101,114,115,10,32,32,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,44,32,97,110,100,32,102,111,114,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,10,10,32,32,87,104,101,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,101,120,105,116,115,44,32,97,32,109,101,115,115,97,103,101,32,111,102,32,116,104,101,32,102,111,114,109,10,32,32,96,123,80,111,114,116,44,123,101,120,105,116,95,115,116,97,116,117,115,44,83,116,97,116,117,115,125,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,44,32,119,104,101,114,101,32,96,83,116,97,116,117,115,96,10,32,32,105,115,32,116,104,101,32,101,120,105,116,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,112,114,111,103,114,97,109,32,97,98,111,114,116,115,32,111,110,32,85,110,105,120,44,32,116,104,101,10,32,32,115,97,109,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,104,101,108,108,115,32,100,111,32,40,116,104,97,116,32,105,115,44,32,49,50,56,43,115,105,103,110,97,108,41,46,10,10,32,32,73,102,32,111,112,116,105,111,110,32,96,101,111,102,96,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,108,115,111,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,96,101,111,102,96,32,97,110,100,32,96,101,120,105,116,95,115,116,97,116,117,115,96,32,97,112,112,101,97,114,10,32,32,105,110,32,97,110,32,117,110,115,112,101,99,105,102,105,101,100,32,111,114,100,101,114,46,10,10,45,32,42,42,96,117,115,101,95,115,116,100,105,111,96,42,42,32,45,32,79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,96,123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125,96,32,97,110,100,10,32,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,46,32,73,116,32,97,108,108,111,119,115,32,116,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,111,117,116,112,117,116,32,40,102,105,108,101,10,32,32,100,101,115,99,114,105,112,116,111,114,115,32,48,32,97,110,100,32,49,41,32,111,102,32,116,104,101,32,115,112,97,119,110,101,100,32,40,85,110,105,120,41,32,112,114,111,99,101,115,115,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,10,32,32,69,114,108,97,110,103,46,10,10,45,32,42,42,96,110,111,117,115,101,95,115,116,100,105,111,96,42,42,32,45,32,84,104,101,32,111,112,112,111,115,105,116,101,32,111,102,32,96,117,115,101,95,115,116,100,105,111,96,46,32,73,116,32,117,115,101,115,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,51,10,32,32,97,110,100,32,52,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46,10,10,45,32,42,42,96,115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116,96,42,42,32,45,32,65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,46,32,84,104,101,32,101,120,101,99,117,116,101,100,10,32,32,112,114,111,103,114,97,109,32,103,101,116,115,32,105,116,115,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,32,102,105,108,101,32,114,101,100,105,114,101,99,116,101,100,32,116,111,32,105,116,115,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,102,105,108,101,46,10,32,32,96,115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116,96,32,97,110,100,32,96,110,111,117,115,101,95,115,116,100,105,111,96,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46,10,10,45,32,42,42,96,111,118,101,114,108,97,112,112,101,100,95,105,111,96,42,42,32,45,32,65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,32,111,110,32,87,105,110,100,111,119,115,32,111,110,108,121,46,32,84,104,101,10,32,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,104,97,110,100,108,101,115,32,111,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,97,114,101,44,32,105,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,115,117,112,112,108,105,101,100,44,32,111,112,101,110,101,100,32,119,105,116,104,32,102,108,97,103,32,96,70,73,76,69,95,70,76,65,71,95,79,86,69,82,76,65,80,80,69,68,96,44,32,115,111,32,116,104,97,116,32,116,104,101,32,112,111,114,116,10,32,32,112,114,111,103,114,97,109,32,99,97,110,32,40,97,110,100,32,109,117,115,116,41,32,100,111,32,111,118,101,114,108,97,112,112,101,100,32,73,47,79,32,111,110,32,105,116,115,32,115,116,97,110,100,97,114,100,32,104,97,110,100,108,101,115,46,32,84,104,105,115,32,105,115,32,110,111,116,10,32,32,110,111,114,109,97,108,108,121,32,116,104,101,32,99,97,115,101,32,102,111,114,32,115,105,109,112,108,101,32,112,111,114,116,32,112,114,111,103,114,97,109,115,44,32,98,117,116,32,97,110,32,111,112,116,105,111,110,32,111,102,32,118,97,108,117,101,32,102,111,114,32,116,104,101,10,32,32,101,120,112,101,114,105,101,110,99,101,100,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,109,101,114,46,32,95,79,110,32,97,108,108,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,10,32,32,115,105,108,101,110,116,108,121,32,100,105,115,99,97,114,100,101,100,46,95,10,10,45,32,42,42,96,105,110,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,105,110,112,117,116,46,10,10,45,32,42,42,96,111,117,116,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,111,117,116,112,117,116,46,10,10,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,115,32,97,115,32,111,112,112,111,115,101,100,32,116,111,10,32,32,108,105,115,116,115,32,111,102,32,98,121,116,101,115,46,10,10,45,32,42,42,96,101,111,102,96,42,42,32,45,32,84,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,10,32,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,46,32,73,110,115,116,101,97,100,44,32,105,116,32,114,101,109,97,105,110,115,32,111,112,101,110,32,97,110,100,32,97,32,96,123,80,111,114,116,44,32,101,111,102,125,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,10,32,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,104,111,108,100,105,110,103,32,116,104,101,32,112,111,114,116,46,10,10,45,32,42,42,96,104,105,100,101,96,42,42,32,45,32,87,104,101,110,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,44,32,115,117,112,112,114,101,115,115,101,115,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,99,111,110,115,111,108,101,10,32,32,119,105,110,100,111,119,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,46,32,40,84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,111,116,104,101,114,10,32,32,112,108,97,116,102,111,114,109,115,46,41,10,10,45,32,42,42,96,123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125,96,42,42,32,45,32,91,93,40,41,123,58,32,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109,32,125,32,83,101,116,115,32,115,99,104,101,100,117,108,101,114,10,32,32,104,105,110,116,32,102,111,114,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,46,32,73,102,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,115,99,104,101,100,117,108,101,115,10,32,32,112,111,114,116,32,116,97,115,107,115,59,32,119,104,101,110,32,100,111,105,110,103,32,115,111,44,32,105,116,32,105,109,112,114,111,118,101,115,32,112,97,114,97,108,108,101,108,105,115,109,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,115,101,116,32,116,111,10,32,32,96,102,97,108,115,101,96,44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,116,114,105,101,115,32,116,111,32,112,101,114,102,111,114,109,32,112,111,114,116,32,116,97,115,107,115,32,105,109,109,101,100,105,97,116,101,108,121,44,10,32,32,105,109,112,114,111,118,105,110,103,32,108,97,116,101,110,99,121,32,97,116,32,116,104,101,32,101,120,112,101,110,115,101,32,111,102,32,112,97,114,97,108,108,101,108,105,115,109,46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,10,32,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32,91,96,43,115,112,112,96,93,40,101,114,108,95,99,109,100,46,109,100,35,37,50,66,115,112,112,41,32,116,111,10,32,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46,10,10,45,32,42,42,96,123,98,117,115,121,95,108,105,109,105,116,115,95,112,111,114,116,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125,96,42,42,32,45,32,83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,10,32,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,46,10,10,32,32,87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,105,110,116,101,114,110,97,108,32,111,117,116,112,117,116,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,10,32,32,96,72,105,103,104,96,32,98,121,116,101,115,44,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32,96,76,111,119,96,32,98,121,116,101,115,10,32,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,10,32,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,32,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,114,10,32,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93,96,46,10,10,32,32,84,104,101,32,96,76,111,119,96,32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32,96,72,105,103,104,96,32,105,102,32,105,116,32,105,115,32,115,101,116,10,32,32,108,97,114,103,101,114,32,116,104,101,110,32,96,72,105,103,104,96,46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32,96,76,111,119,96,32,97,110,100,32,96,72,105,103,104,96,32,105,115,10,32,32,96,91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93,96,46,32,73,102,32,116,104,101,32,97,116,111,109,32,96,100,105,115,97,98,108,101,100,96,32,105,115,10,32,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32,96,76,111,119,32,61,32,52,48,57,54,96,32,97,110,100,32,96,72,105,103,104,32,61,32,56,49,57,50,96,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,40,112,111,114,116,10,32,32,112,114,111,103,114,97,109,41,32,98,121,32,111,112,101,110,105,110,103,32,116,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,97,110,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,96,102,100,96,32,100,114,105,118,101,114,46,32,84,104,105,115,10,32,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,111,112,101,110,105,110,103,32,111,116,104,101,114,10,32,32,100,114,105,118,101,114,115,46,10,10,45,32,42,42,96,123,98,117,115,121,95,108,105,109,105,116,115,95,109,115,103,113,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125,96,42,42,32,45,32,83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,10,32,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,10,32,32,87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,96,72,105,103,104,96,32,98,121,116,101,115,10,32,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32,96,76,111,119,96,32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,10,32,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,10,32,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,97,118,101,115,10,32,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,10,32,32,96,80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125,96,32,111,114,32,96,112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93,96,46,10,10,32,32,84,104,101,32,96,76,111,119,96,32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32,96,72,105,103,104,96,32,105,102,32,105,116,32,105,115,32,115,101,116,10,32,32,108,97,114,103,101,114,32,116,104,101,110,32,96,72,105,103,104,96,46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32,96,76,111,119,96,32,97,110,100,32,96,72,105,103,104,96,32,105,115,10,32,32,96,91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93,96,46,32,73,102,32,116,104,101,32,97,116,111,109,32,96,100,105,115,97,98,108,101,100,96,32,105,115,10,32,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,115,116,97,116,105,99,97,108,108,121,32,104,97,115,32,100,105,115,97,98,108,101,100,32,116,104,101,32,117,115,101,32,111,102,32,116,104,105,115,32,102,101,97,116,117,114,101,44,32,97,10,32,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,110,108,101,115,115,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,115,10,32,32,115,101,116,32,116,111,32,96,100,105,115,97,98,108,101,96,32,111,114,32,110,111,116,32,112,97,115,115,101,100,32,97,116,32,97,108,108,46,10,10,32,32,84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32,96,76,111,119,32,61,32,52,48,57,54,96,32,97,110,100,32,96,72,105,103,104,32,61,32,56,49,57,50,96,32,117,110,108,101,115,115,32,116,104,101,32,100,114,105,118,101,114,32,105,116,115,101,108,102,32,100,111,101,115,10,32,32,109,111,100,105,102,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,46,10,10,32,32,95,78,111,116,101,95,32,116,104,97,116,32,116,104,101,32,100,114,105,118,101,114,32,109,105,103,104,116,32,102,97,105,108,32,105,102,32,105,116,32,97,108,115,111,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,105,116,115,101,108,102,32,97,110,100,10,32,32,121,111,117,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,116,104,105,115,32,102,101,97,116,117,114,101,46,10,10,32,32,84,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,40,117,115,101,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,41,32,97,110,100,32,116,104,101,32,96,102,100,96,32,100,114,105,118,101,114,32,100,111,32,110,111,116,10,32,32,100,105,115,97,98,108,101,32,116,104,105,115,32,102,101,97,116,117,114,101,32,97,110,100,32,100,111,32,110,111,116,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,116,104,101,109,115,101,108,118,101,115,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,10,32,32,91,96,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,40,41,96,93,40,101,114,108,95,100,114,105,118,101,114,46,109,100,35,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,41,46,10,10,68,101,102,97,117,108,116,32,105,115,32,96,115,116,114,101,97,109,96,32,102,111,114,32,97,108,108,32,112,111,114,116,32,116,121,112,101,115,32,97,110,100,32,96,117,115,101,95,115,116,100,105,111,96,32,102,111,114,32,115,112,97,119,110,101,100,32,112,111,114,116,115,46,10,10,70,97,105,108,117,114,101,58,32,105,102,32,116,104,101,32,112,111,114,116,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,44,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32,96,98,97,100,97,114,103,96,44,10,96,115,121,115,116,101,109,95,108,105,109,105,116,96,44,32,111,114,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,116,104,97,116,32,109,111,115,116,32,99,108,111,115,101,108,121,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,101,114,114,111,114,44,10,111,114,32,96,101,105,110,118,97,108,96,32,105,102,32,110,111,32,80,79,83,73,88,32,99,111,100,101,32,105,115,32,97,112,112,114,111,112,114,105,97,116,101,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,66,97,100,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,116,111,32,96,111,112,101,110,95,112,111,114,116,96,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,65,108,108,32,97,118,97,105,108,97,98,108,101,32,112,111,114,116,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,97,114,101,32,105,110,32,117,115,101,46,10,10,45,32,42,42,96,101,110,111,109,101,109,96,42,42,32,45,32,78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,111,114,116,46,10,10,45,32,42,42,96,101,97,103,97,105,110,96,42,42,32,45,32,78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,79,83,32,112,114,111,99,101,115,115,101,115,46,10,10,45,32,42,42,96,101,110,97,109,101,116,111,111,108,111,110,103,96,42,42,32,45,32,84,111,111,32,108,111,110,103,32,101,120,116,101,114,110,97,108,32,99,111,109,109,97,110,100,46,10,10,45,32,42,42,96,101,109,102,105,108,101,96,42,42,32,45,32,78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,40,102,111,114,32,116,104,101,32,79,83,32,112,114,111,99,101,115,115,32,116,104,97,116,32,116,104,101,10,32,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,114,117,110,115,32,105,110,41,46,10,10,45,32,42,42,96,101,110,102,105,108,101,96,42,42,32,45,32,70,117,108,108,32,102,105,108,101,32,116,97,98,108,101,32,40,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,79,83,41,46,10,10,45,32,42,42,96,101,97,99,99,101,115,96,42,42,32,45,32,96,67,111,109,109,97,110,100,96,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,96,32,100,111,101,115,32,110,111,116,10,32,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,46,10,10,45,32,42,42,96,101,110,111,101,110,116,96,42,42,32,45,32,96,70,105,108,101,78,97,109,101,96,32,115,112,101,99,105,102,105,101,100,32,105,110,32,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125,96,32,100,111,101,115,32,110,111,116,10,32,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,46,10,10,68,117,114,105,110,103,32,117,115,101,32,111,102,32,97,32,112,111,114,116,32,111,112,101,110,101,100,32,117,115,105,110,103,32,96,123,115,112,97,119,110,44,32,78,97,109,101,125,96,44,32,96,123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,78,97,109,101,125,96,44,32,111,114,10,96,123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,78,97,109,101,125,96,44,32,101,114,114,111,114,115,32,97,114,105,115,105,110,103,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,105,116,32,97,114,101,10,114,101,112,111,114,116,101,100,32,116,111,32,116,104,101,32,111,119,110,105,110,103,32,112,114,111,99,101,115,115,32,117,115,105,110,103,32,115,105,103,110,97,108,115,32,111,102,32,116,104,101,32,102,111,114,109,10,96,123,39,69,88,73,84,39,44,32,80,111,114,116,44,32,80,111,115,105,120,67,111,100,101,125,96,46,32,70,111,114,32,116,104,101,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,111,102,32,96,80,111,115,105,120,67,111,100,101,96,44,32,115,101,101,10,96,109,58,102,105,108,101,96,46,10,10,84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,116,104,97,116,32,99,97,110,32,98,101,32,111,112,101,110,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,10,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32,91,96,43,81,96,93,40,101,114,108,95,99,109,100,46,109,100,35,109,97,120,95,112,111,114,116,115,41,32,116,111,32,91,101,114,108,93,40,101,114,108,95,99,109,100,46,109,100,41,46>>},#{group => ports,specification => [{attribute,{7256,2},spec,{{open_port,2},[{type,{7256,16},bounded_fun,[{type,{7256,16},'fun',[{type,{7256,16},product,[{var,{7256,17},'PortName'},{var,{7256,27},'PortSettings'}]},{type,{7256,44},port,[]}]},[{type,{7257,7},constraint,[{atom,{7257,7},is_subtype},[{var,{7257,7},'PortName'},{type,{7257,19},union,[{type,{7257,19},tuple,[{atom,{7257,20},spawn},{ann_type,{7257,27},[{var,{7257,27},'Command'},{type,{7257,38},union,[{type,{7257,38},string,[]},{type,{7257,49},binary,[]}]}]}]},{type,{7258,19},tuple,[{atom,{7258,20},spawn_driver},{ann_type,{7258,34},[{var,{7258,34},'Command'},{type,{7258,45},union,[{type,{7258,45},string,[]},{type,{7258,56},binary,[]}]}]}]},{type,{7259,19},tuple,[{atom,{7259,20},spawn_executable},{ann_type,{7259,38},[{var,{7259,38},'FileName'},{remote_type,{7259,50},[{atom,{7259,50},file},{atom,{7259,55},name_all},[]]}]}]},{type,{7260,19},tuple,[{atom,{7260,20},fd},{ann_type,{7260,24},[{var,{7260,24},'In'},{type,{7260,30},non_neg_integer,[]}]},{ann_type,{7260,49},[{var,{7260,49},'Out'},{type,{7260,56},non_neg_integer,[]}]}]}]}]]},{type,{7261,7},constraint,[{atom,{7261,7},is_subtype},[{var,{7261,7},'PortSettings'},{type,{7261,23},list,[{var,{7261,24},'Opt'}]}]]},{type,{7262,7},constraint,[{atom,{7262,7},is_subtype},[{var,{7262,7},'Opt'},{type,{7262,14},union,[{type,{7262,14},tuple,[{atom,{7262,15},packet},{ann_type,{7262,23},[{var,{7262,23},'N'},{type,{7262,28},union,[{integer,{7262,28},1},{integer,{7262,32},2},{integer,{7262,36},4}]}]}]},{atom,{7263,14},stream},{type,{7264,14},tuple,[{atom,{7264,15},line},{ann_type,{7264,21},[{var,{7264,21},'L'},{type,{7264,26},non_neg_integer,[]}]}]},{type,{7265,14},tuple,[{atom,{7265,15},cd},{ann_type,{7265,19},[{var,{7265,19},'Dir'},{type,{7265,26},union,[{type,{7265,26},string,[]},{type,{7265,37},binary,[]}]}]}]},{type,{7266,14},tuple,[{atom,{7266,15},env},{ann_type,{7266,20},[{var,{7266,20},'Env'},{type,{7266,27},list,[{type,{7266,28},tuple,[{ann_type,{7266,29},[{var,{7266,29},'Name'},{remote_type,{7266,37},[{atom,{7266,37},os},{atom,{7266,40},env_var_name},[]]}]},{ann_type,{7266,56},[{var,{7266,56},'Val'},{type,{7266,63},union,[{remote_type,{7266,63},[{atom,{7266,63},os},{atom,{7266,66},env_var_value},[]]},{type,{7266,84},nil,[]},{atom,{7266,89},false}]}]}]}]}]}]},{type,{7267,14},tuple,[{atom,{7267,15},args},{type,{7267,21},list,[{type,{7267,22},union,[{type,{7267,22},string,[]},{type,{7267,33},binary,[]}]}]}]},{type,{7268,14},tuple,[{atom,{7268,15},arg0},{type,{7268,21},union,[{type,{7268,21},string,[]},{type,{7268,32},binary,[]}]}]},{atom,{7269,14},exit_status},{atom,{7270,14},use_stdio},{atom,{7271,14},nouse_stdio},{atom,{7272,14},stderr_to_stdout},{atom,{7273,14},in},{atom,{7274,14},out},{atom,{7275,14},binary},{atom,{7276,14},eof},{type,{7277,7},tuple,[{atom,{7277,8},parallelism},{ann_type,{7277,21},[{var,{7277,21},'Boolean'},{type,{7277,32},boolean,[]}]}]},{atom,{7278,7},hide},{type,{7279,14},tuple,[{atom,{7279,15},busy_limits_port},{type,{7279,33},union,[{type,{7279,33},tuple,[{type,{7279,34},non_neg_integer,[]},{type,{7279,53},non_neg_integer,[]}]},{atom,{7279,74},disabled}]}]},{type,{7280,14},tuple,[{atom,{7280,15},busy_limits_msgq},{type,{7280,33},union,[{type,{7280,33},tuple,[{type,{7280,34},non_neg_integer,[]},{type,{7280,53},non_neg_integer,[]}]},{atom,{7280,74},disabled}]}]}]}]]}]]}]}}]}},{{function,make_tuple,3},{6940,2},[<<109,97,107,101,95,116,117,112,108,101,40,65,114,105,116,121,44,32,68,101,102,97,117,108,116,86,97,108,117,101,44,32,73,110,105,116,76,105,115,116,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,32,116,117,112,108,101,32,111,102,32,115,105,122,101,32,96,65,114,105,116,121,96,44,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,104,97,115,32,118,97,108,117,101,32,96,68,101,102,97,117,108,116,86,97,108,117,101,96,44,10,97,110,100,32,116,104,101,110,32,102,105,108,108,115,32,105,110,32,118,97,108,117,101,115,32,102,114,111,109,32,96,73,110,105,116,76,105,115,116,96,46,10,10,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,110,32,96,73,110,105,116,76,105,115,116,96,32,109,117,115,116,32,98,101,32,97,32,116,119,111,45,116,117,112,108,101,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,10,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,116,117,112,108,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,121,32,116,101,114,109,46,32,73,102,32,97,10,112,111,115,105,116,105,111,110,32,111,99,99,117,114,115,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,116,104,101,32,116,101,114,109,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,108,97,115,116,10,111,99,99,117,114,114,101,110,99,101,32,105,115,32,117,115,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,53,44,32,91,93,44,32,91,123,50,44,105,103,110,111,114,101,100,125,44,123,53,44,122,122,125,44,123,50,44,97,97,125,93,41,46,10,123,91,93,44,97,97,44,91,93,44,91,93,44,122,122,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{6957,2},spec,{{make_tuple,3},[{type,{6957,17},bounded_fun,[{type,{6957,17},'fun',[{type,{6957,17},product,[{var,{6957,18},'Arity'},{var,{6957,25},'DefaultValue'},{var,{6957,39},'InitList'}]},{type,{6957,52},tuple,any}]},[{type,{6958,7},constraint,[{atom,{6958,7},is_subtype},[{var,{6958,7},'Arity'},{type,{6958,16},arity,[]}]]},{type,{6959,7},constraint,[{atom,{6959,7},is_subtype},[{var,{6959,7},'DefaultValue'},{type,{6959,23},term,[]}]]},{type,{6960,7},constraint,[{atom,{6960,7},is_subtype},[{var,{6960,7},'InitList'},{type,{6960,19},list,[{type,{6960,20},tuple,[{ann_type,{6960,21},[{var,{6960,21},'Position'},{type,{6960,33},pos_integer,[]}]},{type,{6960,48},term,[]}]}]}]]}]]}]}}]}},{{function,make_tuple,2},{6921,2},[<<109,97,107,101,95,116,117,112,108,101,40,65,114,105,116,121,44,32,73,110,105,116,105,97,108,86,97,108,117,101,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,32,110,101,119,32,116,117,112,108,101,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,96,65,114,105,116,121,96,44,32,119,104,101,114,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,97,114,101,10,96,73,110,105,116,105,97,108,86,97,108,117,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,52,44,32,91,93,41,46,10,123,91,93,44,91,93,44,91,93,44,91,93,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{6933,2},spec,{{make_tuple,2},[{type,{6933,17},bounded_fun,[{type,{6933,17},'fun',[{type,{6933,17},product,[{var,{6933,18},'Arity'},{var,{6933,25},'InitialValue'}]},{type,{6933,42},tuple,any}]},[{type,{6934,7},constraint,[{atom,{6934,7},is_subtype},[{var,{6934,7},'Arity'},{type,{6934,16},arity,[]}]]},{type,{6935,7},constraint,[{atom,{6935,7},is_subtype},[{var,{6935,7},'InitialValue'},{type,{6935,23},term,[]}]]}]]}]}}]}},{{function,make_fun,3},{6912,2},[<<109,97,107,101,95,102,117,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],hidden,#{}},{{function,localtime_to_universaltime,2},{6877,2},[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,44,32,73,115,68,115,116,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,97,115,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49,96,44,32,98,117,116,32,116,104,101,32,99,97,108,108,101,114,32,100,101,99,105,100,101,115,32,105,102,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,10,84,105,109,101,32,105,115,32,97,99,116,105,118,101,46,10,10,73,102,32,96,73,115,68,115,116,32,61,61,32,116,114,117,101,96,44,32,96,76,111,99,97,108,116,105,109,101,96,32,105,115,32,100,117,114,105,110,103,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,44,32,105,102,10,96,73,115,68,115,116,32,61,61,32,102,97,108,115,101,96,32,105,116,32,105,115,32,110,111,116,46,32,73,102,32,96,73,115,68,115,116,32,61,61,32,117,110,100,101,102,105,110,101,100,96,44,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,99,97,110,10,103,117,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,116,114,117,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,50,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,102,97,108,115,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,117,110,100,101,102,105,110,101,100,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,111,99,97,108,116,105,109,101,96,32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{6901,2},spec,{{localtime_to_universaltime,2},[{type,{6901,33},bounded_fun,[{type,{6901,33},'fun',[{type,{6901,33},product,[{var,{6901,34},'Localtime'},{var,{6901,45},'IsDst'}]},{var,{6901,55},'Universaltime'}]},[{type,{6902,7},constraint,[{atom,{6902,7},is_subtype},[{var,{6902,7},'Localtime'},{remote_type,{6902,20},[{atom,{6902,20},calendar},{atom,{6902,29},datetime},[]]}]]},{type,{6903,7},constraint,[{atom,{6903,7},is_subtype},[{var,{6903,7},'Universaltime'},{remote_type,{6903,24},[{atom,{6903,24},calendar},{atom,{6903,33},datetime},[]]}]]},{type,{6904,7},constraint,[{atom,{6904,7},is_subtype},[{var,{6904,7},'IsDst'},{type,{6904,16},union,[{atom,{6904,16},true},{atom,{6904,23},false},{atom,{6904,31},undefined}]}]]}]]}]}}]}},{{function,load_nif,2},{6826,2},[<<108,111,97,100,95,110,105,102,40,80,97,116,104,44,32,76,111,97,100,73,110,102,111,41>>],#{<<101,110>> => <<76,111,97,100,115,32,97,110,100,32,108,105,110,107,115,32,97,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,101,100,32,102,117,110,99,116,105,111,110,115,32,40,78,73,70,115,41,10,102,111,114,32,97,32,109,111,100,117,108,101,46,10,10,96,80,97,116,104,96,32,105,115,32,97,32,102,105,108,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,104,97,114,101,97,98,108,101,32,111,98,106,101,99,116,47,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,102,105,108,101,10,109,105,110,117,115,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,102,105,108,101,32,101,120,116,101,110,115,105,111,110,32,40,96,46,115,111,96,32,102,111,114,32,85,110,105,120,32,97,110,100,32,96,46,100,108,108,96,32,102,111,114,32,87,105,110,100,111,119,115,41,46,10,78,111,116,105,99,101,32,116,104,97,116,32,111,110,32,109,111,115,116,32,79,83,115,32,116,104,101,32,108,105,98,114,97,114,121,32,104,97,115,32,116,111,32,104,97,118,101,32,97,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,32,111,110,32,100,105,115,99,32,119,104,101,110,32,97,110,10,117,112,103,114,97,100,101,32,111,102,32,116,104,101,32,110,105,102,32,105,115,32,100,111,110,101,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,116,104,101,32,115,97,109,101,44,32,98,117,116,32,116,104,101,32,99,111,110,116,101,110,116,115,32,100,105,102,102,101,114,44,10,116,104,101,32,111,108,100,32,108,105,98,114,97,114,121,32,109,97,121,32,98,101,32,108,111,97,100,101,100,32,105,110,115,116,101,97,100,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,32,78,73,70,10,108,105,98,114,97,114,121,44,32,115,101,101,32,91,96,101,114,108,95,110,105,102,40,51,41,96,93,40,101,114,108,95,110,105,102,46,109,100,41,46,10,10,96,76,111,97,100,73,110,102,111,96,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,32,73,116,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,108,105,98,114,97,114,121,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,10,105,110,105,116,105,97,108,105,122,97,116,105,111,110,46,32,65,32,103,111,111,100,32,112,114,97,99,116,105,99,101,32,105,115,32,116,111,32,105,110,99,108,117,100,101,32,97,32,109,111,100,117,108,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,116,111,32,115,117,112,112,111,114,116,10,102,117,116,117,114,101,32,99,111,100,101,32,117,112,103,114,97,100,101,32,115,99,101,110,97,114,105,111,115,46,10,10,84,104,101,32,99,97,108,108,32,116,111,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,109,117,115,116,32,98,101,32,109,97,100,101,32,95,100,105,114,101,99,116,108,121,95,32,102,114,111,109,32,116,104,101,32,69,114,108,97,110,103,10,99,111,100,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,98,101,108,111,110,103,115,32,116,111,46,32,73,116,32,114,101,116,117,114,110,115,32,101,105,116,104,101,114,32,96,111,107,96,44,32,111,114,10,96,123,101,114,114,111,114,44,123,82,101,97,115,111,110,44,84,101,120,116,125,125,96,32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32,96,82,101,97,115,111,110,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,10,119,104,105,108,101,32,96,84,101,120,116,96,32,105,115,32,97,32,104,117,109,97,110,32,114,101,97,100,97,98,108,101,32,115,116,114,105,110,103,32,116,104,97,116,32,99,97,110,32,103,105,118,101,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,102,97,105,108,117,114,101,58,10,10,45,32,42,42,96,108,111,97,100,95,102,97,105,108,101,100,96,42,42,32,45,32,84,104,101,32,79,83,32,102,97,105,108,101,100,32,116,111,32,108,111,97,100,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,46,10,10,45,32,42,42,96,98,97,100,95,108,105,98,96,42,42,32,45,32,84,104,101,32,108,105,98,114,97,114,121,32,100,105,100,32,110,111,116,32,102,117,108,102,105,108,108,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,97,115,32,97,32,78,73,70,32,108,105,98,114,97,114,121,10,32,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,108,111,97,100,32,124,32,117,112,103,114,97,100,101,96,42,42,32,45,32,84,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,98,114,97,114,121,32,99,97,108,108,98,97,99,107,32,119,97,115,32,117,110,115,117,99,99,101,115,115,102,117,108,46,10,10,45,32,42,42,96,114,101,108,111,97,100,96,42,42,32,45,32,65,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,97,108,114,101,97,100,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,105,110,115,116,97,110,99,101,46,32,84,104,101,10,32,32,112,114,101,118,105,111,117,115,108,121,32,100,101,112,114,101,99,97,116,101,100,32,96,114,101,108,111,97,100,96,32,102,101,97,116,117,114,101,32,119,97,115,32,114,101,109,111,118,101,100,32,105,110,32,79,84,80,32,50,48,46,10,10,45,32,42,42,96,111,108,100,95,99,111,100,101,96,42,42,32,45,32,84,104,101,32,99,97,108,108,32,116,111,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,119,97,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,10,32,32,111,108,100,32,99,111,100,101,32,111,102,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,117,112,103,114,97,100,101,100,59,32,116,104,105,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,10,10,73,102,32,116,104,101,32,91,96,45,110,105,102,115,40,41,96,93,40,96,101,58,115,121,115,116,101,109,58,109,111,100,117,108,101,115,46,109,100,35,110,105,102,115,95,97,116,116,114,105,98,117,116,101,96,41,32,97,116,116,114,105,98,117,116,101,32,105,115,32,117,115,101,100,10,40,119,104,105,99,104,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,41,44,32,97,108,108,32,78,73,70,115,32,105,110,32,116,104,101,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,109,117,115,116,32,98,101,32,100,101,99,108,97,114,101,100,32,97,115,32,115,117,99,104,10,102,111,114,32,91,96,108,111,97,100,95,110,105,102,47,50,96,93,40,96,108,111,97,100,95,110,105,102,47,50,96,41,32,116,111,32,115,117,99,99,101,101,100,46,32,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,32,97,108,108,32,102,117,110,99,116,105,111,110,115,10,100,101,99,108,97,114,101,100,32,119,105,116,104,32,116,104,101,32,96,45,110,105,102,115,40,41,96,32,97,116,116,114,105,98,117,116,101,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,98,121,32,116,104,101,10,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,46,32,84,104,105,115,32,97,108,108,111,119,115,32,97,32,116,97,114,103,101,116,32,105,110,100,101,112,101,110,100,101,110,116,32,69,114,108,97,110,103,32,102,105,108,101,32,116,111,32,99,111,110,116,97,105,110,10,102,97,108,108,98,97,99,107,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,109,97,121,32,108,97,99,107,32,78,73,70,32,115,117,112,112,111,114,116,32,100,101,112,101,110,100,105,110,103,32,111,110,10,116,97,114,103,101,116,32,79,83,47,104,97,114,100,119,97,114,101,32,112,108,97,116,102,111,114,109,46>>},#{group => code,specification => [{attribute,{6869,2},spec,{{load_nif,2},[{type,{6869,15},bounded_fun,[{type,{6869,15},'fun',[{type,{6869,15},product,[{var,{6869,16},'Path'},{var,{6869,22},'LoadInfo'}]},{type,{6869,36},union,[{atom,{6869,36},ok},{var,{6869,41},'Error'}]}]},[{type,{6870,7},constraint,[{atom,{6870,7},is_subtype},[{var,{6870,7},'Path'},{type,{6870,15},string,[]}]]},{type,{6871,7},constraint,[{atom,{6871,7},is_subtype},[{var,{6871,7},'LoadInfo'},{type,{6871,19},term,[]}]]},{type,{6872,7},constraint,[{atom,{6872,7},is_subtype},[{var,{6872,7},'Error'},{type,{6872,16},tuple,[{atom,{6872,17},error},{type,{6872,24},tuple,[{var,{6872,25},'Reason'},{ann_type,{6872,33},[{var,{6872,33},'Text'},{type,{6872,41},string,[]}]}]}]}]]},{type,{6873,7},constraint,[{atom,{6873,7},is_subtype},[{var,{6873,7},'Reason'},{type,{6873,17},union,[{atom,{6873,17},load_failed},{atom,{6873,31},bad_lib},{atom,{6873,41},load},{atom,{6873,48},reload},{atom,{6873,57},upgrade},{atom,{6873,67},old_code}]}]]}]]}]}}]}},{{function,load_module,2},{6774,2},[<<108,111,97,100,95,109,111,100,117,108,101,40,77,111,100,117,108,101,44,32,66,105,110,97,114,121,41>>],#{<<101,110>> => <<76,111,97,100,115,32,96,77,111,100,117,108,101,96,32,100,101,115,99,114,105,98,101,100,32,98,121,32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,101,100,32,119,105,116,104,105,110,32,96,66,105,110,97,114,121,96,46,10,10,73,102,32,116,104,101,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,44,32,97,108,108,32,101,120,112,111,114,116,10,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,114,101,112,108,97,99,101,100,32,115,111,32,116,104,101,121,32,112,111,105,110,116,32,116,111,32,116,104,101,32,110,101,119,108,121,32,108,111,97,100,101,100,32,99,111,100,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,10,108,111,97,100,101,100,32,99,111,100,101,32,105,115,32,107,101,112,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,97,115,32,111,108,100,32,99,111,100,101,44,32,97,115,32,116,104,101,114,101,32,99,97,110,32,115,116,105,108,108,32,98,101,32,112,114,111,99,101,115,115,101,115,10,101,120,101,99,117,116,105,110,103,32,116,104,97,116,32,99,111,100,101,46,10,10,82,101,116,117,114,110,115,32,101,105,116,104,101,114,32,96,123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125,96,44,32,111,114,32,96,123,101,114,114,111,114,44,32,82,101,97,115,111,110,125,96,32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,10,96,82,101,97,115,111,110,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,42,42,96,98,97,100,102,105,108,101,96,42,42,32,45,32,84,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,102,111,114,109,97,116,32,95,111,114,95,32,116,104,101,10,32,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,115,32,99,111,100,101,32,102,111,114,32,97,110,111,116,104,101,114,32,109,111,100,117,108,101,32,116,104,97,110,32,96,77,111,100,117,108,101,96,46,10,10,45,32,42,42,96,110,111,116,95,112,117,114,103,101,100,96,42,42,32,45,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,108,111,97,100,101,100,32,98,101,99,97,117,115,101,10,32,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46,10,10,45,32,42,42,96,111,110,95,108,111,97,100,96,42,42,32,45,32,84,104,101,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,110,32,96,111,110,95,108,111,97,100,96,32,100,101,99,108,97,114,97,116,105,111,110,32,116,104,97,116,10,32,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,101,100,32,98,101,102,111,114,101,32,96,66,105,110,97,114,121,96,32,99,97,110,32,98,101,99,111,109,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,46,32,65,110,121,32,112,114,101,118,105,111,117,115,10,32,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,32,119,105,108,108,32,114,101,109,97,105,110,32,117,110,116,105,108,32,116,104,101,32,96,111,110,95,108,111,97,100,96,32,99,97,108,108,32,104,97,115,32,102,105,110,105,115,104,101,100,46,10,10,45,32,42,42,110,111,116,95,97,108,108,111,119,101,100,42,42,32,45,32,84,104,101,32,99,111,100,101,32,105,110,32,96,66,105,110,97,114,121,96,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,102,101,97,116,117,114,101,115,32,116,104,97,116,10,32,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46>>},#{group => code,specification => [{attribute,{6804,2},spec,{{load_module,2},[{type,{6804,18},bounded_fun,[{type,{6804,18},'fun',[{type,{6804,18},product,[{var,{6804,19},'Module'},{var,{6804,27},'Binary'}]},{type,{6804,38},union,[{type,{6804,38},tuple,[{atom,{6804,39},module},{var,{6804,47},'Module'}]},{type,{6804,57},tuple,[{atom,{6804,58},error},{var,{6804,65},'Reason'}]}]}]},[{type,{6805,7},constraint,[{atom,{6805,7},is_subtype},[{var,{6805,7},'Module'},{type,{6805,17},module,[]}]]},{type,{6806,7},constraint,[{atom,{6806,7},is_subtype},[{var,{6806,7},'Binary'},{type,{6806,17},binary,[]}]]},{type,{6807,7},constraint,[{atom,{6807,7},is_subtype},[{var,{6807,7},'Reason'},{type,{6807,17},union,[{atom,{6807,17},badfile},{atom,{6807,27},not_purged},{atom,{6807,40},on_load},{type,{6808,17},tuple,[{atom,{6808,18},features_not_allowed},{type,{6808,40},list,[{type,{6808,41},atom,[]}]}]}]}]]}]]}]}}]}},{{function,is_tuple,1},{6765,2},[<<105,115,95,116,117,112,108,101,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6769,2},spec,{{is_tuple,1},[{type,{6769,15},bounded_fun,[{type,{6769,15},'fun',[{type,{6769,15},product,[{var,{6769,16},'Term'}]},{type,{6769,25},boolean,[]}]},[{type,{6770,7},constraint,[{atom,{6770,7},is_subtype},[{var,{6770,7},'Term'},{type,{6770,15},term,[]}]]}]]}]}}]}},{{function,is_reference,1},{6755,2},[<<105,115,95,114,101,102,101,114,101,110,99,101,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6759,2},spec,{{is_reference,1},[{type,{6759,19},bounded_fun,[{type,{6759,19},'fun',[{type,{6759,19},product,[{var,{6759,20},'Term'}]},{type,{6759,29},boolean,[]}]},[{type,{6760,7},constraint,[{atom,{6760,7},is_subtype},[{var,{6760,7},'Term'},{type,{6760,15},term,[]}]]}]]}]}}]}},{{function,is_record,3},{6732,2},[<<105,115,95,114,101,99,111,114,100,40,84,101,114,109,44,32,82,101,99,111,114,100,84,97,103,44,32,83,105,122,101,41>>],#{<<101,110>> => <<96,82,101,99,111,114,100,84,97,103,96,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,44,32,97,110,100,32,105,116,115,10,115,105,122,101,32,105,115,32,96,83,105,122,101,96,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,32,97,110,100,32,96,83,105,122,101,96,32,105,115,32,97,32,108,105,116,101,114,97,108,10,105,110,116,101,103,101,114,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,100,111,99,117,109,101,110,116,101,100,32,102,111,114,32,99,111,109,112,108,101,116,101,110,101,115,115,46,32,85,115,117,97,108,108,121,10,62,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,32,105,115,32,116,111,32,98,101,32,117,115,101,100,46>>},#{group => terms,specification => [{attribute,{6747,2},spec,{{is_record,3},[{type,{6747,16},bounded_fun,[{type,{6747,16},'fun',[{type,{6747,16},product,[{var,{6747,17},'Term'},{var,{6747,22},'RecordTag'},{var,{6747,32},'Size'}]},{type,{6747,41},boolean,[]}]},[{type,{6748,7},constraint,[{atom,{6748,7},is_subtype},[{var,{6748,7},'Term'},{type,{6748,15},term,[]}]]},{type,{6749,7},constraint,[{atom,{6749,7},is_subtype},[{var,{6749,7},'RecordTag'},{type,{6749,20},atom,[]}]]},{type,{6750,7},constraint,[{atom,{6750,7},is_subtype},[{var,{6750,7},'Size'},{type,{6750,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,is_record,2},{6710,2},[<<105,115,95,114,101,99,111,114,100,40,84,101,114,109,44,32,82,101,99,111,114,100,84,97,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,32,97,110,100,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,46,10,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,114,109,97,108,108,121,32,116,104,101,32,99,111,109,112,105,108,101,114,32,116,114,101,97,116,115,32,99,97,108,108,115,32,116,111,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,10,62,32,101,115,112,101,99,105,97,108,108,121,46,32,73,116,32,101,109,105,116,115,32,99,111,100,101,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32,96,84,101,114,109,96,32,105,115,32,97,32,116,117,112,108,101,44,32,116,104,97,116,32,105,116,115,32,102,105,114,115,116,10,62,32,101,108,101,109,101,110,116,32,105,115,32,96,82,101,99,111,114,100,84,97,103,96,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,115,105,122,101,32,105,115,32,99,111,114,114,101,99,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,10,62,32,105,115,32,110,111,116,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,44,32,116,104,101,32,66,73,70,32,91,96,105,115,95,114,101,99,111,114,100,47,50,96,93,40,96,105,115,95,114,101,99,111,114,100,47,50,96,41,32,105,115,32,99,97,108,108,101,100,10,62,32,105,110,115,116,101,97,100,32,97,110,100,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,116,117,112,108,101,32,105,115,32,110,111,116,32,118,101,114,105,102,105,101,100,46,10,10,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,44,32,105,102,32,96,82,101,99,111,114,100,84,97,103,96,32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,46>>},#{group => terms,specification => [{attribute,{6725,2},spec,{{is_record,2},[{type,{6725,16},bounded_fun,[{type,{6725,16},'fun',[{type,{6725,16},product,[{var,{6725,17},'Term'},{var,{6725,22},'RecordTag'}]},{type,{6725,36},boolean,[]}]},[{type,{6726,7},constraint,[{atom,{6726,7},is_subtype},[{var,{6726,7},'Term'},{type,{6726,15},term,[]}]]},{type,{6727,7},constraint,[{atom,{6727,7},is_subtype},[{var,{6727,7},'RecordTag'},{type,{6727,20},atom,[]}]]}]]}]}}]}},{{function,is_port,1},{6700,2},[<<105,115,95,112,111,114,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6704,2},spec,{{is_port,1},[{type,{6704,14},bounded_fun,[{type,{6704,14},'fun',[{type,{6704,14},product,[{var,{6704,15},'Term'}]},{type,{6704,24},boolean,[]}]},[{type,{6705,7},constraint,[{atom,{6705,7},is_subtype},[{var,{6705,7},'Term'},{type,{6705,15},term,[]}]]}]]}]}}]}},{{function,is_map,1},{6689,2},[<<105,115,95,109,97,112,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,109,97,112,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6694,2},spec,{{is_map,1},[{type,{6694,13},bounded_fun,[{type,{6694,13},'fun',[{type,{6694,13},product,[{var,{6694,14},'Term'}]},{type,{6694,23},boolean,[]}]},[{type,{6695,7},constraint,[{atom,{6695,7},is_subtype},[{var,{6695,7},'Term'},{type,{6695,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,is_pid,1},{6679,2},[<<105,115,95,112,105,100,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6683,2},spec,{{is_pid,1},[{type,{6683,13},bounded_fun,[{type,{6683,13},'fun',[{type,{6683,13},product,[{var,{6683,14},'Term'}]},{type,{6683,23},boolean,[]}]},[{type,{6684,7},constraint,[{atom,{6684,7},is_subtype},[{var,{6684,7},'Term'},{type,{6684,15},term,[]}]]}]]}]}}]}},{{function,is_number,1},{6668,2},[<<105,115,95,110,117,109,98,101,114,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,46,32,79,116,104,101,114,119,105,115,101,10,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6673,2},spec,{{is_number,1},[{type,{6673,16},bounded_fun,[{type,{6673,16},'fun',[{type,{6673,16},product,[{var,{6673,17},'Term'}]},{type,{6673,26},boolean,[]}]},[{type,{6674,7},constraint,[{atom,{6674,7},is_subtype},[{var,{6674,7},'Term'},{type,{6674,15},term,[]}]]}]]}]}}]}},{{function,is_list,1},{6657,2},[<<105,115,95,108,105,115,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,108,105,115,116,32,119,105,116,104,32,122,101,114,111,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,10,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6662,2},spec,{{is_list,1},[{type,{6662,14},bounded_fun,[{type,{6662,14},'fun',[{type,{6662,14},product,[{var,{6662,15},'Term'}]},{type,{6662,24},boolean,[]}]},[{type,{6663,7},constraint,[{atom,{6663,7},is_subtype},[{var,{6663,7},'Term'},{type,{6663,15},term,[]}]]}]]}]}}]}},{{function,is_integer,1},{6647,2},[<<105,115,95,105,110,116,101,103,101,114,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6651,2},spec,{{is_integer,1},[{type,{6651,17},bounded_fun,[{type,{6651,17},'fun',[{type,{6651,17},product,[{var,{6651,18},'Term'}]},{type,{6651,27},boolean,[]}]},[{type,{6652,7},constraint,[{atom,{6652,7},is_subtype},[{var,{6652,7},'Term'},{type,{6652,15},term,[]}]]}]]}]}}]}},{{function,is_function,2},{6635,2},[<<105,115,95,102,117,110,99,116,105,111,110,40,84,101,114,109,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,117,110,32,116,104,97,116,32,99,97,110,32,98,101,32,97,112,112,108,105,101,100,32,119,105,116,104,32,96,65,114,105,116,121,96,32,110,117,109,98,101,114,32,111,102,10,97,114,103,117,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6640,2},spec,{{is_function,2},[{type,{6640,18},bounded_fun,[{type,{6640,18},'fun',[{type,{6640,18},product,[{var,{6640,19},'Term'},{var,{6640,25},'Arity'}]},{type,{6640,35},boolean,[]}]},[{type,{6641,7},constraint,[{atom,{6641,7},is_subtype},[{var,{6641,7},'Term'},{type,{6641,15},term,[]}]]},{type,{6642,7},constraint,[{atom,{6642,7},is_subtype},[{var,{6642,7},'Arity'},{type,{6642,16},arity,[]}]]}]]}]}}]}},{{function,is_function,1},{6625,2},[<<105,115,95,102,117,110,99,116,105,111,110,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,117,110,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6629,2},spec,{{is_function,1},[{type,{6629,18},bounded_fun,[{type,{6629,18},'fun',[{type,{6629,18},product,[{var,{6629,19},'Term'}]},{type,{6629,28},boolean,[]}]},[{type,{6630,7},constraint,[{atom,{6630,7},is_subtype},[{var,{6630,7},'Term'},{type,{6630,15},term,[]}]]}]]}]}}]}},{{function,is_float,1},{6615,2},[<<105,115,95,102,108,111,97,116,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6619,2},spec,{{is_float,1},[{type,{6619,15},bounded_fun,[{type,{6619,15},'fun',[{type,{6619,15},product,[{var,{6619,16},'Term'}]},{type,{6619,25},boolean,[]}]},[{type,{6620,7},constraint,[{atom,{6620,7},is_subtype},[{var,{6620,7},'Term'},{type,{6620,15},term,[]}]]}]]}]}}]}},{{function,is_boolean,1},{6604,2},[<<105,115,95,98,111,111,108,101,97,110,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,116,114,117,101,96,32,111,114,32,116,104,101,32,97,116,111,109,32,96,102,97,108,115,101,96,32,40,116,104,97,116,32,105,115,44,32,97,10,98,111,111,108,101,97,110,41,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6609,2},spec,{{is_boolean,1},[{type,{6609,17},bounded_fun,[{type,{6609,17},'fun',[{type,{6609,17},product,[{var,{6609,18},'Term'}]},{type,{6609,27},boolean,[]}]},[{type,{6610,7},constraint,[{atom,{6610,7},is_subtype},[{var,{6610,7},'Term'},{type,{6610,15},term,[]}]]}]]}]}}]}},{{function,is_bitstring,1},{6594,2},[<<105,115,95,98,105,116,115,116,114,105,110,103,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,40,105,110,99,108,117,100,105,110,103,32,97,32,98,105,110,97,114,121,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6598,2},spec,{{is_bitstring,1},[{type,{6598,19},bounded_fun,[{type,{6598,19},'fun',[{type,{6598,19},product,[{var,{6598,20},'Term'}]},{type,{6598,29},boolean,[]}]},[{type,{6599,7},constraint,[{atom,{6599,7},is_subtype},[{var,{6599,7},'Term'},{type,{6599,15},term,[]}]]}]]}]}}]}},{{function,is_binary,1},{6582,2},[<<105,115,95,98,105,110,97,114,121,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,65,32,98,105,110,97,114,121,32,97,108,119,97,121,115,32,99,111,110,116,97,105,110,115,32,97,32,99,111,109,112,108,101,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>},#{group => terms,specification => [{attribute,{6588,2},spec,{{is_binary,1},[{type,{6588,16},bounded_fun,[{type,{6588,16},'fun',[{type,{6588,16},product,[{var,{6588,17},'Term'}]},{type,{6588,26},boolean,[]}]},[{type,{6589,7},constraint,[{atom,{6589,7},is_subtype},[{var,{6589,7},'Term'},{type,{6589,15},term,[]}]]}]]}]}}]}},{{function,is_atom,1},{6572,2},[<<105,115,95,97,116,111,109,40,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,84,101,114,109,96,32,105,115,32,97,110,32,97,116,111,109,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46>>},#{group => terms,specification => [{attribute,{6576,2},spec,{{is_atom,1},[{type,{6576,14},bounded_fun,[{type,{6576,14},'fun',[{type,{6576,14},product,[{var,{6576,15},'Term'}]},{type,{6576,24},boolean,[]}]},[{type,{6577,7},constraint,[{atom,{6577,7},is_subtype},[{var,{6577,7},'Term'},{type,{6577,15},term,[]}]]}]]}]}}]}},{{function,hd,1},{6543,2},[<<104,100,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,100,32,111,102,32,96,76,105,115,116,96,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,46,10,10,73,116,32,119,111,114,107,115,32,119,105,116,104,32,105,109,112,114,111,112,101,114,32,108,105,115,116,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,100,40,91,49,44,50,44,51,44,52,44,53,93,41,46,10,49,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,100,40,91,102,105,114,115,116,44,32,115,101,99,111,110,100,44,32,116,104,105,114,100,44,32,115,111,95,111,110,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,102,105,114,115,116,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,76,105,115,116,96,32,105,115,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,96,91,93,96,46>>},#{group => terms,specification => [{attribute,{6563,2},spec,{{hd,1},[{type,{6563,9},bounded_fun,[{type,{6563,9},'fun',[{type,{6563,9},product,[{var,{6563,10},'List'}]},{var,{6563,19},'Head'}]},[{type,{6564,7},constraint,[{atom,{6564,7},is_subtype},[{var,{6564,7},'List'},{type,{6564,15},nonempty_maybe_improper_list,[]}]]},{type,{6565,7},constraint,[{atom,{6565,7},is_subtype},[{var,{6565,7},'Head'},{type,{6565,15},term,[]}]]}]]}]}}]}},{{function,get_module_info,2},{6534,2},[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,40,77,111,100,117,108,101,44,32,73,116,101,109,41>>],hidden,#{}},{{function,element,2},{6514,2},[<<101,108,101,109,101,110,116,40,78,44,32,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,96,78,96,116,104,32,101,108,101,109,101,110,116,32,40,110,117,109,98,101,114,105,110,103,32,102,114,111,109,32,49,41,32,111,102,32,96,84,117,112,108,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,108,101,109,101,110,116,40,50,44,32,123,97,44,32,98,44,32,99,125,41,46,10,98,10,96,96,96>>},#{group => terms,specification => [{attribute,{6525,2},spec,{{element,2},[{type,{6525,14},bounded_fun,[{type,{6525,14},'fun',[{type,{6525,14},product,[{var,{6525,15},'N'},{var,{6525,18},'Tuple'}]},{type,{6525,28},term,[]}]},[{type,{6526,5},constraint,[{atom,{6526,5},is_subtype},[{var,{6526,5},'N'},{type,{6526,10},pos_integer,[]}]]},{type,{6527,5},constraint,[{atom,{6527,5},is_subtype},[{var,{6527,5},'Tuple'},{type,{6527,14},tuple,any}]]}]]}]}}]}},{{function,append,2},{6506,2},[<<97,112,112,101,110,100,40,76,105,115,116,44,32,84,97,105,108,41>>],hidden,#{}},{{function,abs,1},{6483,2},[<<97,98,115,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,102,108,111,97,116,32,116,104,97,116,32,105,115,32,116,104,101,32,97,114,105,116,104,109,101,116,105,99,97,108,32,97,98,115,111,108,117,116,101,32,118,97,108,117,101,32,111,102,32,96,70,108,111,97,116,96,10,111,114,32,96,73,110,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,98,115,40,45,51,46,51,51,41,46,10,51,46,51,51,10,62,32,97,98,115,40,45,51,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{6497,2},spec,{{abs,1},[{type,{6497,10},bounded_fun,[{type,{6497,10},'fun',[{type,{6497,10},product,[{var,{6497,11},'Float'}]},{type,{6497,21},float,[]}]},[{type,{6498,7},constraint,[{atom,{6498,7},is_subtype},[{var,{6498,7},'Float'},{type,{6498,16},float,[]}]]}]]},{type,{6499,10},bounded_fun,[{type,{6499,10},'fun',[{type,{6499,10},product,[{var,{6499,11},'Int'}]},{type,{6499,19},non_neg_integer,[]}]},[{type,{6500,7},constraint,[{atom,{6500,7},is_subtype},[{var,{6500,7},'Int'},{type,{6500,14},integer,[]}]]}]]}]}}]}},{{function,whereis,1},{6455,2},[<<119,104,101,114,101,105,115,40,82,101,103,78,97,109,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,105,116,104,32,116,104,101,10,91,96,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,96,93,40,96,114,101,103,105,115,116,101,114,47,50,96,41,32,96,82,101,103,78,97,109,101,96,32,102,114,111,109,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,32,82,101,116,117,114,110,115,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,119,104,101,114,101,105,115,40,100,98,41,46,10,60,48,46,52,51,46,48,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{6469,2},spec,{{whereis,1},[{type,{6469,14},bounded_fun,[{type,{6469,14},'fun',[{type,{6469,14},product,[{var,{6469,15},'RegName'}]},{type,{6469,27},union,[{type,{6469,27},pid,[]},{type,{6469,35},port,[]},{atom,{6469,44},undefined}]}]},[{type,{6470,7},constraint,[{atom,{6470,7},is_subtype},[{var,{6470,7},'RegName'},{type,{6470,18},atom,[]}]]}]]}]}}]}},{{function,unregister,1},{6428,2},[<<117,110,114,101,103,105,115,116,101,114,40,82,101,103,78,97,109,101,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,116,104,101,32,91,96,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,96,93,40,96,114,101,103,105,115,116,101,114,47,50,96,41,32,96,82,101,103,78,97,109,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,97,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,102,114,111,109,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,117,110,114,101,103,105,115,116,101,114,40,100,98,41,46,10,116,114,117,101,10,96,96,96,10,10,75,101,101,112,32,105,110,32,109,105,110,100,32,116,104,97,116,32,121,111,117,32,99,97,110,32,115,116,105,108,108,32,114,101,99,101,105,118,101,32,115,105,103,110,97,108,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,10,110,97,109,101,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,117,110,114,101,103,105,115,116,101,114,101,100,32,97,115,32,116,104,101,32,115,101,110,100,101,114,32,109,97,121,32,104,97,118,101,32,108,111,111,107,101,100,32,117,112,32,116,104,101,32,110,97,109,101,10,98,101,102,111,114,101,32,115,101,110,100,105,110,103,32,116,111,32,105,116,46,10,10,85,115,101,114,115,32,97,114,101,32,97,100,118,105,115,101,100,32,110,111,116,32,116,111,32,117,110,114,101,103,105,115,116,101,114,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,101,115,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,110,111,116,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46>>},#{group => processes,specification => [{attribute,{6449,2},spec,{{unregister,1},[{type,{6449,17},bounded_fun,[{type,{6449,17},'fun',[{type,{6449,17},product,[{var,{6449,18},'RegName'}]},{atom,{6449,30},true}]},[{type,{6450,7},constraint,[{atom,{6450,7},is_subtype},[{var,{6450,7},'RegName'},{type,{6450,18},atom,[]}]]}]]}]}}]}},{{function,unlink,1},{6372,2},[<<117,110,108,105,110,107,40,73,100,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,100,96,46,10,10,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,117,110,108,105,110,107,101,101,46,10,10,65,32,108,105,110,107,32,99,97,110,32,98,101,32,115,101,116,32,117,112,32,117,115,105,110,103,32,116,104,101,32,96,108,105,110,107,47,49,96,32,66,73,70,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,108,105,110,107,115,32,97,110,100,10,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,10,77,97,110,117,97,108,95,58,10,10,45,32,91,76,105,110,107,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,115,96,41,10,45,32,91,83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,45,32,91,82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,10,79,110,99,101,32,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,108,105,110,107,10,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,101,114,32,97,110,100,32,116,104,101,32,117,110,108,105,110,107,101,101,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,99,97,108,108,101,114,32,105,110,32,116,104,101,32,102,117,116,117,114,101,10,40,117,110,108,101,115,115,32,116,104,101,32,108,105,110,107,32,105,115,32,115,101,116,117,112,32,97,103,97,105,110,41,46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,105,115,10,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,41,44,32,97,110,10,96,123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,109,97,121,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,10,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,99,97,108,108,101,114,32,98,101,102,111,114,101,32,116,104,101,32,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,99,97,108,108,10,99,111,109,112,108,101,116,101,100,46,32,65,108,115,111,32,110,111,116,101,32,116,104,97,116,32,116,104,101,32,96,123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125,96,32,109,101,115,115,97,103,101,32,109,97,121,32,98,101,32,116,104,101,10,114,101,115,117,108,116,32,111,102,32,116,104,101,32,108,105,110,107,44,32,98,117,116,32,109,97,121,32,97,108,115,111,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,117,110,108,105,107,101,101,32,115,101,110,100,105,110,103,32,116,104,101,32,99,97,108,108,101,114,10,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,98,121,32,99,97,108,108,105,110,103,32,116,104,101,32,96,101,120,105,116,47,50,96,32,66,73,70,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,10,97,112,112,114,111,112,114,105,97,116,101,32,116,111,32,99,108,101,97,110,32,117,112,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,97,32,99,97,108,108,32,116,111,10,91,96,117,110,108,105,110,107,40,73,100,41,96,93,40,96,117,110,108,105,110,107,47,49,96,41,32,97,115,32,102,111,108,108,111,119,115,44,32,119,104,101,110,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,58,10,10,96,96,96,101,114,108,97,110,103,10,117,110,108,105,110,107,40,73,100,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,39,69,88,73,84,39,44,32,73,100,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100,10,96,96,96,10,10,84,104,101,32,108,105,110,107,32,114,101,109,111,118,97,108,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,115,117,99,104,32,97,32,108,105,110,107,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,10,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,10,91,108,105,110,107,32,112,114,111,116,111,99,111,108,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,35,108,105,110,107,95,112,114,111,116,111,99,111,108,41,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,95,68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,73,100,96,32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46>>},#{group => processes,specification => [{attribute,{6422,2},spec,{{unlink,1},[{type,{6422,13},bounded_fun,[{type,{6422,13},'fun',[{type,{6422,13},product,[{var,{6422,14},'Id'}]},{atom,{6422,21},true}]},[{type,{6423,7},constraint,[{atom,{6423,7},is_subtype},[{var,{6423,7},'Id'},{type,{6423,13},union,[{type,{6423,13},pid,[]},{type,{6423,21},port,[]}]}]]}]]}]}}]}},{{function,universaltime_to_posixtime,1},{6365,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,112,111,115,105,120,116,105,109,101,40,80,49,41>>],hidden,#{}},{{function,universaltime,0},{6344,2},[<<117,110,105,118,101,114,115,97,108,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,10,105,110,32,116,104,101,32,102,111,114,109,32,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,10,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,96,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,96,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,10,96,96,96>>},#{group => time,specification => [{attribute,{6359,2},spec,{{universaltime,0},[{type,{6359,20},bounded_fun,[{type,{6359,20},'fun',[{type,{6359,20},product,[]},{var,{6359,26},'DateTime'}]},[{type,{6360,7},constraint,[{atom,{6360,7},is_subtype},[{var,{6360,7},'DateTime'},{remote_type,{6360,19},[{atom,{6360,19},calendar},{atom,{6360,28},datetime},[]]}]]}]]}]}}]}},{{function,tuple_size,1},{6327,2},[<<116,117,112,108,101,95,115,105,122,101,40,84,117,112,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,96,84,117,112,108,101,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,117,112,108,101,95,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{6338,2},spec,{{tuple_size,1},[{type,{6338,17},bounded_fun,[{type,{6338,17},'fun',[{type,{6338,17},product,[{var,{6338,18},'Tuple'}]},{type,{6338,28},non_neg_integer,[]}]},[{type,{6339,7},constraint,[{atom,{6339,7},is_subtype},[{var,{6339,7},'Tuple'},{type,{6339,16},tuple,any}]]}]]}]}}]}},{{function,trunc,1},{6286,2},[<<116,114,117,110,99,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<84,114,117,110,99,97,116,101,115,32,116,104,101,32,100,101,99,105,109,97,108,115,32,111,102,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,53,46,55,41,46,10,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,45,53,46,55,41,46,10,45,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,53,41,46,10,53,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,96,93,40,96,116,114,117,110,99,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,96,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,10,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,10,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,10,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{6320,2},spec,{{trunc,1},[{type,{6320,12},bounded_fun,[{type,{6320,12},'fun',[{type,{6320,12},product,[{var,{6320,13},'Number'}]},{type,{6320,24},integer,[]}]},[{type,{6321,7},constraint,[{atom,{6321,7},is_subtype},[{var,{6321,7},'Number'},{type,{6321,17},number,[]}]]}]]}]}}]}},{{function,trace_info,2},{6262,2},[<<116,114,97,99,101,95,105,110,102,111,40,80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,114,97,99,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,44,32,112,114,111,99,101,115,115,44,32,102,117,110,99,116,105,111,110,44,32,111,114,32,101,118,101,110,116,32,102,111,114,32,116,104,101,10,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,105,110,102,111,47,51,96,32,116,104,97,116,32,111,112,101,114,97,116,101,115,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,10,32,32,62,32,115,101,115,115,105,111,110,115,46>>},#{group => trace,specification => [{attribute,{6272,2},spec,{{trace_info,2},[{type,{6272,17},bounded_fun,[{type,{6272,17},'fun',[{type,{6272,17},product,[{var,{6272,18},'PidPortFuncEvent'},{var,{6272,36},'Item'}]},{var,{6272,45},'Res'}]},[{type,{6273,7},constraint,[{atom,{6273,7},is_subtype},[{var,{6273,7},'PidPortFuncEvent'},{type,{6273,27},union,[{type,{6273,27},pid,[]},{type,{6273,35},port,[]},{atom,{6273,44},new},{atom,{6273,50},new_processes},{atom,{6273,66},new_ports},{type,{6274,24},tuple,[{var,{6274,25},'Module'},{var,{6274,33},'Function'},{var,{6274,43},'Arity'}]},{atom,{6274,52},on_load},{atom,{6274,62},send},{atom,{6274,69},'receive'}]}]]},{type,{6275,7},constraint,[{atom,{6275,7},is_subtype},[{var,{6275,7},'Module'},{type,{6275,17},module,[]}]]},{type,{6276,7},constraint,[{atom,{6276,7},is_subtype},[{var,{6276,7},'Function'},{type,{6276,19},atom,[]}]]},{type,{6277,7},constraint,[{atom,{6277,7},is_subtype},[{var,{6277,7},'Arity'},{type,{6277,16},arity,[]}]]},{type,{6278,7},constraint,[{atom,{6278,7},is_subtype},[{var,{6278,7},'Item'},{type,{6278,15},union,[{atom,{6278,15},flags},{atom,{6278,23},tracer},{atom,{6278,32},traced},{atom,{6278,41},match_spec},{atom,{6279,15},meta},{atom,{6279,22},meta_match_spec},{atom,{6279,40},call_count},{atom,{6279,53},call_time},{atom,{6279,65},call_memory},{atom,{6279,79},all}]}]]},{type,{6280,7},constraint,[{atom,{6280,7},is_subtype},[{var,{6280,7},'Res'},{user_type,{6280,14},trace_info_return,[]}]]}]]}]}}]}},{{function,trace_delivered,1},{6216,2},[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>],#{<<101,110>> => <<67,97,108,108,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,107,101,115,32,115,117,114,101,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,10,10,84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,40,103,101,110,101,114,97,116,101,100,32,98,121,32,91,96,101,114,108,97,110,103,58,116,114,97,99,101,47,51,96,93,40,96,116,114,97,99,101,47,51,96,41,44,10,96,109,58,115,101,113,95,116,114,97,99,101,96,44,32,111,114,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,93,40,96,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,41,41,32,105,115,32,100,105,115,108,111,99,97,116,101,100,10,111,110,32,116,104,101,32,116,105,109,101,45,108,105,110,101,32,99,111,109,112,97,114,101,100,32,116,111,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,121,111,117,32,107,110,111,119,32,116,104,97,116,10,96,84,114,97,99,101,101,96,32,104,97,115,32,112,97,115,115,101,100,32,115,111,109,101,32,115,112,101,99,105,102,105,99,32,112,111,105,110,116,32,105,110,32,105,116,115,32,101,120,101,99,117,116,105,111,110,44,32,97,110,100,32,121,111,117,32,119,97,110,116,32,116,111,32,107,110,111,119,10,119,104,101,110,32,97,116,32,108,101,97,115,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,101,118,101,110,116,115,32,117,112,32,116,111,32,116,104,105,115,32,112,111,105,110,116,32,104,97,118,101,10,114,101,97,99,104,101,100,32,116,104,101,32,116,114,97,99,101,114,44,32,117,115,101,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,46,10,10,87,104,101,110,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,117,112,32,116,111,10,116,104,101,32,112,111,105,110,116,32,116,104,97,116,32,96,84,114,97,99,101,101,96,32,114,101,97,99,104,101,100,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,99,97,108,108,32,116,111,10,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,44,32,116,104,101,110,32,97,32,96,123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,84,114,97,99,101,101,44,32,82,101,102,125,96,10,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,109,101,115,115,97,103,101,32,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,100,111,101,115,32,95,110,111,116,95,32,105,109,112,108,121,32,116,104,97,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,10,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,110,115,116,101,97,100,32,105,116,32,105,109,112,108,105,101,115,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,95,97,114,101,32,116,111,32,98,101,10,100,101,108,105,118,101,114,101,100,95,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,116,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,32,105,102,32,96,84,114,97,99,101,101,96,32,105,115,32,110,111,116,44,32,97,110,100,32,104,97,115,10,110,111,116,32,98,101,101,110,32,116,114,97,99,101,100,32,98,121,32,115,111,109,101,111,110,101,44,32,98,117,116,32,105,102,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,95,110,111,95,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,10,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,109,101,115,115,97,103,101,32,97,114,114,105,118,101,115,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,96,84,114,97,99,101,101,96,32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,99,117,114,114,101,110,116,108,121,32,111,114,32,112,114,101,118,105,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,111,110,10,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,114,101,115,105,100,101,115,32,111,110,46,32,84,104,101,10,115,112,101,99,105,97,108,32,96,84,114,97,99,101,101,96,32,97,116,111,109,32,96,97,108,108,96,32,100,101,110,111,116,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,99,117,114,114,101,110,116,108,121,32,97,114,101,32,116,114,97,99,101,100,32,105,110,10,116,104,101,32,110,111,100,101,46,10,10,87,104,101,110,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,91,84,114,97,99,101,114,32,77,111,100,117,108,101,93,40,96,109,58,101,114,108,95,116,114,97,99,101,114,96,41,44,32,97,110,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,105,110,10,116,104,101,32,116,114,97,99,101,32,99,97,108,108,98,97,99,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,104,97,118,101,32,114,101,97,99,104,101,100,32,105,116,115,32,114,101,99,105,112,105,101,110,116,32,98,101,102,111,114,101,32,116,104,101,10,96,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46,10,10,69,120,97,109,112,108,101,58,32,80,114,111,99,101,115,115,32,96,65,96,32,105,115,32,96,84,114,97,99,101,101,96,44,32,112,111,114,116,32,96,66,96,32,105,115,32,116,114,97,99,101,114,44,32,97,110,100,32,112,114,111,99,101,115,115,32,96,67,96,32,105,115,32,116,104,101,10,112,111,114,116,32,111,119,110,101,114,32,111,102,32,96,66,96,46,32,96,67,96,32,119,97,110,116,115,32,116,111,32,99,108,111,115,101,32,96,66,96,32,119,104,101,110,32,96,65,96,32,101,120,105,116,115,46,32,84,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,10,116,114,97,99,101,32,105,115,32,110,111,116,32,116,114,117,110,99,97,116,101,100,44,32,96,67,96,32,99,97,110,32,99,97,108,108,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,65,41,96,32,119,104,101,110,32,96,65,96,32,101,120,105,116,115,44,10,97,110,100,32,119,97,105,116,32,102,111,114,32,109,101,115,115,97,103,101,32,96,123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,65,44,32,82,101,102,125,96,32,98,101,102,111,114,101,32,99,108,111,115,105,110,103,32,96,66,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,84,114,97,99,101,101,96,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,40,100,101,97,100,32,111,114,32,97,108,105,118,101,41,32,111,110,32,116,104,101,10,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41,96,32,114,101,115,105,100,101,115,32,111,110,46>>},#{group => trace,specification => [{attribute,{6255,2},spec,{{trace_delivered,1},[{type,{6255,22},bounded_fun,[{type,{6255,22},'fun',[{type,{6255,22},product,[{var,{6255,23},'Tracee'}]},{var,{6255,34},'Ref'}]},[{type,{6256,7},constraint,[{atom,{6256,7},is_subtype},[{var,{6256,7},'Tracee'},{type,{6256,17},union,[{type,{6256,17},pid,[]},{atom,{6256,25},all}]}]]},{type,{6257,7},constraint,[{atom,{6257,7},is_subtype},[{var,{6257,7},'Ref'},{type,{6257,14},reference,[]}]]}]]}]}}]}},{{function,trace,3},{6174,2},[<<116,114,97,99,101,40,80,105,100,80,111,114,116,83,112,101,99,44,32,72,111,119,44,32,70,108,97,103,76,105,115,116,41>>],#{<<101,110>> => <<84,117,114,110,32,111,110,32,111,114,32,111,102,102,32,116,114,97,99,101,32,102,108,97,103,115,32,111,110,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,102,111,114,32,116,104,101,32,115,116,97,116,105,99,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,32,97,110,100,32,96,116,114,97,99,101,58,112,111,114,116,47,52,96,32,116,104,97,116,10,32,32,62,32,111,112,101,114,97,116,101,32,111,110,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,115,101,115,115,105,111,110,115,46,10,10,65,114,103,117,109,101,110,116,32,96,70,108,97,103,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,116,119,111,32,97,100,100,105,116,105,111,110,97,108,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,101,114,101,32,116,111,32,115,101,110,100,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,96,84,114,97,99,101,114,96,10,32,32,109,117,115,116,32,98,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,10,32,32,108,111,99,97,108,32,112,111,114,116,46,10,10,45,32,42,42,96,123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,105,115,10,32,32,116,111,32,98,101,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,111,102,32,115,101,110,100,105,110,103,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,99,97,110,32,116,104,101,110,10,32,32,105,103,110,111,114,101,32,111,114,32,99,104,97,110,103,101,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,111,32,119,114,105,116,101,32,97,32,116,114,97,99,101,114,10,32,32,109,111,100,117,108,101,44,32,115,101,101,32,96,109,58,101,114,108,95,116,114,97,99,101,114,96,46,10,10,73,102,32,110,111,32,96,116,114,97,99,101,114,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,97,108,108,32,116,104,101,32,116,114,97,99,101,10,109,101,115,115,97,103,101,115,46,32,84,104,101,32,108,101,103,97,99,121,32,116,114,97,99,101,32,115,101,115,115,105,111,110,32,104,97,115,32,110,111,32,115,112,101,99,105,102,105,101,100,32,116,114,97,99,101,114,46,10,10,70,111,114,32,102,117,114,116,104,101,114,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,101,101,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,32,97,110,100,32,96,116,114,97,99,101,58,112,111,114,116,47,52,96,46>>},#{group => trace,specification => [{attribute,{6199,2},spec,{{trace,3},[{type,{6199,12},bounded_fun,[{type,{6199,12},'fun',[{type,{6199,12},product,[{var,{6199,13},'PidPortSpec'},{var,{6199,26},'How'},{var,{6199,31},'FlagList'}]},{type,{6199,44},integer,[]}]},[{type,{6200,7},constraint,[{atom,{6200,7},is_subtype},[{var,{6200,7},'PidPortSpec'},{type,{6200,22},union,[{type,{6200,22},pid,[]},{type,{6200,30},port,[]},{atom,{6201,22},all},{atom,{6201,28},processes},{atom,{6201,40},ports},{atom,{6202,22},existing},{atom,{6202,33},existing_processes},{atom,{6202,54},existing_ports},{atom,{6203,22},new},{atom,{6203,28},new_processes},{atom,{6203,44},new_ports}]}]]},{type,{6204,7},constraint,[{atom,{6204,7},is_subtype},[{var,{6204,7},'How'},{type,{6204,14},boolean,[]}]]},{type,{6205,7},constraint,[{atom,{6205,7},is_subtype},[{var,{6205,7},'FlagList'},{type,{6205,19},list,[{user_type,{6205,20},trace_flag,[]}]}]]}]]}]}}]}},{{function,time,0},{6153,2},[<<116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,97,115,32,96,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,96,46,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,116,105,109,101,40,41,46,10,123,57,44,52,50,44,52,52,125,10,96,96,96>>},#{group => time,specification => [{attribute,{6168,2},spec,{{time,0},[{type,{6168,11},bounded_fun,[{type,{6168,11},'fun',[{type,{6168,11},product,[]},{var,{6168,17},'Time'}]},[{type,{6169,7},constraint,[{atom,{6169,7},is_subtype},[{var,{6169,7},'Time'},{remote_type,{6169,15},[{atom,{6169,15},calendar},{atom,{6169,24},time},[]]}]]}]]}]}}]}},{{function,throw,1},{6112,2},[<<116,104,114,111,119,40,65,110,121,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,116,104,114,111,119,96,46,32,73,110,116,101,110,100,101,100,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,100,111,32,110,111,110,45,108,111,99,97,108,10,114,101,116,117,114,110,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,46,10,10,73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32,91,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,99,97,116,99,104,45,97,110,100,45,116,104,114,111,119,96,41,44,32,116,104,101,10,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,32,114,101,116,117,114,110,115,32,118,97,108,117,101,32,96,65,110,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,97,116,99,104,32,116,104,114,111,119,40,123,104,101,108,108,111,44,32,116,104,101,114,101,125,41,46,10,32,32,32,32,32,32,32,32,123,104,101,108,108,111,44,116,104,101,114,101,125,10,96,96,96,10,10,73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32,96,116,114,121,96,92,45,98,108,111,99,107,32,111,102,32,97,10,91,116,114,121,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,116,114,121,96,41,44,32,116,104,101,32,118,97,108,117,101,32,96,65,110,121,96,32,99,97,110,32,98,101,32,99,97,117,103,104,116,10,119,105,116,104,105,110,32,116,104,101,32,99,97,116,99,104,32,98,108,111,99,107,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,116,114,121,10,32,32,32,32,116,104,114,111,119,40,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,34,83,111,109,101,116,104,105,110,103,32,104,97,112,112,101,110,101,100,34,125,41,10,99,97,116,99,104,10,32,32,32,32,116,104,114,111,119,58,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,68,101,115,99,125,32,45,62,10,32,32,32,32,32,32,32,32,105,111,58,102,111,114,109,97,116,40,115,116,97,110,100,97,114,100,95,101,114,114,111,114,44,32,34,69,114,114,111,114,58,32,126,115,126,110,34,44,32,91,68,101,115,99,93,41,10,101,110,100,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,110,111,99,97,116,99,104,96,32,105,102,32,110,111,116,32,99,97,117,103,104,116,32,98,121,32,97,110,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,46,10,10,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,10,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{6147,2},spec,{{throw,1},[{type,{6147,12},bounded_fun,[{type,{6147,12},'fun',[{type,{6147,12},product,[{var,{6147,13},'Any'}]},{type,{6147,21},no_return,[]}]},[{type,{6148,7},constraint,[{atom,{6148,7},is_subtype},[{var,{6148,7},'Any'},{type,{6148,14},term,[]}]]}]]}]}}]}},{{function,system_profile,2},{6060,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,40,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,101,116,115,32,115,121,115,116,101,109,32,112,114,111,102,105,108,101,114,32,111,112,116,105,111,110,115,46,32,96,80,114,111,102,105,108,101,114,80,105,100,96,32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,10,111,114,32,112,111,114,116,32,114,101,99,101,105,118,105,110,103,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,114,101,99,101,105,118,101,114,32,105,115,32,101,120,99,108,117,100,101,100,32,102,114,111,109,32,97,108,108,10,112,114,111,102,105,108,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,102,105,108,105,110,103,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,101,120,99,108,117,115,105,118,101,96,42,42,32,45,32,73,102,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,105,115,32,100,111,110,101,44,32,116,104,101,10,32,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,110,111,116,32,114,117,110,110,97,98,108,101,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,32,114,117,110,116,105,109,101,32,116,111,32,116,104,101,10,32,32,112,111,114,116,46,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,105,102,105,101,100,32,97,115,32,96,105,110,97,99,116,105,118,101,96,44,32,97,110,100,32,108,97,116,101,114,32,96,97,99,116,105,118,101,96,32,119,104,101,110,10,32,32,116,104,101,32,112,111,114,116,32,99,97,108,108,98,97,99,107,32,114,101,116,117,114,110,115,46,10,10,45,32,42,42,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,117,115,101,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,46,32,84,104,101,32,116,105,109,101,10,32,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,10,32,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,96,46,10,10,45,32,42,42,96,114,117,110,110,97,98,108,101,95,112,114,111,99,115,96,42,42,32,45,32,73,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,10,32,32,97,32,109,101,115,115,97,103,101,44,32,96,123,112,114,111,102,105,108,101,44,32,80,105,100,44,32,83,116,97,116,101,44,32,77,102,97,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,32,82,117,110,110,105,110,103,10,32,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,114,117,110,32,113,117,101,117,101,32,97,102,116,101,114,32,104,97,118,105,110,103,32,98,101,101,110,32,112,114,101,45,101,109,112,116,101,100,10,32,32,100,111,32,110,111,116,32,116,114,105,103,103,101,114,32,116,104,105,115,32,109,101,115,115,97,103,101,46,10,10,45,32,42,42,96,114,117,110,110,97,98,108,101,95,112,111,114,116,115,96,42,42,32,45,32,73,102,32,97,32,112,111,114,116,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,10,32,32,109,101,115,115,97,103,101,44,32,96,123,112,114,111,102,105,108,101,44,32,80,111,114,116,44,32,83,116,97,116,101,44,32,48,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,10,10,45,32,42,42,96,115,99,104,101,100,117,108,101,114,96,42,42,32,45,32,73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,112,117,116,32,116,111,32,115,108,101,101,112,32,111,114,32,97,119,111,107,101,110,44,32,97,32,109,101,115,115,97,103,101,44,10,32,32,96,123,112,114,111,102,105,108,101,44,32,115,99,104,101,100,117,108,101,114,44,32,73,100,44,32,83,116,97,116,101,44,32,78,111,83,99,104,101,100,115,44,32,84,115,125,96,44,32,105,115,32,115,101,110,116,32,116,111,32,96,80,114,111,102,105,108,101,114,80,105,100,96,46,10,10,45,32,42,42,96,115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,99,111,110,115,105,115,116,32,111,102,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,32,97,10,32,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,10,32,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,10,32,32,96,123,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,44,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,125,96,46,10,10,45,32,42,42,96,116,105,109,101,115,116,97,109,112,96,42,42,32,45,32,84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,105,110,99,108,117,100,101,32,97,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,10,32,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,110,111,119,40,41,96,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,105,102,32,110,111,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,96,99,112,117,95,116,105,109,101,115,116,97,109,112,96,32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,10,32,32,116,104,114,111,117,103,104,32,96,116,114,97,99,101,58,112,114,111,99,101,115,115,47,52,96,44,32,116,104,105,115,32,97,108,115,111,32,101,102,102,101,99,116,115,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,10,32,32,112,114,111,100,117,99,101,100,32,105,110,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,102,108,97,103,32,96,116,105,109,101,115,116,97,109,112,96,32,105,115,32,101,110,97,98,108,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,96,32,98,101,104,97,118,105,111,114,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>},#{group => system,specification => [{attribute,{6103,2},spec,{{system_profile,2},[{type,{6103,21},bounded_fun,[{type,{6103,21},'fun',[{type,{6103,21},product,[{var,{6103,22},'ProfilerPid'},{var,{6103,35},'Options'}]},{var,{6103,47},'ProfilerSettings'}]},[{type,{6104,7},constraint,[{atom,{6104,7},is_subtype},[{var,{6104,7},'ProfilerPid'},{type,{6104,22},union,[{type,{6104,22},pid,[]},{type,{6104,30},port,[]},{atom,{6104,39},undefined}]}]]},{type,{6105,7},constraint,[{atom,{6105,7},is_subtype},[{var,{6105,7},'Options'},{type,{6105,18},list,[{user_type,{6105,20},system_profile_option,[]}]}]]},{type,{6106,7},constraint,[{atom,{6106,7},is_subtype},[{var,{6106,7},'ProfilerSettings'},{type,{6106,27},union,[{atom,{6106,27},undefined},{type,{6106,39},tuple,[{type,{6106,41},union,[{type,{6106,41},pid,[]},{type,{6106,49},port,[]}]},{type,{6106,57},list,[{user_type,{6106,59},system_profile_option,[]}]}]}]}]]}]]}]}}]}},{{function,system_profile,0},{6045,2},[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,112,114,111,102,105,108,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,93,40,96,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50,96,41,32,97,115,32,96,123,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,10,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>},#{group => system,specification => [{attribute,{6052,2},spec,{{system_profile,0},[{type,{6052,21},bounded_fun,[{type,{6052,21},'fun',[{type,{6052,21},product,[]},{var,{6052,27},'ProfilerSettings'}]},[{type,{6053,7},constraint,[{atom,{6053,7},is_subtype},[{var,{6053,7},'ProfilerSettings'},{type,{6053,27},union,[{atom,{6053,27},undefined},{type,{6053,39},tuple,[{var,{6053,41},'ProfilerPid'},{var,{6053,54},'Options'}]}]}]]},{type,{6054,7},constraint,[{atom,{6054,7},is_subtype},[{var,{6054,7},'ProfilerPid'},{type,{6054,22},union,[{type,{6054,22},pid,[]},{type,{6054,30},port,[]}]}]]},{type,{6055,7},constraint,[{atom,{6055,7},is_subtype},[{var,{6055,7},'Options'},{type,{6055,18},list,[{user_type,{6055,20},system_profile_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,2},{5977,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,115,121,115,116,101,109,32,101,118,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,46,32,96,77,111,110,105,116,111,114,80,105,100,96,32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,114,101,99,101,105,118,105,110,103,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,115,117,112,101,114,115,101,100,101,100,32,98,121,32,96,116,114,97,99,101,58,115,121,115,116,101,109,47,51,96,32,116,104,97,116,32,111,112,101,114,97,116,101,32,111,110,10,32,32,62,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,115,101,115,115,105,111,110,115,46,10,10,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,32,116,111,32,101,110,97,98,108,101,58,10,10,45,32,42,42,96,123,108,111,110,103,95,103,99,44,32,84,105,109,101,125,96,42,42,10,45,32,42,42,96,123,108,111,110,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,44,32,123,68,105,115,97,98,108,101,44,32,69,110,97,98,108,101,125,125,96,42,42,10,45,32,42,42,96,123,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,84,105,109,101,125,96,42,42,10,45,32,42,42,96,123,108,97,114,103,101,95,104,101,97,112,44,32,83,105,122,101,125,96,42,42,10,45,32,42,42,96,98,117,115,121,95,112,111,114,116,96,42,42,10,45,32,42,42,96,98,117,115,121,95,100,105,115,116,95,112,111,114,116,96,42,42,10,10,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,44,32,115,101,101,10,96,116,114,97,99,101,58,115,121,115,116,101,109,47,51,96,46,10,10,85,110,108,105,110,107,32,96,116,114,97,99,101,58,115,121,115,116,101,109,47,51,96,44,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,116,111,10,91,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,97,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,10,115,104,111,117,108,100,32,98,101,32,115,101,116,44,32,110,111,116,32,104,111,119,32,105,116,32,115,104,111,117,108,100,32,98,101,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,109,101,97,110,115,32,111,110,108,121,32,111,110,101,32,112,114,111,99,101,115,115,10,97,116,32,97,32,116,105,109,101,32,40,96,77,111,110,105,116,111,114,80,105,100,96,41,32,99,97,110,32,98,101,32,116,104,101,32,114,101,99,101,105,118,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,10,119,105,116,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,65,108,115,111,44,32,116,104,101,32,119,97,121,32,116,111,32,99,108,101,97,114,32,97,32,115,112,101,99,105,102,105,99,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,32,105,115,32,116,111,32,110,111,116,10,105,110,99,108,117,100,101,32,105,116,32,105,110,32,116,104,101,32,108,105,115,116,32,96,79,112,116,105,111,110,115,96,46,32,65,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,98,101,10,99,108,101,97,114,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,77,111,110,105,116,111,114,80,105,100,96,32,116,101,114,109,105,110,97,116,101,115,46,10,10,84,104,101,114,101,32,97,114,101,32,110,111,32,115,112,101,99,105,97,108,32,111,112,116,105,111,110,32,118,97,108,117,101,115,32,40,108,105,107,101,32,122,101,114,111,41,32,116,111,32,99,108,101,97,114,32,97,110,32,111,112,116,105,111,110,46,32,83,111,109,101,32,111,102,32,116,104,101,10,111,112,116,105,111,110,115,32,104,97,118,101,32,97,32,117,110,115,112,101,99,105,102,105,101,100,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,76,111,119,101,114,32,118,97,108,117,101,115,32,119,105,108,108,32,98,101,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,10,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,109,111,110,105,116,111,114,32,97,108,108,32,103,97,114,98,97,103,101,10,99,111,108,108,101,99,116,105,111,110,115,32,119,105,116,104,32,96,123,108,111,110,103,95,103,99,44,32,48,125,96,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,97,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,103,101,116,115,32,115,111,32,108,97,114,103,101,32,116,104,97,116,32,105,116,32,105,116,115,101,108,102,32,115,116,97,114,116,115,32,116,111,32,99,97,117,115,101,32,115,121,115,116,101,109,10,62,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,101,110,108,97,114,103,101,32,116,104,101,32,112,114,111,99,101,115,115,10,62,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,110,100,32,112,114,111,98,97,98,108,121,32,109,97,107,101,32,116,104,101,32,112,114,111,98,108,101,109,32,119,111,114,115,101,46,10,62,10,62,32,75,101,101,112,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,110,101,97,116,32,97,110,100,32,100,111,32,110,111,116,32,115,101,116,32,116,104,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,108,105,109,105,116,115,32,116,111,111,10,62,32,116,105,103,104,116,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,110,105,116,111,114,80,105,100,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,110,105,116,111,114,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => system,specification => [{attribute,{6030,2},spec,{{system_monitor,2},[{type,{6030,21},bounded_fun,[{type,{6030,21},'fun',[{type,{6030,21},product,[{var,{6030,22},'MonitorPid'},{var,{6030,34},'Options'}]},{var,{6030,46},'MonSettings'}]},[{type,{6031,7},constraint,[{atom,{6031,7},is_subtype},[{var,{6031,7},'MonitorPid'},{type,{6031,21},pid,[]}]]},{type,{6032,7},constraint,[{atom,{6032,7},is_subtype},[{var,{6032,7},'Options'},{type,{6032,18},list,[{user_type,{6032,20},system_monitor_option,[]}]}]]},{type,{6033,7},constraint,[{atom,{6033,7},is_subtype},[{var,{6033,7},'MonSettings'},{type,{6033,22},union,[{atom,{6033,22},undefined},{type,{6033,34},tuple,[{var,{6033,36},'OldMonitorPid'},{var,{6033,51},'OldOptions'}]}]}]]},{type,{6034,7},constraint,[{atom,{6034,7},is_subtype},[{var,{6034,7},'OldMonitorPid'},{type,{6034,24},pid,[]}]]},{type,{6035,7},constraint,[{atom,{6035,7},is_subtype},[{var,{6035,7},'OldOptions'},{type,{6035,21},list,[{user_type,{6035,23},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,1},{5947,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,65,114,103,41>>],#{<<101,110>> => <<87,104,101,110,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,32,96,117,110,100,101,102,105,110,101,100,96,44,32,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,10,115,101,116,116,105,110,103,115,32,97,114,101,32,99,108,101,97,114,101,100,46,10,10,67,97,108,108,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32,96,123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,32,97,115,32,97,114,103,117,109,101,110,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,10,99,97,108,108,105,110,103,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48,96,41,46>>},#{group => system,specification => [{attribute,{5958,2},spec,{{system_monitor,1},[{type,{5958,21},bounded_fun,[{type,{5958,21},'fun',[{type,{5958,21},product,[{var,{5958,22},'Arg'}]},{var,{5958,30},'MonSettings'}]},[{type,{5959,7},constraint,[{atom,{5959,7},is_subtype},[{var,{5959,7},'Arg'},{type,{5959,14},union,[{atom,{5959,14},undefined},{type,{5959,26},tuple,[{var,{5959,28},'MonitorPid'},{var,{5959,40},'Options'}]}]}]]},{type,{5960,7},constraint,[{atom,{5960,7},is_subtype},[{var,{5960,7},'MonSettings'},{type,{5960,22},union,[{atom,{5960,22},undefined},{type,{5960,34},tuple,[{var,{5960,36},'MonitorPid'},{var,{5960,48},'Options'}]}]}]]},{type,{5961,7},constraint,[{atom,{5961,7},is_subtype},[{var,{5961,7},'MonitorPid'},{type,{5961,21},pid,[]}]]},{type,{5962,7},constraint,[{atom,{5962,7},is_subtype},[{var,{5962,7},'Options'},{type,{5962,18},list,[{user_type,{5962,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,0},{5931,2},[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,93,40,96,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50,96,41,32,97,115,32,96,123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125,96,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,110,111,32,115,101,116,116,105,110,103,115,32,101,120,105,115,116,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>},#{group => system,specification => [{attribute,{5939,2},spec,{{system_monitor,0},[{type,{5939,21},bounded_fun,[{type,{5939,21},'fun',[{type,{5939,21},product,[]},{var,{5939,27},'MonSettings'}]},[{type,{5940,7},constraint,[{atom,{5940,7},is_subtype},[{var,{5940,7},'MonSettings'},{type,{5940,22},union,[{atom,{5940,22},undefined},{type,{5940,34},tuple,[{var,{5940,36},'MonitorPid'},{var,{5940,48},'Options'}]}]}]]},{type,{5941,7},constraint,[{atom,{5941,7},is_subtype},[{var,{5941,7},'MonitorPid'},{type,{5941,21},pid,[]}]]},{type,{5942,7},constraint,[{atom,{5942,7},is_subtype},[{var,{5942,7},'Options'},{type,{5942,18},list,[{user_type,{5942,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,suspend_process,1},{5907,2},[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>],#{<<101,110>> => <<83,117,115,112,101,110,100,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,91,93,41,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>},#{group => processes,specification => [{attribute,{5916,2},spec,{{suspend_process,1},[{type,{5916,22},bounded_fun,[{type,{5916,22},'fun',[{type,{5916,22},product,[{var,{5916,23},'Suspendee'}]},{atom,{5916,37},true}]},[{type,{5917,7},constraint,[{atom,{5917,7},is_subtype},[{var,{5917,7},'Suspendee'},{type,{5917,20},pid,[]}]]}]]}]}}]}},{{function,suspend_process,2},{5808,2},[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,79,112,116,76,105,115,116,41>>],#{<<101,110>> => <<73,110,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,97,110,100,32,112,117,116,115,32,105,116,10,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,105,102,32,105,116,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,105,110,32,116,104,97,116,32,115,116,97,116,101,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,10,105,115,32,110,111,116,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,117,110,116,105,108,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,115,117,109,101,100,46,10,10,65,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,98,121,32,109,117,108,116,105,112,108,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,109,117,108,116,105,112,108,101,10,116,105,109,101,115,32,98,121,32,97,32,115,105,110,103,108,101,32,112,114,111,99,101,115,115,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,108,101,97,118,101,32,116,104,101,32,115,117,115,112,101,110,100,101,100,10,115,116,97,116,101,32,117,110,116,105,108,32,105,116,115,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,114,101,97,99,104,101,115,32,122,101,114,111,46,32,84,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,10,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,91,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,93,40,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,41,32,105,115,10,99,97,108,108,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,46,32,65,108,108,10,105,110,99,114,101,97,115,101,100,32,115,117,115,112,101,110,100,32,99,111,117,110,116,115,32,111,110,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,97,99,113,117,105,114,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,97,114,101,10,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46,10,10,79,112,116,105,111,110,115,32,40,96,79,112,116,96,115,41,58,10,10,45,32,42,42,96,97,115,121,110,99,104,114,111,110,111,117,115,96,42,42,32,45,32,65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,83,117,115,112,101,110,100,101,101,96,46,32,96,83,117,115,112,101,110,100,101,101,96,32,101,118,101,110,116,117,97,108,108,121,32,115,117,115,112,101,110,100,115,32,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,32,98,101,102,111,114,101,32,105,116,10,32,32,99,111,117,108,100,32,115,117,115,112,101,110,100,46,32,84,104,101,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,114,101,116,117,114,110,115,32,105,109,109,101,100,105,97,116,101,108,121,44,10,32,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,115,117,115,112,101,110,100,101,100,32,121,101,116,32,111,114,32,110,111,116,46,32,84,104,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,10,32,32,119,104,101,110,32,96,83,117,115,112,101,110,100,101,101,96,32,115,117,115,112,101,110,100,115,32,99,97,110,110,111,116,32,98,101,32,100,101,100,117,99,101,100,32,102,114,111,109,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,10,32,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,96,83,117,115,112,101,110,100,101,101,96,32,95,101,118,101,110,116,117,97,108,108,121,95,32,115,117,115,112,101,110,100,115,32,40,117,110,108,101,115,115,32,105,116,32,105,115,10,32,32,114,101,115,117,109,101,100,41,46,32,73,102,32,110,111,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,112,116,105,111,110,115,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,32,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,115,117,115,112,101,110,100,101,100,46,10,10,45,32,42,42,96,123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125,96,42,42,32,45,32,65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,97,10,32,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,112,108,121,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,10,32,32,96,123,82,101,112,108,121,84,97,103,44,32,83,116,97,116,101,125,96,32,119,104,101,114,101,32,96,83,116,97,116,101,96,32,105,115,32,101,105,116,104,101,114,58,10,10,32,32,45,32,42,42,96,101,120,105,116,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,101,120,105,116,101,100,46,10,10,32,32,45,32,42,42,96,115,117,115,112,101,110,100,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,119,32,115,117,115,112,101,110,100,101,100,46,10,10,32,32,45,32,42,42,96,110,111,116,95,115,117,115,112,101,110,100,101,100,96,42,42,32,45,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,104,97,112,112,101,110,10,32,32,32,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,115,117,101,100,32,116,104,105,115,32,114,101,113,117,101,115,116,44,32,104,97,118,101,32,99,97,108,108,101,100,10,32,32,32,32,91,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,93,40,96,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,41,32,98,101,102,111,114,101,32,103,101,116,116,105,110,103,32,116,104,101,32,114,101,112,108,121,46,10,10,32,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,44,32,116,104,101,32,96,123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125,96,32,111,112,116,105,111,110,32,98,101,104,97,118,101,115,10,32,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,111,112,116,105,111,110,32,119,105,116,104,111,117,116,32,114,101,112,108,121,32,116,97,103,46,10,10,45,32,42,42,96,117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,115,117,115,112,101,110,100,101,100,10,32,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,46,32,73,102,10,32,32,96,117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103,96,32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,44,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,10,32,32,105,115,32,115,101,110,116,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,32,111,114,32,105,102,32,97,10,32,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,104,97,115,32,98,101,101,110,32,115,101,110,116,32,97,110,100,32,105,115,32,105,110,32,116,114,97,110,115,105,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,10,32,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32,96,83,117,115,112,101,110,100,101,101,96,44,32,111,114,32,105,102,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,10,32,32,96,97,115,121,110,99,104,114,111,110,111,117,115,96,32,97,110,100,32,97,32,115,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,105,115,32,105,110,32,116,114,97,110,115,105,116,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,10,32,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,32,114,101,109,97,105,110,115,32,117,110,99,104,97,110,103,101,100,46,10,10,73,102,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,105,110,99,114,101,97,115,101,100,44,10,96,116,114,117,101,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,89,111,117,32,99,97,110,32,101,97,115,105,108,121,32,99,114,101,97,116,101,32,100,101,97,100,108,111,99,107,115,32,105,102,32,112,114,111,99,101,115,115,101,115,32,115,117,115,112,101,110,100,115,32,101,97,99,104,32,111,116,104,101,114,32,40,100,105,114,101,99,116,108,121,32,111,114,10,62,32,105,110,32,99,105,114,99,108,101,115,41,46,32,73,110,32,69,82,84,83,32,118,101,114,115,105,111,110,115,32,112,114,105,111,114,32,116,111,32,69,82,84,83,32,118,101,114,115,105,111,110,32,49,48,46,48,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,62,32,112,114,101,118,101,110,116,101,100,32,115,117,99,104,32,100,101,97,100,108,111,99,107,115,44,32,98,117,116,32,116,104,105,115,32,112,114,101,118,101,110,116,105,111,110,32,104,97,115,32,110,111,119,32,98,101,101,110,32,114,101,109,111,118,101,100,32,100,117,101,32,116,111,10,62,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,97,115,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,114,101,115,105,100,101,115,32,111,110,32,97,110,111,116,104,101,114,10,32,32,110,111,100,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,118,97,108,105,100,32,96,79,112,116,96,115,46,10,10,45,32,42,42,96,115,121,115,116,101,109,95,108,105,109,105,116,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,104,97,115,32,98,101,101,110,10,32,32,115,117,115,112,101,110,100,101,100,32,109,111,114,101,32,116,105,109,101,115,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,116,104,97,110,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,10,32,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,105,110,116,101,114,110,97,108,32,100,97,116,97,32,115,116,114,117,99,116,117,114,101,115,46,32,84,104,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,105,115,32,103,114,101,97,116,101,114,32,116,104,97,110,10,32,32,50,44,48,48,48,44,48,48,48,44,48,48,48,32,115,117,115,112,101,110,100,115,32,97,110,100,32,119,105,108,108,32,110,101,118,101,114,32,98,101,32,108,111,119,101,114,46>>},#{group => processes,specification => [{attribute,{5891,2},spec,{{suspend_process,2},[{type,{5891,22},bounded_fun,[{type,{5891,22},'fun',[{type,{5891,22},product,[{var,{5891,23},'Suspendee'},{var,{5891,34},'OptList'}]},{type,{5891,46},boolean,[]}]},[{type,{5892,7},constraint,[{atom,{5892,7},is_subtype},[{var,{5892,7},'Suspendee'},{type,{5892,20},pid,[]}]]},{type,{5893,7},constraint,[{atom,{5893,7},is_subtype},[{var,{5893,7},'OptList'},{type,{5893,18},list,[{var,{5893,19},'Opt'}]}]]},{type,{5894,7},constraint,[{atom,{5894,7},is_subtype},[{var,{5894,7},'Opt'},{type,{5894,14},union,[{atom,{5894,14},unless_suspending},{atom,{5894,34},asynchronous},{type,{5894,49},tuple,[{atom,{5894,50},asynchronous},{type,{5894,64},term,[]}]}]}]]}]]}]}}]}},{{function,start_timer,4},{5755,2},[<<115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,123,116,105,109,101,111,117,116,44,32,84,105,109,101,114,82,101,102,44,32,77,115,103,125,96,10,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,101,115,116,96,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,98,115,44,32,102,97,108,115,101,125,96,42,42,32,45,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,73,116,32,109,101,97,110,115,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,10,32,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,95,114,101,108,97,116,105,118,101,95,32,99,117,114,114,101,110,116,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,46,10,10,45,32,42,42,96,123,97,98,115,44,32,116,114,117,101,125,96,42,42,32,45,32,65,98,115,111,108,117,116,101,32,96,84,105,109,101,96,32,118,97,108,117,101,46,32,84,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,10,32,32,97,110,32,97,98,115,111,108,117,116,101,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,84,104,101,32,97,98,115,111,108,117,116,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,115,101,116,32,116,111,32,101,120,112,105,114,101,32,111,110,44,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,10,105,110,116,101,114,118,97,108,10,96,91,32,96,91,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,41,96,40,115,116,97,114,116,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,44,32,96,91,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101,41,96,40,101,110,100,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,32,93,96,46,10,73,102,32,97,32,114,101,108,97,116,105,118,101,32,116,105,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,110,101,103,97,116,105,118,101,46,10,10,73,102,32,96,68,101,115,116,96,32,105,115,32,97,32,96,116,58,112,105,100,47,48,96,44,32,105,116,32,109,117,115,116,32,98,101,32,97,32,96,116,58,112,105,100,47,48,96,32,111,102,32,97,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,10,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,101,105,116,104,101,114,32,116,101,114,109,105,110,97,116,101,100,32,111,114,32,110,111,116,46,32,73,102,10,96,68,101,115,116,96,32,105,115,32,97,110,32,96,116,58,97,116,111,109,47,48,96,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,10,112,114,111,99,101,115,115,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,110,97,109,101,32,105,115,32,108,111,111,107,101,100,32,117,112,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,105,109,101,114,10,101,120,112,105,114,97,116,105,111,110,46,32,78,111,32,101,114,114,111,114,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,46,10,10,73,102,32,96,68,101,115,116,96,32,105,115,32,97,32,96,116,58,112,105,100,47,48,96,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,10,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,96,116,58,112,105,100,47,48,96,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,111,114,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,10,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,52,46,49,49,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,105,109,101,114,115,32,97,114,101,32,110,111,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,10,119,104,101,110,32,96,68,101,115,116,96,32,105,115,32,97,110,32,96,116,58,97,116,111,109,47,48,96,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,93,40,96,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50,96,93,40,96,114,101,97,100,95,116,105,109,101,114,47,50,96,41,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,100,111,32,110,111,116,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,10,104,101,114,101,46>>},#{group => timer,specification => [{attribute,{5795,2},spec,{{start_timer,4},[{type,{5795,18},bounded_fun,[{type,{5795,18},'fun',[{type,{5795,18},product,[{var,{5795,19},'Time'},{var,{5795,25},'Dest'},{var,{5795,31},'Msg'},{var,{5795,36},'Options'}]},{var,{5795,48},'TimerRef'}]},[{type,{5796,7},constraint,[{atom,{5796,7},is_subtype},[{var,{5796,7},'Time'},{type,{5796,15},integer,[]}]]},{type,{5797,7},constraint,[{atom,{5797,7},is_subtype},[{var,{5797,7},'Dest'},{type,{5797,15},union,[{type,{5797,15},pid,[]},{type,{5797,23},atom,[]}]}]]},{type,{5798,7},constraint,[{atom,{5798,7},is_subtype},[{var,{5798,7},'Msg'},{type,{5798,14},term,[]}]]},{type,{5799,7},constraint,[{atom,{5799,7},is_subtype},[{var,{5799,7},'Options'},{type,{5799,18},list,[{var,{5799,19},'Option'}]}]]},{type,{5800,7},constraint,[{atom,{5800,7},is_subtype},[{var,{5800,7},'Abs'},{type,{5800,14},boolean,[]}]]},{type,{5801,7},constraint,[{atom,{5801,7},is_subtype},[{var,{5801,7},'Option'},{type,{5801,17},tuple,[{atom,{5801,18},abs},{var,{5801,23},'Abs'}]}]]},{type,{5802,7},constraint,[{atom,{5802,7},is_subtype},[{var,{5802,7},'TimerRef'},{type,{5802,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,start_timer,3},{5751,1},[<<115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>}},{{function,split_binary,2},{5714,2},[<<115,112,108,105,116,95,98,105,110,97,114,121,40,66,105,110,44,32,80,111,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,108,105,116,116,105,110,103,32,96,66,105,110,96,10,105,110,116,111,32,116,119,111,32,112,97,114,116,115,32,97,116,32,112,111,115,105,116,105,111,110,32,96,80,111,115,96,46,10,10,84,104,105,115,32,105,115,32,110,111,116,32,97,32,100,101,115,116,114,117,99,116,105,118,101,32,111,112,101,114,97,116,105,111,110,46,32,65,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,98,105,110,97,114,105,101,115,32,97,108,116,111,103,101,116,104,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,32,61,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,34,48,49,50,51,52,53,54,55,56,57,34,41,46,10,60,60,34,48,49,50,51,52,53,54,55,56,57,34,62,62,10,62,32,98,121,116,101,95,115,105,122,101,40,66,41,46,10,49,48,10,62,32,123,66,49,44,32,66,50,125,32,61,32,115,112,108,105,116,95,98,105,110,97,114,121,40,66,44,51,41,46,10,123,60,60,34,48,49,50,34,62,62,44,60,60,34,51,52,53,54,55,56,57,34,62,62,125,10,62,32,98,121,116,101,95,115,105,122,101,40,66,49,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,66,50,41,46,10,55,10,96,96,96>>},#{group => terms,specification => [{attribute,{5736,2},spec,{{split_binary,2},[{type,{5736,19},bounded_fun,[{type,{5736,19},'fun',[{type,{5736,19},product,[{var,{5736,20},'Bin'},{var,{5736,25},'Pos'}]},{type,{5736,33},tuple,[{type,{5736,34},binary,[]},{type,{5736,44},binary,[]}]}]},[{type,{5737,7},constraint,[{atom,{5737,7},is_subtype},[{var,{5737,7},'Bin'},{type,{5737,14},binary,[]}]]},{type,{5738,7},constraint,[{atom,{5738,7},is_subtype},[{var,{5738,7},'Pos'},{type,{5738,14},non_neg_integer,[]}]]}]]}]}}]}},{{function,spawn_link,3},{5700,2},[<<115,112,97,119,110,95,108,105,110,107,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,10,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32,96,115,112,97,119,110,47,51,96,46>>},#{group => processes,specification => [{attribute,{5706,2},spec,{{spawn_link,3},[{type,{5706,17},bounded_fun,[{type,{5706,17},'fun',[{type,{5706,17},product,[{var,{5706,18},'Module'},{var,{5706,26},'Function'},{var,{5706,36},'Args'}]},{type,{5706,45},pid,[]}]},[{type,{5707,7},constraint,[{atom,{5707,7},is_subtype},[{var,{5707,7},'Module'},{type,{5707,17},module,[]}]]},{type,{5708,7},constraint,[{atom,{5708,7},is_subtype},[{var,{5708,7},'Function'},{type,{5708,19},atom,[]}]]},{type,{5709,7},constraint,[{atom,{5709,7},is_subtype},[{var,{5709,7},'Args'},{type,{5709,15},list,[{type,{5709,16},term,[]}]}]]}]]}]}}]}},{{function,spawn,3},{5672,2},[<<115,112,97,119,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,116,111,32,96,65,114,103,115,96,46,10,10,91,96,101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41,96,93,40,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,41,32,105,115,10,32,101,118,97,108,117,97,116,101,100,32,98,121,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,10,40,119,104,101,114,101,32,96,65,114,105,116,121,96,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,96,65,114,103,115,96,41,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,10,40,115,101,101,32,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,46,32,73,102,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,10,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,32,97,110,100,32,105,116,115,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,114,101,97,115,111,110,32,96,117,110,100,101,102,96,10,111,99,99,117,114,115,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,112,97,119,110,40,115,112,101,101,100,44,32,114,101,103,117,108,97,116,111,114,44,32,91,104,105,103,104,95,115,112,101,101,100,44,32,116,104,105,110,95,99,117,116,93,41,46,10,60,48,46,49,51,46,49,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{5692,2},spec,{{spawn,3},[{type,{5692,12},bounded_fun,[{type,{5692,12},'fun',[{type,{5692,12},product,[{var,{5692,13},'Module'},{var,{5692,21},'Function'},{var,{5692,31},'Args'}]},{type,{5692,40},pid,[]}]},[{type,{5693,7},constraint,[{atom,{5693,7},is_subtype},[{var,{5693,7},'Module'},{type,{5693,17},module,[]}]]},{type,{5694,7},constraint,[{atom,{5694,7},is_subtype},[{var,{5694,7},'Function'},{type,{5694,19},atom,[]}]]},{type,{5695,7},constraint,[{atom,{5695,7},is_subtype},[{var,{5695,7},'Args'},{type,{5695,15},list,[{type,{5695,16},term,[]}]}]]}]]}]}}]}},{{function,size,1},{5646,2},[<<115,105,122,101,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,97,32,116,117,112,108,101,32,111,114,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,97,32,98,105,110,97,114,121,32,111,114,10,98,105,116,115,116,114,105,110,103,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,62,32,115,105,122,101,40,60,60,49,49,44,32,50,50,44,32,51,51,62,62,41,46,10,51,10,96,96,96,10,10,70,111,114,32,98,105,116,115,116,114,105,110,103,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,98,121,116,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,98,105,116,115,32,105,110,32,116,104,101,32,98,105,116,115,116,114,105,110,103,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,10,114,111,117,110,100,101,100,32,95,100,111,119,110,95,46,10,10,83,101,101,32,97,108,115,111,32,96,116,117,112,108,101,95,115,105,122,101,47,49,96,44,32,96,98,121,116,101,95,115,105,122,101,47,49,96,44,32,97,110,100,32,96,98,105,116,95,115,105,122,101,47,49,96,46>>},#{group => terms,specification => [{attribute,{5666,2},spec,{{size,1},[{type,{5666,11},bounded_fun,[{type,{5666,11},'fun',[{type,{5666,11},product,[{var,{5666,12},'Item'}]},{type,{5666,21},non_neg_integer,[]}]},[{type,{5667,7},constraint,[{atom,{5667,7},is_subtype},[{var,{5667,7},'Item'},{type,{5667,15},union,[{type,{5667,15},tuple,any},{type,{5667,25},binary,[]}]}]]}]]}]}}]}},{{function,setnode,3},{5624,2},[<<115,101,116,110,111,100,101,40,78,111,100,101,44,32,68,105,115,116,67,116,114,108,114,44,32,79,112,116,115,41>>],hidden,#{}},{{function,setnode,2},{5616,2},[<<115,101,116,110,111,100,101,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,seq_trace_print,2},{5608,2},[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,seq_trace_print,1},{5601,2},[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,40,80,49,41>>],hidden,#{}},{{function,seq_trace,2},{5593,2},[<<115,101,113,95,116,114,97,99,101,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,send_after,4},{5573,2},[<<115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,77,115,103,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,68,101,115,116,96,46,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,44,32,116,104,105,115,10,102,117,110,99,116,105,111,110,32,119,111,114,107,115,32,101,120,97,99,116,108,121,32,97,115,32,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,46>>},#{group => timer,specification => [{attribute,{5580,2},spec,{{send_after,4},[{type,{5580,17},bounded_fun,[{type,{5580,17},'fun',[{type,{5580,17},product,[{var,{5580,18},'Time'},{var,{5580,24},'Dest'},{var,{5580,30},'Msg'},{var,{5580,35},'Options'}]},{var,{5580,47},'TimerRef'}]},[{type,{5581,7},constraint,[{atom,{5581,7},is_subtype},[{var,{5581,7},'Time'},{type,{5581,15},integer,[]}]]},{type,{5582,7},constraint,[{atom,{5582,7},is_subtype},[{var,{5582,7},'Dest'},{type,{5582,15},union,[{type,{5582,15},pid,[]},{type,{5582,23},atom,[]}]}]]},{type,{5583,7},constraint,[{atom,{5583,7},is_subtype},[{var,{5583,7},'Msg'},{type,{5583,14},term,[]}]]},{type,{5584,7},constraint,[{atom,{5584,7},is_subtype},[{var,{5584,7},'Options'},{type,{5584,18},list,[{var,{5584,19},'Option'}]}]]},{type,{5585,7},constraint,[{atom,{5585,7},is_subtype},[{var,{5585,7},'Abs'},{type,{5585,14},boolean,[]}]]},{type,{5586,7},constraint,[{atom,{5586,7},is_subtype},[{var,{5586,7},'Option'},{type,{5586,17},tuple,[{atom,{5586,18},abs},{var,{5586,23},'Abs'}]}]]},{type,{5587,7},constraint,[{atom,{5587,7},is_subtype},[{var,{5587,7},'TimerRef'},{type,{5587,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,send_after,3},{5569,1},[<<115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>}},{{function,self,0},{5545,2},[<<115,101,108,102,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,115,101,108,102,40,41,46,10,60,48,46,50,54,46,48,62,10,96,96,96>>},#{group => processes,specification => [{attribute,{5556,2},spec,{{self,0},[{type,{5556,11},'fun',[{type,{5556,11},product,[]},{type,{5556,17},pid,[]}]}]}}]}},{{function,round,1},{5504,2},[<<114,111,117,110,100,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,98,121,32,114,111,117,110,100,105,110,103,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,52,50,46,49,41,46,10,52,50,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,53,46,53,41,46,10,54,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,45,53,46,53,41,46,10,45,54,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,96,93,40,96,114,111,117,110,100,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,10,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,96,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,10,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,96,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,10,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,10,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{5538,2},spec,{{round,1},[{type,{5538,12},bounded_fun,[{type,{5538,12},'fun',[{type,{5538,12},product,[{var,{5538,13},'Number'}]},{type,{5538,24},integer,[]}]},[{type,{5539,7},constraint,[{atom,{5539,7},is_subtype},[{var,{5539,7},'Number'},{type,{5539,17},number,[]}]]}]]}]}}]}},{{function,resume_process,1},{5472,2},[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>],#{<<101,110>> => <<68,101,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,46,10,10,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,116,104,114,111,117,103,104,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50,96,41,32,111,114,10,91,96,101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,93,40,96,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,96,41,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,10,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41,96,46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,96,83,117,115,112,101,110,100,101,101,96,10,114,101,97,99,104,101,115,32,122,101,114,111,44,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,114,101,115,117,109,101,100,44,32,116,104,97,116,32,105,115,44,32,105,116,115,32,115,116,97,116,101,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,10,115,117,115,112,101,110,100,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,116,101,32,105,116,32,104,97,100,32,98,101,102,111,114,101,32,105,116,32,119,97,115,32,115,117,115,112,101,110,100,101,100,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49,96,32,104,97,100,32,110,111,116,10,32,32,112,114,101,118,105,111,117,115,108,121,32,105,110,99,114,101,97,115,101,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,32,32,96,83,117,115,112,101,110,100,101,101,96,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,83,117,115,112,101,110,100,101,101,96,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => processes,specification => [{attribute,{5497,2},spec,{{resume_process,1},[{type,{5497,21},bounded_fun,[{type,{5497,21},'fun',[{type,{5497,21},product,[{var,{5497,22},'Suspendee'}]},{atom,{5497,36},true}]},[{type,{5498,7},constraint,[{atom,{5498,7},is_subtype},[{var,{5498,7},'Suspendee'},{type,{5498,20},pid,[]}]]}]]}]}}]}},{{function,registered,0},{5455,2},[<<114,101,103,105,115,116,101,114,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,97,109,101,115,32,116,104,97,116,32,104,97,118,101,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32,96,114,101,103,105,115,116,101,114,47,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,114,101,103,105,115,116,101,114,101,100,40,41,46,10,91,99,111,100,101,95,115,101,114,118,101,114,44,32,102,105,108,101,95,115,101,114,118,101,114,44,32,105,110,105,116,44,32,117,115,101,114,44,32,109,121,95,100,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{5466,2},spec,{{registered,0},[{type,{5466,17},bounded_fun,[{type,{5466,17},'fun',[{type,{5466,17},product,[]},{type,{5466,23},list,[{var,{5466,24},'RegName'}]}]},[{type,{5467,7},constraint,[{atom,{5467,7},is_subtype},[{var,{5467,7},'RegName'},{type,{5467,18},atom,[]}]]}]]}]}}]}},{{function,register,2},{5417,2},[<<114,101,103,105,115,116,101,114,40,82,101,103,78,97,109,101,44,32,80,105,100,79,114,80,111,114,116,41>>],#{<<101,110>> => <<82,101,103,105,115,116,101,114,115,32,116,104,101,32,110,97,109,101,32,96,82,101,103,78,97,109,101,96,32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,32,105,110,32,116,104,101,10,91,96,110,97,109,101,32,114,101,103,105,115,116,114,121,96,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101,96,41,46,10,96,82,101,103,78,97,109,101,96,44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,44,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,112,105,100,32,111,114,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,32,105,110,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,40,96,82,101,103,78,97,109,101,32,33,32,77,101,115,115,97,103,101,96,41,32,97,110,100,32,109,111,115,116,32,111,116,104,101,114,32,66,73,70,115,32,116,104,97,116,32,116,97,107,101,10,97,32,112,105,100,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,115,32,97,115,32,97,110,32,97,114,103,117,109,101,110,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,114,101,103,105,115,116,101,114,40,100,98,44,32,80,105,100,41,46,10,116,114,117,101,10,96,96,96,10,10,84,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,10,91,68,105,114,101,99,116,108,121,32,86,105,115,105,98,108,101,32,69,114,108,97,110,103,32,82,101,115,111,117,114,99,101,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,118,105,115,105,98,108,101,45,114,101,115,111,117,114,99,101,115,96,41,10,97,110,100,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,110,114,101,103,105,115,116,101,114,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,79,114,80,111,114,116,96,32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,97,108,114,101,97,100,121,32,105,110,32,117,115,101,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,115,32,97,108,114,101,97,100,121,32,114,101,103,105,115,116,101,114,101,100,32,40,97,108,114,101,97,100,121,32,104,97,115,32,97,10,32,32,110,97,109,101,41,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,82,101,103,78,97,109,101,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,117,110,100,101,102,105,110,101,100,96,46>>},#{group => processes,specification => [{attribute,{5448,2},spec,{{register,2},[{type,{5448,15},bounded_fun,[{type,{5448,15},'fun',[{type,{5448,15},product,[{var,{5448,16},'RegName'},{var,{5448,25},'PidOrPort'}]},{atom,{5448,39},true}]},[{type,{5449,7},constraint,[{atom,{5449,7},is_subtype},[{var,{5449,7},'RegName'},{type,{5449,18},atom,[]}]]},{type,{5450,7},constraint,[{atom,{5450,7},is_subtype},[{var,{5450,7},'PidOrPort'},{type,{5450,20},union,[{type,{5450,20},port,[]},{type,{5450,29},pid,[]}]}]]}]]}]}}]}},{{function,ref_to_list,1},{5402,2},[<<114,101,102,95,116,111,95,108,105,115,116,40,82,101,102,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,82,101,102,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{5411,2},spec,{{ref_to_list,1},[{type,{5411,18},bounded_fun,[{type,{5411,18},'fun',[{type,{5411,18},product,[{var,{5411,19},'Ref'}]},{type,{5411,27},string,[]}]},[{type,{5412,7},constraint,[{atom,{5412,7},is_subtype},[{var,{5412,7},'Ref'},{type,{5412,14},reference,[]}]]}]]}]}}]}},{{function,read_timer,2},{5348,2},[<<114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,101,105,116,104,101,114,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,32,111,114,10,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,46,32,96,84,105,109,101,114,82,101,102,96,32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,10,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46,10,10,96,79,112,116,105,111,110,115,96,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,65,115,121,110,99,125,96,42,42,32,45,32,65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32,96,65,115,121,110,99,96,10,32,32,100,101,102,97,117,108,116,115,32,116,111,32,96,102,97,108,115,101,96,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,10,32,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,46,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,10,32,32,96,116,114,117,101,96,44,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,115,116,97,116,101,10,32,32,105,110,102,111,114,109,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,10,32,32,96,111,107,96,46,32,65,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,97,116,32,96,123,114,101,97,100,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,32,32,99,97,108,108,101,114,32,111,102,32,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,96,32,119,104,101,110,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,10,116,105,109,101,114,32,101,120,112,105,114,101,115,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,96,102,97,108,115,101,96,44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,105,109,101,114,82,101,102,96,32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,10,84,104,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,111,114,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32,96,84,105,109,101,114,82,101,102,96,10,110,101,118,101,114,32,104,97,115,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,115,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,10,116,101,108,108,32,121,111,117,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,10,62,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,10,62,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,10,62,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,97,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,10,62,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,10,62,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,116,114,117,101,125,96,46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,102,97,108,115,101,125,96,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,10,62,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,93,40,96,99,97,110,99,101,108,95,116,105,109,101,114,47,50,96,41,46>>},#{group => timer,specification => [{attribute,{5390,2},spec,{{read_timer,2},[{type,{5390,17},bounded_fun,[{type,{5390,17},'fun',[{type,{5390,17},product,[{var,{5390,18},'TimerRef'},{var,{5390,28},'Options'}]},{type,{5390,40},union,[{var,{5390,40},'Result'},{atom,{5390,49},ok}]}]},[{type,{5391,7},constraint,[{atom,{5391,7},is_subtype},[{var,{5391,7},'TimerRef'},{type,{5391,19},reference,[]}]]},{type,{5392,7},constraint,[{atom,{5392,7},is_subtype},[{var,{5392,7},'Async'},{type,{5392,16},boolean,[]}]]},{type,{5393,7},constraint,[{atom,{5393,7},is_subtype},[{var,{5393,7},'Option'},{type,{5393,17},tuple,[{atom,{5393,18},async},{var,{5393,25},'Async'}]}]]},{type,{5394,7},constraint,[{atom,{5394,7},is_subtype},[{var,{5394,7},'Options'},{type,{5394,18},list,[{var,{5394,19},'Option'}]}]]},{type,{5395,7},constraint,[{atom,{5395,7},is_subtype},[{var,{5395,7},'Time'},{type,{5395,15},non_neg_integer,[]}]]},{type,{5396,7},constraint,[{atom,{5396,7},is_subtype},[{var,{5396,7},'Result'},{type,{5396,17},union,[{var,{5396,17},'Time'},{atom,{5396,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,read_timer,1},{5344,1},[<<114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,41>>],none,#{group => timer,equiv => <<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>}},{{function,raise,3},{5287,2},[<<114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,99,108,97,115,115,44,32,114,101,97,115,111,110,44,32,97,110,100,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,116,114,97,99,101,10,40,95,115,116,97,99,107,116,114,97,99,101,95,41,46,10,10,96,67,108,97,115,115,96,32,105,115,32,96,101,114,114,111,114,96,44,32,96,101,120,105,116,96,44,32,111,114,32,96,116,104,114,111,119,96,46,32,83,111,44,32,105,102,32,105,116,32,119,101,114,101,32,110,111,116,32,102,111,114,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,44,10,96,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,101,114,108,97,110,103,58,67,108,97,115,115,40,82,101,97,115,111,110,41,96,32,40,103,105,118,101,110,32,116,104,97,116,32,96,67,108,97,115,115,96,32,105,115,32,97,32,118,97,108,105,100,32,99,108,97,115,115,41,46,10,10,96,82,101,97,115,111,110,96,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,10,10,96,83,116,97,99,107,116,114,97,99,101,96,32,105,115,32,97,32,108,105,115,116,32,97,115,32,112,114,111,118,105,100,101,100,32,105,110,32,97,32,116,114,121,45,99,97,116,99,104,32,99,108,97,117,115,101,46,10,10,96,96,96,101,114,108,97,110,103,10,116,114,121,10,32,32,32,32,46,46,46,10,99,97,116,99,104,32,67,108,97,115,115,58,82,101,97,115,111,110,58,83,116,97,99,107,116,114,97,99,101,32,45,62,10,32,32,32,32,46,46,46,10,101,110,100,10,96,96,96,10,10,84,104,97,116,32,105,115,44,32,97,32,108,105,115,116,32,111,102,32,102,111,117,114,45,116,117,112,108,101,115,32,96,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,32,124,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125,96,44,10,119,104,101,114,101,32,96,77,111,100,117,108,101,96,32,97,110,100,32,96,70,117,110,99,116,105,111,110,96,32,97,114,101,32,97,116,111,109,115,44,32,97,110,100,32,116,104,101,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,105,110,116,101,103,101,114,10,97,114,105,116,121,32,111,114,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46,32,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,99,97,110,32,97,108,115,111,32,99,111,110,116,97,105,110,10,96,123,70,117,110,44,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125,96,32,116,117,112,108,101,115,44,32,119,104,101,114,101,32,96,70,117,110,96,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,32,97,110,100,32,96,65,114,103,115,96,32,105,115,32,97,110,10,97,114,103,117,109,101,110,116,32,108,105,115,116,46,10,10,69,108,101,109,101,110,116,32,96,69,120,116,114,97,73,110,102,111,96,32,97,116,32,116,104,101,32,101,110,100,32,105,115,32,111,112,116,105,111,110,97,108,46,32,79,109,105,116,116,105,110,103,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,115,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,46,10,10,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,115,116,97,99,107,116,114,97,99,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,59,32,105,116,10,105,115,32,116,114,117,110,99,97,116,101,100,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,120,105,109,117,109,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,111,32,116,101,114,109,105,110,97,116,101,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,10,118,97,108,117,101,32,117,110,108,101,115,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,105,110,118,97,108,105,100,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,95,114,101,116,117,114,110,115,32,116,104,101,10,101,114,114,111,114,32,114,101,97,115,111,110,95,32,96,98,97,100,97,114,103,96,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,114,101,116,117,114,110,44,32,121,111,117,32,99,97,110,32,99,97,108,108,10,91,96,101,114,114,111,114,40,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,41,96,93,40,96,101,114,114,111,114,47,49,96,41,32,97,110,100,32,104,111,112,101,32,116,111,10,100,105,115,116,105,110,103,117,105,115,104,32,101,120,99,101,112,116,105,111,110,115,32,108,97,116,101,114,46,10,10,83,101,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,110,117,97,108,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,10,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,101,115,32,97,110,100,32,104,111,119,32,116,111,32,99,97,116,99,104,32,101,120,99,101,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{5329,2},spec,{{raise,3},[{type,{5329,12},bounded_fun,[{type,{5329,12},'fun',[{type,{5329,12},product,[{var,{5329,13},'Class'},{var,{5329,20},'Reason'},{var,{5329,28},'Stacktrace'}]},{atom,{5329,43},badarg}]},[{type,{5330,7},constraint,[{atom,{5330,7},is_subtype},[{var,{5330,7},'Class'},{type,{5330,16},union,[{atom,{5330,16},error},{atom,{5330,26},exit},{atom,{5330,35},throw}]}]]},{type,{5331,7},constraint,[{atom,{5331,7},is_subtype},[{var,{5331,7},'Reason'},{type,{5331,17},term,[]}]]},{type,{5332,7},constraint,[{atom,{5332,7},is_subtype},[{var,{5332,7},'Stacktrace'},{user_type,{5332,21},raise_stacktrace,[]}]]}]]}]}}]}},{{function,put,2},{5255,2},[<<112,117,116,40,75,101,121,44,32,86,97,108,41>>],#{<<101,110>> => <<65,100,100,115,32,97,32,110,101,119,32,96,75,101,121,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,44,32,97,110,100,10,114,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,46,32,73,102,32,96,75,101,121,96,32,101,120,105,115,116,115,44,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,105,115,32,100,101,108,101,116,101,100,32,97,110,100,32,114,101,112,108,97,99,101,100,32,98,121,10,96,86,97,108,96,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,46,10,10,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,88,32,61,32,112,117,116,40,110,97,109,101,44,32,119,97,108,114,117,115,41,44,32,89,32,61,32,112,117,116,40,110,97,109,101,44,32,99,97,114,112,101,110,116,101,114,41,44,10,90,32,61,32,103,101,116,40,110,97,109,101,41,44,10,123,88,44,32,89,44,32,90,125,46,10,123,117,110,100,101,102,105,110,101,100,44,119,97,108,114,117,115,44,99,97,114,112,101,110,116,101,114,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,118,97,108,117,101,115,32,115,116,111,114,101,100,32,119,104,101,110,32,96,112,117,116,96,32,105,115,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,116,104,101,32,115,99,111,112,101,32,111,102,32,97,32,96,99,97,116,99,104,96,32,97,114,101,10,62,32,110,111,116,32,114,101,116,114,97,99,116,101,100,32,105,102,32,97,32,96,116,104,114,111,119,96,32,105,115,32,101,118,97,108,117,97,116,101,100,44,32,111,114,32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>},#{group => processes,specification => [{attribute,{5279,2},spec,{{put,2},[{type,{5279,10},bounded_fun,[{type,{5279,10},'fun',[{type,{5279,10},product,[{var,{5279,11},'Key'},{var,{5279,16},'Val'}]},{type,{5279,24},term,[]}]},[{type,{5280,7},constraint,[{atom,{5280,7},is_subtype},[{var,{5280,7},'Key'},{type,{5280,14},term,[]}]]},{type,{5281,7},constraint,[{atom,{5281,7},is_subtype},[{var,{5281,7},'Val'},{type,{5281,14},term,[]}]]}]]}]}}]}},{{function,purge_module,1},{5223,2},[<<112,117,114,103,101,95,109,111,100,117,108,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,109,111,118,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46,32,66,101,102,111,114,101,32,116,104,105,115,32,66,73,70,32,105,115,32,117,115,101,100,44,32,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50,96,10,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,116,111,32,99,104,101,99,107,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,40,69,114,108,97,110,103,47,79,84,80,32,49,57,41,44,32,97,110,121,32,108,105,110,103,101,114,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,115,116,105,108,108,32,101,120,101,99,117,116,101,10,62,32,116,104,101,32,111,108,100,32,99,111,100,101,32,105,115,32,107,105,108,108,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,110,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,105,110,99,111,114,114,101,99,116,10,62,32,117,115,101,32,99,111,117,108,100,32,99,97,117,115,101,32,109,117,99,104,32,109,111,114,101,32,102,97,116,97,108,32,102,97,105,108,117,114,101,115,44,32,108,105,107,101,32,101,109,117,108,97,116,111,114,32,99,114,97,115,104,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46>>},#{group => code,specification => [{attribute,{5241,2},spec,{{purge_module,1},[{type,{5241,19},bounded_fun,[{type,{5241,19},'fun',[{type,{5241,19},product,[{var,{5241,20},'Module'}]},{atom,{5241,31},true}]},[{type,{5242,7},constraint,[{atom,{5242,7},is_subtype},[{var,{5242,7},'Module'},{type,{5242,17},atom,[]}]]}]]}]}}]}},{{function,processes,0},{5201,2},[<<112,114,111,99,101,115,115,101,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,10,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,105,118,101,46,32,84,104,97,116,32,105,115,44,10,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,102,111,114,32,97,110,32,101,120,105,116,105,110,103,10,112,114,111,99,101,115,115,44,32,98,117,116,32,105,116,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,102,114,111,109,10,96,112,114,111,99,101,115,115,101,115,47,48,96,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,114,111,99,101,115,115,101,115,40,41,46,10,91,60,48,46,48,46,48,62,44,60,48,46,50,46,48,62,44,60,48,46,52,46,48,62,44,60,48,46,53,46,48,62,44,60,48,46,55,46,48,62,44,60,48,46,56,46,48,62,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{5218,2},spec,{{processes,0},[{type,{5218,16},'fun',[{type,{5218,16},product,[]},{type,{5218,22},list,[{type,{5218,23},pid,[]}]}]}]}}]}},{{function,process_info,1},{5154,2},[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46,10,10,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,97,108,108,32,96,73,110,102,111,84,117,112,108,101,96,115,32,97,114,101,32,110,111,116,10,109,97,110,100,97,116,111,114,121,46,32,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,10,110,111,116,105,99,101,46,10,10,84,104,101,32,96,73,110,102,111,84,117,112,108,101,96,115,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,58,10,10,45,32,96,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,96,10,45,32,96,105,110,105,116,105,97,108,95,99,97,108,108,96,10,45,32,96,115,116,97,116,117,115,96,10,45,32,96,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,96,10,45,32,96,108,105,110,107,115,96,10,45,32,96,100,105,99,116,105,111,110,97,114,121,96,10,45,32,96,116,114,97,112,95,101,120,105,116,96,10,45,32,96,101,114,114,111,114,95,104,97,110,100,108,101,114,96,10,45,32,96,112,114,105,111,114,105,116,121,96,10,45,32,96,103,114,111,117,112,95,108,101,97,100,101,114,96,10,45,32,96,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,96,10,45,32,96,104,101,97,112,95,115,105,122,101,96,10,45,32,96,115,116,97,99,107,95,115,105,122,101,96,10,45,32,96,114,101,100,117,99,116,105,111,110,115,96,10,45,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,96,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,97,108,115,111,32,97,110,32,96,73,110,102,111,84,117,112,108,101,96,10,119,105,116,104,32,105,116,101,109,32,96,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,96,32,105,115,32,105,110,99,108,117,100,101,100,46,10,10,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,112,101,99,105,102,105,99,32,96,73,110,102,111,84,117,112,108,101,96,115,44,32,115,101,101,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,95,100,101,98,117,103,103,105,110,103,32,111,110,108,121,95,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,112,117,114,112,111,115,101,115,44,32,117,115,101,10,62,32,96,112,114,111,99,101,115,115,95,105,110,102,111,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{5193,2},spec,{{process_info,1},[{type,{5193,19},bounded_fun,[{type,{5193,19},'fun',[{type,{5193,19},product,[{var,{5193,20},'Pid'}]},{var,{5193,28},'Info'}]},[{type,{5194,7},constraint,[{atom,{5194,7},is_subtype},[{var,{5194,7},'Pid'},{type,{5194,14},pid,[]}]]},{type,{5195,7},constraint,[{atom,{5195,7},is_subtype},[{var,{5195,7},'Info'},{type,{5195,15},union,[{type,{5195,15},list,[{var,{5195,16},'InfoTuple'}]},{atom,{5195,29},undefined}]}]]},{type,{5196,7},constraint,[{atom,{5196,7},is_subtype},[{var,{5196,7},'InfoTuple'},{user_type,{5196,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,process_flag,3},{5128,2},[<<112,114,111,99,101,115,115,95,102,108,97,103,40,80,105,100,44,32,70,108,97,103,44,32,86,97,108,117,101,41>>],#{<<101,110>> => <<83,101,116,115,32,99,101,114,116,97,105,110,32,102,108,97,103,115,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,96,80,105,100,96,44,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,10,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,46,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32,96,70,108,97,103,96,10,97,114,101,32,111,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,111,115,101,32,97,108,108,111,119,101,100,32,105,110,32,91,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,10,110,97,109,101,108,121,32,96,115,97,118,101,95,99,97,108,108,115,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>},#{group => processes,specification => [{attribute,{5137,2},spec,{{process_flag,3},[{type,{5137,19},bounded_fun,[{type,{5137,19},'fun',[{type,{5137,19},product,[{var,{5137,20},'Pid'},{var,{5137,25},'Flag'},{var,{5137,31},'Value'}]},{var,{5137,41},'OldValue'}]},[{type,{5138,7},constraint,[{atom,{5138,7},is_subtype},[{var,{5138,7},'Pid'},{type,{5138,14},pid,[]}]]},{type,{5139,7},constraint,[{atom,{5139,7},is_subtype},[{var,{5139,7},'Flag'},{atom,{5139,15},save_calls}]]},{type,{5140,7},constraint,[{atom,{5140,7},is_subtype},[{var,{5140,7},'Value'},{type,{5140,16},non_neg_integer,[]}]]},{type,{5141,7},constraint,[{atom,{5141,7},is_subtype},[{var,{5141,7},'OldValue'},{type,{5141,19},non_neg_integer,[]}]]}]]}]}}]}},{{function,process_display,2},{5098,2},[<<112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,84,121,112,101,41>>],#{<<101,110>> => <<87,114,105,116,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,96,80,105,100,96,32,111,110,32,91,115,116,97,110,100,97,114,100,32,101,114,114,111,114,93,40,96,116,58,105,111,58,115,116,97,110,100,97,114,100,95,101,114,114,111,114,47,48,96,41,46,10,10,84,104,101,32,111,110,108,121,32,97,108,108,111,119,101,100,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,97,116,111,109,32,96,84,121,112,101,96,32,105,115,32,96,98,97,99,107,116,114,97,99,101,96,44,32,119,104,105,99,104,32,115,104,111,119,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,10,116,104,101,32,99,97,108,108,32,115,116,97,99,107,44,32,105,110,99,108,117,100,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,97,108,108,32,99,104,97,105,110,44,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,112,114,105,110,116,101,100,32,102,105,114,115,116,46,32,84,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,111,117,116,112,117,116,32,105,115,32,110,111,116,32,102,117,114,116,104,101,114,32,100,101,102,105,110,101,100,46>>},#{group => processes,specification => [{attribute,{5106,2},spec,{{process_display,2},[{type,{5106,22},bounded_fun,[{type,{5106,22},'fun',[{type,{5106,22},product,[{var,{5106,23},'Pid'},{var,{5106,28},'Type'}]},{atom,{5106,37},true}]},[{type,{5107,7},constraint,[{atom,{5107,7},is_subtype},[{var,{5107,7},'Pid'},{type,{5107,14},pid,[]}]]},{type,{5108,7},constraint,[{atom,{5108,7},is_subtype},[{var,{5108,7},'Type'},{atom,{5108,15},backtrace}]]}]]}]}}]}},{{function,pre_loaded,0},{5086,2},[<<112,114,101,95,108,111,97,100,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,112,114,101,108,111,97,100,101,100,32,105,110,32,116,104,101,32,114,117,110,45,116,105,109,101,32,115,121,115,116,101,109,46,10,10,80,114,101,45,108,111,97,100,101,100,32,109,111,100,117,108,101,115,32,97,114,101,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,110,101,101,100,101,100,32,116,111,32,98,111,111,116,115,116,114,97,112,32,116,104,101,32,115,121,115,116,101,109,32,116,111,10,108,111,97,100,32,116,104,101,32,102,105,114,115,116,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,102,114,111,109,32,101,105,116,104,101,114,32,100,105,115,107,32,111,114,32,98,121,32,117,115,105,110,103,32,96,109,58,101,114,108,95,98,111,111,116,95,115,101,114,118,101,114,96,46>>},#{group => code,specification => [{attribute,{5092,2},spec,{{pre_loaded,0},[{type,{5092,17},'fun',[{type,{5092,17},product,[]},{type,{5092,23},list,[{type,{5092,24},module,[]}]}]}]}}]}},{{function,prepare_loading,2},{5050,2},[<<112,114,101,112,97,114,101,95,108,111,97,100,105,110,103,40,77,111,100,117,108,101,44,32,67,111,100,101,41>>],hidden,#{}},{{function,timestamp,0},{5011,2},[<<116,105,109,101,115,116,97,109,112,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,111,110,10,116,104,101,32,102,111,114,109,97,116,32,96,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,96,46,10,10,84,104,105,115,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,96,111,115,58,116,105,109,101,115,116,97,109,112,47,48,96,32,97,110,100,32,116,104,101,32,100,101,112,114,101,99,97,116,101,100,32,91,96,101,114,108,97,110,103,58,110,111,119,47,48,96,93,40,96,110,111,119,47,48,96,41,32,117,115,101,46,10,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41,96,32,105,115,32,112,117,114,101,108,121,32,116,111,32,115,105,109,112,108,105,102,121,32,117,115,101,32,102,111,114,32,101,120,105,115,116,105,110,103,10,99,111,100,101,32,116,104,97,116,32,97,115,115,117,109,101,115,32,116,104,105,115,32,116,105,109,101,32,115,116,97,109,112,32,102,111,114,109,97,116,46,32,67,117,114,114,101,110,116,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,32,99,97,110,32,109,111,114,101,10,101,102,102,105,99,105,101,110,116,108,121,32,98,101,32,114,101,116,114,105,101,118,101,100,32,105,110,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,121,111,117,114,32,99,104,111,105,99,101,32,117,115,105,110,103,10,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,47,49,96,93,40,96,115,121,115,116,101,109,95,116,105,109,101,47,49,96,41,46,10,10,84,104,101,32,96,101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41,96,32,66,73,70,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,58,10,10,96,96,96,99,10,116,105,109,101,115,116,97,109,112,40,41,32,45,62,10,32,32,32,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,109,105,99,114,111,115,101,99,111,110,100,41,44,10,32,32,32,32,77,101,103,97,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,95,48,48,48,95,48,48,48,44,10,32,32,32,32,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,32,45,32,77,101,103,97,83,101,99,115,42,49,48,48,48,95,48,48,48,44,10,32,32,32,32,77,105,99,114,111,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,114,101,109,32,49,48,48,48,95,48,48,48,44,10,32,32,32,32,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,46,10,96,96,96,10,10,73,116,44,32,104,111,119,101,118,101,114,44,32,117,115,101,115,32,97,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,117,105,108,100,32,103,97,114,98,97,103,101,32,111,110,32,116,104,101,10,104,101,97,112,32,97,110,100,32,119,105,116,104,32,115,108,105,103,104,116,108,121,32,98,101,116,116,101,114,32,112,101,114,102,111,114,109,97,110,99,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{5043,2},spec,{{timestamp,0},[{type,{5043,16},bounded_fun,[{type,{5043,16},'fun',[{type,{5043,16},product,[]},{var,{5043,22},'Timestamp'}]},[{type,{5044,7},constraint,[{atom,{5044,7},is_subtype},[{var,{5044,7},'Timestamp'},{user_type,{5044,20},timestamp,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,1},{4993,2},[<<116,105,109,101,95,111,102,102,115,101,116,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,10,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41,96,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,10,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32,96,85,110,105,116,96,115,46>>},#{group => time,specification => [{attribute,{5005,2},spec,{{time_offset,1},[{type,{5005,18},bounded_fun,[{type,{5005,18},'fun',[{type,{5005,18},product,[{var,{5005,19},'Unit'}]},{type,{5005,28},integer,[]}]},[{type,{5006,7},constraint,[{atom,{5006,7},is_subtype},[{var,{5006,7},'Unit'},{user_type,{5006,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,0},{4962,2},[<<116,105,109,101,95,111,102,102,115,101,116,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,105,110,32,96,110,97,116,105,118,101,96,10,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,32,67,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,97,100,100,101,100,32,116,111,32,97,110,32,69,114,108,97,110,103,10,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,103,105,118,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,46,10,10,84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,111,112,101,114,97,116,105,111,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,10,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,117,115,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,32,99,104,97,110,103,101,32,105,110,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,32,98,101,32,111,98,115,101,114,118,101,100,32,97,116,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,10,62,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,46,10,62,10,62,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,10,62,32,91,109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,44,32,116,104,101,32,116,105,109,101,10,62,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,10,62,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,10,62,32,115,121,115,116,101,109,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,10,62,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,59,32,115,111,44,10,62,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,10,62,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>},#{group => time,specification => [{attribute,{4988,2},spec,{{time_offset,0},[{type,{4988,18},'fun',[{type,{4988,18},product,[]},{type,{4988,24},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,convert_time_unit,3},{4900,2},[<<99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,84,105,109,101,44,32,70,114,111,109,85,110,105,116,44,32,84,111,85,110,105,116,41>>],#{<<101,110>> => <<67,111,110,118,101,114,116,115,32,116,104,101,32,96,84,105,109,101,96,32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32,96,70,114,111,109,85,110,105,116,96,32,116,111,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,96,67,111,110,118,101,114,116,101,100,84,105,109,101,96,32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32,96,84,111,85,110,105,116,96,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,117,115,105,110,103,32,116,104,101,10,96,102,108,111,111,114,47,49,96,32,102,117,110,99,116,105,111,110,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,89,111,117,32,99,97,110,32,108,111,115,101,32,97,99,99,117,114,97,99,121,32,97,110,100,32,112,114,101,99,105,115,105,111,110,32,119,104,101,110,32,99,111,110,118,101,114,116,105,110,103,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,46,32,84,111,10,62,32,109,105,110,105,109,105,122,101,32,115,117,99,104,32,108,111,115,115,44,32,99,111,108,108,101,99,116,32,97,108,108,32,100,97,116,97,32,97,116,32,96,110,97,116,105,118,101,96,32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,100,111,32,116,104,101,10,62,32,99,111,110,118,101,114,115,105,111,110,32,111,110,32,116,104,101,32,101,110,100,32,114,101,115,117,108,116,46>>},#{group => time,specification => [{attribute,{4913,2},spec,{{convert_time_unit,3},[{type,{4913,24},bounded_fun,[{type,{4913,24},'fun',[{type,{4913,24},product,[{var,{4913,25},'Time'},{var,{4913,31},'FromUnit'},{var,{4913,41},'ToUnit'}]},{var,{4913,52},'ConvertedTime'}]},[{type,{4914,7},constraint,[{atom,{4914,7},is_subtype},[{var,{4914,7},'Time'},{type,{4914,15},integer,[]}]]},{type,{4915,7},constraint,[{atom,{4915,7},is_subtype},[{var,{4915,7},'ConvertedTime'},{type,{4915,24},integer,[]}]]},{type,{4916,7},constraint,[{atom,{4916,7},is_subtype},[{var,{4916,7},'FromUnit'},{user_type,{4916,19},time_unit,[]}]]},{type,{4917,7},constraint,[{atom,{4917,7},is_subtype},[{var,{4917,7},'ToUnit'},{user_type,{4917,17},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,1},{4879,2},[<<115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,10,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,67,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41,96,93,40,96,115,121,115,116,101,109,95,116,105,109,101,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{4894,2},spec,{{system_time,1},[{type,{4894,18},bounded_fun,[{type,{4894,18},'fun',[{type,{4894,18},product,[{var,{4894,19},'Unit'}]},{type,{4894,28},integer,[]}]},[{type,{4895,7},constraint,[{atom,{4895,7},is_subtype},[{var,{4895,7},'Unit'},{user_type,{4895,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,0},{4859,2},[<<115,121,115,116,101,109,95,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,32,105,110,10,96,110,97,116,105,118,101,96,32,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,10,10,67,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41,96,93,40,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,96,43,96,91,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41,96,93,40,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,116,105,109,101,32,105,115,32,95,110,111,116,95,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,10,62,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,10,62,32,91,116,105,109,101,32,119,97,114,112,32,109,111,100,101,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,116,105,109,101,45,119,97,114,112,45,109,111,100,101,115,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>},#{group => time,specification => [{attribute,{4874,2},spec,{{system_time,0},[{type,{4874,18},'fun',[{type,{4874,18},product,[]},{type,{4874,24},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,1},{4842,2},[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,85,110,105,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,10,116,104,101,32,96,85,110,105,116,96,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,10,10,83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,91,96,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,96,93,40,96,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51,96,41,96,40,96,91,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41,96,93,40,96,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,41,96,44,32,110,97,116,105,118,101,44,32,85,110,105,116,41,96,44,10,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32,96,85,110,105,116,96,115,46>>},#{group => time,specification => [{attribute,{4853,2},spec,{{monotonic_time,1},[{type,{4853,21},bounded_fun,[{type,{4853,21},'fun',[{type,{4853,21},product,[{var,{4853,22},'Unit'}]},{type,{4853,31},integer,[]}]},[{type,{4854,7},constraint,[{atom,{4854,7},is_subtype},[{var,{4854,7},'Unit'},{user_type,{4854,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,0},{4810,2},[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,10,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,105,110,32,96,110,97,116,105,118,101,96,10,91,116,105,109,101,32,117,110,105,116,93,40,96,116,58,116,105,109,101,95,117,110,105,116,47,48,96,41,46,32,84,104,105,115,32,105,115,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,10,115,105,110,99,101,32,115,111,109,101,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,105,115,32,105,115,32,97,10,62,32,91,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,32,116,105,109,101,44,10,62,32,98,117,116,32,95,110,111,116,95,32,97,10,62,32,91,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,116,114,105,99,116,108,121,45,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,10,62,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,115,101,99,117,116,105,118,101,32,99,97,108,108,115,32,116,111,32,96,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48,96,32,99,97,110,32,112,114,111,100,117,99,101,32,116,104,101,10,62,32,115,97,109,101,32,114,101,115,117,108,116,46,10,62,10,62,32,68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,119,105,108,108,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,115,32,105,110,10,62,32,116,105,109,101,32,97,115,32,98,97,115,101,32,102,111,114,32,116,104,101,105,114,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,99,108,111,99,107,115,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,115,32,95,112,111,105,110,116,108,101,115,115,95,10,62,32,99,111,109,112,97,114,105,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,46,32,68,105,102,102,101,114,101,110,116,10,62,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,99,97,110,32,97,108,115,111,32,112,108,97,99,101,32,116,104,105,115,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,10,62,32,100,105,102,102,101,114,101,110,116,32,114,101,108,97,116,105,118,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,46,32,73,116,32,99,97,110,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,116,105,109,101,10,62,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,41,44,32,116,104,101,32,112,97,115,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,118,97,108,117,101,41,44,10,62,32,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,122,101,114,111,41,46,32,84,104,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,97,116,10,62,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,98,121,32,99,97,108,108,105,110,103,10,62,32,91,96,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,116,97,114,116,95,116,105,109,101,41,96,93,40,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101,41,46>>},#{group => time,specification => [{attribute,{4837,2},spec,{{monotonic_time,0},[{type,{4837,21},'fun',[{type,{4837,21},product,[]},{type,{4837,27},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,0},{4798,2},[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,41>>],#{<<101,110>> => <<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,10,91,105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115,96,41,46,10,69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{4805,2},spec,{{unique_integer,0},[{type,{4805,21},'fun',[{type,{4805,21},product,[]},{type,{4805,27},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,1},{4732,2},[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,77,111,100,105,102,105,101,114,76,105,115,116,41>>],#{<<101,110>> => <<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,10,91,105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115,96,41,46,10,84,104,101,32,105,110,116,101,103,101,114,32,105,115,32,117,110,105,113,117,101,32,105,110,32,116,104,101,32,115,101,110,115,101,32,116,104,97,116,32,116,104,105,115,32,66,73,70,44,32,117,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,10,109,111,100,105,102,105,101,114,115,44,32,100,111,101,115,32,110,111,116,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,105,110,116,101,103,101,114,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,10,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,69,97,99,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32,99,97,110,32,111,102,32,99,111,117,114,115,101,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,10,111,116,104,101,114,32,109,101,97,110,115,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,119,104,101,110,32,96,91,93,96,32,105,115,32,112,97,115,115,101,100,32,97,115,32,96,77,111,100,105,102,105,101,114,76,105,115,116,96,44,32,98,111,116,104,32,110,101,103,97,116,105,118,101,32,97,110,100,32,112,111,115,105,116,105,118,101,10,105,110,116,101,103,101,114,115,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,116,111,32,117,115,101,32,116,104,101,32,114,97,110,103,101,32,111,102,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,110,101,101,100,10,104,101,97,112,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,97,114,101,10,97,108,115,111,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,117,110,105,113,117,101,44,32,116,104,97,116,32,105,115,44,32,97,110,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,32,99,97,110,32,98,101,32,115,109,97,108,108,101,114,10,111,114,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,46,10,10,96,77,111,100,105,102,105,101,114,96,115,58,10,10,45,32,42,42,112,111,115,105,116,105,118,101,42,42,32,45,32,82,101,116,117,114,110,115,32,111,110,108,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,46,10,10,32,32,78,111,116,105,99,101,32,116,104,97,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32,96,112,111,115,105,116,105,118,101,96,32,109,111,100,105,102,105,101,114,32,121,111,117,32,119,105,108,108,32,103,101,116,32,104,101,97,112,32,97,108,108,111,99,97,116,101,100,10,32,32,105,110,116,101,103,101,114,115,32,40,98,105,103,110,117,109,115,41,32,113,117,105,99,107,101,114,46,10,10,45,32,42,42,109,111,110,111,116,111,110,105,99,42,42,32,45,32,82,101,116,117,114,110,115,10,32,32,91,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,116,114,105,99,116,108,121,45,109,111,110,111,116,111,110,105,99,97,108,108,121,45,105,110,99,114,101,97,115,105,110,103,41,10,32,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,99,114,101,97,116,105,111,110,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,105,115,10,32,32,97,108,119,97,121,115,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,10,32,32,105,110,115,116,97,110,99,101,46,10,10,32,32,84,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,101,118,101,110,116,115,32,111,110,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,97,116,32,105,115,44,32,105,102,32,98,111,116,104,32,96,88,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,32,97,110,100,10,32,32,96,89,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,32,97,114,101,32,101,120,101,99,117,116,101,100,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,10,32,32,40,111,114,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,41,32,111,110,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,110,100,32,96,88,32,60,32,89,96,44,32,119,101,32,107,110,111,119,10,32,32,116,104,97,116,32,96,88,96,32,119,97,115,32,99,114,101,97,116,101,100,32,98,101,102,111,114,101,32,96,89,96,46,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,83,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,32,97,114,101,32,105,110,104,101,114,101,110,116,108,121,32,113,117,105,116,101,32,101,120,112,101,110,115,105,118,101,32,116,111,10,32,32,62,32,103,101,110,101,114,97,116,101,32,97,110,100,32,115,99,97,108,101,115,32,112,111,111,114,108,121,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,118,97,108,117,101,115,32,110,101,101,100,32,116,111,32,98,101,10,32,32,62,32,115,121,110,99,104,114,111,110,105,122,101,100,32,98,101,116,119,101,101,110,32,67,80,85,32,99,111,114,101,115,46,32,84,104,97,116,32,105,115,44,32,100,111,32,110,111,116,32,112,97,115,115,32,116,104,101,32,96,109,111,110,111,116,111,110,105,99,96,10,32,32,62,32,109,111,100,105,102,105,101,114,32,117,110,108,101,115,115,32,121,111,117,32,114,101,97,108,108,121,32,110,101,101,100,32,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,10,10,65,108,108,32,118,97,108,105,100,32,96,77,111,100,105,102,105,101,114,96,115,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,46,32,82,101,112,101,97,116,101,100,32,40,118,97,108,105,100,41,32,96,77,111,100,105,102,105,101,114,96,115,32,105,110,32,116,104,101,10,96,77,111,100,105,102,105,101,114,76,105,115,116,96,32,97,114,101,32,105,103,110,111,114,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,115,101,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,116,117,114,110,101,100,32,98,121,32,96,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,32,117,115,105,110,103,32,100,105,102,102,101,114,101,110,116,32,115,101,116,115,10,62,32,111,102,32,96,77,111,100,105,102,105,101,114,96,115,32,95,119,105,108,108,32,111,118,101,114,108,97,112,95,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32,99,97,108,108,105,110,103,10,62,32,91,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,44,32,97,110,100,10,62,32,91,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,112,111,115,105,116,105,118,101,44,32,109,111,110,111,116,111,110,105,99,93,41,96,93,40,96,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49,96,41,32,114,101,112,101,97,116,101,100,108,121,44,32,121,111,117,10,62,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,115,101,101,32,115,111,109,101,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,97,114,101,32,114,101,116,117,114,110,101,100,32,98,121,32,98,111,116,104,32,99,97,108,108,115,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,105,102,32,96,77,111,100,105,102,105,101,114,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,105,102,32,96,77,111,100,105,102,105,101,114,96,32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,109,111,100,105,102,105,101,114,46>>},#{group => terms,specification => [{attribute,{4791,2},spec,{{unique_integer,1},[{type,{4791,21},bounded_fun,[{type,{4791,21},'fun',[{type,{4791,21},product,[{var,{4791,22},'ModifierList'}]},{type,{4791,39},integer,[]}]},[{type,{4792,7},constraint,[{atom,{4792,7},is_subtype},[{var,{4792,7},'ModifierList'},{type,{4792,23},list,[{var,{4792,24},'Modifier'}]}]]},{type,{4793,7},constraint,[{atom,{4793,7},is_subtype},[{var,{4793,7},'Modifier'},{type,{4793,19},union,[{atom,{4793,19},positive},{atom,{4793,30},monotonic}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,posixtime_to_universaltime,1},{4726,2},[<<112,111,115,105,120,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,80,49,41>>],hidden,#{}},{{function,ports,0},{4714,2},[<<112,111,114,116,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,111,114,116,115,32,101,120,105,115,116,105,110,103,32,111,110,10,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,111,114,116,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,111,112,101,110,46>>},#{group => ports,specification => [{attribute,{4721,2},spec,{{ports,0},[{type,{4721,12},'fun',[{type,{4721,12},product,[]},{type,{4721,18},list,[{type,{4721,19},port,[]}]}]}]}}]}},{{function,port_to_list,1},{4703,2},[<<112,111,114,116,95,116,111,95,108,105,115,116,40,80,111,114,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,10,96,80,111,114,116,96,46>>},#{group => terms,specification => [{attribute,{4708,2},spec,{{port_to_list,1},[{type,{4708,19},bounded_fun,[{type,{4708,19},'fun',[{type,{4708,19},product,[{var,{4708,20},'Port'}]},{type,{4708,29},string,[]}]},[{type,{4709,7},constraint,[{atom,{4709,7},is_subtype},[{var,{4709,7},'Port'},{type,{4709,15},port,[]}]]}]]}]}}]}},{{function,pid_to_list,1},{4680,2},[<<112,105,100,95,116,111,95,108,105,115,116,40,80,105,100,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,80,105,100,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,112,105,100,95,116,111,95,108,105,115,116,40,115,101,108,102,40,41,41,46,10,34,60,48,46,56,53,46,48,62,34,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,91,99,114,101,97,116,105,111,110,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,41,32,102,111,114,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,80,105,100,96,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,10,62,32,111,102,32,97,32,110,111,100,101,32,119,105,116,104,32,97,32,115,112,101,99,105,102,105,99,32,110,97,109,101,32,99,97,110,32,103,101,116,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>},#{group => terms,specification => [{attribute,{4697,2},spec,{{pid_to_list,1},[{type,{4697,18},bounded_fun,[{type,{4697,18},'fun',[{type,{4697,18},product,[{var,{4697,19},'Pid'}]},{type,{4697,27},string,[]}]},[{type,{4698,7},constraint,[{atom,{4698,7},is_subtype},[{var,{4698,7},'Pid'},{type,{4698,14},pid,[]}]]}]]}]}}]}},{{function,phash2,2},{4657,2},[<<112,104,97,115,104,50,40,84,101,114,109,44,32,82,97,110,103,101,41>>],#{<<101,110>> => <<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,10,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32,96,84,101,114,109,96,32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,10,96,48,46,46,82,97,110,103,101,45,49,96,46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32,96,82,97,110,103,101,96,32,105,115,32,50,94,51,50,46,32,87,104,101,110,32,119,105,116,104,111,117,116,32,97,114,103,117,109,101,110,116,10,96,82,97,110,103,101,96,44,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,94,50,55,45,49,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,84,104,105,115,32,66,73,70,32,105,115,32,97,108,119,97,121,115,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,104,97,115,104,105,110,103,32,116,101,114,109,115,46,32,73,116,32,100,105,115,116,114,105,98,117,116,101,115,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,10,98,101,116,116,101,114,32,116,104,97,110,32,91,96,112,104,97,115,104,47,50,96,93,40,96,112,104,97,115,104,47,50,96,41,44,32,97,110,100,32,105,116,32,105,115,32,102,97,115,116,101,114,32,102,111,114,32,98,105,103,110,117,109,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,97,110,103,101,32,96,48,46,46,82,97,110,103,101,45,49,96,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,114,97,110,103,101,32,111,102,10,91,96,112,104,97,115,104,47,50,96,93,40,96,112,104,97,115,104,47,50,96,41,44,32,119,104,105,99,104,32,105,115,32,96,49,46,46,82,97,110,103,101,96,46>>},#{group => terms,specification => [{attribute,{4672,2},spec,{{phash2,2},[{type,{4672,13},bounded_fun,[{type,{4672,13},'fun',[{type,{4672,13},product,[{var,{4672,14},'Term'},{var,{4672,20},'Range'}]},{var,{4672,30},'Hash'}]},[{type,{4673,7},constraint,[{atom,{4673,7},is_subtype},[{var,{4673,7},'Term'},{type,{4673,15},term,[]}]]},{type,{4674,7},constraint,[{atom,{4674,7},is_subtype},[{var,{4674,7},'Range'},{type,{4674,16},pos_integer,[]}]]},{type,{4675,7},constraint,[{atom,{4675,7},is_subtype},[{var,{4675,7},'Hash'},{type,{4675,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,phash2,1},{4653,1},[<<112,104,97,115,104,50,40,84,101,114,109,41>>],none,#{group => terms,equiv => <<112,104,97,115,104,50,47,50>>}},{{function,phash,2},{4627,2},[<<112,104,97,115,104,40,84,101,114,109,44,32,82,97,110,103,101,41>>],#{<<101,110>> => <<62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,115,32,91,96,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,96,93,40,96,112,104,97,115,104,50,47,50,96,41,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,10,62,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,78,111,116,101,32,116,104,97,116,32,96,101,114,108,97,110,103,58,112,104,97,115,104,40,88,44,78,41,96,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,101,113,117,97,108,32,116,111,10,62,32,96,101,114,108,97,110,103,58,112,104,97,115,104,50,40,88,44,78,41,96,10,10,80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,10,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,10,69,82,84,83,32,52,46,57,46,49,46,49,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32,96,84,101,114,109,96,32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,10,96,49,46,46,82,97,110,103,101,96,46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32,96,82,97,110,103,101,96,32,105,115,32,50,94,51,50,46>>},#{deprecated => <<101,114,108,97,110,103,58,112,104,97,115,104,47,50,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,32,105,110,115,116,101,97,100>>,group => deprecated,specification => [{attribute,{4640,2},spec,{{phash,2},[{type,{4640,12},bounded_fun,[{type,{4640,12},'fun',[{type,{4640,12},product,[{var,{4640,13},'Term'},{var,{4640,19},'Range'}]},{var,{4640,29},'Hash'}]},[{type,{4641,7},constraint,[{atom,{4641,7},is_subtype},[{var,{4641,7},'Term'},{type,{4641,15},term,[]}]]},{type,{4642,7},constraint,[{atom,{4642,7},is_subtype},[{var,{4642,7},'Range'},{type,{4642,16},pos_integer,[]}]]},{type,{4643,7},constraint,[{atom,{4643,7},is_subtype},[{var,{4643,7},'Hash'},{type,{4643,15},pos_integer,[]}]]}]]}]}}]}},{{function,now,0},{4599,2},[<<110,111,119,40,41>>],#{<<101,110>> => <<62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,95,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,68,111,32,110,111,116,32,117,115,101,32,105,116,46,95,10,62,10,62,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,10,62,32,91,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,41,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,10,62,32,83,112,101,99,105,102,105,99,97,108,108,121,44,32,115,101,99,116,105,111,110,32,91,68,111,115,32,97,110,100,32,68,111,110,116,39,115,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,68,111,115,95,97,110,100,95,68,111,110,116,115,41,10,62,32,100,101,115,99,114,105,98,101,115,32,119,104,97,116,32,116,111,32,117,115,101,32,105,110,115,116,101,97,100,32,111,102,32,96,101,114,108,97,110,103,58,110,111,119,47,48,96,46,10,10,82,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32,96,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,101,108,97,112,115,101,100,32,116,105,109,101,32,115,105,110,99,101,10,48,48,58,48,48,32,71,77,84,44,32,74,97,110,117,97,114,121,32,49,44,32,49,57,55,48,32,40,122,101,114,111,32,104,111,117,114,41,44,32,105,102,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,79,116,104,101,114,119,105,115,101,32,115,111,109,101,32,111,116,104,101,114,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,105,115,32,99,104,111,115,101,110,46,32,73,116,32,105,115,32,97,108,115,111,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32,116,104,105,115,32,66,73,70,32,114,101,116,117,114,110,32,99,111,110,116,105,110,117,111,117,115,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,32,72,101,110,99,101,44,32,116,104,101,10,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,96,101,114,108,97,110,103,58,110,111,119,47,48,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,110,101,114,97,116,101,32,117,110,105,113,117,101,32,116,105,109,101,32,115,116,97,109,112,115,46,32,73,102,10,105,116,32,105,115,32,99,97,108,108,101,100,32,105,110,32,97,32,116,105,103,104,116,32,108,111,111,112,32,111,110,32,97,32,102,97,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,99,111,109,101,10,115,107,101,119,101,100,46,10,10,67,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,111,99,97,108,32,116,105,109,101,32,111,102,32,100,97,121,32,105,102,32,116,104,101,32,116,105,109,101,45,122,111,110,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,102,10,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,105,115,32,112,114,111,112,101,114,108,121,32,99,111,110,102,105,103,117,114,101,100,46>>},#{deprecated => <<101,114,108,97,110,103,58,110,111,119,47,48,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,115,101,101,32,116,104,101,32,34,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,32,105,110,32,69,114,108,97,110,103,34,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110>>,group => deprecated,specification => [{attribute,{4621,2},spec,{{now,0},[{type,{4621,10},bounded_fun,[{type,{4621,10},'fun',[{type,{4621,10},product,[]},{var,{4621,16},'Timestamp'}]},[{type,{4622,7},constraint,[{atom,{4622,7},is_subtype},[{var,{4622,7},'Timestamp'},{user_type,{4622,20},timestamp,[]}]]}]]}]}}]}},{{function,node,1},{4586,2},[<<110,111,100,101,40,65,114,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,96,65,114,103,96,32,111,114,105,103,105,110,97,116,101,115,46,32,96,65,114,103,96,32,99,97,110,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,10,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,32,112,111,114,116,46,32,73,102,32,96,65,114,103,96,32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,110,100,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,10,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,110,111,110,111,100,101,64,110,111,104,111,115,116,96,32,105,115,32,114,101,116,117,114,110,101,100,46>>},#{group => terms,specification => [{attribute,{4592,2},spec,{{node,1},[{type,{4592,11},bounded_fun,[{type,{4592,11},'fun',[{type,{4592,11},product,[{var,{4592,12},'Arg'}]},{var,{4592,20},'Node'}]},[{type,{4593,7},constraint,[{atom,{4593,7},is_subtype},[{var,{4593,7},'Arg'},{type,{4593,14},union,[{type,{4593,14},pid,[]},{type,{4593,22},port,[]},{type,{4593,31},reference,[]}]}]]},{type,{4594,7},constraint,[{atom,{4594,7},is_subtype},[{var,{4594,7},'Node'},{type,{4594,15},node,[]}]]}]]}]}}]}},{{function,node,0},{4574,2},[<<110,111,100,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,96,110,111,110,111,100,101,64,110,111,104,111,115,116,96,32,105,115,10,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>},#{group => distribution,specification => [{attribute,{4579,2},spec,{{node,0},[{type,{4579,11},bounded_fun,[{type,{4579,11},'fun',[{type,{4579,11},product,[]},{var,{4579,17},'Node'}]},[{type,{4580,7},constraint,[{atom,{4580,7},is_subtype},[{var,{4580,7},'Node'},{type,{4580,15},node,[]}]]}]]}]}}]}},{{function,nif_error,2},{4559,2},[<<110,105,102,95,101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32,96,101,114,114,111,114,47,50,96,44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,10,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,10,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>},#{group => processes,specification => [{attribute,{4566,2},spec,{{nif_error,2},[{type,{4566,16},bounded_fun,[{type,{4566,16},'fun',[{type,{4566,16},product,[{var,{4566,17},'Reason'},{var,{4566,25},'Args'}]},{type,{4566,34},no_return,[]}]},[{type,{4567,7},constraint,[{atom,{4567,7},is_subtype},[{var,{4567,7},'Reason'},{type,{4567,17},term,[]}]]},{type,{4568,7},constraint,[{atom,{4568,7},is_subtype},[{var,{4568,7},'Args'},{type,{4568,15},list,[{type,{4568,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,nif_error,1},{4545,2},[<<110,105,102,95,101,114,114,111,114,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32,96,101,114,114,111,114,47,49,96,44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,10,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,10,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>},#{group => processes,specification => [{attribute,{4552,2},spec,{{nif_error,1},[{type,{4552,16},bounded_fun,[{type,{4552,16},'fun',[{type,{4552,16},product,[{var,{4552,17},'Reason'}]},{type,{4552,28},no_return,[]}]},[{type,{4553,7},constraint,[{atom,{4553,7},is_subtype},[{var,{4553,7},'Reason'},{type,{4553,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,monitor_node,3},{4515,2},[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,70,108,97,103,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<66,101,104,97,118,101,115,32,97,115,32,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,108,111,119,115,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,116,111,32,98,101,10,115,112,101,99,105,102,105,101,100,44,32,110,97,109,101,108,121,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,46,10,10,84,104,105,115,32,111,112,116,105,111,110,32,97,108,108,111,119,115,32,116,104,101,32,66,73,70,32,116,111,32,119,97,105,116,32,116,104,101,32,110,111,114,109,97,108,32,110,101,116,119,111,114,107,32,99,111,110,110,101,99,116,105,111,110,32,116,105,109,101,45,111,117,116,10,102,111,114,32,116,104,101,32,95,109,111,110,105,116,111,114,101,100,32,110,111,100,101,95,32,116,111,32,99,111,110,110,101,99,116,32,105,116,115,101,108,102,44,32,101,118,101,110,32,105,102,32,105,116,32,99,97,110,110,111,116,32,98,101,32,97,99,116,105,118,101,108,121,10,99,111,110,110,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,110,111,100,101,32,40,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,98,108,111,99,107,101,100,41,46,32,84,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,10,98,101,32,117,115,101,102,117,108,32,99,97,110,32,111,110,108,121,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,117,115,105,110,103,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,32,96,100,105,115,116,95,97,117,116,111,95,99,111,110,110,101,99,116,32,111,110,99,101,96,46,10,73,102,32,116,104,97,116,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,117,115,101,100,44,32,111,112,116,105,111,110,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,112,116,105,111,110,32,96,97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116,96,32,105,115,32,117,115,101,100,32,105,110,116,101,114,110,97,108,108,121,32,97,110,100,32,105,115,32,115,101,108,100,111,109,32,110,101,101,100,101,100,32,105,110,10,62,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,104,101,114,101,32,116,104,101,32,110,101,116,119,111,114,107,32,116,111,112,111,108,111,103,121,32,97,110,100,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,115,32,105,110,32,101,102,102,101,99,116,32,97,114,101,10,62,32,107,110,111,119,110,32,105,110,32,97,100,118,97,110,99,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,32,111,114,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,10,109,97,108,102,111,114,109,101,100,46>>},#{group => distribution,specification => [{attribute,{4535,2},spec,{{monitor_node,3},[{type,{4535,19},bounded_fun,[{type,{4535,19},'fun',[{type,{4535,19},product,[{var,{4535,20},'Node'},{var,{4535,26},'Flag'},{var,{4535,32},'Options'}]},{atom,{4535,44},true}]},[{type,{4536,7},constraint,[{atom,{4536,7},is_subtype},[{var,{4536,7},'Node'},{type,{4536,15},node,[]}]]},{type,{4537,7},constraint,[{atom,{4537,7},is_subtype},[{var,{4537,7},'Flag'},{type,{4537,15},boolean,[]}]]},{type,{4538,7},constraint,[{atom,{4538,7},is_subtype},[{var,{4538,7},'Options'},{type,{4538,18},list,[{var,{4538,19},'Option'}]}]]},{type,{4539,7},constraint,[{atom,{4539,7},is_subtype},[{var,{4539,7},'Option'},{atom,{4539,17},allow_passive_connect}]]}]]}]}}]}},{{function,monitor_node,2},{4483,2},[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,70,108,97,103,41>>],#{<<101,110>> => <<77,111,110,105,116,111,114,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,110,111,100,101,32,96,78,111,100,101,96,46,32,73,102,32,96,70,108,97,103,96,32,105,115,32,96,116,114,117,101,96,44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,10,111,110,46,32,73,102,32,96,70,108,97,103,96,32,105,115,32,96,102,97,108,115,101,96,44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,10,10,77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32,91,96,109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41,96,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,102,111,114,32,116,104,101,10,115,97,109,101,32,96,78,111,100,101,96,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,10,105,110,115,116,97,110,99,101,115,46,10,10,73,102,32,96,78,111,100,101,96,32,102,97,105,108,115,32,111,114,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,116,104,101,32,109,101,115,115,97,103,101,32,96,123,110,111,100,101,100,111,119,110,44,32,78,111,100,101,125,96,32,105,115,32,100,101,108,105,118,101,114,101,100,10,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,109,97,100,101,32,116,119,111,32,99,97,108,108,115,32,116,111,10,91,96,109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41,96,93,40,96,109,111,110,105,116,111,114,95,110,111,100,101,47,50,96,41,32,97,110,100,32,96,78,111,100,101,96,32,116,101,114,109,105,110,97,116,101,115,44,32,116,119,111,10,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,10,96,78,111,100,101,96,44,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,99,114,101,97,116,101,32,111,110,101,46,32,73,102,32,116,104,105,115,32,102,97,105,108,115,44,32,97,32,96,110,111,100,101,100,111,119,110,96,32,109,101,115,115,97,103,101,32,105,115,10,100,101,108,105,118,101,114,101,100,46,10,10,84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,104,101,32,96,110,111,100,101,100,111,119,110,96,32,115,105,103,110,97,108,32,105,115,32,110,111,116,32,111,114,100,101,114,101,100,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,111,116,104,101,114,32,108,105,110,107,10,111,114,32,109,111,110,105,116,111,114,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,110,111,100,101,32,116,104,97,116,32,103,111,101,115,32,100,111,119,110,46,32,73,102,32,121,111,117,32,110,101,101,100,32,97,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,10,97,108,108,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,101,32,96,110,111,100,101,100,111,119,110,96,32,115,105,103,110,97,108,10,105,115,32,115,101,110,116,44,32,121,111,117,32,115,104,111,117,108,100,32,117,115,101,32,96,110,101,116,95,107,101,114,110,101,108,58,109,111,110,105,116,111,114,95,110,111,100,101,115,47,49,96,46,10,10,78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,97,115,32,97,110,121,32,111,116,104,101,114,32,110,111,100,101,115,46,10,10,70,97,105,108,117,114,101,58,32,96,110,111,116,97,108,105,118,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>},#{group => distribution,specification => [{attribute,{4508,2},spec,{{monitor_node,2},[{type,{4508,19},bounded_fun,[{type,{4508,19},'fun',[{type,{4508,19},product,[{var,{4508,20},'Node'},{var,{4508,26},'Flag'}]},{atom,{4508,35},true}]},[{type,{4509,7},constraint,[{atom,{4509,7},is_subtype},[{var,{4509,7},'Node'},{type,{4509,15},node,[]}]]},{type,{4510,7},constraint,[{atom,{4510,7},is_subtype},[{var,{4510,7},'Flag'},{type,{4510,15},boolean,[]}]]}]]}]}}]}},{{function,monitor,3},{4353,2},[<<109,111,110,105,116,111,114,40,84,121,112,101,44,32,73,116,101,109,44,32,79,112,116,115,41>>],#{<<101,110>> => <<80,114,111,118,105,100,101,115,32,97,110,32,111,112,116,105,111,110,32,108,105,115,116,32,102,111,114,32,109,111,100,105,102,105,99,97,116,105,111,110,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,10,96,109,111,110,105,116,111,114,47,50,96,46,32,84,104,101,32,96,84,121,112,101,96,32,97,110,100,32,96,73,116,101,109,96,32,97,114,103,117,109,101,110,116,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,109,101,97,110,105,110,103,32,97,115,32,119,104,101,110,10,112,97,115,115,101,100,32,116,111,32,91,96,109,111,110,105,116,111,114,47,50,96,93,40,96,109,111,110,105,116,111,114,47,50,96,41,46,10,10,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,97,108,105,97,115,44,32,85,110,97,108,105,97,115,79,112,116,125,96,42,42,32,45,32,84,104,101,32,114,101,116,117,114,110,101,100,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,119,105,108,108,32,97,108,115,111,32,98,101,99,111,109,101,32,97,110,10,32,32,97,108,105,97,115,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,10,32,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,83,101,101,32,97,108,115,111,32,96,97,108,105,97,115,47,48,96,46,32,84,104,101,32,96,85,110,97,108,105,97,115,79,112,116,96,10,32,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32,97,108,105,97,115,32,115,104,111,117,108,100,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,46,10,10,32,32,45,32,42,42,96,101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115,96,42,42,32,45,32,79,110,108,121,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32,96,117,110,97,108,105,97,115,47,49,96,32,119,105,108,108,10,32,32,32,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,46,10,10,32,32,45,32,42,42,96,100,101,109,111,110,105,116,111,114,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,118,105,97,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32,96,100,101,109,111,110,105,116,111,114,47,49,96,32,111,114,10,32,32,32,32,119,104,101,110,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,105,115,10,32,32,32,32,100,101,108,105,118,101,114,101,100,32,100,117,101,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,10,10,32,32,45,32,42,42,96,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,32,40,115,101,101,32,96,100,101,109,111,110,105,116,111,114,96,32,111,112,116,105,111,110,32,97,98,111,118,101,41,32,111,114,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,10,32,32,32,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,87,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,118,105,97,32,116,104,101,32,97,108,105,97,115,10,32,32,32,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,97,108,115,111,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,110,10,32,32,32,32,99,108,105,101,110,116,47,115,101,114,118,101,114,32,115,99,101,110,97,114,105,111,115,32,119,104,101,110,32,97,32,99,108,105,101,110,116,32,109,111,110,105,116,111,114,115,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,119,105,108,108,32,103,101,116,32,116,104,101,10,32,32,32,32,114,101,112,108,121,32,118,105,97,32,116,104,101,32,97,108,105,97,115,46,32,79,110,99,101,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,114,101,99,101,105,118,101,100,32,98,111,116,104,32,116,104,101,32,97,108,105,97,115,32,97,110,100,32,116,104,101,10,32,32,32,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,10,32,32,32,32,97,32,114,101,112,108,121,32,111,114,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,109,111,118,101,100,32,117,115,105,110,103,10,32,32,32,32,116,104,101,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,32,66,73,70,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,115,116,105,108,108,32,98,101,32,108,101,102,116,32,97,99,116,105,118,101,46,10,10,32,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,32,32,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,32,32,65,108,105,97,115,77,111,110,82,101,113,73,100,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,91,123,97,108,105,97,115,44,32,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,125,93,41,44,10,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,32,32,37,37,32,65,108,105,97,115,32,97,115,32,119,101,108,108,32,97,115,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,10,32,32,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,32,111,114,32,97,32,39,68,79,87,78,39,32,109,101,115,115,97,103,101,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,39,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,39,10,32,32,32,32,32,32,37,37,32,97,115,32,117,110,97,108,105,97,115,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,59,10,32,32,32,32,32,32,32,32,32,32,123,39,68,79,87,78,39,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,114,111,114,40,69,120,105,116,82,101,97,115,111,110,41,10,32,32,32,32,32,32,101,110,100,46,10,32,32,96,96,96,10,10,32,32,78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,10,32,32,97,116,32,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46,10,10,32,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,32,32,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,10,32,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,45,32,42,42,96,123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125,96,42,42,32,45,32,82,101,112,108,97,99,101,32,116,104,101,32,100,101,102,97,117,108,116,32,96,84,97,103,96,32,119,105,116,104,32,96,85,115,101,114,68,101,102,105,110,101,100,84,97,103,96,10,32,32,105,110,32,116,104,101,32,91,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,93,40,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101,41,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,10,32,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,44,32,116,104,101,32,96,39,68,79,87,78,39,96,32,116,97,103,10,32,32,105,110,32,116,104,101,32,100,111,119,110,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,114,101,112,108,97,99,101,100,32,98,121,32,96,85,115,101,114,68,101,102,105,110,101,100,84,97,103,96,46,10,10,32,32,65,110,32,101,120,97,109,112,108,101,32,111,102,32,104,111,119,32,116,104,101,32,96,123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125,96,32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,111,114,100,101,114,32,116,111,10,32,32,101,110,97,98,108,101,32,116,104,101,32,110,101,119,10,32,32,91,115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,102,102,95,103,117,105,100,101,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,45,109,101,115,115,97,103,101,115,96,41,44,10,32,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,79,84,80,32,50,52,44,32,119,104,101,110,32,109,97,107,105,110,103,32,109,117,108,116,105,112,108,101,32,114,101,113,117,101,115,116,115,32,116,111,32,100,105,102,102,101,114,101,110,116,32,115,101,114,118,101,114,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,70,114,111,109,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,70,114,111,109,32,33,32,123,114,101,112,108,121,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,32,32,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,115,44,32,82,101,113,117,101,115,116,41,32,119,104,101,110,32,105,115,95,108,105,115,116,40,83,101,114,118,101,114,80,105,100,115,41,32,45,62,10,32,32,32,32,32,32,82,101,113,73,100,32,61,32,109,97,107,101,95,114,101,102,40,41,44,10,32,32,32,32,32,32,108,105,115,116,115,58,102,111,114,101,97,99,104,40,102,117,110,32,40,83,101,114,118,101,114,80,105,100,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,95,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,116,97,103,44,32,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,125,93,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,115,41,44,10,32,32,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,108,101,110,103,116,104,40,83,101,114,118,101,114,80,105,100,115,41,44,32,91,93,41,46,10,10,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,95,82,101,113,73,100,44,32,48,44,32,65,99,99,41,32,45,62,10,32,32,32,32,32,32,65,99,99,59,10,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,44,32,65,99,99,41,32,45,62,10,32,32,32,32,32,32,37,37,32,84,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,100,101,116,101,99,116,32,116,104,97,116,32,119,101,32,109,97,116,99,104,32,111,110,32,116,104,101,32,39,82,101,113,73,100,39,10,32,32,32,32,32,32,37,37,32,114,101,102,101,114,101,110,99,101,32,105,110,32,97,108,108,32,99,108,97,117,115,101,115,44,32,97,110,100,32,119,105,108,108,32,101,110,97,98,108,101,32,116,104,101,32,115,101,108,101,99,116,105,118,101,10,32,32,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,114,101,99,101,105,118,101,32,97,98,108,101,32,116,111,10,32,32,32,32,32,32,37,37,32,115,107,105,112,32,112,97,115,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,116,10,32,32,32,32,32,32,37,37,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,116,104,101,32,39,82,101,113,73,100,39,32,114,101,102,101,114,101,110,99,101,32,119,97,115,32,99,114,101,97,116,101,100,46,46,46,10,32,32,32,32,32,32,82,101,115,32,61,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,72,101,114,101,32,119,101,32,116,121,112,105,99,97,108,108,121,32,119,111,117,108,100,32,104,97,118,101,32,100,101,97,99,116,105,118,97,116,101,100,32,116,104,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,109,111,110,105,116,111,114,32,98,121,32,97,32,99,97,108,108,32,116,111,32,100,101,109,111,110,105,116,111,114,40,77,111,110,44,32,91,102,108,117,115,104,93,41,32,98,117,116,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,119,101,32,105,103,110,111,114,101,32,116,104,105,115,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,102,111,114,32,115,105,109,112,108,105,99,105,116,121,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,111,107,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,115,117,108,116,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,44,32,95,77,111,110,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,114,111,114,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,45,49,44,32,91,82,101,115,32,124,32,65,99,99,93,41,46,10,32,32,96,96,96,10,10,32,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,101,120,97,109,112,108,101,32,116,111,32,119,111,114,107,32,97,115,32,105,110,116,101,110,100,101,100,44,32,116,104,101,32,99,108,105,101,110,116,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,10,32,32,97,116,32,108,101,97,115,116,32,97,110,32,79,84,80,32,50,52,32,115,121,115,116,101,109,44,32,98,117,116,32,116,104,101,32,115,101,114,118,101,114,115,32,109,97,121,32,101,120,101,99,117,116,101,32,111,110,32,111,108,100,101,114,32,115,121,115,116,101,109,115,46>>},#{group => processes,specification => [{attribute,{4471,2},spec,{{monitor,3},[{type,{4472,7},bounded_fun,[{type,{4472,7},'fun',[{type,{4472,7},product,[{atom,{4472,8},process},{user_type,{4472,17},monitor_process_identifier,[]},{type,{4472,47},list,[{user_type,{4472,48},monitor_option,[]}]}]},{var,{4472,70},'MonitorRef'}]},[{type,{4473,9},constraint,[{atom,{4473,9},is_subtype},[{var,{4473,9},'MonitorRef'},{type,{4473,23},reference,[]}]]}]]},{type,{4474,7},bounded_fun,[{type,{4474,7},'fun',[{type,{4474,7},product,[{atom,{4474,8},port},{user_type,{4474,14},monitor_port_identifier,[]},{type,{4474,41},list,[{user_type,{4474,42},monitor_option,[]}]}]},{var,{4474,64},'MonitorRef'}]},[{type,{4475,9},constraint,[{atom,{4475,9},is_subtype},[{var,{4475,9},'MonitorRef'},{type,{4475,23},reference,[]}]]}]]},{type,{4476,7},bounded_fun,[{type,{4476,7},'fun',[{type,{4476,7},product,[{atom,{4476,8},time_offset},{atom,{4476,21},clock_service},{type,{4476,36},list,[{user_type,{4476,37},monitor_option,[]}]}]},{var,{4476,59},'MonitorRef'}]},[{type,{4477,9},constraint,[{atom,{4477,9},is_subtype},[{var,{4477,9},'MonitorRef'},{type,{4477,23},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,monitor,2},{4200,2},[<<109,111,110,105,116,111,114,40,84,121,112,101,44,32,73,116,101,109,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,111,102,32,116,121,112,101,32,96,84,121,112,101,96,32,116,111,32,116,104,101,32,101,110,116,105,116,121,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,46,10,10,73,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,111,114,32,105,116,32,99,104,97,110,103,101,115,32,109,111,110,105,116,111,114,101,100,32,115,116,97,116,101,44,32,116,104,101,32,99,97,108,108,101,114,10,111,102,32,96,109,111,110,105,116,111,114,47,50,96,32,105,115,32,110,111,116,105,102,105,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,97,116,58,10,123,58,32,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101,125,10,10,96,96,96,101,114,108,97,110,103,10,123,84,97,103,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,105,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,97,107,101,115,32,116,105,109,101,32,98,101,102,111,114,101,10,62,32,116,104,101,32,115,105,103,110,97,108,32,114,101,97,99,104,101,115,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,46,10,10,96,84,121,112,101,96,32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58,32,96,112,114,111,99,101,115,115,96,44,32,96,112,111,114,116,96,32,111,114,32,96,116,105,109,101,95,111,102,102,115,101,116,96,46,10,10,65,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,108,121,32,111,110,99,101,44,32,97,102,116,101,114,32,116,104,97,116,32,105,116,32,105,115,32,114,101,109,111,118,101,100,10,102,114,111,109,32,98,111,116,104,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,77,111,110,105,116,111,114,115,32,97,114,101,32,102,105,114,101,100,32,119,104,101,110,10,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,101,114,109,105,110,97,116,101,115,44,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,10,99,114,101,97,116,105,111,110,44,32,111,114,32,105,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,44,10,119,101,32,100,111,32,110,111,116,32,107,110,111,119,32,105,102,32,105,116,32,115,116,105,108,108,32,101,120,105,115,116,115,46,32,84,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,115,111,32,116,117,114,110,101,100,32,111,102,102,32,119,104,101,110,10,96,100,101,109,111,110,105,116,111,114,47,49,96,32,105,115,32,99,97,108,108,101,100,46,10,10,65,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,98,121,32,110,97,109,101,32,114,101,115,111,108,118,101,115,32,116,104,101,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,116,111,32,96,116,58,112,105,100,47,48,96,10,111,114,32,96,116,58,112,111,114,116,47,48,96,32,111,110,108,121,32,111,110,99,101,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,109,111,110,105,116,111,114,32,105,110,115,116,97,110,116,105,97,116,105,111,110,44,32,108,97,116,101,114,32,99,104,97,110,103,101,115,32,116,111,10,116,104,101,32,110,97,109,101,32,114,101,103,105,115,116,114,97,116,105,111,110,32,119,105,108,108,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,111,110,105,116,111,114,46,10,10,87,104,101,110,32,97,32,96,112,114,111,99,101,115,115,96,32,111,114,32,96,112,111,114,116,96,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,104,97,116,10,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,101,114,108,97,110,103,10,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125,10,96,96,96,10,10,73,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,96,77,111,110,105,116,111,114,82,101,102,96,32,97,110,100,32,96,84,121,112,101,96,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,10,101,97,114,108,105,101,114,44,32,97,110,100,58,10,10,45,32,42,42,96,79,98,106,101,99,116,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,44,32,119,104,105,99,104,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,101,118,101,110,116,46,32,87,104,101,110,10,32,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,108,111,99,97,108,32,112,111,114,116,44,32,96,79,98,106,101,99,116,96,32,119,105,108,108,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,96,116,58,112,105,100,47,48,96,10,32,32,111,114,32,96,116,58,112,111,114,116,47,48,96,32,116,104,97,116,32,119,97,115,32,98,101,105,110,103,32,109,111,110,105,116,111,114,101,100,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,98,121,10,32,32,110,97,109,101,44,32,96,79,98,106,101,99,116,96,32,119,105,108,108,32,104,97,118,101,32,102,111,114,109,97,116,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,119,104,101,114,101,10,32,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,105,115,32,116,104,101,32,110,97,109,101,32,119,104,105,99,104,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,119,105,116,104,10,32,32,96,109,111,110,105,116,111,114,47,50,96,32,99,97,108,108,32,97,110,100,32,96,78,111,100,101,96,32,105,115,32,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,110,111,100,101,32,110,97,109,101,32,40,102,111,114,10,32,32,112,111,114,116,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,44,32,96,78,111,100,101,96,32,105,115,32,97,108,119,97,121,115,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,41,46,10,10,45,32,42,42,96,73,110,102,111,96,42,42,32,45,32,69,105,116,104,101,114,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,44,32,96,110,111,112,114,111,99,96,32,40,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,10,32,32,100,105,100,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,109,111,110,105,116,111,114,32,99,114,101,97,116,105,111,110,41,44,32,111,114,32,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,40,110,111,10,32,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,115,41,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,112,114,111,99,101,115,115,96,123,58,32,35,109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,32,125,42,42,32,45,32,67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,10,32,32,96,116,58,112,105,100,47,48,96,32,40,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,41,44,32,97,110,32,97,116,111,109,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,111,114,32,97,32,116,117,112,108,101,10,32,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,44,32,108,111,99,97,116,101,100,32,101,108,115,101,119,104,101,114,101,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,101,102,111,114,101,32,69,82,84,83,32,49,48,46,48,32,40,79,84,80,32,50,49,46,48,41,44,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,99,111,117,108,100,32,102,97,105,108,32,119,105,116,104,32,96,98,97,100,97,114,103,96,10,32,32,62,32,105,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,100,32,111,110,32,97,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,40,115,117,99,104,32,97,115,32,101,114,108,95,105,110,116,101,114,102,97,99,101,10,32,32,62,32,111,114,32,106,105,110,116,101,114,102,97,99,101,41,44,32,119,104,101,114,101,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,46,10,32,32,62,10,32,32,62,32,78,111,119,44,32,115,117,99,104,32,97,32,99,97,108,108,32,116,111,32,96,109,111,110,105,116,111,114,96,32,119,105,108,108,32,105,110,115,116,101,97,100,32,115,117,99,99,101,101,100,32,97,110,100,32,97,32,109,111,110,105,116,111,114,32,105,115,32,99,114,101,97,116,101,100,46,10,32,32,62,32,66,117,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,111,110,108,121,32,115,117,112,101,114,118,105,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,10,32,32,62,32,96,123,39,68,79,87,78,39,44,32,95,44,32,112,114,111,99,101,115,115,44,32,95,44,32,110,111,99,111,110,110,101,99,116,105,111,110,125,96,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,115,115,97,103,101,32,116,104,97,116,32,109,97,121,32,98,101,10,32,32,62,32,114,101,99,101,105,118,101,100,44,32,97,115,32,116,104,101,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,104,97,115,32,110,111,32,119,97,121,32,111,102,32,114,101,112,111,114,116,105,110,103,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,10,32,32,62,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,112,111,114,116,96,123,58,32,35,109,111,110,105,116,111,114,95,112,111,114,116,32,125,42,42,32,45,32,67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,10,32,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32,96,116,58,112,111,114,116,47,48,96,10,32,32,40,111,110,108,121,32,108,111,99,97,108,41,44,32,97,110,32,97,116,111,109,32,96,82,101,103,105,115,116,101,114,101,100,78,97,109,101,96,32,111,114,32,97,32,116,117,112,108,101,32,96,123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125,96,32,102,111,114,10,32,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,111,114,116,44,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,78,111,116,101,44,32,116,104,97,116,32,97,116,116,101,109,112,116,32,116,111,32,109,111,110,105,116,111,114,32,97,10,32,32,114,101,109,111,116,101,32,112,111,114,116,32,119,105,108,108,32,114,101,115,117,108,116,32,105,110,32,96,98,97,100,97,114,103,96,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,57,46,48,46,10,10,45,32,42,42,77,111,110,105,116,111,114,105,110,103,32,97,32,96,116,105,109,101,95,111,102,102,115,101,116,96,123,58,32,35,109,111,110,105,116,111,114,95,116,105,109,101,95,111,102,102,115,101,116,32,125,42,42,32,45,32,77,111,110,105,116,111,114,115,32,99,104,97,110,103,101,115,32,105,110,10,32,32,96,116,105,109,101,95,111,102,102,115,101,116,47,48,96,32,98,101,116,119,101,101,110,10,32,32,91,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,109,111,110,111,116,111,110,105,99,45,116,105,109,101,41,32,97,110,100,10,32,32,91,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,101,114,108,97,110,103,45,115,121,115,116,101,109,45,116,105,109,101,41,46,32,79,110,101,32,118,97,108,105,100,32,96,73,116,101,109,96,10,32,32,101,120,105,115,116,115,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,96,116,105,109,101,95,111,102,102,115,101,116,32,84,121,112,101,96,44,32,110,97,109,101,108,121,32,116,104,101,32,97,116,111,109,10,32,32,96,99,108,111,99,107,95,115,101,114,118,105,99,101,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,116,111,109,32,96,99,108,111,99,107,95,115,101,114,118,105,99,101,96,32,105,115,32,95,110,111,116,95,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,10,32,32,110,97,109,101,32,111,102,32,97,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,105,115,32,99,97,115,101,32,105,116,32,115,101,114,118,101,115,32,97,115,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,105,110,116,101,114,110,97,108,32,99,108,111,99,107,32,115,101,114,118,105,99,101,32,97,116,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,119,104,101,110,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,105,102,32,116,104,101,10,32,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,105,115,32,99,104,97,110,103,101,100,44,32,111,114,32,105,102,32,116,104,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,10,32,32,102,105,110,97,108,32,100,117,114,105,110,103,10,32,32,91,102,105,110,97,108,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,93,40,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116,41,32,119,104,101,110,32,116,104,101,10,32,32,91,115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,115,105,110,103,108,101,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,32,105,115,32,117,115,101,100,46,10,32,32,87,104,101,110,32,97,32,99,104,97,110,103,101,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,109,97,100,101,44,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,10,32,32,116,114,105,103,103,101,114,101,100,32,111,110,99,101,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,119,97,115,32,99,104,97,110,103,101,100,32,111,114,32,110,111,116,46,10,10,32,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,10,32,32,91,109,117,108,116,105,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,109,117,108,116,105,45,116,105,109,101,45,119,97,114,112,45,109,111,100,101,41,44,32,116,104,101,32,116,105,109,101,10,32,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,10,32,32,91,79,83,32,115,121,115,116,101,109,32,116,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,10,32,32,115,121,115,116,101,109,32,100,111,101,115,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,10,32,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,44,32,115,111,10,32,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,10,32,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46,10,10,32,32,84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,95,110,111,116,95,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,116,114,105,103,103,101,114,101,100,46,32,84,104,97,116,10,32,32,105,115,44,32,114,101,112,101,97,116,101,100,32,99,104,97,110,103,101,115,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,116,114,105,103,103,101,114,32,116,104,101,32,109,111,110,105,116,111,114,32,114,101,112,101,97,116,101,100,108,121,46,10,10,32,32,87,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,97,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,10,32,32,112,114,111,99,101,115,115,46,32,65,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,39,67,72,65,78,71,69,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,73,116,101,109,44,32,78,101,119,84,105,109,101,79,102,102,115,101,116,125,10,32,32,96,96,96,10,10,32,32,119,104,101,114,101,32,96,77,111,110,105,116,111,114,82,101,102,96,44,32,96,84,121,112,101,96,44,32,97,110,100,32,96,73,116,101,109,96,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,44,32,97,110,100,10,32,32,96,78,101,119,84,105,109,101,79,102,102,115,101,116,96,32,105,115,32,116,104,101,32,110,101,119,32,116,105,109,101,32,111,102,102,115,101,116,46,10,10,32,32,87,104,101,110,32,116,104,101,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,32,104,97,115,32,98,101,101,110,32,114,101,99,101,105,118,101,100,32,121,111,117,32,97,114,101,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,10,32,32,114,101,116,114,105,101,118,101,32,116,104,101,32,111,108,100,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,10,32,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,47,48,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,121,111,117,32,99,97,110,32,111,98,115,101,114,118,101,32,116,104,101,10,32,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32,96,101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,47,48,96,32,98,101,102,111,114,101,32,121,111,117,32,103,101,116,10,32,32,116,104,101,32,96,39,67,72,65,78,71,69,39,96,32,109,101,115,115,97,103,101,46,10,10,32,32,65,118,97,105,108,97,98,108,101,32,115,105,110,99,101,32,79,84,80,32,49,56,46,48,46,10,10,77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32,96,109,111,110,105,116,111,114,47,50,96,32,102,111,114,32,116,104,101,32,115,97,109,101,32,96,73,116,101,109,96,32,97,110,100,47,111,114,10,96,84,121,112,101,96,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46,10,10,84,104,101,32,109,111,110,105,116,111,114,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,104,97,116,32,105,115,44,32,111,116,104,101,114,32,96,84,121,112,101,96,115,32,97,110,100,10,96,73,116,101,109,96,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,111,114,32,119,104,101,110,32,96,109,111,110,105,116,111,114,47,50,96,32,105,115,32,101,120,116,101,110,100,101,100,44,32,111,116,104,101,114,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,102,111,114,10,62,32,96,84,97,103,96,44,32,96,79,98,106,101,99,116,96,44,32,97,110,100,32,96,73,110,102,111,96,32,105,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,105,110,116,114,111,100,117,99,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{4341,2},spec,{{monitor,2},[{type,{4342,7},bounded_fun,[{type,{4342,7},'fun',[{type,{4342,7},product,[{atom,{4342,8},process},{user_type,{4342,17},monitor_process_identifier,[]}]},{var,{4342,50},'MonitorRef'}]},[{type,{4343,9},constraint,[{atom,{4343,9},is_subtype},[{var,{4343,9},'MonitorRef'},{type,{4343,23},reference,[]}]]}]]},{type,{4344,7},bounded_fun,[{type,{4344,7},'fun',[{type,{4344,7},product,[{atom,{4344,8},port},{user_type,{4344,14},monitor_port_identifier,[]}]},{var,{4344,44},'MonitorRef'}]},[{type,{4345,9},constraint,[{atom,{4345,9},is_subtype},[{var,{4345,9},'MonitorRef'},{type,{4345,23},reference,[]}]]}]]},{type,{4346,7},bounded_fun,[{type,{4346,7},'fun',[{type,{4346,7},product,[{atom,{4346,8},time_offset},{atom,{4346,21},clock_service}]},{var,{4346,39},'MonitorRef'}]},[{type,{4347,9},constraint,[{atom,{4347,9},is_subtype},[{var,{4347,9},'MonitorRef'},{type,{4347,23},reference,[]}]]}]]}]}}]}},{{function,module_loaded,1},{4180,2},[<<109,111,100,117,108,101,95,108,111,97,100,101,100,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,105,115,32,108,111,97,100,101,100,32,97,115,10,91,95,99,117,114,114,101,110,116,32,99,111,100,101,95,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,59,32,111,116,104,101,114,119,105,115,101,44,10,96,102,97,108,115,101,96,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,116,116,101,109,112,116,32,116,111,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46>>},#{group => code,specification => [{attribute,{4186,2},spec,{{module_loaded,1},[{type,{4186,20},bounded_fun,[{type,{4186,20},'fun',[{type,{4186,20},product,[{var,{4186,21},'Module'}]},{type,{4186,32},boolean,[]}]},[{type,{4187,7},constraint,[{atom,{4187,7},is_subtype},[{var,{4187,7},'Module'},{type,{4187,17},module,[]}]]}]]}]}}]}},{{function,md5_update,2},{4170,2},[<<109,100,53,95,117,112,100,97,116,101,40,67,111,110,116,101,120,116,44,32,68,97,116,97,41>>],#{<<101,110>> => <<85,112,100,97,116,101,32,97,110,32,77,68,53,32,96,67,111,110,116,101,120,116,96,32,119,105,116,104,32,96,68,97,116,97,96,32,97,110,100,32,114,101,116,117,114,110,115,32,97,32,96,78,101,119,67,111,110,116,101,120,116,96,46>>},#{group => checksum,specification => [{attribute,{4172,2},spec,{{md5_update,2},[{type,{4172,17},bounded_fun,[{type,{4172,17},'fun',[{type,{4172,17},product,[{var,{4172,18},'Context'},{var,{4172,27},'Data'}]},{var,{4172,36},'NewContext'}]},[{type,{4173,7},constraint,[{atom,{4173,7},is_subtype},[{var,{4173,7},'Context'},{type,{4173,18},binary,[]}]]},{type,{4174,7},constraint,[{atom,{4174,7},is_subtype},[{var,{4174,7},'Data'},{type,{4174,15},iodata,[]}]]},{type,{4175,7},constraint,[{atom,{4175,7},is_subtype},[{var,{4175,7},'NewContext'},{type,{4175,21},binary,[]}]]}]]}]}}]}},{{function,md5_init,0},{4159,2},[<<109,100,53,95,105,110,105,116,40,41>>],#{<<101,110>> => <<67,114,101,97,116,101,115,32,97,110,32,77,68,53,32,99,111,110,116,101,120,116,44,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,10,91,96,109,100,53,95,117,112,100,97,116,101,47,50,96,93,40,96,109,100,53,95,117,112,100,97,116,101,47,50,96,41,46>>},#{group => checksum,specification => [{attribute,{4164,2},spec,{{md5_init,0},[{type,{4164,15},bounded_fun,[{type,{4164,15},'fun',[{type,{4164,15},product,[]},{var,{4164,21},'Context'}]},[{type,{4165,7},constraint,[{atom,{4165,7},is_subtype},[{var,{4165,7},'Context'},{type,{4165,18},binary,[]}]]}]]}]}}]}},{{function,md5_final,1},{4147,2},[<<109,100,53,95,102,105,110,97,108,40,67,111,110,116,101,120,116,41>>],#{<<101,110>> => <<70,105,110,105,115,104,101,115,32,116,104,101,32,117,112,100,97,116,101,32,111,102,32,97,110,32,77,68,53,32,96,67,111,110,116,101,120,116,96,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,117,116,101,100,32,96,77,68,53,96,32,109,101,115,115,97,103,101,10,100,105,103,101,115,116,46>>},#{group => checksum,specification => [{attribute,{4152,2},spec,{{md5_final,1},[{type,{4152,16},bounded_fun,[{type,{4152,16},'fun',[{type,{4152,16},product,[{var,{4152,17},'Context'}]},{var,{4152,29},'Digest'}]},[{type,{4153,7},constraint,[{atom,{4153,7},is_subtype},[{var,{4153,7},'Context'},{type,{4153,18},binary,[]}]]},{type,{4154,7},constraint,[{atom,{4154,7},is_subtype},[{var,{4154,7},'Digest'},{type,{4154,17},binary,[]}]]}]]}]}}]}},{{function,md5,1},{4126,2},[<<109,100,53,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,32,77,68,53,32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,32,102,114,111,109,32,96,68,97,116,97,96,44,32,119,104,101,114,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,100,105,103,101,115,116,32,105,115,10,49,50,56,32,98,105,116,115,32,40,49,54,32,98,121,116,101,115,41,46,32,96,68,97,116,97,96,32,105,115,32,97,32,98,105,110,97,114,121,32,111,114,32,97,32,108,105,115,116,32,111,102,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,97,110,100,10,98,105,110,97,114,105,101,115,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,77,68,53,44,32,115,101,101,10,91,82,70,67,32,49,51,50,49,32,45,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,93,40,104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,49,51,50,49,46,116,120,116,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,32,105,115,32,95,110,111,116,95,32,99,111,110,115,105,100,101,114,101,100,32,115,97,102,101,32,102,111,114,32,99,111,100,101,45,115,105,103,110,105,110,103,32,111,114,10,62,32,115,111,102,116,119,97,114,101,45,105,110,116,101,103,114,105,116,121,32,112,117,114,112,111,115,101,115,46>>},#{group => checksum,specification => [{attribute,{4140,2},spec,{{md5,1},[{type,{4140,10},bounded_fun,[{type,{4140,10},'fun',[{type,{4140,10},product,[{var,{4140,11},'Data'}]},{var,{4140,20},'Digest'}]},[{type,{4141,7},constraint,[{atom,{4141,7},is_subtype},[{var,{4141,7},'Data'},{type,{4141,15},iodata,[]}]]},{type,{4142,7},constraint,[{atom,{4142,7},is_subtype},[{var,{4142,7},'Digest'},{type,{4142,17},binary,[]}]]}]]}]}}]}},{{function,match_spec_test,3},{4085,2},[<<109,97,116,99,104,95,115,112,101,99,95,116,101,115,116,40,77,97,116,99,104,65,103,97,105,110,115,116,44,32,77,97,116,99,104,83,112,101,99,44,32,84,121,112,101,41>>],#{<<101,110>> => <<84,101,115,116,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,117,115,101,100,32,105,110,32,99,97,108,108,115,32,116,111,32,96,101,116,115,58,115,101,108,101,99,116,47,50,96,32,97,110,100,10,96,116,114,97,99,101,58,102,117,110,99,116,105,111,110,47,52,96,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,116,101,115,116,115,32,98,111,116,104,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,34,115,121,110,116,97,99,116,105,99,34,32,99,111,114,114,101,99,116,110,101,115,115,32,97,110,100,10,114,117,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,103,97,105,110,115,116,32,116,104,101,32,111,98,106,101,99,116,46,10,73,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,110,116,97,105,110,115,32,101,114,114,111,114,115,44,32,116,104,101,32,116,117,112,108,101,10,96,123,101,114,114,111,114,44,32,69,114,114,111,114,115,125,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,101,114,101,32,96,69,114,114,111,114,115,96,32,105,115,32,97,32,108,105,115,116,32,111,102,32,110,97,116,117,114,97,108,32,108,97,110,103,117,97,103,101,10,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,119,104,97,116,32,119,97,115,32,119,114,111,110,103,32,119,105,116,104,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46,10,10,73,102,32,96,84,121,112,101,96,32,105,115,32,96,116,97,98,108,101,96,44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,46,32,84,104,101,32,102,117,110,99,116,105,111,110,10,116,104,101,110,32,114,101,116,117,114,110,115,32,96,123,111,107,44,82,101,115,117,108,116,44,91,93,44,87,97,114,110,105,110,103,115,125,96,44,32,119,104,101,114,101,32,96,82,101,115,117,108,116,96,32,105,115,32,119,104,97,116,32,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,10,116,104,101,32,114,101,115,117,108,116,32,105,110,32,97,32,114,101,97,108,32,96,101,116,115,58,115,101,108,101,99,116,47,50,96,32,99,97,108,108,44,32,111,114,32,96,102,97,108,115,101,96,32,105,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,10,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,111,98,106,101,99,116,32,116,117,112,108,101,46,10,10,73,102,32,96,84,121,112,101,96,32,105,115,32,96,116,114,97,99,101,96,44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,46,32,84,104,101,32,102,117,110,99,116,105,111,110,10,114,101,116,117,114,110,115,32,96,123,111,107,44,32,82,101,115,117,108,116,44,32,70,108,97,103,115,44,32,87,97,114,110,105,110,103,115,125,96,44,32,119,104,101,114,101,32,96,82,101,115,117,108,116,96,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,45,32,96,116,114,117,101,96,32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,116,111,32,98,101,32,101,109,105,116,116,101,100,10,45,32,96,102,97,108,115,101,96,32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,101,109,105,116,116,101,100,10,45,32,84,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,32,116,111,32,98,101,32,97,112,112,101,110,100,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,10,10,96,70,108,97,103,115,96,32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,116,111,32,98,101,32,101,110,97,98,108,101,100,44,32,99,117,114,114,101,110,116,108,121,32,116,104,105,115,10,105,115,32,111,110,108,121,32,96,114,101,116,117,114,110,95,116,114,97,99,101,96,46,10,10,84,104,105,115,32,105,115,32,97,32,117,115,101,102,117,108,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,116,101,115,116,32,116,111,111,108,44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,119,114,105,116,105,110,103,32,99,111,109,112,108,105,99,97,116,101,100,10,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,10,10,83,101,101,32,97,108,115,111,32,96,101,116,115,58,116,101,115,116,95,109,115,47,50,96,46>>},#{group => terms,specification => [{attribute,{4117,2},spec,{{match_spec_test,3},[{type,{4117,22},bounded_fun,[{type,{4117,22},'fun',[{type,{4117,22},product,[{var,{4117,23},'MatchAgainst'},{var,{4117,37},'MatchSpec'},{var,{4117,48},'Type'}]},{var,{4117,57},'TestResult'}]},[{type,{4118,7},constraint,[{atom,{4118,7},is_subtype},[{var,{4118,7},'MatchAgainst'},{type,{4118,23},union,[{type,{4118,23},list,[{type,{4118,24},term,[]}]},{type,{4118,34},tuple,any}]}]]},{type,{4119,7},constraint,[{atom,{4119,7},is_subtype},[{var,{4119,7},'MatchSpec'},{type,{4119,20},term,[]}]]},{type,{4120,7},constraint,[{atom,{4120,7},is_subtype},[{var,{4120,7},'Type'},{type,{4120,15},union,[{atom,{4120,15},table},{atom,{4120,23},trace}]}]]},{type,{4121,7},constraint,[{atom,{4121,7},is_subtype},[{var,{4121,7},'TestResult'},{type,{4121,21},union,[{type,{4121,21},tuple,[{atom,{4121,22},ok},{type,{4121,26},term,[]},{type,{4121,34},list,[{atom,{4121,35},return_trace}]},{type,{4121,50},list,[{type,{4121,52},tuple,[{type,{4121,53},union,[{atom,{4121,53},error},{atom,{4121,61},warning}]},{type,{4121,70},string,[]}]}]}]},{type,{4121,85},tuple,[{atom,{4121,86},error},{type,{4121,93},list,[{type,{4121,95},tuple,[{type,{4121,96},union,[{atom,{4121,96},error},{atom,{4121,104},warning}]},{type,{4121,113},string,[]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,map_get,2},{4060,2},[<<109,97,112,95,103,101,116,40,75,101,121,44,32,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,118,97,108,117,101,32,96,86,97,108,117,101,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,102,32,96,77,97,112,96,32,99,111,110,116,97,105,110,115,32,96,75,101,121,96,46,10,10,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,123,98,97,100,109,97,112,44,77,97,112,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,77,97,112,96,32,105,115,32,110,111,116,32,97,32,109,97,112,44,32,111,114,32,119,105,116,104,32,97,10,96,123,98,97,100,107,101,121,44,75,101,121,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,62,32,75,101,121,32,61,32,49,51,51,55,44,10,32,32,77,97,112,32,61,32,35,123,52,50,32,61,62,32,118,97,108,117,101,95,116,119,111,44,49,51,51,55,32,61,62,32,34,118,97,108,117,101,32,111,110,101,34,44,34,97,34,32,61,62,32,49,125,44,10,32,32,109,97,112,95,103,101,116,40,75,101,121,44,77,97,112,41,46,10,34,118,97,108,117,101,32,111,110,101,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{4077,2},spec,{{map_get,2},[{type,{4077,14},bounded_fun,[{type,{4077,14},'fun',[{type,{4077,14},product,[{var,{4077,15},'Key'},{var,{4077,20},'Map'}]},{var,{4077,28},'Value'}]},[{type,{4078,7},constraint,[{atom,{4078,7},is_subtype},[{var,{4078,7},'Map'},{type,{4078,14},map,any}]]},{type,{4079,7},constraint,[{atom,{4079,7},is_subtype},[{var,{4079,7},'Key'},{type,{4079,14},any,[]}]]},{type,{4080,7},constraint,[{atom,{4080,7},is_subtype},[{var,{4080,7},'Value'},{type,{4080,16},any,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,map_size,1},{4042,2},[<<109,97,112,95,115,105,122,101,40,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,107,101,121,45,118,97,108,117,101,32,112,97,105,114,115,32,105,110,32,96,77,97,112,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,109,97,112,95,115,105,122,101,40,35,123,97,61,62,49,44,32,98,61,62,50,44,32,99,61,62,51,125,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{4054,2},spec,{{map_size,1},[{type,{4054,15},bounded_fun,[{type,{4054,15},'fun',[{type,{4054,15},product,[{var,{4054,16},'Map'}]},{type,{4054,24},non_neg_integer,[]}]},[{type,{4055,7},constraint,[{atom,{4055,7},is_subtype},[{var,{4055,7},'Map'},{type,{4055,14},map,any}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,make_ref,0},{4026,2},[<<109,97,107,101,95,114,101,102,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,91,117,110,105,113,117,101,32,114,101,102,101,114,101,110,99,101,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,117,110,105,113,117,101,95,114,101,102,101,114,101,110,99,101,115,96,41,46,32,84,104,101,10,114,101,102,101,114,101,110,99,101,32,105,115,32,117,110,105,113,117,101,32,97,109,111,110,103,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,66,101,102,111,114,101,32,79,84,80,32,50,51,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,44,10,62,32,114,101,102,101,114,101,110,99,101,115,32,99,114,101,97,116,101,100,32,111,110,32,97,32,110,101,119,101,114,32,110,111,100,101,32,99,97,110,32,98,101,32,109,105,115,116,97,107,101,110,32,102,111,114,32,97,32,114,101,102,101,114,101,110,99,101,32,99,114,101,97,116,101,100,32,111,110,10,62,32,97,110,32,111,108,100,101,114,32,110,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,46>>},#{group => terms,specification => [{attribute,{4037,2},spec,{{make_ref,0},[{type,{4037,15},'fun',[{type,{4037,15},product,[]},{type,{4037,21},reference,[]}]}]}}]}},{{function,localtime,0},{4004,2},[<<108,111,99,97,108,116,105,109,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,44,10,96,123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,10,96,96,96,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46>>},#{group => time,specification => [{attribute,{4020,2},spec,{{localtime,0},[{type,{4020,16},bounded_fun,[{type,{4020,16},'fun',[{type,{4020,16},product,[]},{var,{4020,22},'DateTime'}]},[{type,{4021,7},constraint,[{atom,{4021,7},is_subtype},[{var,{4021,7},'DateTime'},{remote_type,{4021,19},[{atom,{4021,19},calendar},{atom,{4021,28},datetime},[]]}]]}]]}]}}]}},{{function,loaded,0},{3991,2},[<<108,111,97,100,101,100,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,40,99,117,114,114,101,110,116,32,97,110,100,32,111,108,100,32,99,111,100,101,41,44,32,105,110,99,108,117,100,105,110,103,10,112,114,101,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46>>},#{group => code,specification => [{attribute,{3998,2},spec,{{loaded,0},[{type,{3998,13},bounded_fun,[{type,{3998,13},'fun',[{type,{3998,13},product,[]},{type,{3998,19},list,[{var,{3998,20},'Module'}]}]},[{type,{3999,7},constraint,[{atom,{3999,7},is_subtype},[{var,{3999,7},'Module'},{type,{3999,17},module,[]}]]}]]}]}}]}},{{function,list_to_tuple,1},{3974,2},[<<108,105,115,116,95,116,111,95,116,117,112,108,101,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,76,105,115,116,96,44,32,102,111,114,32,101,120,97,109,112,108,101,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,116,117,112,108,101,40,91,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,93,41,46,10,123,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,125,10,96,96,96,10,10,96,76,105,115,116,96,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46>>},#{group => terms,specification => [{attribute,{3985,2},spec,{{list_to_tuple,1},[{type,{3985,20},bounded_fun,[{type,{3985,20},'fun',[{type,{3985,20},product,[{var,{3985,21},'List'}]},{type,{3985,30},tuple,any}]},[{type,{3986,7},constraint,[{atom,{3986,7},is_subtype},[{var,{3986,7},'List'},{type,{3986,15},list,[{type,{3986,16},term,[]}]}]]}]]}]}}]}},{{function,list_to_ref,1},{3949,2},[<<108,105,115,116,95,116,111,95,114,101,102,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,114,101,102,101,114,101,110,99,101,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,114,101,102,40,34,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,34,41,46,10,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,114,101,102,101,114,101,110,99,101,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3968,2},spec,{{list_to_ref,1},[{type,{3968,18},bounded_fun,[{type,{3968,18},'fun',[{type,{3968,18},product,[{var,{3968,19},'String'}]},{type,{3968,30},reference,[]}]},[{type,{3969,7},constraint,[{atom,{3969,7},is_subtype},[{var,{3969,7},'String'},{type,{3969,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_port,1},{3923,2},[<<108,105,115,116,95,116,111,95,112,111,114,116,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,112,111,114,116,40,34,35,80,111,114,116,60,48,46,52,62,34,41,46,10,35,80,111,114,116,60,48,46,52,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,111,114,116,10,105,100,101,110,116,105,102,105,101,114,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3943,2},spec,{{list_to_port,1},[{type,{3943,19},bounded_fun,[{type,{3943,19},'fun',[{type,{3943,19},product,[{var,{3943,20},'String'}]},{type,{3943,31},port,[]}]},[{type,{3944,7},constraint,[{atom,{3944,7},is_subtype},[{var,{3944,7},'String'},{type,{3944,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_pid,1},{3898,2},[<<108,105,115,116,95,116,111,95,112,105,100,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,112,105,100,40,34,60,48,46,52,46,49,62,34,41,46,10,60,48,46,52,46,49,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,10,105,100,101,110,116,105,102,105,101,114,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,10,62,32,112,114,111,103,114,97,109,115,46>>},#{group => terms,specification => [{attribute,{3917,2},spec,{{list_to_pid,1},[{type,{3917,18},bounded_fun,[{type,{3917,18},'fun',[{type,{3917,18},product,[{var,{3917,19},'String'}]},{type,{3917,30},pid,[]}]},[{type,{3918,7},constraint,[{atom,{3918,7},is_subtype},[{var,{3918,7},'String'},{type,{3918,17},string,[]}]]}]]}]}}]}},{{function,list_to_integer,2},{3837,2},[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,83,116,114,105,110,103,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32,96,66,97,115,101,96,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,102,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,70,34,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,51,70,70,34,44,32,49,54,41,46,10,45,49,48,50,51,10,96,96,96,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,96,66,97,115,101,96,32,105,115,32,49,54,44,32,96,83,116,114,105,110,103,96,32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,10,96,34,94,91,43,45,93,63,40,91,48,45,57,93,124,91,65,45,70,93,124,91,97,45,102,93,41,43,36,34,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{3873,2},spec,{{list_to_integer,2},[{type,{3873,22},bounded_fun,[{type,{3873,22},'fun',[{type,{3873,22},product,[{var,{3873,23},'String'},{var,{3873,31},'Base'}]},{type,{3873,40},integer,[]}]},[{type,{3874,7},constraint,[{atom,{3874,7},is_subtype},[{var,{3874,7},'String'},{type,{3874,17},string,[]}]]},{type,{3875,7},constraint,[{atom,{3875,7},is_subtype},[{var,{3875,7},'Base'},{type,{3875,15},range,[{integer,{3875,15},2},{integer,{3875,18},36}]}]]}]]}]}}]}},{{function,list_to_integer,1},{3785,2},[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,49,50,51,34,41,46,10,49,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,49,50,51,34,41,46,10,45,49,50,51,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,34,41,46,10,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,10,96,96,96,10,10,96,83,116,114,105,110,103,96,32,109,117,115,116,32,99,111,110,116,97,105,110,32,97,116,32,108,101,97,115,116,32,111,110,101,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,99,97,110,32,104,97,118,101,32,97,110,32,111,112,116,105,111,110,97,108,10,112,114,101,102,105,120,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,34,96,43,96,34,32,111,114,32,34,96,45,96,34,32,99,104,97,114,97,99,116,101,114,32,40,116,104,97,116,32,105,115,44,32,96,83,116,114,105,110,103,96,32,109,117,115,116,10,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,34,94,91,43,45,93,63,91,48,45,57,93,43,36,34,96,41,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{3812,2},spec,{{list_to_integer,1},[{type,{3812,22},bounded_fun,[{type,{3812,22},'fun',[{type,{3812,22},product,[{var,{3812,23},'String'}]},{type,{3812,34},integer,[]}]},[{type,{3813,7},constraint,[{atom,{3813,7},is_subtype},[{var,{3813,7},'String'},{type,{3813,17},string,[]}]]}]]}]}}]}},{{function,list_to_float,1},{3762,2},[<<108,105,115,116,95,116,111,95,102,108,111,97,116,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,32,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,34,50,46,50,48,49,55,55,54,52,101,43,48,34,41,46,10,50,46,50,48,49,55,55,54,52,10,96,96,96,10,10,84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,10,91,69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,96,41,32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,10,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,83,116,114,105,110,103,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>},#{group => terms,specification => [{attribute,{3779,2},spec,{{list_to_float,1},[{type,{3779,20},bounded_fun,[{type,{3779,20},'fun',[{type,{3779,20},product,[{var,{3779,21},'String'}]},{type,{3779,32},float,[]}]},[{type,{3780,7},constraint,[{atom,{3780,7},is_subtype},[{var,{3780,7},'String'},{type,{3780,17},string,[]}]]}]]}]}}]}},{{function,list_to_existing_atom,1},{3738,2},[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,114,101,10,97,108,114,101,97,100,121,32,101,120,105,115,116,115,32,115,117,99,104,32,97,116,111,109,46,32,65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,102,32,105,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,114,117,110,45,116,105,109,101,10,115,121,115,116,101,109,32,98,121,32,101,105,116,104,101,114,32,108,111,97,100,105,110,103,32,99,111,100,101,32,111,114,32,99,114,101,97,116,105,110,103,32,97,32,116,101,114,109,32,105,110,32,119,104,105,99,104,32,116,104,101,32,97,116,111,109,32,105,115,32,112,97,114,116,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,100,111,101,115,32,110,111,116,32,97,108,114,101,97,100,121,32,101,120,105,115,116,32,97,110,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,10,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,10,62,32,114,101,119,114,105,116,101,32,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,96,34,115,111,109,101,95,97,116,111,109,34,96,46,32,73,102,10,62,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32,96,115,111,109,101,95,97,116,111,109,96,32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,10,62,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,10,62,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,10,62,32,91,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,34,115,111,109,101,95,97,116,111,109,34,41,96,93,40,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,41,32,119,105,108,108,32,102,97,105,108,46>>},#{group => terms,specification => [{attribute,{3756,2},spec,{{list_to_existing_atom,1},[{type,{3756,28},bounded_fun,[{type,{3756,28},'fun',[{type,{3756,28},product,[{var,{3756,29},'String'}]},{type,{3756,40},atom,[]}]},[{type,{3757,7},constraint,[{atom,{3757,7},is_subtype},[{var,{3757,7},'String'},{type,{3757,17},string,[]}]]}]]}]}}]}},{{function,list_to_bitstring,1},{3713,2},[<<108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,66,105,116,115,116,114,105,110,103,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,116,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,116,115,116,114,105,110,103,115,32,105,110,10,96,66,105,116,115,116,114,105,110,103,76,105,115,116,96,46,32,40,84,104,101,32,108,97,115,116,32,116,97,105,108,32,105,110,32,96,66,105,116,115,116,114,105,110,103,76,105,115,116,96,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,10,98,105,116,115,116,114,105,110,103,46,41,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,44,55,58,52,62,62,46,10,60,60,54,44,55,58,52,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,44,55,58,52,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3732,2},spec,{{list_to_bitstring,1},[{type,{3732,24},bounded_fun,[{type,{3732,24},'fun',[{type,{3732,24},product,[{var,{3732,25},'BitstringList'}]},{type,{3732,43},bitstring,[]}]},[{type,{3733,7},constraint,[{atom,{3733,7},is_subtype},[{var,{3733,7},'BitstringList'},{user_type,{3733,24},bitstring_list,[]}]]}]]}]}}]}},{{function,list_to_binary,1},{3690,2},[<<108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,111,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32,96,73,111,76,105,115,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3707,2},spec,{{list_to_binary,1},[{type,{3707,21},bounded_fun,[{type,{3707,21},'fun',[{type,{3707,21},product,[{var,{3707,22},'IoList'}]},{type,{3707,33},binary,[]}]},[{type,{3708,7},constraint,[{atom,{3708,7},is_subtype},[{var,{3708,7},'IoList'},{type,{3708,17},iolist,[]}]]}]]}]}}]}},{{function,list_to_atom,1},{3654,2},[<<108,105,115,116,95,116,111,95,97,116,111,109,40,83,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,83,116,114,105,110,103,96,46,10,10,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,96,83,116,114,105,110,103,96,32,109,97,121,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,10,118,101,114,115,105,111,110,115,32,97,108,108,111,119,101,100,32,111,110,108,121,32,73,83,79,45,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,100,105,100,32,110,111,116,32,97,108,108,111,119,10,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,98,111,118,101,32,50,53,53,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,97,32,91,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,10,62,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,10,62,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,105,102,10,62,32,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,10,62,32,91,96,108,105,115,116,95,116,111,95,97,116,111,109,47,49,96,93,40,96,108,105,115,116,95,116,111,95,97,116,111,109,47,49,96,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,105,115,116,95,116,111,95,97,116,111,109,40,34,69,114,108,97,110,103,34,41,46,10,39,69,114,108,97,110,103,39,10,96,96,96>>},#{group => terms,specification => [{attribute,{3684,2},spec,{{list_to_atom,1},[{type,{3684,19},bounded_fun,[{type,{3684,19},'fun',[{type,{3684,19},product,[{var,{3684,20},'String'}]},{type,{3684,31},atom,[]}]},[{type,{3685,7},constraint,[{atom,{3685,7},is_subtype},[{var,{3685,7},'String'},{type,{3685,17},string,[]}]]}]]}]}}]}},{{function,link,1},{3594,2},[<<108,105,110,107,40,80,105,100,79,114,80,111,114,116,41>>],#{<<101,110>> => <<83,101,116,115,32,117,112,32,97,110,100,32,97,99,116,105,118,97,116,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,10,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,79,114,80,111,114,116,96,46,10,10,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,108,105,110,107,101,101,46,32,73,102,32,116,104,101,32,108,105,110,107,101,101,10,105,115,32,97,32,112,111,114,116,44,32,105,116,32,109,117,115,116,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,46,10,10,73,102,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,116,105,99,105,112,97,110,116,115,32,111,102,32,97,32,108,105,110,107,32,116,101,114,109,105,110,97,116,101,115,44,32,105,116,32,119,105,108,108,10,91,115,101,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,32,116,111,10,116,104,101,32,111,116,104,101,114,32,112,97,114,116,105,99,105,112,97,110,116,46,32,84,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,10,91,101,120,105,116,32,114,101,97,115,111,110,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,95,101,120,105,116,95,115,105,103,110,97,108,95,114,101,97,115,111,110,96,41,32,111,102,32,116,104,101,10,116,101,114,109,105,110,97,116,101,100,32,112,97,114,116,105,99,105,112,97,110,116,46,32,79,116,104,101,114,32,99,97,115,101,115,32,119,104,101,110,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,101,32,116,114,105,103,103,101,114,101,100,32,100,117,101,32,116,111,32,97,10,108,105,110,107,32,97,114,101,32,119,104,101,110,32,110,111,32,108,105,110,107,101,101,32,101,120,105,115,116,32,40,96,110,111,112,114,111,99,96,32,101,120,105,116,32,114,101,97,115,111,110,41,32,97,110,100,32,119,104,101,110,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,10,98,101,116,119,101,101,110,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,111,110,32,100,105,102,102,101,114,101,110,116,32,110,111,100,101,115,32,105,115,32,108,111,115,116,32,111,114,32,99,97,110,110,111,116,32,98,101,32,101,115,116,97,98,108,105,115,104,101,100,10,40,96,110,111,99,111,110,110,101,99,116,105,111,110,96,32,101,120,105,116,32,114,101,97,115,111,110,41,46,10,10,65,110,32,101,120,105,115,116,105,110,103,32,108,105,110,107,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,98,121,32,99,97,108,108,105,110,103,32,96,117,110,108,105,110,107,47,49,96,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,10,108,105,110,107,115,32,97,110,100,32,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,58,10,10,45,32,91,76,105,110,107,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,108,105,110,107,115,96,41,10,45,32,91,83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,45,32,91,82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,10,10,70,111,114,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,104,97,115,32,97,32,115,116,114,97,110,103,101,32,115,101,109,105,45,115,121,110,99,104,114,111,110,111,117,115,10,98,101,104,97,118,105,111,114,32,119,104,101,110,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,111,114,32,110,111,116,44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,10,100,111,101,115,32,110,111,116,32,91,116,114,97,112,32,101,120,105,116,115,93,40,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116,41,46,32,73,102,32,116,104,101,32,97,98,111,118,101,32,105,115,32,116,114,117,101,10,97,110,100,32,116,104,101,32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,119,105,108,108,32,114,97,105,115,101,32,97,32,96,110,111,112,114,111,99,96,32,101,114,114,111,114,10,95,101,120,99,101,112,116,105,111,110,95,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,119,111,117,108,100,32,105,110,115,116,101,97,100,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,10,91,96,108,105,110,107,47,49,96,93,40,96,108,105,110,107,47,49,96,41,32,114,101,116,117,114,110,101,100,32,96,116,114,117,101,96,44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,32,108,97,116,101,114,32,119,97,115,32,115,101,110,116,32,97,110,32,101,120,105,116,10,115,105,103,110,97,108,32,119,105,116,104,32,96,110,111,112,114,111,99,96,32,101,120,105,116,32,114,101,97,115,111,110,44,32,98,117,116,32,116,104,105,115,32,105,115,32,117,110,102,111,114,116,117,110,97,116,101,108,121,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,101,10,96,110,111,112,114,111,99,96,32,91,101,120,99,101,112,116,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,35,101,120,99,101,112,116,105,111,110,115,96,41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,99,111,110,102,117,115,101,100,32,119,105,116,104,10,97,110,32,91,101,120,105,116,32,115,105,103,110,97,108,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115,96,41,32,119,105,116,104,32,101,120,105,116,10,114,101,97,115,111,110,32,96,110,111,112,114,111,99,96,46,32,67,117,114,114,101,110,116,108,121,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,119,104,101,110,32,105,116,10,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,108,105,110,107,32,115,101,116,117,112,32,97,110,100,32,97,99,116,105,118,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,116,104,101,32,108,105,110,107,32,97,108,114,101,97,100,121,10,101,120,105,115,116,115,44,32,111,114,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,99,114,101,97,116,101,32,97,32,108,105,110,107,32,116,111,32,105,116,115,101,108,102,44,32,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,10,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,91,108,105,110,107,32,112,114,111,116,111,99,111,108,93,40,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,46,109,100,35,108,105,110,107,95,112,114,111,116,111,99,111,108,41,10,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,95,68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,95,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,70,97,105,108,117,114,101,58,10,10,45,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,105,100,79,114,80,111,114,116,96,32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46,10,45,32,96,110,111,112,114,111,99,96,32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,110,100,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,105,116,32,101,120,105,115,116,115,32,97,115,10,32,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,46>>},#{group => processes,specification => [{attribute,{3648,2},spec,{{link,1},[{type,{3648,11},bounded_fun,[{type,{3648,11},'fun',[{type,{3648,11},product,[{var,{3648,12},'PidOrPort'}]},{atom,{3648,26},true}]},[{type,{3649,7},constraint,[{atom,{3649,7},is_subtype},[{var,{3649,7},'PidOrPort'},{type,{3649,20},union,[{type,{3649,20},pid,[]},{type,{3649,28},port,[]}]}]]}]]}]}}]}},{{function,length,1},{3577,2},[<<108,101,110,103,116,104,40,76,105,115,116,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,96,76,105,115,116,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,108,101,110,103,116,104,40,91,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,93,41,46,10,57,10,96,96,96>>},#{group => terms,specification => [{attribute,{3588,2},spec,{{length,1},[{type,{3588,13},bounded_fun,[{type,{3588,13},'fun',[{type,{3588,13},product,[{var,{3588,14},'List'}]},{type,{3588,23},non_neg_integer,[]}]},[{type,{3589,7},constraint,[{atom,{3589,7},is_subtype},[{var,{3589,7},'List'},{type,{3589,15},list,[{type,{3589,16},term,[]}]}]]}]]}]}}]}},{{function,is_process_alive,1},{3542,2},[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,105,100,41>>],#{<<101,110>> => <<96,80,105,100,96,32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,32,97,110,100,32,105,115,32,97,108,105,118,101,44,32,116,104,97,116,32,105,115,44,32,105,115,32,110,111,116,32,101,120,105,116,105,110,103,32,97,110,100,10,104,97,115,32,110,111,116,32,101,120,105,116,101,100,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46,10,10,73,102,32,112,114,111,99,101,115,115,32,96,80,49,96,32,99,97,108,108,115,32,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,105,116,32,105,115,10,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,115,105,103,110,97,108,115,44,32,115,101,110,116,32,102,114,111,109,32,96,80,49,96,32,116,111,32,96,80,50,96,32,40,96,80,50,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,10,105,100,101,110,116,105,102,105,101,114,32,96,80,50,80,105,100,96,41,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,44,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,50,96,32,98,101,102,111,114,101,32,116,104,101,10,97,108,105,118,101,110,101,115,115,32,111,102,32,96,80,50,96,32,105,115,32,99,104,101,99,107,101,100,46,32,84,104,105,115,32,103,117,97,114,97,110,116,101,101,32,109,101,97,110,115,32,116,104,97,116,32,111,110,101,32,99,97,110,32,117,115,101,10,91,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,93,40,96,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49,96,41,32,116,111,32,108,101,116,32,97,32,112,114,111,99,101,115,115,32,96,80,49,96,32,119,97,105,116,32,117,110,116,105,108,32,97,10,112,114,111,99,101,115,115,32,96,80,50,96,44,32,119,104,105,99,104,32,104,97,115,32,103,111,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,102,114,111,109,32,80,49,44,32,105,115,10,107,105,108,108,101,100,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,101,120,105,116,40,80,50,80,105,100,44,32,107,105,108,108,41,44,10,37,32,80,50,32,109,105,103,104,116,32,110,111,116,32,98,101,32,107,105,108,108,101,100,10,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,44,10,37,32,80,50,32,105,115,32,110,111,116,32,97,108,105,118,101,32,40,116,104,101,32,99,97,108,108,32,97,98,111,118,101,32,97,108,119,97,121,115,32,114,101,116,117,114,110,32,102,97,108,115,101,41,10,96,96,96,10,10,83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,98,111,117,116,32,91,115,105,103,110,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,10,97,110,100,32,91,101,114,108,97,110,103,58,101,120,105,116,47,50,93,40,96,101,120,105,116,47,50,96,41,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,105,103,110,97,108,115,32,97,110,100,32,101,120,105,116,10,115,105,103,110,97,108,115,46>>},#{group => processes,specification => [{attribute,{3570,2},spec,{{is_process_alive,1},[{type,{3570,23},bounded_fun,[{type,{3570,23},'fun',[{type,{3570,23},product,[{var,{3570,24},'Pid'}]},{type,{3570,32},boolean,[]}]},[{type,{3571,7},constraint,[{atom,{3571,7},is_subtype},[{var,{3571,7},'Pid'},{type,{3571,14},pid,[]}]]}]]}]}}]}},{{function,is_map_key,2},{3516,2},[<<105,115,95,109,97,112,95,107,101,121,40,75,101,121,44,32,77,97,112,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,109,97,112,32,96,77,97,112,96,32,99,111,110,116,97,105,110,115,32,96,75,101,121,96,32,97,110,100,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,10,99,111,110,116,97,105,110,32,116,104,101,32,96,75,101,121,96,46,10,10,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,123,98,97,100,109,97,112,44,77,97,112,125,96,32,101,120,99,101,112,116,105,111,110,32,105,102,32,96,77,97,112,96,32,105,115,32,110,111,116,32,97,32,109,97,112,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,62,32,77,97,112,32,61,32,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,46,10,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,10,62,32,105,115,95,109,97,112,95,107,101,121,40,34,52,50,34,44,77,97,112,41,46,10,116,114,117,101,10,62,32,105,115,95,109,97,112,95,107,101,121,40,118,97,108,117,101,44,77,97,112,41,46,10,102,97,108,115,101,10,96,96,96>>},#{group => terms,specification => [{attribute,{3535,2},spec,{{is_map_key,2},[{type,{3535,17},bounded_fun,[{type,{3535,17},'fun',[{type,{3535,17},product,[{var,{3535,18},'Key'},{var,{3535,23},'Map'}]},{type,{3535,31},boolean,[]}]},[{type,{3536,5},constraint,[{atom,{3536,5},is_subtype},[{var,{3536,5},'Key'},{type,{3536,12},term,[]}]]},{type,{3537,5},constraint,[{atom,{3537,5},is_subtype},[{var,{3537,5},'Map'},{type,{3537,12},map,any}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,is_builtin,3},{3501,2},[<<105,115,95,98,117,105,108,116,105,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<84,104,105,115,32,66,73,70,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,98,117,105,108,100,101,114,115,32,111,102,32,99,114,111,115,115,45,114,101,102,101,114,101,110,99,101,32,116,111,111,108,115,46,10,10,82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,105,115,32,97,32,66,73,70,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,44,32,111,116,104,101,114,119,105,115,101,10,96,102,97,108,115,101,96,46>>},#{group => code,specification => [{attribute,{3508,2},spec,{{is_builtin,3},[{type,{3508,17},bounded_fun,[{type,{3508,17},'fun',[{type,{3508,17},product,[{var,{3508,18},'Module'},{var,{3508,26},'Function'},{var,{3508,36},'Arity'}]},{type,{3508,46},boolean,[]}]},[{type,{3509,7},constraint,[{atom,{3509,7},is_subtype},[{var,{3509,7},'Module'},{type,{3509,17},module,[]}]]},{type,{3510,7},constraint,[{atom,{3510,7},is_subtype},[{var,{3510,7},'Function'},{type,{3510,19},atom,[]}]]},{type,{3511,7},constraint,[{atom,{3511,7},is_subtype},[{var,{3511,7},'Arity'},{type,{3511,16},arity,[]}]]}]]}]}}]}},{{function,is_alive,0},{3485,2},[<<105,115,95,97,108,105,118,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,40,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,97,10,100,105,115,116,114,105,98,117,116,101,100,32,115,121,115,116,101,109,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,32,65,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,105,102,32,105,116,32,105,115,32,115,116,97,114,116,101,100,32,119,105,116,104,58,10,10,49,46,32,91,96,34,101,114,108,32,45,110,97,109,101,32,76,79,78,71,78,65,77,69,34,96,93,40,101,114,108,95,99,109,100,46,109,100,35,110,97,109,101,41,32,111,114,44,10,49,46,32,91,96,34,101,114,108,32,45,115,110,97,109,101,32,83,72,79,82,84,78,65,77,69,34,96,93,40,101,114,108,95,99,109,100,46,109,100,35,115,110,97,109,101,41,46,10,10,65,32,110,111,100,101,32,99,97,110,32,97,108,115,111,32,98,101,32,97,108,105,118,101,32,105,102,32,105,116,32,104,97,115,32,103,111,116,32,97,32,110,97,109,101,32,102,114,111,109,32,97,32,99,97,108,108,32,116,111,10,96,110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,50,96,32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,111,112,112,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32,96,110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48,96,46>>},#{group => distribution,specification => [{attribute,{3496,2},spec,{{is_alive,0},[{type,{3496,15},'fun',[{type,{3496,15},product,[]},{type,{3496,21},boolean,[]}]}]}}]}},{{function,iolist_to_iovec,1},{3446,2},[<<105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,73,111,76,105,115,116,79,114,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,91,105,111,118,101,99,93,40,96,116,58,105,111,118,101,99,47,48,96,41,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,10,96,73,111,76,105,115,116,79,114,66,105,110,97,114,121,96,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,102,108,97,116,116,101,110,32,97,110,32,105,111,108,105,115,116,32,98,117,116,10,121,111,117,32,100,111,32,110,111,116,32,110,101,101,100,32,97,32,115,105,110,103,108,101,32,98,105,110,97,114,121,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,115,115,105,110,103,32,116,104,101,32,100,97,116,97,32,116,111,32,110,105,102,10,102,117,110,99,116,105,111,110,115,32,115,117,99,104,32,97,115,32,91,96,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,96,93,40,101,114,108,95,110,105,102,46,109,100,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99,41,32,111,114,32,100,111,10,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,46,32,84,104,101,32,97,100,118,97,110,116,97,103,101,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,118,101,114,10,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,32,105,115,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,99,111,112,121,10,91,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,93,40,96,101,58,115,121,115,116,101,109,58,98,105,110,97,114,121,104,97,110,100,108,105,110,103,46,109,100,35,114,101,102,99,95,98,105,110,97,114,121,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,115,109,97,108,108,32,98,105,110,97,114,105,101,115,32,97,110,100,32,105,110,116,101,103,101,114,115,32,105,116,32,119,111,114,107,115,32,97,115,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,91,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,93,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,108,97,114,103,101,114,32,98,105,110,97,114,105,101,115,44,32,116,104,101,121,32,97,114,101,32,115,112,108,105,116,32,97,110,100,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,102,111,114,109,10,37,37,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,97,108,108,105,110,103,32,116,104,101,32,67,32,102,117,110,99,116,105,111,110,32,119,114,105,116,101,118,46,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,60,60,49,62,62,44,60,60,50,58,56,48,57,54,62,62,44,60,60,51,58,56,48,57,54,62,62,93,41,46,10,91,60,60,49,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,48,44,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,46,46,46,62,62,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{3479,2},spec,{{iolist_to_iovec,1},[{type,{3479,22},bounded_fun,[{type,{3479,22},'fun',[{type,{3479,22},product,[{var,{3479,23},'IoListOrBinary'}]},{user_type,{3479,42},iovec,[]}]},[{type,{3480,7},constraint,[{atom,{3480,7},is_subtype},[{var,{3480,7},'IoListOrBinary'},{type,{3480,25},union,[{type,{3480,25},iolist,[]},{type,{3480,36},binary,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,49>>}},{{function,iolist_to_binary,1},{3422,2},[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,111,76,105,115,116,79,114,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,10,96,73,111,76,105,115,116,79,114,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3440,2},spec,{{iolist_to_binary,1},[{type,{3440,23},bounded_fun,[{type,{3440,23},'fun',[{type,{3440,23},product,[{var,{3440,24},'IoListOrBinary'}]},{type,{3440,43},binary,[]}]},[{type,{3441,7},constraint,[{atom,{3441,7},is_subtype},[{var,{3441,7},'IoListOrBinary'},{type,{3441,25},union,[{type,{3441,25},iolist,[]},{type,{3441,36},binary,[]}]}]]}]]}]}}]}},{{function,iolist_size,1},{3404,2},[<<105,111,108,105,115,116,95,115,105,122,101,40,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,44,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,116,104,97,116,32,119,111,117,108,100,32,98,101,32,116,104,101,10,114,101,115,117,108,116,32,111,102,32,91,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,116,101,109,41,96,93,40,96,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,111,108,105,115,116,95,115,105,122,101,40,91,49,44,50,124,60,60,51,44,52,62,62,93,41,46,10,52,10,96,96,96>>},#{group => terms,specification => [{attribute,{3416,2},spec,{{iolist_size,1},[{type,{3416,18},bounded_fun,[{type,{3416,18},'fun',[{type,{3416,18},product,[{var,{3416,19},'Item'}]},{type,{3416,28},non_neg_integer,[]}]},[{type,{3417,7},constraint,[{atom,{3417,7},is_subtype},[{var,{3417,7},'Item'},{type,{3417,15},union,[{type,{3417,15},iolist,[]},{type,{3417,26},binary,[]}]}]]}]]}]}}]}},{{function,integer_to_list,1},{3387,2},[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,73,110,116,101,103,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,55,55,41,46,10,34,55,55,34,10,96,96,96>>},#{group => terms,specification => [{attribute,{3398,2},spec,{{integer_to_list,1},[{type,{3398,22},bounded_fun,[{type,{3398,22},'fun',[{type,{3398,22},product,[{var,{3398,23},'Integer'}]},{type,{3398,35},string,[]}]},[{type,{3399,7},constraint,[{atom,{3399,7},is_subtype},[{var,{3399,7},'Integer'},{type,{3399,18},integer,[]}]]}]]}]}}]}},{{function,integer_to_binary,1},{3369,2},[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,73,110,116,101,103,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,73,110,116,101,103,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,55,55,41,46,10,60,60,34,55,55,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{3381,2},spec,{{integer_to_binary,1},[{type,{3381,24},bounded_fun,[{type,{3381,24},'fun',[{type,{3381,24},product,[{var,{3381,25},'Integer'}]},{type,{3381,37},binary,[]}]},[{type,{3382,7},constraint,[{atom,{3382,7},is_subtype},[{var,{3382,7},'Integer'},{type,{3382,18},integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,insert_element,3},{3346,2},[<<105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,44,32,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,96,84,101,114,109,96,32,105,110,115,101,114,116,101,100,32,97,116,32,112,111,115,105,116,105,111,110,32,96,73,110,100,101,120,96,32,105,110,32,116,117,112,108,101,10,96,84,117,112,108,101,49,96,46,32,65,108,108,32,101,108,101,109,101,110,116,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32,96,73,110,100,101,120,96,32,97,110,100,32,117,112,119,97,114,100,115,32,97,114,101,32,112,117,115,104,101,100,32,111,110,101,32,115,116,101,112,10,104,105,103,104,101,114,32,105,110,32,116,104,101,32,110,101,119,32,116,117,112,108,101,32,96,84,117,112,108,101,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,44,32,110,101,119,41,46,10,123,111,110,101,44,110,101,119,44,116,119,111,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{3360,2},spec,{{insert_element,3},[{type,{3360,21},bounded_fun,[{type,{3360,21},'fun',[{type,{3360,21},product,[{var,{3360,22},'Index'},{var,{3360,29},'Tuple1'},{var,{3360,37},'Term'}]},{var,{3360,46},'Tuple2'}]},[{type,{3361,7},constraint,[{atom,{3361,7},is_subtype},[{var,{3361,7},'Index'},{type,{3361,17},pos_integer,[]}]]},{type,{3362,7},constraint,[{atom,{3362,7},is_subtype},[{var,{3362,7},'Tuple1'},{type,{3362,17},tuple,any}]]},{type,{3363,7},constraint,[{atom,{3363,7},is_subtype},[{var,{3363,7},'Tuple2'},{type,{3363,17},tuple,any}]]},{type,{3364,7},constraint,[{atom,{3364,7},is_subtype},[{var,{3364,7},'Term'},{type,{3364,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,hibernate,3},{3306,2},[<<104,105,98,101,114,110,97,116,101,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<80,117,116,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,110,116,111,32,97,32,119,97,105,116,32,115,116,97,116,101,32,119,104,101,114,101,32,105,116,115,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,10,114,101,100,117,99,101,100,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,101,120,112,101,99,116,32,116,111,10,114,101,99,101,105,118,101,32,97,110,121,32,109,101,115,115,97,103,101,115,32,115,111,111,110,46,10,10,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,105,116,44,32,97,110,100,32,99,111,110,116,114,111,108,32,114,101,115,117,109,101,115,32,105,110,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,96,32,119,105,116,104,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,65,114,103,115,96,32,119,105,116,104,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,10,101,109,112,116,105,101,100,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,32,119,104,101,110,32,116,104,97,116,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46,32,84,104,117,115,10,96,101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51,96,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46,32,84,104,101,32,114,101,115,117,109,101,32,102,117,110,99,116,105,111,110,10,96,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,40,96,65,114,105,116,121,96,32,61,58,61,10,91,96,108,101,110,103,116,104,40,65,114,103,115,41,96,93,40,96,108,101,110,103,116,104,47,49,96,41,41,46,10,10,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,110,121,32,109,101,115,115,97,103,101,32,105,110,32,105,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,44,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,10,105,109,109,101,100,105,97,116,101,108,121,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,10,10,73,110,32,109,111,114,101,32,116,101,99,104,110,105,99,97,108,32,116,101,114,109,115,44,32,96,101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51,96,32,100,105,115,99,97,114,100,115,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,102,111,114,32,116,104,101,10,112,114,111,99,101,115,115,44,32,97,110,100,32,116,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,112,114,111,99,101,115,115,46,32,65,102,116,101,114,32,116,104,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,105,110,10,111,110,101,32,99,111,110,116,105,110,117,111,117,115,32,104,101,97,112,46,32,84,104,101,32,104,101,97,112,32,105,115,32,116,104,101,110,32,115,104,114,117,110,107,101,110,32,116,111,32,116,104,101,32,101,120,97,99,116,32,115,97,109,101,32,115,105,122,101,32,97,115,32,116,104,101,10,108,105,118,101,32,100,97,116,97,32,116,104,97,116,32,105,116,32,104,111,108,100,115,32,40,101,118,101,110,32,105,102,32,116,104,97,116,32,115,105,122,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,10,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,41,46,10,10,73,102,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,10,116,104,101,32,102,105,114,115,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,99,99,117,114,114,105,110,103,32,97,102,116,101,114,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,101,110,115,117,114,101,115,10,116,104,97,116,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,105,115,32,99,104,97,110,103,101,100,32,116,111,32,97,32,115,105,122,101,32,110,111,116,32,115,109,97,108,108,101,114,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,101,109,112,116,121,105,110,103,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,109,101,97,110,115,32,116,104,97,116,32,97,110,121,32,115,117,114,114,111,117,110,100,105,110,103,32,96,99,97,116,99,104,96,32,105,115,10,114,101,109,111,118,101,100,32,97,110,100,32,109,117,115,116,32,98,101,32,114,101,45,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,104,105,98,101,114,110,97,116,105,111,110,46,32,79,110,101,32,101,102,102,101,99,116,32,111,102,32,116,104,105,115,32,105,115,32,116,104,97,116,10,112,114,111,99,101,115,115,101,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32,96,112,114,111,99,95,108,105,98,96,32,40,97,108,115,111,32,105,110,100,105,114,101,99,116,108,121,44,32,115,117,99,104,32,97,115,32,96,103,101,110,95,115,101,114,118,101,114,96,10,112,114,111,99,101,115,115,101,115,41,44,32,97,114,101,32,116,111,32,117,115,101,32,96,112,114,111,99,95,108,105,98,58,104,105,98,101,114,110,97,116,101,47,51,96,32,105,110,115,116,101,97,100,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,10,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,99,111,110,116,105,110,117,101,115,32,116,111,32,119,111,114,107,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,107,101,115,32,117,112,46>>},#{group => processes,specification => [{attribute,{3338,2},spec,{{hibernate,3},[{type,{3338,16},bounded_fun,[{type,{3338,16},'fun',[{type,{3338,16},product,[{var,{3338,17},'Module'},{var,{3338,25},'Function'},{var,{3338,35},'Args'}]},{type,{3338,44},no_return,[]}]},[{type,{3339,7},constraint,[{atom,{3339,7},is_subtype},[{var,{3339,7},'Module'},{type,{3339,17},module,[]}]]},{type,{3340,7},constraint,[{atom,{3340,7},is_subtype},[{var,{3340,7},'Function'},{type,{3340,19},atom,[]}]]},{type,{3341,7},constraint,[{atom,{3341,7},is_subtype},[{var,{3341,7},'Args'},{type,{3341,15},list,[{type,{3341,16},term,[]}]}]]}]]}]}}]}},{{function,has_prepared_code_on_load,1},{3299,2},[<<104,97,115,95,112,114,101,112,97,114,101,100,95,99,111,100,101,95,111,110,95,108,111,97,100,40,80,114,101,112,97,114,101,100,67,111,100,101,41>>],hidden,#{}},{{function,halt,2},{3190,2},[<<104,97,108,116,47,50>>],#{<<101,110>> => <<72,97,108,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,83,116,97,116,117,115,32,58,58,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,115,116,97,116,117,115,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,116,104,32,115,116,97,116,117,115,32,99,111,100,101,32,96,83,116,97,116,117,115,96,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,79,110,32,109,97,110,121,32,112,108,97,116,102,111,114,109,115,44,32,116,104,101,32,79,83,32,115,117,112,112,111,114,116,115,32,111,110,108,121,32,115,116,97,116,117,115,32,99,111,100,101,115,32,48,45,50,53,53,46,32,65,32,116,111,111,32,108,97,114,103,101,10,32,32,62,32,115,116,97,116,117,115,32,99,111,100,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,98,121,32,99,108,101,97,114,105,110,103,32,116,104,101,32,104,105,103,104,32,98,105,116,115,46,10,10,32,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,118,97,108,105,100,58,10,10,32,32,45,32,42,42,96,123,102,108,117,115,104,44,32,69,110,97,98,108,101,70,108,117,115,104,105,110,103,125,96,123,58,32,35,104,97,108,116,95,102,108,117,115,104,32,125,42,42,32,45,32,73,102,32,96,69,110,97,98,108,101,70,108,117,115,104,105,110,103,96,32,101,113,117,97,108,115,10,32,32,32,32,96,116,114,117,101,96,44,32,119,104,105,99,104,32,97,108,115,111,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,112,101,114,102,111,114,109,10,32,32,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,101,114,97,116,105,111,110,115,32,98,101,102,111,114,101,32,116,101,114,109,105,110,97,116,105,110,103,58,10,10,32,32,32,32,45,32,70,108,117,115,104,32,97,108,108,32,111,117,116,115,116,97,110,100,105,110,103,32,111,117,116,112,117,116,46,10,32,32,32,32,45,32,83,101,110,100,32,97,108,108,32,69,114,108,97,110,103,32,112,111,114,116,115,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,110,100,32,119,97,105,116,32,102,111,114,32,116,104,101,109,32,116,111,32,101,120,105,116,46,10,32,32,32,32,45,32,87,97,105,116,32,102,111,114,32,97,108,108,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,116,111,32,99,111,109,112,108,101,116,101,32,97,108,108,32,111,117,116,115,116,97,110,100,105,110,103,32,97,115,121,110,99,32,106,111,98,115,46,10,32,32,32,32,45,32,67,97,108,108,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,91,78,73,70,32,95,111,110,32,104,97,108,116,95,32,99,97,108,108,98,97,99,107,115,93,40,101,114,108,95,110,105,102,46,109,100,35,111,110,95,104,97,108,116,41,46,10,32,32,32,32,45,32,87,97,105,116,32,102,111,114,32,97,108,108,32,111,110,103,111,105,110,103,10,32,32,32,32,32,32,91,78,73,70,32,99,97,108,108,115,32,119,105,116,104,32,116,104,101,32,95,100,101,108,97,121,32,104,97,108,116,95,32,115,101,116,116,105,110,103,93,40,101,114,108,95,110,105,102,46,109,100,35,100,101,108,97,121,95,104,97,108,116,41,32,101,110,97,98,108,101,100,10,32,32,32,32,32,32,116,111,32,114,101,116,117,114,110,46,10,32,32,32,32,45,32,67,97,108,108,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,96,97,116,101,120,105,116,96,47,96,111,110,95,101,120,105,116,96,32,99,97,108,108,98,97,99,107,115,46,10,10,32,32,32,32,73,102,32,96,69,110,97,98,108,101,70,108,117,115,104,105,110,103,96,32,101,113,117,97,108,115,32,96,102,97,108,115,101,96,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,10,32,32,32,32,105,109,109,101,100,105,97,116,101,108,121,32,119,105,116,104,111,117,116,32,112,101,114,102,111,114,109,105,110,103,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,108,105,115,116,101,100,32,111,112,101,114,97,116,105,111,110,115,46,10,10,32,32,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,32,32,62,10,32,32,32,32,62,32,82,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,112,114,105,111,114,32,116,111,32,79,84,80,32,50,54,46,48,32,99,97,108,108,101,100,32,97,108,108,32,105,110,115,116,97,108,108,101,100,32,96,97,116,101,120,105,116,96,47,96,111,110,95,101,120,105,116,96,10,32,32,32,32,62,32,99,97,108,108,98,97,99,107,115,32,97,108,115,111,32,119,104,101,110,32,96,102,108,117,115,104,96,32,119,97,115,32,100,105,115,97,98,108,101,100,44,32,98,117,116,32,97,115,32,111,102,32,79,84,80,32,50,54,46,48,32,116,104,105,115,32,105,115,32,110,111,10,32,32,32,32,62,32,108,111,110,103,101,114,32,116,104,101,32,99,97,115,101,46,10,10,32,32,45,32,42,42,96,123,102,108,117,115,104,95,116,105,109,101,111,117,116,44,32,84,105,109,101,111,117,116,32,58,58,32,48,46,46,50,49,52,55,52,56,51,54,52,55,32,124,32,105,110,102,105,110,105,116,121,125,96,123,58,32,35,104,97,108,116,95,102,108,117,115,104,95,116,105,109,101,111,117,116,32,125,42,42,32,45,10,32,32,32,32,83,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,116,105,109,101,32,97,108,108,111,119,101,100,32,102,111,114,32,91,102,108,117,115,104,105,110,103,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,112,114,105,111,114,32,116,111,10,32,32,32,32,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,96,84,105,109,101,111,117,116,96,32,105,115,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,32,84,104,101,32,100,101,102,97,117,108,116,10,32,32,32,32,118,97,108,117,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,116,104,101,32,96,101,114,108,96,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,10,32,32,32,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,10,32,32,32,32,73,102,32,102,108,117,115,104,105,110,103,32,104,97,115,32,98,101,101,110,32,111,110,103,111,105,110,103,32,102,111,114,32,96,84,105,109,101,111,117,116,96,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,102,108,117,115,104,105,110,103,32,111,112,101,114,97,116,105,111,110,115,10,32,32,32,32,119,105,108,108,32,98,101,32,105,110,116,101,114,114,117,112,116,101,100,32,97,110,100,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,32,116,101,114,109,105,110,97,116,101,100,10,32,32,32,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,99,111,100,101,32,96,50,53,53,96,46,32,73,102,32,102,108,117,115,104,105,110,103,32,105,115,32,110,111,116,32,101,110,97,98,108,101,100,44,32,116,104,101,32,116,105,109,101,111,117,116,32,119,105,108,108,32,104,97,118,101,10,32,32,32,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,10,10,32,32,32,32,83,101,101,32,97,108,115,111,32,116,104,101,32,96,101,114,108,96,32,91,96,43,122,104,102,116,32,60,84,105,109,101,111,117,116,62,96,93,40,101,114,108,95,99,109,100,46,109,100,35,43,122,104,102,116,41,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,46,10,32,32,32,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,115,104,111,114,116,101,115,116,32,116,105,109,101,111,117,116,32,115,101,116,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,32,108,105,110,101,32,102,108,97,103,32,97,110,100,32,116,104,101,10,32,32,32,32,96,102,108,117,115,104,95,116,105,109,101,111,117,116,96,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,116,104,101,32,97,99,116,117,97,108,32,116,105,109,101,111,117,116,32,118,97,108,117,101,32,105,110,32,101,102,102,101,99,116,46,10,10,32,32,32,32,83,105,110,99,101,58,32,79,84,80,32,50,55,46,48,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,65,98,111,114,116,32,58,58,32,97,98,111,114,116,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,97,98,111,114,116,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,98,121,32,97,98,111,114,116,105,110,103,32,97,110,100,32,112,114,111,100,117,99,101,32,97,32,99,111,114,101,32,100,117,109,112,32,105,102,32,99,111,114,101,10,32,32,100,117,109,112,105,110,103,32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,116,104,97,116,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,10,32,32,101,120,101,99,117,116,105,110,103,32,105,110,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,91,96,123,102,108,117,115,104,44,32,98,111,111,108,101,97,110,40,41,125,96,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,44,32,97,110,100,10,32,32,62,32,102,108,117,115,104,105,110,103,32,119,105,108,108,32,98,101,32,100,105,115,97,98,108,101,100,46,10,10,45,32,96,96,96,101,114,108,97,110,103,10,32,32,104,97,108,116,40,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,32,58,58,32,115,116,114,105,110,103,40,41,44,32,79,112,116,105,111,110,115,32,58,58,32,104,97,108,116,95,111,112,116,105,111,110,115,40,41,41,10,32,32,96,96,96,10,32,32,123,58,32,35,104,97,108,116,95,99,114,97,115,104,95,100,117,109,112,95,50,32,125,10,10,32,32,72,97,108,116,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,32,103,101,110,101,114,97,116,101,32,97,110,10,32,32,91,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,93,40,99,114,97,115,104,95,100,117,109,112,46,109,100,41,46,32,84,104,101,32,115,116,114,105,110,103,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,119,105,108,108,32,98,101,32,117,115,101,100,10,32,32,97,115,32,115,108,111,103,97,110,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,32,99,114,101,97,116,101,100,46,32,84,104,101,32,115,108,111,103,97,110,32,119,105,108,108,32,98,101,32,116,114,117,110,107,97,116,101,100,32,105,102,10,32,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,49,48,50,51,32,99,104,97,114,97,99,116,101,114,115,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,91,96,123,102,108,117,115,104,44,32,98,111,111,108,101,97,110,40,41,125,96,93,40,35,104,97,108,116,95,102,108,117,115,104,41,32,111,112,116,105,111,110,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,44,32,97,110,100,10,32,32,62,32,102,108,117,115,104,105,110,103,32,119,105,108,108,32,98,101,32,100,105,115,97,98,108,101,100,46,10,10,32,32,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,66,101,104,97,118,105,111,114,32,99,104,97,110,103,101,115,32,99,111,109,112,97,114,101,100,32,116,111,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,58,10,32,32,62,10,32,32,62,32,45,32,66,101,102,111,114,101,32,79,84,80,32,50,52,46,50,44,32,116,104,101,32,115,108,111,103,97,110,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,105,102,32,96,67,114,97,115,104,68,117,109,112,83,108,111,103,97,110,96,32,119,97,115,32,108,111,110,103,101,114,10,32,32,62,32,32,32,116,104,97,110,32,50,48,48,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,119,32,105,116,32,119,105,108,108,32,98,101,32,116,114,117,110,99,97,116,101,100,32,105,102,32,108,111,110,103,101,114,32,116,104,97,110,32,49,48,50,51,10,32,32,62,32,32,32,99,104,97,114,97,99,116,101,114,115,46,10,32,32,62,32,45,32,66,101,102,111,114,101,32,79,84,80,32,50,48,46,49,44,32,111,110,108,121,32,99,111,100,101,32,112,111,105,110,116,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,45,50,53,53,32,119,101,114,101,32,97,99,99,101,112,116,101,100,32,105,110,32,116,104,101,10,32,32,62,32,32,32,115,108,111,103,97,110,46,32,78,111,119,32,97,110,121,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,32,105,115,32,118,97,108,105,100,46>>},#{group => system,specification => [{attribute,{3287,2},spec,{{halt,2},[{type,{3287,11},'fun',[{type,{3287,11},product,[{ann_type,{3287,12},[{var,{3287,12},'Status'},{type,{3287,22},non_neg_integer,[]}]},{ann_type,{3287,41},[{var,{3287,41},'Options'},{user_type,{3287,52},halt_options,[]}]}]},{type,{3288,11},no_return,[]}]},{type,{3289,11},'fun',[{type,{3289,11},product,[{ann_type,{3289,12},[{var,{3289,12},'Abort'},{atom,{3289,21},abort}]},{ann_type,{3289,28},[{var,{3289,28},'Options'},{user_type,{3289,39},halt_options,[]}]}]},{type,{3290,11},no_return,[]}]},{type,{3291,11},'fun',[{type,{3291,11},product,[{ann_type,{3291,12},[{var,{3291,12},'CrashDumpSlogan'},{type,{3291,31},string,[]}]},{ann_type,{3291,41},[{var,{3291,41},'Options'},{user_type,{3291,52},halt_options,[]}]}]},{type,{3292,11},no_return,[]}]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,halt,1},{3156,2},[<<104,97,108,116,40,72,97,108,116,84,121,112,101,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,104,97,108,116,40,72,97,108,116,84,121,112,101,44,32,91,93,41,96,93,40,96,104,97,108,116,47,50,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,97,108,116,40,49,55,41,46,10,111,115,95,112,114,111,109,112,116,37,32,101,99,104,111,32,36,63,10,49,55,10,111,115,95,112,114,111,109,112,116,37,10,96,96,96>>},#{group => system,specification => [{attribute,{3169,2},spec,{{halt,1},[{type,{3169,11},'fun',[{type,{3169,11},product,[{ann_type,{3169,12},[{var,{3169,12},'Status'},{type,{3169,22},non_neg_integer,[]}]}]},{type,{3170,11},no_return,[]}]},{type,{3171,11},'fun',[{type,{3171,11},product,[{ann_type,{3171,12},[{var,{3171,12},'Abort'},{atom,{3171,21},abort}]}]},{type,{3172,11},no_return,[]}]},{type,{3173,11},'fun',[{type,{3173,11},product,[{ann_type,{3173,12},[{var,{3173,12},'CrashDumpSlogan'},{type,{3173,31},string,[]}]}]},{type,{3174,11},no_return,[]}]}]}}]}},{{function,halt,0},{3139,2},[<<104,97,108,116,40,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,99,97,108,108,105,110,103,32,91,96,104,97,108,116,40,48,44,32,91,93,41,96,93,40,96,104,97,108,116,47,50,96,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,104,97,108,116,40,41,46,10,111,115,95,112,114,111,109,112,116,37,10,96,96,96>>},#{group => system,specification => [{attribute,{3150,2},spec,{{halt,0},[{type,{3150,11},'fun',[{type,{3150,11},product,[]},{type,{3150,17},no_return,[]}]}]}}]}},{{function,group_leader,2},{3095,2},[<<103,114,111,117,112,95,108,101,97,100,101,114,40,71,114,111,117,112,76,101,97,100,101,114,44,32,80,105,100,41>>],#{<<101,110>> => <<83,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,96,80,105,100,96,32,116,111,32,96,71,114,111,117,112,76,101,97,100,101,114,96,46,32,84,121,112,105,99,97,108,108,121,44,32,116,104,105,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,97,10,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,102,114,111,109,32,97,32,99,101,114,116,97,105,110,32,115,104,101,108,108,32,105,115,32,116,111,32,104,97,118,101,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,104,97,110,10,96,105,110,105,116,96,46,10,10,84,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,104,111,117,108,100,32,98,101,32,114,97,114,101,108,121,32,99,104,97,110,103,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,105,116,104,32,97,32,115,117,112,101,114,118,105,115,105,111,110,10,116,114,101,101,44,32,98,101,99,97,117,115,101,32,79,84,80,32,97,115,115,117,109,101,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,116,104,101,105,114,32,112,114,111,99,101,115,115,101,115,32,105,115,32,116,104,101,105,114,10,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46,10,10,83,101,116,116,105,110,103,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,10,91,80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,115,105,103,110,97,108,115,96,41,32,105,110,32,116,104,101,32,95,69,114,108,97,110,103,10,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,83,101,101,32,97,108,115,111,32,96,103,114,111,117,112,95,108,101,97,100,101,114,47,48,96,32,97,110,100,10,91,79,84,80,32,100,101,115,105,103,110,32,112,114,105,110,99,105,112,108,101,115,93,40,96,101,58,115,121,115,116,101,109,58,97,112,112,108,105,99,97,116,105,111,110,115,46,109,100,35,115,116,111,112,112,105,110,103,96,41,32,114,101,108,97,116,101,100,32,116,111,32,115,116,97,114,116,105,110,103,10,97,110,100,32,115,116,111,112,112,105,110,103,32,97,112,112,108,105,99,97,116,105,111,110,115,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{3119,2},spec,{{group_leader,2},[{type,{3119,19},bounded_fun,[{type,{3119,19},'fun',[{type,{3119,19},product,[{var,{3119,20},'GroupLeader'},{var,{3119,33},'Pid'}]},{atom,{3119,41},true}]},[{type,{3120,7},constraint,[{atom,{3120,7},is_subtype},[{var,{3120,7},'GroupLeader'},{type,{3120,22},pid,[]}]]},{type,{3121,7},constraint,[{atom,{3121,7},is_subtype},[{var,{3121,7},'Pid'},{type,{3121,14},pid,[]}]]}]]}]}}]}},{{function,group_leader,0},{3069,2},[<<103,114,111,117,112,95,108,101,97,100,101,114,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,101,118,97,108,117,97,116,105,110,103,10,116,104,101,32,102,117,110,99,116,105,111,110,46,10,10,69,118,101,114,121,32,112,114,111,99,101,115,115,32,105,115,32,97,32,109,101,109,98,101,114,32,111,102,32,115,111,109,101,32,112,114,111,99,101,115,115,32,103,114,111,117,112,32,97,110,100,32,97,108,108,32,103,114,111,117,112,115,32,104,97,118,101,32,97,32,95,103,114,111,117,112,10,108,101,97,100,101,114,95,46,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,103,114,111,117,112,32,105,115,32,99,104,97,110,110,101,108,101,100,32,116,111,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,46,32,87,104,101,110,32,97,32,110,101,119,10,112,114,111,99,101,115,115,32,105,115,32,115,112,97,119,110,101,100,44,32,105,116,32,103,101,116,115,32,116,104,101,32,115,97,109,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,115,32,116,104,101,32,115,112,97,119,110,105,110,103,32,112,114,111,99,101,115,115,46,10,10,73,110,105,116,105,97,108,108,121,44,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,44,32,96,105,110,105,116,96,32,105,115,32,98,111,116,104,32,105,116,115,32,111,119,110,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,110,100,32,116,104,101,32,103,114,111,117,112,10,108,101,97,100,101,114,32,111,102,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46,32,68,117,114,105,110,103,32,116,104,101,32,98,111,111,116,32,111,102,32,97,32,115,121,115,116,101,109,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,10,112,114,111,99,101,115,115,101,115,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,110,101,101,100,32,111,102,32,116,104,101,32,115,121,115,116,101,109,46,32,83,111,109,101,32,101,120,97,109,112,108,101,115,10,119,104,101,114,101,32,116,104,105,115,32,105,115,32,100,111,110,101,32,97,114,101,58,10,10,45,32,87,104,101,110,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,115,116,97,114,116,101,100,44,32,116,104,101,32,116,111,112,32,115,117,112,101,114,118,105,115,111,114,32,111,102,32,116,104,97,116,32,97,112,112,108,105,99,97,116,105,111,110,32,119,105,108,108,10,32,32,104,97,118,101,32,105,116,115,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,101,116,32,116,111,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46,32,83,101,101,32,96,97,112,112,108,105,99,97,116,105,111,110,58,115,116,97,114,116,47,50,96,10,32,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46,10,45,32,87,104,101,110,32,114,117,110,110,105,110,103,32,116,101,115,116,115,44,32,98,111,116,104,32,91,96,99,111,109,109,111,110,95,116,101,115,116,96,93,40,96,101,58,99,111,109,109,111,110,95,116,101,115,116,58,105,110,100,101,120,46,104,116,109,108,96,41,32,97,110,100,10,32,32,96,109,58,101,117,110,105,116,96,32,115,101,116,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,105,110,32,111,114,100,101,114,32,116,111,32,99,97,112,116,117,114,101,32,97,110,121,32,73,47,79,32,102,114,111,109,32,116,104,101,32,116,101,115,116,99,97,115,101,46,10,45,32,84,104,101,32,91,105,110,116,101,114,97,99,116,105,118,101,32,115,104,101,108,108,93,40,96,109,58,115,104,101,108,108,96,41,32,115,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,111,32,105,110,116,101,114,99,101,112,116,32,73,47,79,46>>},#{group => processes,specification => [{attribute,{3090,2},spec,{{group_leader,0},[{type,{3090,19},'fun',[{type,{3090,19},product,[]},{type,{3090,25},pid,[]}]}]}}]}},{{function,get_module_info,1},{3061,2},[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,40,77,111,100,117,108,101,41>>],hidden,#{}},{{function,get_keys,1},{3036,2},[<<103,101,116,95,107,101,121,115,40,86,97,108,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,107,101,121,115,32,116,104,97,116,32,97,114,101,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,10,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,109,97,114,121,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,104,97,100,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,97,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,108,105,116,116,108,101,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,100,111,103,44,32,123,49,44,32,51,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,49,44,32,50,125,41,44,10,103,101,116,95,107,101,121,115,40,123,49,44,32,50,125,41,46,10,91,109,97,114,121,44,104,97,100,44,97,44,108,105,116,116,108,101,44,108,97,109,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{3054,2},spec,{{get_keys,1},[{type,{3054,15},bounded_fun,[{type,{3054,15},'fun',[{type,{3054,15},product,[{var,{3054,16},'Val'}]},{type,{3054,24},list,[{var,{3054,25},'Key'}]}]},[{type,{3055,7},constraint,[{atom,{3055,7},is_subtype},[{var,{3055,7},'Val'},{type,{3055,14},term,[]}]]},{type,{3056,7},constraint,[{atom,{3056,7},is_subtype},[{var,{3056,7},'Key'},{type,{3056,14},term,[]}]]}]]}]}}]}},{{function,get_keys,0},{3014,2},[<<103,101,116,95,107,101,121,115,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,107,101,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,10,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,100,111,103,44,32,123,97,110,105,109,97,108,44,49,125,41,44,10,112,117,116,40,99,111,119,44,32,123,97,110,105,109,97,108,44,50,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,97,110,105,109,97,108,44,51,125,41,44,10,103,101,116,95,107,101,121,115,40,41,46,10,91,100,111,103,44,99,111,119,44,108,97,109,98,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{3030,2},spec,{{get_keys,0},[{type,{3030,15},bounded_fun,[{type,{3030,15},'fun',[{type,{3030,15},product,[]},{type,{3030,21},list,[{var,{3030,22},'Key'}]}]},[{type,{3031,7},constraint,[{atom,{3031,7},is_subtype},[{var,{3031,7},'Key'},{type,{3031,14},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,get,1},{2988,2},[<<103,101,116,40,75,101,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,111,114,10,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,96,75,101,121,96,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,84,104,101,32,101,120,112,101,99,116,101,100,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,41,46,10,123,97,114,101,44,112,108,97,121,105,110,103,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{3007,2},spec,{{get,1},[{type,{3007,10},bounded_fun,[{type,{3007,10},'fun',[{type,{3007,10},product,[{var,{3007,11},'Key'}]},{type,{3007,19},union,[{var,{3007,19},'Val'},{atom,{3007,25},undefined}]}]},[{type,{3008,7},constraint,[{atom,{3008,7},is_subtype},[{var,{3008,7},'Key'},{type,{3008,14},term,[]}]]},{type,{3009,7},constraint,[{atom,{3009,7},is_subtype},[{var,{3009,7},'Val'},{type,{3009,14},term,[]}]]}]]}]}}]}},{{function,get,0},{2966,2},[<<103,101,116,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,115,32,97,32,108,105,115,116,32,111,102,32,96,123,75,101,121,44,32,86,97,108,125,96,32,116,117,112,108,101,115,46,32,84,104,101,32,105,116,101,109,115,32,105,110,10,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,107,101,121,51,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,41,46,10,91,123,107,101,121,49,44,109,101,114,114,121,125,44,123,107,101,121,50,44,108,97,109,98,115,125,44,123,107,101,121,51,44,123,97,114,101,44,112,108,97,121,105,110,103,125,125,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{2981,2},spec,{{get,0},[{type,{2981,10},bounded_fun,[{type,{2981,10},'fun',[{type,{2981,10},product,[]},{type,{2981,16},list,[{type,{2981,17},tuple,[{var,{2981,18},'Key'},{var,{2981,23},'Val'}]}]}]},[{type,{2982,7},constraint,[{atom,{2982,7},is_subtype},[{var,{2982,7},'Key'},{type,{2982,14},term,[]}]]},{type,{2983,7},constraint,[{atom,{2983,7},is_subtype},[{var,{2983,7},'Val'},{type,{2983,14},term,[]}]]}]]}]}}]}},{{function,garbage_collect_message_area,0},{2960,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,95,109,101,115,115,97,103,101,95,97,114,101,97,40,41>>],hidden,#{}},{{function,garbage_collect,2},{2874,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,46,10,10,96,79,112,116,105,111,110,96,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125,96,42,42,32,45,32,84,104,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50,96,93,40,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50,96,41,32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,97,115,121,110,99,96,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,10,32,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,10,32,32,102,111,114,109,32,96,123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,44,32,82,101,113,117,101,115,116,73,100,44,32,71,67,82,101,115,117,108,116,125,96,46,10,10,45,32,42,42,96,123,116,121,112,101,44,32,39,109,97,106,111,114,39,32,124,32,39,109,105,110,111,114,39,125,96,42,42,32,45,32,84,114,105,103,103,101,114,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,114,101,113,117,101,115,116,101,100,10,32,32,116,121,112,101,46,32,68,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,96,39,109,97,106,111,114,39,96,44,32,119,104,105,99,104,32,119,111,117,108,100,32,116,114,105,103,103,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,71,67,46,32,84,104,101,10,32,32,111,112,116,105,111,110,32,96,39,109,105,110,111,114,39,96,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,104,105,110,116,32,97,110,100,32,109,97,121,32,108,101,97,100,32,116,111,32,101,105,116,104,101,114,32,109,105,110,111,114,32,111,114,32,109,97,106,111,114,32,71,67,10,32,32,114,117,110,46,10,10,73,102,32,96,80,105,100,96,32,101,113,117,97,108,115,32,96,115,101,108,102,47,48,96,44,32,97,110,100,32,110,111,32,96,97,115,121,110,99,96,32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,103,97,114,98,97,103,101,10,99,111,108,108,101,99,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,10,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48,96,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,110,100,32,119,105,108,108,32,98,101,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32,96,97,115,121,110,99,96,10,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32,96,71,67,82,101,115,117,108,116,96,32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,10,98,101,32,114,101,116,117,114,110,101,100,46,10,10,96,71,67,82,101,115,117,108,116,96,32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,114,101,113,117,101,115,116,32,97,115,10,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,104,97,115,32,98,101,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,78,111,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,10,32,32,98,121,32,96,80,105,100,96,32,116,101,114,109,105,110,97,116,101,100,32,98,101,102,111,114,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,111,117,108,100,32,98,101,32,115,97,116,105,115,102,105,101,100,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,99,97,118,101,97,116,115,32,97,112,112,108,121,32,97,115,32,102,111,114,32,96,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48,96,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{2915,2},spec,{{garbage_collect,2},[{type,{2915,22},bounded_fun,[{type,{2915,22},'fun',[{type,{2915,22},product,[{var,{2915,23},'Pid'},{var,{2915,28},'OptionList'}]},{type,{2915,43},union,[{var,{2915,43},'GCResult'},{atom,{2915,54},async}]}]},[{type,{2916,7},constraint,[{atom,{2916,7},is_subtype},[{var,{2916,7},'Pid'},{type,{2916,14},pid,[]}]]},{type,{2917,7},constraint,[{atom,{2917,7},is_subtype},[{var,{2917,7},'RequestId'},{type,{2917,20},term,[]}]]},{type,{2918,7},constraint,[{atom,{2918,7},is_subtype},[{var,{2918,7},'Option'},{type,{2918,17},union,[{type,{2918,17},tuple,[{atom,{2918,18},async},{var,{2918,25},'RequestId'}]},{type,{2918,38},tuple,[{atom,{2918,39},type},{type,{2918,45},union,[{atom,{2918,45},major},{atom,{2918,55},minor}]}]}]}]]},{type,{2919,7},constraint,[{atom,{2919,7},is_subtype},[{var,{2919,7},'OptionList'},{type,{2919,21},list,[{var,{2919,22},'Option'}]}]]},{type,{2920,7},constraint,[{atom,{2920,7},is_subtype},[{var,{2920,7},'GCResult'},{type,{2920,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,garbage_collect,1},{2861,1},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,41>>],none,#{group => processes,equiv => <<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,91,93,41>>}},{{function,garbage_collect,0},{2839,2},[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,41>>],#{<<101,110>> => <<70,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,101,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,46,10,10,84,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,117,110,108,101,115,115,32,105,116,32,104,97,115,32,98,101,101,110,32,110,111,116,105,99,101,100,32,40,111,114,32,116,104,101,114,101,32,97,114,101,32,103,111,111,100,10,114,101,97,115,111,110,115,32,116,111,32,115,117,115,112,101,99,116,41,32,116,104,97,116,32,116,104,101,32,115,112,111,110,116,97,110,101,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,105,108,108,32,111,99,99,117,114,32,116,111,111,32,108,97,116,101,10,111,114,32,110,111,116,32,97,116,32,97,108,108,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,73,109,112,114,111,112,101,114,32,117,115,101,32,99,97,110,32,115,101,114,105,111,117,115,108,121,32,100,101,103,114,97,100,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>},#{group => processes,specification => [{attribute,{2851,2},spec,{{garbage_collect,0},[{type,{2851,22},'fun',[{type,{2851,22},product,[]},{atom,{2851,28},true}]}]}}]}},{{function,function_exported,3},{2824,2},[<<102,117,110,99,116,105,111,110,95,101,120,112,111,114,116,101,100,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,96,77,111,100,117,108,101,96,32,105,115,10,91,99,117,114,114,101,110,116,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,32,97,110,100,32,99,111,110,116,97,105,110,115,32,97,110,32,101,120,112,111,114,116,101,100,10,102,117,110,99,116,105,111,110,32,96,70,117,110,99,116,105,111,110,47,65,114,105,116,121,96,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,66,73,70,32,40,97,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,109,112,108,101,109,101,110,116,101,100,10,105,110,32,67,41,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,110,97,109,101,44,32,111,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32,96,102,97,108,115,101,96,46>>},#{group => code,specification => [{attribute,{2831,2},spec,{{function_exported,3},[{type,{2831,24},bounded_fun,[{type,{2831,24},'fun',[{type,{2831,24},product,[{var,{2831,25},'Module'},{var,{2831,33},'Function'},{var,{2831,43},'Arity'}]},{type,{2831,53},boolean,[]}]},[{type,{2832,7},constraint,[{atom,{2832,7},is_subtype},[{var,{2832,7},'Module'},{type,{2832,17},module,[]}]]},{type,{2833,7},constraint,[{atom,{2833,7},is_subtype},[{var,{2833,7},'Function'},{type,{2833,19},atom,[]}]]},{type,{2834,7},constraint,[{atom,{2834,7},is_subtype},[{var,{2834,7},'Arity'},{type,{2834,16},arity,[]}]]}]]}]}}]}},{{function,fun_to_list,1},{2740,2},[<<102,117,110,95,116,111,95,108,105,115,116,40,70,117,110,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,83,116,114,105,110,103,96,32,116,104,97,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,96,70,117,110,96,46,10,10,96,83,116,114,105,110,103,96,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,44,32,105,102,32,96,70,117,110,96,32,119,97,115,32,99,114,101,97,116,101,100,32,98,121,32,97,10,91,102,117,110,32,101,120,112,114,101,115,115,105,111,110,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115,96,41,32,111,102,32,116,104,101,32,102,111,114,109,10,96,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,96,58,10,10,96,34,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,34,96,10,10,84,104,101,32,102,111,114,109,32,111,102,32,96,83,116,114,105,110,103,96,32,119,104,101,110,32,96,70,117,110,96,32,105,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,111,116,104,101,114,32,116,121,112,101,115,32,111,102,10,91,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,93,40,96,101,58,115,121,115,116,101,109,58,101,120,112,114,101,115,115,105,111,110,115,46,109,100,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115,96,41,32,100,105,102,102,101,114,115,32,100,101,112,101,110,100,105,110,103,10,111,110,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,111,114,32,105,102,32,116,104,101,10,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,40,117,110,99,111,109,112,105,108,101,100,10,101,115,99,114,105,112,116,115,44,32,116,104,101,32,69,114,108,97,110,103,32,115,104,101,108,108,44,32,97,110,100,32,111,116,104,101,114,32,99,111,100,101,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,101,114,108,95,101,118,97,108,32,109,111,100,117,108,101,41,58,10,10,45,32,42,42,99,111,109,112,105,108,101,100,32,99,111,100,101,42,42,32,45,32,96,34,35,70,117,110,60,77,46,73,46,85,62,34,96,44,32,119,104,101,114,101,32,77,44,32,73,32,97,110,100,32,85,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32,118,97,108,117,101,115,10,32,32,110,97,109,101,100,32,96,109,111,100,117,108,101,96,44,32,96,105,110,100,101,120,96,32,97,110,100,32,96,117,110,105,113,96,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,10,32,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,40,70,117,110,41,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,46,10,10,45,32,42,42,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,42,42,32,45,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,10,32,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,10,32,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,71,101,110,101,114,97,108,108,121,44,32,111,110,101,32,99,97,110,32,110,111,116,32,117,115,101,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,99,104,101,99,107,32,105,102,32,116,119,111,10,62,32,102,117,110,115,32,97,114,101,32,101,113,117,97,108,32,97,115,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,100,111,101,115,32,110,111,116,32,116,97,107,101,32,116,104,101,32,102,117,110,39,115,10,62,32,101,110,118,105,114,111,110,109,101,110,116,32,105,110,116,111,32,97,99,99,111,117,110,116,46,32,83,101,101,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,32,102,111,114,32,104,111,119,32,116,111,10,62,32,103,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,97,32,102,117,110,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,111,117,116,112,117,116,32,111,102,32,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,69,114,108,97,110,103,10,62,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,97,110,100,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,97,100,100,47,49,44,32,97,100,100,50,47,48,44,32,102,117,110,95,116,117,112,108,101,47,48,93,41,46,10,97,100,100,40,65,41,32,45,62,32,102,117,110,40,66,41,32,45,62,32,65,32,43,32,66,32,101,110,100,46,10,97,100,100,50,40,41,32,45,62,32,102,117,110,32,97,100,100,47,49,46,10,102,117,110,95,116,117,112,108,101,40,41,32,45,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,32,116,101,115,116,58,97,100,100,50,40,41,125,46,10,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,35,70,117,110,60,116,101,115,116,46,49,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,96,102,117,110,32,116,101,115,116,58,97,100,100,47,49,96,32,105,115,32,117,112,103,114,97,100,97,98,108,101,32,98,117,116,32,96,116,101,115,116,58,97,100,100,50,40,41,96,32,105,115,32,110,111,116,32,117,112,103,114,97,100,97,98,108,101,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,116,101,115,116,58,97,100,100,40,49,41,44,32,116,101,115,116,58,97,100,100,40,52,50,41,125,46,10,123,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,96,116,101,115,116,58,97,100,100,40,49,41,96,32,97,110,100,32,96,116,101,115,116,58,97,100,100,40,52,50,41,96,32,104,97,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,97,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,105,115,32,110,111,116,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,46,10,10,96,96,96,101,114,108,97,110,103,10,62,116,101,115,116,58,102,117,110,95,116,117,112,108,101,40,41,46,10,123,35,70,117,110,60,116,101,115,116,46,50,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,51,46,49,48,55,55,51,56,57,56,51,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,84,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,100,105,102,102,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,102,117,110,115,32,99,111,109,101,32,102,114,111,109,10,100,105,102,102,101,114,101,110,116,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,32,62,10,123,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,44,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,125,10,96,96,96,10,10,69,120,112,108,97,110,97,116,105,111,110,58,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,105,115,32,102,111,114,109,32,105,110,32,117,110,99,111,109,112,105,108,101,100,10,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,10,91,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,93,40,96,102,117,110,95,116,111,95,108,105,115,116,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{2818,2},spec,{{fun_to_list,1},[{type,{2818,18},bounded_fun,[{type,{2818,18},'fun',[{type,{2818,18},product,[{var,{2818,19},'Fun'}]},{ann_type,{2818,27},[{var,{2818,27},'String'},{type,{2818,37},string,[]}]}]},[{type,{2819,7},constraint,[{atom,{2819,7},is_subtype},[{var,{2819,7},'Fun'},{type,{2819,14},function,[]}]]}]]}]}}]}},{{function,fun_info_mfa,1},{2730,2},[<<102,117,110,95,105,110,102,111,95,109,102,97,40,70,117,110,41>>],hidden,#{}},{{function,fun_info,2},{2708,2},[<<102,117,110,95,105,110,102,111,40,70,117,110,44,32,73,116,101,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,96,70,117,110,96,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,73,116,101,109,96,44,32,105,110,32,116,104,101,32,102,111,114,109,10,96,123,73,116,101,109,44,73,110,102,111,125,96,46,10,10,70,111,114,32,97,110,121,32,102,117,110,44,32,96,73,116,101,109,96,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32,96,109,111,100,117,108,101,96,44,32,96,110,97,109,101,96,44,32,96,97,114,105,116,121,96,44,32,96,101,110,118,96,44,32,111,114,10,96,116,121,112,101,96,46,10,10,70,111,114,32,97,32,108,111,99,97,108,32,102,117,110,44,32,96,73,116,101,109,96,32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32,96,105,110,100,101,120,96,44,32,96,110,101,119,95,105,110,100,101,120,96,44,10,96,110,101,119,95,117,110,105,113,96,44,32,96,117,110,105,113,96,44,32,97,110,100,32,96,112,105,100,96,46,32,70,111,114,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,97,110,121,32,111,102,32,116,104,101,115,101,10,105,116,101,109,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,97,116,111,109,32,96,117,110,100,101,102,105,110,101,100,96,46,10,10,83,101,101,32,91,96,101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49,96,93,40,96,102,117,110,95,105,110,102,111,47,49,96,41,46>>},#{group => terms,specification => [{attribute,{2722,2},spec,{{fun_info,2},[{type,{2722,15},bounded_fun,[{type,{2722,15},'fun',[{type,{2722,15},product,[{var,{2722,16},'Fun'},{var,{2722,21},'Item'}]},{type,{2722,30},tuple,[{var,{2722,31},'Item'},{var,{2722,37},'Info'}]}]},[{type,{2723,7},constraint,[{atom,{2723,7},is_subtype},[{var,{2723,7},'Fun'},{type,{2723,14},function,[]}]]},{type,{2724,7},constraint,[{atom,{2724,7},is_subtype},[{var,{2724,7},'Item'},{user_type,{2724,15},fun_info_item,[]}]]},{type,{2725,7},constraint,[{atom,{2725,7},is_subtype},[{var,{2725,7},'Info'},{type,{2725,15},term,[]}]]}]]}]}}]}},{{function,floor,1},{2690,2},[<<102,108,111,111,114,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,111,114,40,45,49,48,46,53,41,46,10,45,49,49,10,96,96,96>>},#{group => terms,specification => [{attribute,{2702,2},spec,{{floor,1},[{type,{2702,12},bounded_fun,[{type,{2702,12},'fun',[{type,{2702,12},product,[{var,{2702,13},'Number'}]},{type,{2702,24},integer,[]}]},[{type,{2703,7},constraint,[{atom,{2703,7},is_subtype},[{var,{2703,7},'Number'},{type,{2703,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,float_to_list,2},{2633,2},[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,70,108,111,97,116,96,32,117,115,105,110,103,32,102,105,120,101,100,10,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,10,10,65,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58,10,10,45,32,73,102,32,111,112,116,105,111,110,32,96,100,101,99,105,109,97,108,115,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,99,111,110,116,97,105,110,115,32,97,116,32,109,111,115,116,10,32,32,96,68,101,99,105,109,97,108,115,96,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,112,97,115,116,32,116,104,101,32,100,101,99,105,109,97,108,32,112,111,105,110,116,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,100,111,101,115,32,110,111,116,32,102,105,116,10,32,32,105,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,115,116,97,116,105,99,32,98,117,102,102,101,114,32,111,102,32,50,53,54,32,98,121,116,101,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,114,111,119,115,32,96,98,97,100,97,114,103,96,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,99,111,109,112,97,99,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,116,114,97,105,108,105,110,103,32,122,101,114,111,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,108,105,115,116,10,32,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,109,101,97,110,105,110,103,102,117,108,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,111,112,116,105,111,110,32,96,100,101,99,105,109,97,108,115,96,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,115,99,105,101,110,116,105,102,105,99,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,10,32,32,110,111,116,97,116,105,111,110,32,119,105,116,104,32,96,68,101,99,105,109,97,108,115,96,32,100,105,103,105,116,115,32,111,102,32,112,114,101,99,105,115,105,111,110,46,10,45,32,73,102,32,111,112,116,105,111,110,32,96,115,104,111,114,116,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,32,116,104,101,32,115,109,97,108,108,101,115,116,10,32,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,97,116,32,115,116,105,108,108,32,103,117,97,114,97,110,116,101,101,115,32,116,104,97,116,10,32,32,96,70,32,61,58,61,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,44,32,91,115,104,111,114,116,93,41,41,96,46,32,87,104,101,110,32,116,104,101,32,102,108,111,97,116,32,105,115,32,105,110,115,105,100,101,32,116,104,101,10,32,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,44,32,116,104,101,32,110,111,116,97,116,105,111,110,32,116,104,97,116,32,121,105,101,108,100,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,32,32,105,115,32,117,115,101,100,32,40,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,111,114,32,110,111,114,109,97,108,32,100,101,99,105,109,97,108,32,110,111,116,97,116,105,111,110,41,46,32,70,108,111,97,116,115,32,111,117,116,115,105,100,101,32,116,104,101,10,32,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,32,97,114,101,32,97,108,119,97,121,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,116,111,32,97,118,111,105,100,10,32,32,99,111,110,102,117,115,105,110,103,32,114,101,115,117,108,116,115,32,119,104,101,110,32,100,111,105,110,103,32,97,114,105,116,104,109,101,116,105,99,32,111,112,101,114,97,116,105,111,110,115,46,10,45,32,73,102,32,96,79,112,116,105,111,110,115,96,32,105,115,32,96,91,93,96,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,97,115,32,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,34,55,46,49,50,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,34,55,46,49,50,48,101,43,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,10,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,10,96,96,96,10,10,73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32,91,96,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,96,93,40,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49,96,41,32,101,118,97,108,117,97,116,101,115,32,116,111,10,96,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,96,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,120,112,108,97,105,110,101,100,32,105,110,10,91,82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109,96,41,46>>},#{group => terms,specification => [{attribute,{2678,2},spec,{{float_to_list,2},[{type,{2678,20},bounded_fun,[{type,{2678,20},'fun',[{type,{2678,20},product,[{var,{2678,21},'Float'},{var,{2678,28},'Options'}]},{type,{2678,40},string,[]}]},[{type,{2679,7},constraint,[{atom,{2679,7},is_subtype},[{var,{2679,7},'Float'},{type,{2679,16},float,[]}]]},{type,{2680,7},constraint,[{atom,{2680,7},is_subtype},[{var,{2680,7},'Options'},{type,{2680,18},list,[{var,{2680,19},'Option'}]}]]},{type,{2681,7},constraint,[{atom,{2681,7},is_subtype},[{var,{2681,7},'Option'},{type,{2681,18},union,[{type,{2681,18},tuple,[{atom,{2681,19},decimals},{ann_type,{2681,29},[{var,{2681,29},'Decimals'},{type,{2681,41},range,[{integer,{2681,41},0},{integer,{2681,44},253}]}]}]},{type,{2682,18},tuple,[{atom,{2682,19},scientific},{ann_type,{2682,31},[{var,{2682,31},'Decimals'},{type,{2682,43},range,[{integer,{2682,43},0},{integer,{2682,46},249}]}]}]},{atom,{2683,18},compact},{atom,{2684,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_list,1},{2629,1},[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,41>>],none,#{group => terms,equiv => <<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,50,48,125,93,41>>}},{{function,float_to_binary,2},{2589,2},[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,70,108,111,97,116,96,32,117,115,105,110,103,32,102,105,120,101,100,10,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,10,10,96,79,112,116,105,111,110,115,96,32,98,101,104,97,118,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,96,102,108,111,97,116,95,116,111,95,108,105,115,116,47,50,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,60,60,34,55,46,49,50,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,60,60,34,55,46,49,50,48,101,43,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,41,10,60,60,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{2614,2},spec,{{float_to_binary,2},[{type,{2614,22},bounded_fun,[{type,{2614,22},'fun',[{type,{2614,22},product,[{var,{2614,23},'Float'},{var,{2614,30},'Options'}]},{type,{2614,42},binary,[]}]},[{type,{2615,7},constraint,[{atom,{2615,7},is_subtype},[{var,{2615,7},'Float'},{type,{2615,16},float,[]}]]},{type,{2616,7},constraint,[{atom,{2616,7},is_subtype},[{var,{2616,7},'Options'},{type,{2616,18},list,[{var,{2616,19},'Option'}]}]]},{type,{2617,7},constraint,[{atom,{2617,7},is_subtype},[{var,{2617,7},'Option'},{type,{2617,18},union,[{type,{2617,18},tuple,[{atom,{2617,19},decimals},{ann_type,{2617,29},[{var,{2617,29},'Decimals'},{type,{2617,41},range,[{integer,{2617,41},0},{integer,{2617,44},253}]}]}]},{type,{2618,18},tuple,[{atom,{2618,19},scientific},{ann_type,{2618,31},[{var,{2618,31},'Decimals'},{type,{2618,43},range,[{integer,{2618,43},0},{integer,{2618,46},249}]}]}]},{atom,{2619,18},compact},{atom,{2620,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_binary,1},{2585,1},[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,41>>],none,#{group => terms,equiv => <<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,50,48,125,93,41>>,since => <<79,84,80,32,82,49,54,66>>}},{{function,float,1},{2555,2},[<<102,108,111,97,116,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,102,108,111,97,116,32,98,121,32,99,111,110,118,101,114,116,105,110,103,32,96,78,117,109,98,101,114,96,32,116,111,32,97,32,102,108,111,97,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,102,108,111,97,116,40,53,53,41,46,10,53,53,46,48,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,117,115,101,100,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,105,110,32,97,32,103,117,97,114,100,44,32,105,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,10,62,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,59,32,102,111,114,32,99,108,97,114,105,116,121,44,32,117,115,101,32,96,105,115,95,102,108,111,97,116,47,49,96,32,105,110,115,116,101,97,100,46,10,62,10,62,32,87,104,101,110,32,91,96,102,108,111,97,116,47,49,96,93,40,96,102,108,111,97,116,47,49,96,41,32,105,115,32,117,115,101,100,32,105,110,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,97,32,103,117,97,114,100,44,32,115,117,99,104,32,97,115,10,62,32,39,96,102,108,111,97,116,40,65,41,32,61,61,32,52,46,48,96,39,44,32,105,116,32,99,111,110,118,101,114,116,115,32,97,32,110,117,109,98,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>},#{group => terms,specification => [{attribute,{2574,2},spec,{{float,1},[{type,{2574,12},bounded_fun,[{type,{2574,12},'fun',[{type,{2574,12},product,[{var,{2574,13},'Number'}]},{type,{2574,24},float,[]}]},[{type,{2575,7},constraint,[{atom,{2575,7},is_subtype},[{var,{2575,7},'Number'},{type,{2575,17},number,[]}]]}]]}]}}]}},{{function,finish_after_on_load,2},{2546,2},[<<102,105,110,105,115,104,95,97,102,116,101,114,95,111,110,95,108,111,97,100,40,80,49,44,32,80,50,41>>],hidden,#{}},{{function,finish_loading,1},{2536,2},[<<102,105,110,105,115,104,95,108,111,97,100,105,110,103,40,80,114,101,112,97,114,101,100,67,111,100,101,76,105,115,116,41>>],hidden,#{}},{{function,external_size,2},{2507,2},[<<101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,10,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101,10,96,96,96,10,10,79,112,116,105,111,110,32,96,123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125,96,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,102,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,46,32,70,111,114,32,97,10,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,44,32,115,101,101,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50,96,46>>},#{group => terms,specification => [{attribute,{2525,2},spec,{{external_size,2},[{type,{2525,20},bounded_fun,[{type,{2525,20},'fun',[{type,{2525,20},product,[{var,{2525,21},'Term'},{var,{2525,27},'Options'}]},{type,{2525,39},non_neg_integer,[]}]},[{type,{2526,7},constraint,[{atom,{2526,7},is_subtype},[{var,{2526,7},'Term'},{type,{2526,15},term,[]}]]},{type,{2527,7},constraint,[{atom,{2527,7},is_subtype},[{var,{2527,7},'Options'},{type,{2527,18},list,[{type,{2527,19},union,[{atom,{2527,19},compressed},{type,{2528,10},tuple,[{atom,{2528,11},compressed},{ann_type,{2528,23},[{var,{2528,23},'Level'},{type,{2528,32},range,[{integer,{2528,32},0},{integer,{2528,35},9}]}]}]},{atom,{2529,10},deterministic},{type,{2530,10},tuple,[{atom,{2530,11},minor_version},{ann_type,{2530,26},[{var,{2530,26},'Version'},{type,{2530,37},range,[{integer,{2530,37},0},{integer,{2530,40},2}]}]}]},{atom,{2531,10},local}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,external_size,1},{2480,2},[<<101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41>>],#{<<101,110>> => <<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,10,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101,10,96,96,96,10,10,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,97,32,99,97,108,108,32,116,111,58,10,10,96,96,96,101,114,108,97,110,103,10,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,91,93,41,10,96,96,96>>},#{group => terms,specification => [{attribute,{2501,2},spec,{{external_size,1},[{type,{2501,20},bounded_fun,[{type,{2501,20},'fun',[{type,{2501,20},product,[{var,{2501,21},'Term'}]},{type,{2501,30},non_neg_integer,[]}]},[{type,{2502,7},constraint,[{atom,{2502,7},is_subtype},[{var,{2502,7},'Term'},{type,{2502,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,exit_signal,2},{2472,2},[<<101,120,105,116,95,115,105,103,110,97,108,40,80,105,100,44,32,82,101,97,115,111,110,41>>],hidden,#{}},{{function,exit,2},{2402,2},[<<101,120,105,116,40,80,105,100,44,32,82,101,97,115,111,110,41>>],#{<<101,110>> => <<83,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,10,98,121,32,96,80,105,100,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32,96,82,101,97,115,111,110,96,32,105,115,32,97,110,121,32,116,101,114,109,44,32,101,120,99,101,112,116,32,96,110,111,114,109,97,108,96,32,111,114,10,96,107,105,108,108,96,44,32,97,110,100,32,96,80,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,58,10,10,45,32,73,102,32,96,80,96,32,105,115,32,110,111,116,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,96,80,96,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,10,32,32,96,82,101,97,115,111,110,96,46,10,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,10,32,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,96,80,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,116,101,114,109,32,96,110,111,114,109,97,108,96,32,97,110,100,32,96,80,105,100,96,32,105,115,32,116,104,101,10,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,96,80,96,32,119,104,105,99,104,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,110,118,111,107,101,100,10,96,101,114,108,97,110,103,58,101,120,105,116,40,80,105,100,44,32,110,111,114,109,97,108,41,96,32,40,116,104,101,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,32,115,105,103,110,97,108,32,119,105,116,104,32,116,104,101,10,96,110,111,114,109,97,108,96,32,114,101,97,115,111,110,32,116,111,32,105,116,115,101,108,102,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,119,97,114,110,105,110,103,41,58,10,10,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,96,39,115,10,32,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,45,32,84,104,101,32,115,105,103,110,97,108,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,102,32,96,80,96,32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46,10,10,73,102,32,96,82,101,97,115,111,110,96,32,105,115,32,116,104,101,32,97,116,111,109,32,96,107,105,108,108,96,44,32,116,104,97,116,32,105,115,44,32,105,102,32,91,96,101,120,105,116,40,80,105,100,44,32,107,105,108,108,41,96,93,40,96,101,120,105,116,47,50,96,41,32,105,115,10,99,97,108,108,101,100,44,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,10,96,80,105,100,96,44,32,119,104,105,99,104,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,101,100,96,46,32,84,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,10,99,104,97,110,103,101,100,32,102,114,111,109,32,96,107,105,108,108,96,32,116,111,32,96,107,105,108,108,101,100,96,32,116,111,32,104,105,110,116,32,116,111,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,107,105,108,108,101,100,10,112,114,111,99,101,115,115,32,103,111,116,32,107,105,108,108,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32,91,96,101,120,105,116,40,80,105,100,44,32,107,105,108,108,41,96,93,40,96,101,120,105,116,47,50,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,117,110,99,116,105,111,110,115,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,93,40,96,101,120,105,116,47,49,96,41,32,97,110,100,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,93,40,96,101,120,105,116,47,50,96,41,32,97,114,101,10,62,32,110,97,109,101,100,32,115,105,109,105,108,97,114,108,121,32,98,117,116,32,112,114,111,118,105,100,101,32,118,101,114,121,32,100,105,102,102,101,114,101,110,116,32,102,117,110,99,116,105,111,110,97,108,105,116,105,101,115,46,32,84,104,101,10,62,32,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,32,102,117,110,99,116,105,111,110,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,116,111,112,32,116,104,101,32,99,117,114,114,101,110,116,10,62,32,112,114,111,99,101,115,115,32,119,104,105,108,101,32,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,101,110,100,32,97,110,10,62,32,101,120,105,116,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,101,32,97,108,115,111,32,116,104,97,116,32,96,101,114,108,97,110,103,58,101,120,105,116,47,49,96,32,114,97,105,115,101,115,32,97,110,10,62,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,104,105,108,101,32,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,97,110,121,10,62,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,101,32,111,110,108,121,32,115,99,101,110,97,114,105,111,32,116,104,97,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,99,111,118,101,114,101,100,32,98,121,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,97,98,111,118,101,32,105,115,32,119,104,101,110,32,97,10,62,32,112,114,111,99,101,115,115,32,96,80,96,32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,116,111,32,105,116,115,101,108,102,44,32,116,104,97,116,32,105,115,10,62,32,96,101,114,108,97,110,103,58,101,120,105,116,40,115,101,108,102,40,41,44,32,110,111,114,109,97,108,41,96,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,10,62,10,62,32,45,32,73,102,32,96,80,96,32,105,115,32,91,116,114,97,112,112,105,110,103,32,101,120,105,116,115,93,40,96,112,114,111,99,101,115,115,95,102,108,97,103,47,50,96,41,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,10,62,32,32,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32,96,123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125,96,44,32,119,104,101,114,101,32,96,70,114,111,109,96,32,105,115,32,96,80,96,39,115,32,112,114,111,99,101,115,115,10,62,32,32,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,96,80,96,39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,62,32,45,32,96,80,96,32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,105,102,32,96,80,96,32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,10,62,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32,96,110,111,114,109,97,108,96,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,97,114,103,117,97,98,108,121,10,62,32,115,116,114,97,110,103,101,32,98,117,116,32,116,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,114,101,97,115,111,110,115,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2465,2},spec,{{exit,2},[{type,{2465,11},bounded_fun,[{type,{2465,11},'fun',[{type,{2465,11},product,[{var,{2465,12},'Pid'},{var,{2465,17},'Reason'}]},{atom,{2465,28},true}]},[{type,{2466,7},constraint,[{atom,{2466,7},is_subtype},[{var,{2466,7},'Pid'},{type,{2466,14},union,[{type,{2466,14},pid,[]},{type,{2466,22},port,[]}]}]]},{type,{2467,7},constraint,[{atom,{2467,7},is_subtype},[{var,{2467,7},'Reason'},{type,{2467,17},term,[]}]]}]]}]}}]}},{{function,exit,1},{2361,2},[<<101,120,105,116,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,120,105,116,96,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,120,105,116,96,32,105,115,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,104,111,117,108,100,32,98,101,10,115,116,111,112,112,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,116,101,108,108,105,110,103,32,97,32,112,114,111,99,101,115,115,32,116,111,32,115,116,111,112,32,105,115,32,114,101,99,101,105,118,101,100,41,46,10,10,84,104,105,115,32,102,117,110,99,116,105,111,110,32,100,105,102,102,101,114,32,102,114,111,109,32,91,96,101,114,114,111,114,47,49,44,50,44,51,96,93,40,96,101,114,114,111,114,47,49,96,41,32,98,121,32,99,97,117,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,10,97,32,100,105,102,102,101,114,101,110,116,32,99,108,97,115,115,32,97,110,100,32,98,121,32,104,97,118,105,110,103,32,97,32,114,101,97,115,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,108,105,115,116,32,111,102,10,102,117,110,99,116,105,111,110,115,32,102,114,111,109,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,46,10,10,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,10,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,120,105,116,58,32,102,111,111,98,97,114,10,62,32,99,97,116,99,104,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,102,111,111,98,97,114,125,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,102,32,97,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32,91,96,101,120,105,116,40,107,105,108,108,41,96,93,40,96,101,120,105,116,47,49,96,41,32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,116,99,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,44,10,62,32,105,116,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,97,110,100,32,97,108,115,111,32,101,109,105,116,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,10,62,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,40,110,111,116,32,96,107,105,108,108,101,100,96,41,32,116,111,32,97,108,108,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,83,117,99,104,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,10,62,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,99,97,110,32,98,101,32,116,114,97,112,112,101,100,32,98,121,32,116,104,101,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,10,62,32,109,101,97,110,115,32,116,104,97,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32,96,107,105,108,108,96,32,98,101,104,97,118,101,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,10,62,32,116,104,101,121,32,97,114,101,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,105,103,110,97,108,32,119,105,108,108,32,98,101,32,117,110,116,114,97,112,112,97,98,108,101,32,105,102,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,115,117,99,104,32,97,10,62,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,119,105,116,104,32,91,96,101,114,108,97,110,103,58,101,120,105,116,47,50,96,93,40,96,101,120,105,116,47,50,96,41,46>>},#{group => processes,specification => [{attribute,{2396,2},spec,{{exit,1},[{type,{2396,11},bounded_fun,[{type,{2396,11},'fun',[{type,{2396,11},product,[{var,{2396,12},'Reason'}]},{type,{2396,23},no_return,[]}]},[{type,{2397,7},constraint,[{atom,{2397,7},is_subtype},[{var,{2397,7},'Reason'},{type,{2397,17},term,[]}]]}]]}]}}]}},{{function,error,3},{2321,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,32,96,65,114,103,115,96,32,105,115,10,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,10,96,110,111,110,101,96,46,10,10,73,102,32,96,65,114,103,115,96,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32,96,110,111,110,101,96,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,10,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,73,102,32,116,104,101,32,96,101,114,114,111,114,95,105,110,102,111,96,32,111,112,116,105,111,110,32,105,115,32,103,105,118,101,110,44,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,119,105,108,108,32,98,101,32,105,110,115,101,114,116,101,100,32,105,110,116,111,10,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,103,105,118,101,110,32,105,110,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,98,121,10,101,114,114,111,114,32,102,111,114,109,97,116,116,101,114,115,32,115,117,99,104,32,97,115,32,91,96,101,114,108,95,101,114,114,111,114,96,93,40,96,101,114,108,95,101,114,114,111,114,58,102,111,114,109,97,116,95,101,120,99,101,112,116,105,111,110,47,52,96,41,32,116,111,10,112,114,111,118,105,100,101,32,109,111,114,101,32,99,111,110,116,101,120,116,32,97,114,111,117,110,100,32,97,110,32,101,114,114,111,114,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,96,109,111,100,117,108,101,96,32,111,102,32,116,104,101,32,96,69,114,114,111,114,73,110,102,111,77,97,112,96,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,32,116,111,10,96,101,114,114,111,114,47,51,96,32,105,115,32,109,97,100,101,46,32,84,104,101,32,100,101,102,97,117,108,116,32,96,102,117,110,99,116,105,111,110,96,32,105,115,32,96,102,111,114,109,97,116,95,101,114,114,111,114,96,46,32,83,101,101,10,91,96,102,111,114,109,97,116,95,101,114,114,111,114,47,50,96,93,40,96,99,58,101,114,108,95,101,114,114,111,114,58,102,111,114,109,97,116,95,101,114,114,111,114,47,50,96,41,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,105,115,10,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,50,32,105,115,32,116,111,32,98,101,32,117,115,101,100,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>},#{group => processes,specification => [{attribute,{2348,2},spec,{{error,3},[{type,{2348,12},bounded_fun,[{type,{2348,12},'fun',[{type,{2348,12},product,[{var,{2348,13},'Reason'},{var,{2348,21},'Args'},{var,{2348,27},'Options'}]},{type,{2348,39},no_return,[]}]},[{type,{2349,7},constraint,[{atom,{2349,7},is_subtype},[{var,{2349,7},'Reason'},{type,{2349,17},term,[]}]]},{type,{2350,7},constraint,[{atom,{2350,7},is_subtype},[{var,{2350,7},'Args'},{type,{2350,15},union,[{type,{2350,15},list,[{type,{2350,16},term,[]}]},{atom,{2350,26},none}]}]]},{type,{2351,7},constraint,[{atom,{2351,7},is_subtype},[{var,{2351,7},'Options'},{type,{2351,18},list,[{var,{2351,19},'Option'}]}]]},{type,{2352,7},constraint,[{atom,{2352,7},is_subtype},[{var,{2352,7},'Option'},{type,{2352,17},tuple,[{atom,{2352,18},error_info},{var,{2352,32},'ErrorInfoMap'}]}]]},{type,{2353,7},constraint,[{atom,{2353,7},is_subtype},[{var,{2353,7},'ErrorInfoMap'},{type,{2353,23},map,[{type,{2353,33},map_field_assoc,[{atom,{2353,25},cause},{type,{2353,36},term,[]}]},{type,{2354,34},map_field_assoc,[{atom,{2354,25},module},{type,{2354,37},module,[]}]},{type,{2355,36},map_field_assoc,[{atom,{2355,25},function},{type,{2355,39},atom,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,error,2},{2275,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,44,32,65,114,103,115,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,32,96,65,114,103,115,96,32,105,115,10,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,10,96,110,111,110,101,96,46,10,10,73,102,32,96,65,114,103,115,96,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,10,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32,96,110,111,110,101,96,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,10,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,10,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,69,120,97,109,112,108,101,58,10,10,96,116,101,115,116,46,101,114,108,96,58,10,10,96,96,96,101,114,108,97,110,103,10,45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,101,120,97,109,112,108,101,95,102,117,110,47,50,93,41,46,10,10,101,120,97,109,112,108,101,95,102,117,110,40,65,49,44,32,65,50,41,32,45,62,10,32,32,32,32,101,114,108,97,110,103,58,101,114,114,111,114,40,109,121,95,101,114,114,111,114,44,32,91,65,49,44,32,65,50,93,41,46,10,96,96,96,10,10,69,114,108,97,110,103,32,115,104,101,108,108,58,10,10,96,96,96,101,114,108,97,110,103,10,54,62,32,99,40,116,101,115,116,41,46,10,123,111,107,44,116,101,115,116,125,10,55,62,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,109,121,95,101,114,114,111,114,10,32,32,32,32,32,105,110,32,102,117,110,99,116,105,111,110,32,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,47,50,10,32,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,97,115,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,10,96,96,96>>},#{group => processes,specification => [{attribute,{2312,2},spec,{{error,2},[{type,{2312,12},bounded_fun,[{type,{2312,12},'fun',[{type,{2312,12},product,[{var,{2312,13},'Reason'},{var,{2312,21},'Args'}]},{type,{2312,30},no_return,[]}]},[{type,{2313,7},constraint,[{atom,{2313,7},is_subtype},[{var,{2313,7},'Reason'},{type,{2313,17},term,[]}]]},{type,{2314,7},constraint,[{atom,{2314,7},is_subtype},[{var,{2314,7},'Args'},{type,{2314,15},union,[{type,{2314,15},list,[{type,{2314,16},term,[]}]},{atom,{2314,26},none}]}]]}]]}]}}]}},{{function,error,1},{2245,2},[<<101,114,114,111,114,40,82,101,97,115,111,110,41>>],#{<<101,110>> => <<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32,96,82,101,97,115,111,110,96,46,10,10,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,116,104,114,111,119,110,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,10,10,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32,96,101,114,114,111,114,96,32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,10,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,10,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,10,91,101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,93,40,96,101,58,115,121,115,116,101,109,58,101,114,114,111,114,115,46,109,100,96,41,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,97,116,99,104,32,101,114,114,111,114,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,123,102,111,111,98,97,114,44,91,123,115,104,101,108,108,44,97,112,112,108,121,95,102,117,110,44,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,57,48,54,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,100,111,95,97,112,112,108,121,44,54,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,55,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,101,120,112,114,44,53,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,52,51,48,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,56,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,52,50,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,108,111,111,112,44,51,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,50,55,125,93,125,93,125,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{2268,2},spec,{{error,1},[{type,{2268,12},bounded_fun,[{type,{2268,12},'fun',[{type,{2268,12},product,[{var,{2268,13},'Reason'}]},{type,{2268,24},no_return,[]}]},[{type,{2269,7},constraint,[{atom,{2269,7},is_subtype},[{var,{2269,7},'Reason'},{type,{2269,17},term,[]}]]}]]}]}}]}},{{function,erase,1},{2219,2},[<<101,114,97,115,101,40,75,101,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,86,97,108,96,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,10,100,105,99,116,105,111,110,97,114,121,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,96,75,101,121,96,46,10,10,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,10,79,40,96,49,96,41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40,96,78,96,41,44,32,119,104,101,114,101,32,96,78,96,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,10,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,123,109,101,114,114,121,44,32,108,97,109,98,115,44,32,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,88,32,61,32,101,114,97,115,101,40,107,101,121,49,41,44,10,123,88,44,32,101,114,97,115,101,40,107,101,121,49,41,125,46,10,123,123,109,101,114,114,121,44,108,97,109,98,115,44,97,114,101,44,112,108,97,121,105,110,103,125,44,117,110,100,101,102,105,110,101,100,125,10,96,96,96>>},#{group => processes,specification => [{attribute,{2237,2},spec,{{erase,1},[{type,{2237,12},bounded_fun,[{type,{2237,12},'fun',[{type,{2237,12},product,[{var,{2237,13},'Key'}]},{type,{2237,21},union,[{var,{2237,21},'Val'},{atom,{2237,27},undefined}]}]},[{type,{2238,7},constraint,[{atom,{2238,7},is_subtype},[{var,{2238,7},'Key'},{type,{2238,14},term,[]}]]},{type,{2239,7},constraint,[{atom,{2239,7},is_subtype},[{var,{2239,7},'Val'},{type,{2239,14},term,[]}]]}]]}]}}]}},{{function,erase,0},{2199,2},[<<101,114,97,115,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,112,117,116,40,107,101,121,49,44,32,123,49,44,32,50,44,32,51,125,41,44,10,112,117,116,40,107,101,121,50,44,32,91,97,44,32,98,44,32,99,93,41,44,10,101,114,97,115,101,40,41,46,10,91,123,107,101,121,49,44,123,49,44,50,44,51,125,125,44,123,107,101,121,50,44,91,97,44,98,44,99,93,125,93,10,96,96,96>>},#{group => processes,specification => [{attribute,{2212,2},spec,{{erase,0},[{type,{2212,12},bounded_fun,[{type,{2212,12},'fun',[{type,{2212,12},product,[]},{type,{2212,18},list,[{type,{2212,19},tuple,[{var,{2212,20},'Key'},{var,{2212,25},'Val'}]}]}]},[{type,{2213,7},constraint,[{atom,{2213,7},is_subtype},[{var,{2213,7},'Key'},{type,{2213,14},term,[]}]]},{type,{2214,7},constraint,[{atom,{2214,7},is_subtype},[{var,{2214,7},'Val'},{type,{2214,14},term,[]}]]}]]}]}}]}},{{function,dt_spread_tag,1},{2192,2},[<<100,116,95,115,112,114,101,97,100,95,116,97,103,40,66,111,111,108,41>>],hidden,#{}},{{function,dt_restore_tag,1},{2185,2},[<<100,116,95,114,101,115,116,111,114,101,95,116,97,103,40,84,97,103,68,97,116,97,41>>],hidden,#{}},{{function,dt_put_tag,1},{2178,2},[<<100,116,95,112,117,116,95,116,97,103,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,dt_prepend_vm_tag_data,1},{2170,2},[<<100,116,95,112,114,101,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,dt_get_tag_data,0},{2164,2},[<<100,116,95,103,101,116,95,116,97,103,95,100,97,116,97,40,41>>],hidden,#{}},{{function,dt_get_tag,0},{2158,2},[<<100,116,95,103,101,116,95,116,97,103,40,41>>],hidden,#{}},{{function,dt_append_vm_tag_data,1},{2150,2},[<<100,116,95,97,112,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,40,73,111,68,97,116,97,41>>],hidden,#{}},{{function,display_string,2},{2142,2},[<<100,105,115,112,108,97,121,95,115,116,114,105,110,103,40,68,101,118,105,99,101,44,32,80,49,41>>],hidden,#{}},{{function,display_string,1},{2131,2},[<<100,105,115,112,108,97,121,95,115,116,114,105,110,103,40,80,49,41>>],hidden,#{}},{{function,display,1},{2115,2},[<<100,105,115,112,108,97,121,40,84,101,114,109,41>>],#{<<101,110>> => <<80,114,105,110,116,115,32,97,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,84,101,114,109,96,32,111,110,32,116,104,101,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46,32,84,104,101,32,112,114,105,110,116,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,109,97,121,10,62,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,100,101,116,97,105,108,115,32,116,104,97,116,32,100,111,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,104,105,103,104,45,108,101,118,101,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,10,62,32,116,104,101,32,116,101,114,109,32,105,110,32,69,114,108,97,110,103,46>>},#{group => terms,specification => [{attribute,{2125,2},spec,{{display,1},[{type,{2125,14},bounded_fun,[{type,{2125,14},'fun',[{type,{2125,14},product,[{var,{2125,15},'Term'}]},{atom,{2125,24},true}]},[{type,{2126,7},constraint,[{atom,{2126,7},is_subtype},[{var,{2126,7},'Term'},{type,{2126,15},term,[]}]]}]]}]}}]}},{{function,unalias,1},{2092,2},[<<117,110,97,108,105,97,115,40,65,108,105,97,115,41>>],#{<<101,110>> => <<68,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,96,65,108,105,97,115,96,32,112,114,101,118,105,111,117,115,108,121,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,65,110,32,97,108,105,97,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,98,101,32,99,114,101,97,116,101,100,32,118,105,97,32,96,97,108,105,97,115,47,48,96,32,111,114,32,96,109,111,110,105,116,111,114,47,51,96,46,10,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,32,119,105,108,108,32,97,108,119,97,121,115,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,10,111,112,116,105,111,110,115,32,117,115,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,97,108,105,97,115,46,10,10,82,101,116,117,114,110,115,32,116,114,117,101,32,105,102,32,96,65,108,105,97,115,96,32,119,97,115,32,97,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,97,108,105,97,115,32,102,111,114,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,101,115,59,10,111,116,104,101,114,119,105,115,101,44,32,102,97,108,115,101,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,32,111,102,10,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2108,2},spec,{{unalias,1},[{type,{2108,14},bounded_fun,[{type,{2108,14},'fun',[{type,{2108,14},product,[{var,{2108,15},'Alias'}]},{type,{2108,25},boolean,[]}]},[{type,{2109,7},constraint,[{atom,{2109,7},is_subtype},[{var,{2109,7},'Alias'},{type,{2109,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,alias,1},{2033,2},[<<97,108,105,97,115,40,79,112,116,115,41>>],#{<<101,110>> => <<67,114,101,97,116,101,32,97,110,32,97,108,105,97,115,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,10,99,114,101,97,116,101,100,32,116,104,101,32,97,108,105,97,115,46,32,87,104,101,110,32,116,104,101,32,97,108,105,97,115,32,104,97,115,32,98,101,101,110,32,100,101,97,99,116,105,118,97,116,101,100,44,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,117,115,105,110,103,32,116,104,101,10,97,108,105,97,115,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32,96,117,110,97,108,105,97,115,47,49,96,46,10,10,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,32,102,111,114,32,91,96,97,108,105,97,115,47,49,96,93,40,96,97,108,105,97,115,47,49,96,41,58,10,10,45,32,42,42,96,101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,111,110,108,121,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,10,32,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,117,114,32,105,102,32,110,111,32,111,112,116,105,111,110,115,10,32,32,97,114,101,32,112,97,115,115,101,100,32,111,114,32,105,102,32,96,97,108,105,97,115,47,48,96,32,105,115,32,99,97,108,108,101,100,46,10,10,45,32,42,42,96,114,101,112,108,121,96,42,42,32,45,32,84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,10,32,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,10,32,32,99,97,108,108,32,116,111,32,91,96,117,110,97,108,105,97,115,47,49,96,93,40,96,117,110,97,108,105,97,115,47,49,96,41,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,101,110,100,44,10,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,61,32,97,108,105,97,115,40,91,114,101,112,108,121,93,41,44,10,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,37,37,32,65,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,10,32,32,32,32,37,37,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,116,104,101,32,39,114,101,112,108,121,39,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,97,102,116,101,114,32,53,48,48,48,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,117,110,97,108,105,97,115,40,65,108,105,97,115,82,101,113,73,100,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,70,108,117,115,104,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,99,97,115,101,32,116,104,101,32,114,101,112,108,121,32,97,114,114,105,118,101,100,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,106,117,115,116,32,98,101,102,111,114,101,32,116,104,101,32,97,108,105,97,115,32,119,97,115,32,100,101,97,99,116,105,118,97,116,101,100,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,99,101,105,118,101,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,32,32,32,32,32,32,32,32,97,102,116,101,114,32,48,32,45,62,32,101,120,105,116,40,116,105,109,101,111,117,116,41,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,10,32,32,32,32,101,110,100,46,10,96,96,96,10,10,78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,32,97,116,10,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46,10,10,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,10,91,95,80,114,111,99,101,115,115,32,65,108,105,97,115,101,115,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115,96,41,32,115,101,99,116,105,111,110,32,111,102,10,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46>>},#{group => processes,specification => [{attribute,{2085,2},spec,{{alias,1},[{type,{2085,12},bounded_fun,[{type,{2085,12},'fun',[{type,{2085,12},product,[{var,{2085,13},'Opts'}]},{var,{2085,22},'Alias'}]},[{type,{2086,7},constraint,[{atom,{2086,7},is_subtype},[{var,{2086,7},'Alias'},{type,{2086,16},reference,[]}]]},{type,{2087,7},constraint,[{atom,{2087,7},is_subtype},[{var,{2087,7},'Opts'},{type,{2087,15},list,[{type,{2087,16},union,[{atom,{2087,16},explicit_unalias},{atom,{2087,37},reply}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,alias,0},{2030,1},[<<97,108,105,97,115,40,41>>],none,#{group => processes,equiv => <<97,108,105,97,115,40,91,93,41>>,since => <<79,84,80,32,50,52,46,48>>}},{{function,demonitor,2},{1968,2},[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,96,116,114,117,101,96,32,117,110,108,101,115,115,32,96,105,110,102,111,96,32,105,115,32,112,97,114,116,32,111,102,32,96,79,112,116,105,111,110,76,105,115,116,96,46,10,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,102,108,117,115,104,96,42,42,32,45,32,82,101,109,111,118,101,115,32,40,111,110,101,41,32,96,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,44,32,105,102,32,116,104,101,114,101,32,105,115,10,32,32,111,110,101,44,32,102,114,111,109,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,10,10,32,32,67,97,108,108,105,110,103,32,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,10,32,32,102,111,108,108,111,119,105,110,103,44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,44,10,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,116,114,117,101,10,32,32,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,32,32,116,114,117,101,10,32,32,101,110,100,10,32,32,96,96,96,10,10,45,32,42,42,96,105,110,102,111,96,42,42,32,45,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,102,111,117,110,100,32,97,110,100,32,114,101,109,111,118,101,100,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,110,111,32,96,39,68,79,87,78,39,96,10,32,32,32,32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,97,110,100,32,119,105,108,108,32,110,111,116,32,98,101,10,32,32,32,32,100,101,108,105,118,101,114,101,100,46,10,10,32,32,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,46,32,84,104,105,115,10,32,32,32,32,112,114,111,98,97,98,108,121,32,98,101,99,97,117,115,101,32,115,111,109,101,111,110,101,32,97,108,114,101,97,100,121,32,104,97,115,32,112,108,97,99,101,100,32,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,10,32,32,32,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46,10,10,32,32,73,102,32,111,112,116,105,111,110,32,96,105,110,102,111,96,32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,102,108,117,115,104,96,44,32,96,102,97,108,115,101,96,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,97,10,32,32,102,108,117,115,104,32,119,97,115,32,110,101,101,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,110,111,116,32,97,32,108,105,115,116,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,84,104,101,32,115,97,109,101,32,102,97,105,108,117,114,101,32,97,115,32,102,111,114,32,96,100,101,109,111,110,105,116,111,114,47,49,96,46>>},#{group => processes,specification => [{attribute,{2018,2},spec,{{demonitor,2},[{type,{2018,16},bounded_fun,[{type,{2018,16},'fun',[{type,{2018,16},product,[{var,{2018,17},'MonitorRef'},{var,{2018,29},'OptionList'}]},{type,{2018,44},boolean,[]}]},[{type,{2019,7},constraint,[{atom,{2019,7},is_subtype},[{var,{2019,7},'MonitorRef'},{type,{2019,21},reference,[]}]]},{type,{2020,7},constraint,[{atom,{2020,7},is_subtype},[{var,{2020,7},'OptionList'},{type,{2020,21},list,[{var,{2020,22},'Option'}]}]]},{type,{2021,7},constraint,[{atom,{2021,7},is_subtype},[{var,{2021,7},'Option'},{type,{2021,17},union,[{atom,{2021,17},flush},{atom,{2021,25},info}]}]]}]]}]}}]}},{{function,demonitor,1},{1925,2},[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>],#{<<101,110>> => <<73,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,98,116,97,105,110,101,100,32,98,121,32,99,97,108,108,105,110,103,10,96,109,111,110,105,116,111,114,47,50,96,44,32,116,104,105,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,114,101,97,100,121,32,116,117,114,110,101,100,10,111,102,102,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,10,10,79,110,99,101,32,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,10,116,104,97,116,32,110,111,32,96,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,44,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,44,32,119,105,108,108,32,98,101,10,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,32,72,111,119,101,118,101,114,44,32,97,10,96,123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,96,32,109,101,115,115,97,103,101,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,10,109,101,115,115,97,103,101,32,113,117,101,117,101,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,46,32,73,116,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,115,117,97,108,108,121,32,97,100,118,105,115,97,98,108,101,32,116,111,32,114,101,109,111,118,101,32,115,117,99,104,10,97,32,96,39,68,79,87,78,39,96,32,109,101,115,115,97,103,101,32,102,114,111,109,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,50,96,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,10,91,96,100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,105,102,32,116,104,105,115,32,99,108,101,97,110,117,112,32,105,115,32,119,97,110,116,101,100,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,70,111,114,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,115,116,114,105,98,117,116,101,100,32,115,105,103,110,97,108,115,44,32,115,101,101,32,116,104,101,10,62,32,91,95,66,108,111,99,107,105,110,103,32,83,105,103,110,97,108,105,110,103,32,79,118,101,114,32,68,105,115,116,114,105,98,117,116,105,111,110,95,93,40,96,101,58,115,121,115,116,101,109,58,114,101,102,95,109,97,110,95,112,114,111,99,101,115,115,101,115,46,109,100,35,98,108,111,99,107,105,110,103,45,115,105,103,110,97,108,105,110,103,45,111,118,101,114,45,100,105,115,116,114,105,98,117,116,105,111,110,96,41,10,62,32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,95,80,114,111,99,101,115,115,101,115,95,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,95,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,95,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,32,40,69,82,84,83,32,53,46,53,41,32,91,96,100,101,109,111,110,105,116,111,114,47,49,96,93,40,96,100,101,109,111,110,105,116,111,114,47,49,96,41,32,98,101,104,97,118,101,100,10,62,32,99,111,109,112,108,101,116,101,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,10,62,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,114,101,97,99,104,101,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,84,104,105,115,32,104,97,100,32,111,110,101,32,117,110,100,101,115,105,114,97,98,108,101,10,62,32,101,102,102,101,99,116,46,32,89,111,117,32,99,111,117,108,100,32,110,101,118,101,114,32,107,110,111,119,32,119,104,101,110,32,121,111,117,32,119,101,114,101,32,103,117,97,114,97,110,116,101,101,100,32,95,110,111,116,95,32,116,111,32,114,101,99,101,105,118,101,32,97,10,62,32,96,68,79,87,78,96,32,109,101,115,115,97,103,101,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46,10,62,10,62,32,84,104,101,32,99,117,114,114,101,110,116,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,118,105,101,119,101,100,32,97,115,32,116,119,111,32,99,111,109,98,105,110,101,100,32,111,112,101,114,97,116,105,111,110,115,58,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,10,62,32,115,101,110,100,32,97,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,97,110,100,32,105,103,110,111,114,101,32,97,110,121,32,102,117,116,117,114,101,10,62,32,114,101,115,117,108,116,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46,10,10,70,97,105,108,117,114,101,58,32,73,116,32,105,115,32,97,110,32,101,114,114,111,114,32,105,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,114,101,102,101,114,115,32,116,111,32,97,32,109,111,110,105,116,111,114,105,110,103,32,115,116,97,114,116,101,100,32,98,121,10,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,32,97,108,108,32,115,117,99,104,32,99,97,115,101,115,32,97,114,101,32,99,104,101,97,112,32,116,111,32,99,104,101,99,107,46,32,73,102,32,99,104,101,99,107,105,110,103,32,105,115,32,99,104,101,97,112,44,10,116,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,96,98,97,100,97,114,103,96,44,32,102,111,114,32,101,120,97,109,112,108,101,32,105,102,32,96,77,111,110,105,116,111,114,82,101,102,96,32,105,115,32,97,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,46>>},#{group => processes,specification => [{attribute,{1961,2},spec,{{demonitor,1},[{type,{1961,16},bounded_fun,[{type,{1961,16},'fun',[{type,{1961,16},product,[{var,{1961,17},'MonitorRef'}]},{atom,{1961,32},true}]},[{type,{1962,7},constraint,[{atom,{1962,7},is_subtype},[{var,{1962,7},'MonitorRef'},{type,{1962,21},reference,[]}]]}]]}]}}]}},{{function,delete_module,1},{1906,2},[<<100,101,108,101,116,101,95,109,111,100,117,108,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<77,97,107,101,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,32,98,101,99,111,109,101,32,111,108,100,32,99,111,100,101,32,97,110,100,32,100,101,108,101,116,101,115,32,97,108,108,32,114,101,102,101,114,101,110,99,101,115,10,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,102,114,111,109,32,116,104,101,32,101,120,112,111,114,116,32,116,97,98,108,101,46,32,82,101,116,117,114,110,115,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,100,111,101,115,10,110,111,116,32,101,120,105,115,116,44,32,111,116,104,101,114,119,105,115,101,32,96,116,114,117,101,96,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32,96,109,58,99,111,100,101,96,41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,10,62,32,101,108,115,101,119,104,101,114,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,105,115,32,97,110,32,111,108,100,32,118,101,114,115,105,111,110,32,111,102,32,96,77,111,100,117,108,101,96,46>>},#{group => code,specification => [{attribute,{1919,2},spec,{{delete_module,1},[{type,{1919,20},bounded_fun,[{type,{1919,20},'fun',[{type,{1919,20},product,[{var,{1919,21},'Module'}]},{type,{1919,32},union,[{atom,{1919,32},true},{atom,{1919,39},undefined}]}]},[{type,{1920,7},constraint,[{atom,{1920,7},is_subtype},[{var,{1920,7},'Module'},{type,{1920,17},module,[]}]]}]]}]}}]}},{{function,delete_element,2},{1886,2},[<<100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,73,110,100,101,120,44,32,84,117,112,108,101,49,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,97,116,32,96,73,110,100,101,120,96,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,117,112,108,101,32,96,84,117,112,108,101,49,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,41,46,10,123,111,110,101,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{1898,2},spec,{{delete_element,2},[{type,{1898,21},bounded_fun,[{type,{1898,21},'fun',[{type,{1898,21},product,[{var,{1898,22},'Index'},{var,{1898,29},'Tuple1'}]},{var,{1898,40},'Tuple2'}]},[{type,{1899,7},constraint,[{atom,{1899,7},is_subtype},[{var,{1899,7},'Index'},{type,{1899,17},pos_integer,[]}]]},{type,{1900,7},constraint,[{atom,{1900,7},is_subtype},[{var,{1900,7},'Tuple1'},{type,{1900,17},tuple,any}]]},{type,{1901,7},constraint,[{atom,{1901,7},is_subtype},[{var,{1901,7},'Tuple2'},{type,{1901,17},tuple,any}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,decode_packet,3},{1697,2},[<<100,101,99,111,100,101,95,112,97,99,107,101,116,40,84,121,112,101,44,32,66,105,110,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<68,101,99,111,100,101,115,32,116,104,101,32,98,105,110,97,114,121,32,96,66,105,110,96,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,112,114,111,116,111,99,111,108,32,115,112,101,99,105,102,105,101,100,32,98,121,32,96,84,121,112,101,96,46,10,83,105,109,105,108,97,114,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,100,111,110,101,32,98,121,32,115,111,99,107,101,116,115,32,119,105,116,104,32,111,112,116,105,111,110,32,96,123,112,97,99,107,101,116,44,84,121,112,101,125,46,96,10,10,73,102,32,97,110,32,101,110,116,105,114,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,96,66,105,110,96,44,32,105,116,32,105,115,32,114,101,116,117,114,110,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,10,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,97,115,32,96,123,111,107,44,80,97,99,107,101,116,44,82,101,115,116,125,96,46,10,10,73,102,32,96,66,105,110,96,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,99,107,101,116,44,32,96,123,109,111,114,101,44,76,101,110,103,116,104,125,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,96,76,101,110,103,116,104,96,32,105,115,32,101,105,116,104,101,114,32,116,104,101,32,101,120,112,101,99,116,101,100,32,95,116,111,116,97,108,32,115,105,122,101,95,32,111,102,32,116,104,101,32,112,97,99,107,101,116,44,32,111,114,32,96,117,110,100,101,102,105,110,101,100,96,32,105,102,10,116,104,101,32,101,120,112,101,99,116,101,100,32,112,97,99,107,101,116,32,115,105,122,101,32,105,115,32,117,110,107,110,111,119,110,46,32,96,100,101,99,111,100,101,95,112,97,99,107,101,116,96,32,99,97,110,32,116,104,101,110,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,10,119,105,116,104,32,109,111,114,101,32,100,97,116,97,32,97,100,100,101,100,46,10,10,73,102,32,116,104,101,32,112,97,99,107,101,116,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,112,114,111,116,111,99,111,108,32,102,111,114,109,97,116,44,32,96,123,101,114,114,111,114,44,82,101,97,115,111,110,125,96,32,105,115,10,114,101,116,117,114,110,101,100,46,10,10,96,84,121,112,101,96,115,58,10,10,45,32,42,42,96,114,97,119,32,124,32,48,96,42,42,32,45,32,78,111,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,105,115,32,100,111,110,101,46,32,84,104,101,32,101,110,116,105,114,101,32,98,105,110,97,114,121,32,105,115,32,114,101,116,117,114,110,101,100,10,32,32,117,110,108,101,115,115,32,105,116,32,105,115,32,101,109,112,116,121,46,10,10,45,32,42,42,96,49,32,124,32,50,32,124,32,52,96,42,42,32,45,32,80,97,99,107,101,116,115,32,99,111,110,115,105,115,116,32,111,102,32,97,32,104,101,97,100,101,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,10,32,32,105,110,32,116,104,101,32,112,97,99,107,101,116,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,97,116,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46,32,84,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,104,101,97,100,101,114,32,99,97,110,10,32,32,98,101,32,111,110,101,44,32,116,119,111,44,32,111,114,32,102,111,117,114,32,98,121,116,101,115,59,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,98,121,116,101,115,32,105,115,32,98,105,103,45,101,110,100,105,97,110,46,32,84,104,101,32,104,101,97,100,101,114,10,32,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,102,32,119,104,101,110,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,114,101,116,117,114,110,101,100,46,10,10,45,32,42,42,96,108,105,110,101,96,42,42,32,45,32,65,32,112,97,99,107,101,116,32,105,115,32,97,32,108,105,110,101,45,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,44,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,10,32,32,108,97,116,105,110,45,49,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,32,105,115,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,10,32,32,112,97,99,107,101,116,32,117,110,108,101,115,115,32,116,104,101,32,108,105,110,101,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,111,112,116,105,111,110,32,96,108,105,110,101,95,108,101,110,103,116,104,96,46,10,10,45,32,42,42,96,97,115,110,49,32,124,32,99,100,114,32,124,32,115,117,110,114,109,32,124,32,102,99,103,105,32,124,32,116,112,107,116,96,42,42,32,45,32,84,104,101,32,104,101,97,100,101,114,32,105,115,32,95,110,111,116,95,32,115,116,114,105,112,112,101,100,32,111,102,102,46,10,10,32,32,84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,32,32,45,32,42,42,96,97,115,110,49,96,32,92,45,32,65,83,78,46,49,32,66,69,82,42,42,10,10,32,32,45,32,42,42,96,115,117,110,114,109,96,32,92,45,32,83,117,110,39,115,32,82,80,67,32,101,110,99,111,100,105,110,103,42,42,10,10,32,32,45,32,42,42,96,99,100,114,96,32,92,45,32,67,79,82,66,65,32,40,71,73,79,80,32,49,46,49,41,42,42,10,10,32,32,45,32,42,42,96,102,99,103,105,96,32,92,45,32,70,97,115,116,32,67,71,73,42,42,10,10,32,32,45,32,42,42,96,116,112,107,116,96,32,92,45,32,84,80,75,84,32,102,111,114,109,97,116,32,92,91,82,70,67,49,48,48,54,93,42,42,10,10,45,32,42,42,96,104,116,116,112,32,124,32,104,116,116,112,104,32,124,32,104,116,116,112,95,98,105,110,32,124,32,104,116,116,112,104,95,98,105,110,96,42,42,32,45,32,84,104,101,32,72,121,112,101,114,116,101,120,116,32,84,114,97,110,115,102,101,114,32,80,114,111,116,111,99,111,108,46,10,32,32,84,104,101,32,112,97,99,107,101,116,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,119,105,116,104,32,116,104,101,32,102,111,114,109,97,116,32,97,99,99,111,114,100,105,110,103,32,116,111,32,96,72,116,116,112,80,97,99,107,101,116,96,32,100,101,115,99,114,105,98,101,100,10,32,32,101,97,114,108,105,101,114,46,32,65,32,112,97,99,107,101,116,32,105,115,32,101,105,116,104,101,114,32,97,32,114,101,113,117,101,115,116,44,32,97,32,114,101,115,112,111,110,115,101,44,32,97,32,104,101,97,100,101,114,44,32,111,114,32,97,110,32,101,110,100,32,111,102,10,32,32,104,101,97,100,101,114,32,109,97,114,107,46,32,73,110,118,97,108,105,100,32,108,105,110,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,96,72,116,116,112,69,114,114,111,114,96,46,10,10,32,32,82,101,99,111,103,110,105,122,101,100,32,114,101,113,117,101,115,116,32,109,101,116,104,111,100,115,32,97,110,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,97,116,111,109,115,46,32,79,116,104,101,114,115,32,97,114,101,10,32,32,114,101,116,117,114,110,101,100,32,97,115,32,115,116,114,105,110,103,115,46,32,83,116,114,105,110,103,115,32,111,102,32,117,110,114,101,99,111,103,110,105,122,101,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,10,32,32,111,110,108,121,32,99,97,112,105,116,97,108,32,108,101,116,116,101,114,115,32,102,105,114,115,116,32,97,110,100,32,97,102,116,101,114,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,10,32,32,96,34,83,101,99,45,87,101,98,115,111,99,107,101,116,45,75,101,121,34,96,46,32,72,101,97,100,101,114,32,102,105,101,108,100,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,114,101,116,117,114,110,101,100,32,105,110,10,32,32,96,85,110,109,111,100,105,102,105,101,100,70,105,101,108,100,96,32,97,115,32,115,116,114,105,110,103,115,44,32,119,105,116,104,111,117,116,32,97,110,121,32,99,111,110,118,101,114,115,105,111,110,32,111,114,32,102,111,114,109,97,116,116,105,110,103,46,10,10,32,32,84,104,101,32,112,114,111,116,111,99,111,108,32,116,121,112,101,32,96,104,116,116,112,96,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,108,105,110,101,32,119,104,101,110,32,97,110,10,32,32,96,72,116,116,112,82,101,113,117,101,115,116,96,32,111,114,32,97,110,32,96,72,116,116,112,82,101,115,112,111,110,115,101,96,32,105,115,32,101,120,112,101,99,116,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,97,114,101,32,116,111,32,117,115,101,10,32,32,96,104,116,116,112,104,96,32,116,111,32,103,101,116,32,96,72,116,116,112,72,101,97,100,101,114,96,115,32,117,110,116,105,108,32,96,104,116,116,112,95,101,111,104,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,105,99,104,32,109,97,114,107,115,32,116,104,101,32,101,110,100,10,32,32,111,102,32,116,104,101,32,104,101,97,100,101,114,115,32,97,110,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,109,101,115,115,97,103,101,32,98,111,100,121,46,10,10,32,32,84,104,101,32,118,97,114,105,97,110,116,115,32,96,104,116,116,112,95,98,105,110,96,32,97,110,100,32,96,104,116,116,112,104,95,98,105,110,96,32,114,101,116,117,114,110,32,115,116,114,105,110,103,115,32,40,96,72,116,116,112,83,116,114,105,110,103,96,41,32,97,115,10,32,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,108,105,115,116,115,46,10,10,32,32,83,105,110,99,101,32,79,84,80,32,50,54,46,48,44,32,96,72,111,115,116,96,32,109,97,121,32,98,101,32,97,110,32,73,80,118,54,32,97,100,100,114,101,115,115,32,101,110,99,108,111,115,101,100,32,105,110,32,96,91,93,96,44,32,97,115,32,100,101,102,105,110,101,100,32,105,110,10,32,32,91,82,70,67,50,55,51,50,32,93,40,104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,50,55,51,50,46,116,120,116,41,46,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,123,112,97,99,107,101,116,95,115,105,122,101,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,115,105,122,101,32,111,102,32,116,104,101,10,32,32,112,97,99,107,101,116,32,98,111,100,121,46,32,73,102,32,116,104,101,32,112,97,99,107,101,116,32,104,101,97,100,101,114,32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,105,115,10,32,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,108,101,110,103,116,104,44,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,105,110,118,97,108,105,100,46,10,32,32,68,101,102,97,117,108,116,115,32,116,111,32,48,44,32,119,104,105,99,104,32,109,101,97,110,115,32,110,111,32,115,105,122,101,32,108,105,109,105,116,46,10,10,45,32,42,42,96,123,108,105,110,101,95,108,101,110,103,116,104,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32,96,108,105,110,101,96,44,32,108,105,110,101,115,32,108,111,110,103,101,114,10,32,32,116,104,97,110,32,116,104,101,32,105,110,100,105,99,97,116,101,100,32,108,101,110,103,116,104,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,10,10,32,32,79,112,116,105,111,110,32,96,108,105,110,101,95,108,101,110,103,116,104,96,32,97,108,115,111,32,97,112,112,108,105,101,115,32,116,111,32,96,104,116,116,112,42,96,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,115,32,97,110,32,97,108,105,97,115,32,102,111,114,10,32,32,111,112,116,105,111,110,32,96,112,97,99,107,101,116,95,115,105,122,101,96,32,105,102,32,96,112,97,99,107,101,116,95,115,105,122,101,96,32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,115,101,116,46,32,84,104,105,115,32,117,115,101,32,105,115,32,111,110,108,121,10,32,32,105,110,116,101,110,100,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,10,10,45,32,42,42,96,123,108,105,110,101,95,100,101,108,105,109,105,116,101,114,44,32,48,32,61,60,32,98,121,116,101,40,41,32,61,60,32,50,53,53,125,96,42,42,32,45,32,70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32,96,108,105,110,101,96,44,32,115,101,116,115,32,116,104,101,10,32,32,100,101,108,105,109,105,116,105,110,103,32,98,121,116,101,46,32,68,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,96,36,92,110,96,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,51,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,111,107,44,60,60,34,97,98,99,34,62,62,44,60,60,34,100,34,62,62,125,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,53,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,109,111,114,101,44,54,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{1789,2},spec,{{decode_packet,3},[{type,{1789,20},bounded_fun,[{type,{1789,20},'fun',[{type,{1789,20},product,[{var,{1789,21},'Type'},{var,{1789,27},'Bin'},{var,{1789,32},'Options'}]},{type,{1790,35},union,[{type,{1790,35},tuple,[{atom,{1790,36},ok},{var,{1790,40},'Packet'},{var,{1790,48},'Rest'}]},{type,{1791,35},tuple,[{atom,{1791,36},more},{var,{1791,42},'Length'}]},{type,{1792,35},tuple,[{atom,{1792,36},error},{var,{1792,43},'Reason'}]}]}]},[{type,{1793,7},constraint,[{atom,{1793,7},is_subtype},[{var,{1793,7},'Type'},{type,{1793,15},union,[{atom,{1793,15},raw},{integer,{1793,23},0},{integer,{1793,27},1},{integer,{1793,31},2},{integer,{1793,35},4},{atom,{1793,39},asn1},{atom,{1793,48},cdr},{atom,{1793,56},sunrm},{atom,{1793,66},fcgi},{atom,{1794,15},tpkt},{atom,{1794,24},line},{atom,{1794,33},http},{atom,{1794,42},http_bin},{atom,{1794,55},httph},{atom,{1794,65},httph_bin}]}]]},{type,{1795,7},constraint,[{atom,{1795,7},is_subtype},[{var,{1795,7},'Bin'},{type,{1795,14},binary,[]}]]},{type,{1796,7},constraint,[{atom,{1796,7},is_subtype},[{var,{1796,7},'Options'},{type,{1796,18},list,[{var,{1796,19},'Opt'}]}]]},{type,{1797,7},constraint,[{atom,{1797,7},is_subtype},[{var,{1797,7},'Opt'},{type,{1797,14},union,[{type,{1797,14},tuple,[{atom,{1797,15},packet_size},{type,{1797,28},non_neg_integer,[]}]},{type,{1798,14},tuple,[{atom,{1798,15},line_length},{type,{1798,28},non_neg_integer,[]}]}]}]]},{type,{1799,7},constraint,[{atom,{1799,7},is_subtype},[{var,{1799,7},'Packet'},{type,{1799,17},union,[{type,{1799,17},binary,[]},{var,{1799,28},'HttpPacket'}]}]]},{type,{1800,7},constraint,[{atom,{1800,7},is_subtype},[{var,{1800,7},'Rest'},{type,{1800,15},binary,[]}]]},{type,{1801,7},constraint,[{atom,{1801,7},is_subtype},[{var,{1801,7},'Length'},{type,{1801,17},union,[{type,{1801,17},non_neg_integer,[]},{atom,{1801,37},undefined}]}]]},{type,{1802,7},constraint,[{atom,{1802,7},is_subtype},[{var,{1802,7},'Reason'},{type,{1802,17},term,[]}]]},{type,{1803,7},constraint,[{atom,{1803,7},is_subtype},[{var,{1803,7},'HttpPacket'},{type,{1803,21},union,[{var,{1803,21},'HttpRequest'},{var,{1804,21},'HttpResponse'},{var,{1805,21},'HttpHeader'},{atom,{1806,21},http_eoh},{var,{1807,21},'HttpError'}]}]]},{type,{1808,7},constraint,[{atom,{1808,7},is_subtype},[{var,{1808,7},'HttpRequest'},{type,{1808,22},tuple,[{atom,{1808,23},http_request},{var,{1808,39},'HttpMethod'},{var,{1808,51},'HttpUri'},{var,{1808,60},'HttpVersion'}]}]]},{type,{1809,7},constraint,[{atom,{1809,7},is_subtype},[{var,{1809,7},'HttpResponse'},{type,{1809,23},tuple,[{atom,{1809,24},http_response},{var,{1809,41},'HttpVersion'},{type,{1809,54},integer,[]},{var,{1809,65},'HttpString'}]}]]},{type,{1810,7},constraint,[{atom,{1810,7},is_subtype},[{var,{1810,7},'HttpHeader'},{type,{1810,21},tuple,[{atom,{1810,22},http_header},{type,{1811,22},integer,[]},{var,{1812,22},'HttpField'},{ann_type,{1813,22},[{var,{1813,22},'UnmodifiedField'},{var,{1813,41},'HttpString'}]},{ann_type,{1814,22},[{var,{1814,22},'Value'},{var,{1814,31},'HttpString'}]}]}]]},{type,{1815,7},constraint,[{atom,{1815,7},is_subtype},[{var,{1815,7},'HttpError'},{type,{1815,20},tuple,[{atom,{1815,21},http_error},{var,{1815,35},'HttpString'}]}]]},{type,{1816,7},constraint,[{atom,{1816,7},is_subtype},[{var,{1816,7},'HttpMethod'},{type,{1816,21},union,[{atom,{1816,21},'OPTIONS'},{atom,{1816,33},'GET'},{atom,{1816,41},'HEAD'},{atom,{1816,50},'POST'},{atom,{1816,59},'PUT'},{atom,{1816,67},'DELETE'},{atom,{1817,21},'TRACE'},{var,{1817,31},'HttpString'}]}]]},{type,{1818,7},constraint,[{atom,{1818,7},is_subtype},[{var,{1818,7},'HttpUri'},{type,{1818,18},union,[{atom,{1818,18},'*'},{type,{1819,18},tuple,[{atom,{1819,20},absoluteURI},{type,{1820,20},union,[{atom,{1820,20},http},{atom,{1820,29},https}]},{ann_type,{1821,20},[{var,{1821,20},'Host'},{var,{1821,28},'HttpString'}]},{ann_type,{1822,20},[{var,{1822,20},'Port'},{type,{1822,28},union,[{remote_type,{1822,28},[{atom,{1822,28},inet},{atom,{1822,33},port_number},[]]},{atom,{1822,49},undefined}]}]},{ann_type,{1823,20},[{var,{1823,20},'Path'},{var,{1823,28},'HttpString'}]}]},{type,{1824,18},tuple,[{atom,{1824,19},scheme},{ann_type,{1824,29},[{var,{1824,29},'Scheme'},{var,{1824,39},'HttpString'}]},{var,{1824,51},'HttpString'}]},{type,{1825,18},tuple,[{atom,{1825,19},abs_path},{var,{1825,31},'HttpString'}]},{var,{1826,18},'HttpString'}]}]]},{type,{1827,7},constraint,[{atom,{1827,7},is_subtype},[{var,{1827,7},'HttpVersion'},{type,{1827,22},tuple,[{ann_type,{1827,23},[{var,{1827,23},'Major'},{type,{1827,32},non_neg_integer,[]}]},{ann_type,{1827,51},[{var,{1827,51},'Minor'},{type,{1827,60},non_neg_integer,[]}]}]}]]},{type,{1828,7},constraint,[{atom,{1828,7},is_subtype},[{var,{1828,7},'HttpField'},{type,{1828,20},union,[{atom,{1828,20},'Cache-Control'},{atom,{1829,20},'Connection'},{atom,{1830,20},'Date'},{atom,{1831,20},'Pragma'},{atom,{1832,20},'Transfer-Encoding'},{atom,{1833,20},'Upgrade'},{atom,{1834,20},'Via'},{atom,{1835,20},'Accept'},{atom,{1836,20},'Accept-Charset'},{atom,{1837,20},'Accept-Encoding'},{atom,{1838,20},'Accept-Language'},{atom,{1839,20},'Authorization'},{atom,{1840,20},'From'},{atom,{1841,20},'Host'},{atom,{1842,20},'If-Modified-Since'},{atom,{1843,20},'If-Match'},{atom,{1844,20},'If-None-Match'},{atom,{1845,20},'If-Range'},{atom,{1846,20},'If-Unmodified-Since'},{atom,{1847,20},'Max-Forwards'},{atom,{1848,20},'Proxy-Authorization'},{atom,{1849,20},'Range'},{atom,{1850,20},'Referer'},{atom,{1851,20},'User-Agent'},{atom,{1852,20},'Age'},{atom,{1853,20},'Location'},{atom,{1854,20},'Proxy-Authenticate'},{atom,{1855,20},'Public'},{atom,{1856,20},'Retry-After'},{atom,{1857,20},'Server'},{atom,{1858,20},'Vary'},{atom,{1859,20},'Warning'},{atom,{1860,19},'Www-Authenticate'},{atom,{1861,20},'Allow'},{atom,{1862,20},'Content-Base'},{atom,{1863,20},'Content-Encoding'},{atom,{1864,20},'Content-Language'},{atom,{1865,20},'Content-Length'},{atom,{1866,20},'Content-Location'},{atom,{1867,20},'Content-Md5'},{atom,{1868,20},'Content-Range'},{atom,{1869,20},'Content-Type'},{atom,{1870,20},'Etag'},{atom,{1871,20},'Expires'},{atom,{1872,20},'Last-Modified'},{atom,{1873,20},'Accept-Ranges'},{atom,{1874,20},'Set-Cookie'},{atom,{1875,20},'Set-Cookie2'},{atom,{1876,20},'X-Forwarded-For'},{atom,{1877,20},'Cookie'},{atom,{1878,20},'Keep-Alive'},{atom,{1879,20},'Proxy-Connection'},{var,{1880,20},'HttpString'}]}]]},{type,{1881,7},constraint,[{atom,{1881,7},is_subtype},[{var,{1881,7},'HttpString'},{type,{1881,21},union,[{type,{1881,21},string,[]},{type,{1881,32},binary,[]}]}]]}]]}]}}]}},{{function,date,0},{1676,2},[<<100,97,116,101,40,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,115,32,96,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,96,46,10,10,84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,10,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,10,91,79,83,32,83,121,115,116,101,109,32,84,105,109,101,93,40,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,46,109,100,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101,41,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,100,97,116,101,40,41,46,10,123,49,57,57,53,44,50,44,49,57,125,10,96,96,96>>},#{group => time,specification => [{attribute,{1691,2},spec,{{date,0},[{type,{1691,11},bounded_fun,[{type,{1691,11},'fun',[{type,{1691,11},product,[]},{var,{1691,17},'Date'}]},[{type,{1692,7},constraint,[{atom,{1692,7},is_subtype},[{var,{1692,7},'Date'},{remote_type,{1692,15},[{atom,{1692,15},calendar},{atom,{1692,24},date},[]]}]]}]]}]}}]}},{{function,crc32_combine,3},{1646,2},[<<99,114,99,51,50,95,99,111,109,98,105,110,101,40,70,105,114,115,116,67,114,99,44,32,83,101,99,111,110,100,67,114,99,44,32,83,101,99,111,110,100,83,105,122,101,41>>],#{<<101,110>> => <<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,115,46,10,10,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,10,116,111,32,98,101,32,107,110,111,119,110,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,89,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,90,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{1668,2},spec,{{crc32_combine,3},[{type,{1668,20},bounded_fun,[{type,{1668,20},'fun',[{type,{1668,20},product,[{var,{1668,21},'FirstCrc'},{var,{1668,31},'SecondCrc'},{var,{1668,42},'SecondSize'}]},{type,{1668,57},non_neg_integer,[]}]},[{type,{1669,7},constraint,[{atom,{1669,7},is_subtype},[{var,{1669,7},'FirstCrc'},{type,{1669,19},non_neg_integer,[]}]]},{type,{1670,7},constraint,[{atom,{1670,7},is_subtype},[{var,{1670,7},'SecondCrc'},{type,{1670,20},non_neg_integer,[]}]]},{type,{1671,7},constraint,[{atom,{1671,7},is_subtype},[{var,{1671,7},'SecondSize'},{type,{1671,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,crc32,2},{1621,2},[<<99,114,99,51,50,40,79,108,100,67,114,99,44,32,68,97,116,97,41>>],#{<<101,110>> => <<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,10,96,79,108,100,67,114,99,96,44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32,96,68,97,116,97,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,88,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,89,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{1639,2},spec,{{crc32,2},[{type,{1639,12},bounded_fun,[{type,{1639,12},'fun',[{type,{1639,12},product,[{var,{1639,13},'OldCrc'},{var,{1639,21},'Data'}]},{type,{1639,30},non_neg_integer,[]}]},[{type,{1640,7},constraint,[{atom,{1640,7},is_subtype},[{var,{1640,7},'OldCrc'},{type,{1640,17},non_neg_integer,[]}]]},{type,{1641,7},constraint,[{atom,{1641,7},is_subtype},[{var,{1641,7},'Data'},{type,{1641,15},iodata,[]}]]}]]}]}}]}},{{function,crc32,1},{1613,2},[<<99,114,99,51,50,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,114,99,51,50,32,40,73,69,69,69,32,56,48,50,46,51,32,115,116,121,108,101,41,32,99,104,101,99,107,115,117,109,32,102,111,114,32,96,68,97,116,97,96,46>>},#{group => checksum,specification => [{attribute,{1615,2},spec,{{crc32,1},[{type,{1615,12},bounded_fun,[{type,{1615,12},'fun',[{type,{1615,12},product,[{var,{1615,13},'Data'}]},{type,{1615,22},non_neg_integer,[]}]},[{type,{1616,7},constraint,[{atom,{1616,7},is_subtype},[{var,{1616,7},'Data'},{type,{1616,15},iodata,[]}]]}]]}]}}]}},{{function,check_process_code,3},{1529,2},[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,79,112,116,105,111,110,76,105,115,116,41>>],#{<<101,110>> => <<67,104,101,99,107,115,32,105,102,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,10,96,77,111,100,117,108,101,96,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,108,108,111,119,95,103,99,44,32,98,111,111,108,101,97,110,40,41,125,96,42,42,32,45,32,68,101,116,101,114,109,105,110,101,115,32,105,102,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,108,108,111,119,101,100,32,119,104,101,110,10,32,32,112,101,114,102,111,114,109,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,96,123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125,96,32,105,115,32,112,97,115,115,101,100,44,32,97,110,100,32,97,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,10,32,32,105,115,32,97,98,111,114,116,101,100,32,40,115,101,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,96,67,104,101,99,107,82,101,115,117,108,116,96,32,98,101,108,111,119,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,111,32,97,108,108,111,119,10,32,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,116,104,97,116,32,105,115,44,32,96,123,97,108,108,111,119,95,103,99,44,32,116,114,117,101,125,96,46,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125,96,42,42,32,45,32,84,104,101,32,102,117,110,99,116,105,111,110,10,32,32,91,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51,96,93,40,96,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51,96,41,32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,96,97,115,121,110,99,96,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,10,32,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,10,32,32,102,111,114,109,32,96,123,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,44,32,82,101,113,117,101,115,116,73,100,44,32,67,104,101,99,107,82,101,115,117,108,116,125,96,46,10,10,73,102,32,96,80,105,100,96,32,101,113,117,97,108,115,32,96,115,101,108,102,47,48,96,44,32,97,110,100,32,110,111,32,96,97,115,121,110,99,96,32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,10,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,10,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,44,32,97,110,100,32,105,115,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32,96,97,115,121,110,99,96,10,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32,96,67,104,101,99,107,82,101,115,117,108,116,96,32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,10,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,10,10,96,67,104,101,99,107,82,101,115,117,108,116,96,32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,116,114,117,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,96,77,111,100,117,108,101,96,46,10,32,32,84,104,97,116,32,105,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,10,32,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,10,32,32,99,111,110,116,97,105,110,115,32,102,117,110,115,32,116,104,97,116,32,114,101,102,101,114,101,110,99,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,46,10,10,45,32,42,42,96,102,97,108,115,101,96,42,42,32,45,32,84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32,96,80,105,100,96,32,100,111,101,115,32,110,111,116,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,102,111,114,10,32,32,96,77,111,100,117,108,101,96,46,10,10,45,32,42,42,96,97,98,111,114,116,101,100,96,42,42,32,45,32,84,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,97,98,111,114,116,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,101,101,100,101,100,32,116,111,32,98,101,32,103,97,114,98,97,103,101,10,32,32,99,111,108,108,101,99,116,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,114,101,113,117,101,115,116,101,100,10,32,32,98,121,32,112,97,115,115,105,110,103,32,111,112,116,105,111,110,32,96,123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125,96,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,85,112,32,117,110,116,105,108,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,92,42,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,99,104,101,99,107,115,32,102,111,114,32,97,108,108,10,62,32,116,121,112,101,115,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,111,108,100,32,99,111,100,101,46,32,84,104,97,116,32,105,115,44,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,101,46,103,46,32,114,101,116,117,114,110,10,62,32,97,100,100,114,101,115,115,101,115,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,41,44,32,105,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,96,102,117,110,96,115,32,105,110,32,112,114,111,99,101,115,115,10,62,32,99,111,110,116,101,120,116,41,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,108,105,116,101,114,97,108,115,32,105,110,32,116,104,101,32,99,111,100,101,46,10,62,10,62,32,65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,111,110,108,121,32,99,104,101,99,107,115,32,102,111,114,10,62,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,99,111,100,101,46,32,73,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,118,105,97,32,96,102,117,110,96,115,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,46,10,62,32,73,102,32,115,117,99,104,32,96,102,117,110,96,115,32,101,120,105,115,116,32,97,110,100,32,97,114,101,32,117,115,101,100,32,97,102,116,101,114,32,97,32,112,117,114,103,101,32,111,102,32,116,104,101,32,111,108,100,32,99,111,100,101,44,32,97,110,32,101,120,99,101,112,116,105,111,110,10,62,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,112,111,110,32,117,115,97,103,101,32,40,115,97,109,101,32,97,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,96,102,117,110,96,32,105,115,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,10,62,32,112,114,111,99,101,115,115,32,97,102,116,101,114,32,116,104,101,32,112,117,114,103,101,41,46,32,76,105,116,101,114,97,108,115,32,119,105,108,108,32,98,101,32,116,97,107,101,110,32,99,97,114,101,32,111,102,32,40,99,111,112,105,101,100,41,32,97,116,32,97,32,108,97,116,101,114,10,62,32,115,116,97,103,101,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,99,97,110,32,97,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,49,32,98,101,32,101,110,97,98,108,101,100,32,119,104,101,110,10,62,32,91,98,117,105,108,100,105,110,103,32,79,84,80,93,40,96,101,58,115,121,115,116,101,109,58,105,110,115,116,97,108,108,46,109,100,35,97,100,118,97,110,99,101,100,45,99,111,110,102,105,103,117,114,97,116,105,111,110,45,97,110,100,45,98,117,105,108,100,45,111,102,45,101,114,108,97,110,103,45,111,116,112,95,99,111,110,102,105,103,117,114,105,110,103,96,41,44,10,62,32,97,110,100,32,119,105,108,108,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,98,101,32,101,110,97,98,108,101,100,32,105,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,32,115,117,112,112,111,114,116,32,105,115,32,101,110,97,98,108,101,100,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46,10,10,70,97,105,108,117,114,101,115,58,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,80,105,100,96,32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,77,111,100,117,108,101,96,32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46,10,10,45,32,42,42,96,98,97,100,97,114,103,96,42,42,32,45,32,73,102,32,96,79,112,116,105,111,110,76,105,115,116,96,32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>},#{group => code,specification => [{attribute,{1595,2},spec,{{check_process_code,3},[{type,{1595,25},bounded_fun,[{type,{1595,25},'fun',[{type,{1595,25},product,[{var,{1595,26},'Pid'},{var,{1595,31},'Module'},{var,{1595,39},'OptionList'}]},{type,{1595,54},union,[{var,{1595,54},'CheckResult'},{atom,{1595,68},async}]}]},[{type,{1596,7},constraint,[{atom,{1596,7},is_subtype},[{var,{1596,7},'Pid'},{type,{1596,14},pid,[]}]]},{type,{1597,7},constraint,[{atom,{1597,7},is_subtype},[{var,{1597,7},'Module'},{type,{1597,17},module,[]}]]},{type,{1598,7},constraint,[{atom,{1598,7},is_subtype},[{var,{1598,7},'RequestId'},{type,{1598,20},term,[]}]]},{type,{1599,7},constraint,[{atom,{1599,7},is_subtype},[{var,{1599,7},'Option'},{type,{1599,17},union,[{type,{1599,17},tuple,[{atom,{1599,18},async},{var,{1599,25},'RequestId'}]},{type,{1599,38},tuple,[{atom,{1599,39},allow_gc},{type,{1599,49},boolean,[]}]}]}]]},{type,{1600,7},constraint,[{atom,{1600,7},is_subtype},[{var,{1600,7},'OptionList'},{type,{1600,21},list,[{var,{1600,22},'Option'}]}]]},{type,{1601,7},constraint,[{atom,{1601,7},is_subtype},[{var,{1601,7},'CheckResult'},{type,{1601,22},union,[{type,{1601,22},boolean,[]},{atom,{1601,34},aborted}]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,check_process_code,2},{1521,1},[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,41>>],none,#{group => code,equiv => <<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,91,93,41>>}},{{function,check_old_code,1},{1501,2},[<<99,104,101,99,107,95,111,108,100,95,99,111,100,101,40,77,111,100,117,108,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,96,116,114,117,101,96,32,105,102,32,96,77,111,100,117,108,101,96,32,104,97,115,10,91,111,108,100,32,99,111,100,101,93,40,96,101,58,115,121,115,116,101,109,58,99,111,100,101,95,108,111,97,100,105,110,103,46,109,100,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116,96,41,44,32,111,116,104,101,114,119,105,115,101,32,96,102,97,108,115,101,96,46,10,10,83,101,101,32,97,108,115,111,32,96,109,58,99,111,100,101,96,46>>},#{group => code,specification => [{attribute,{1509,2},spec,{{check_old_code,1},[{type,{1509,21},bounded_fun,[{type,{1509,21},'fun',[{type,{1509,21},product,[{var,{1509,22},'Module'}]},{type,{1509,33},boolean,[]}]},[{type,{1510,7},constraint,[{atom,{1510,7},is_subtype},[{var,{1510,7},'Module'},{type,{1510,17},module,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,ceil,1},{1483,2},[<<99,101,105,108,40,78,117,109,98,101,114,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,108,101,115,115,32,116,104,97,110,32,96,78,117,109,98,101,114,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,99,101,105,108,40,53,46,53,41,46,10,54,10,96,96,96>>},#{group => terms,specification => [{attribute,{1495,2},spec,{{ceil,1},[{type,{1495,11},bounded_fun,[{type,{1495,11},'fun',[{type,{1495,11},product,[{var,{1495,12},'Number'}]},{type,{1495,23},integer,[]}]},[{type,{1496,7},constraint,[{atom,{1496,7},is_subtype},[{var,{1496,7},'Number'},{type,{1496,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,cancel_timer,2},{1417,2},[<<99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,10,111,114,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,46,32,96,84,105,109,101,114,82,101,102,96,32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,10,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46,10,10,96,79,112,116,105,111,110,96,115,58,10,10,45,32,42,42,96,123,97,115,121,110,99,44,32,65,115,121,110,99,125,96,42,42,32,45,32,65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32,96,65,115,121,110,99,96,32,100,101,102,97,117,108,116,115,10,32,32,116,111,32,96,102,97,108,115,101,96,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,87,104,101,110,10,32,32,96,65,115,121,110,99,96,32,105,115,32,115,101,116,32,116,111,32,96,116,114,117,101,96,44,32,116,104,101,32,99,97,110,99,101,108,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,10,32,32,84,104,97,116,32,105,115,44,32,96,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,10,32,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32,96,111,107,96,46,10,10,45,32,42,42,96,123,105,110,102,111,44,32,73,110,102,111,125,96,42,42,32,45,32,82,101,113,117,101,115,116,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,96,82,101,115,117,108,116,96,32,111,102,32,116,104,101,10,32,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32,96,73,110,102,111,96,32,100,101,102,97,117,108,116,115,32,116,111,32,96,116,114,117,101,96,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,103,105,118,101,110,46,10,32,32,87,104,101,110,32,96,73,110,102,111,96,32,105,115,32,115,101,116,32,116,111,32,96,102,97,108,115,101,96,44,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,10,32,32,99,97,110,99,101,108,108,97,116,105,111,110,32,105,115,32,103,105,118,101,110,46,10,10,32,32,45,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,32,96,102,97,108,115,101,96,58,32,105,102,32,96,73,110,102,111,96,32,105,115,32,96,116,114,117,101,96,44,32,116,104,101,32,96,82,101,115,117,108,116,96,32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,10,32,32,32,32,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,46,32,111,116,104,101,114,119,105,115,101,32,96,111,107,96,32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32,45,32,87,104,101,110,32,96,65,115,121,110,99,96,32,105,115,32,96,116,114,117,101,96,58,32,105,102,32,96,73,110,102,111,96,32,105,115,32,96,116,114,117,101,96,44,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,10,32,32,32,32,96,123,99,97,110,99,101,108,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125,96,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,10,32,32,32,32,96,101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41,96,32,119,104,101,110,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,44,10,32,32,32,32,111,116,104,101,114,119,105,115,101,32,110,111,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46,10,10,77,111,114,101,32,96,79,112,116,105,111,110,96,115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,10,99,97,110,99,101,108,101,100,32,116,105,109,101,114,32,119,111,117,108,100,32,104,97,118,101,32,101,120,112,105,114,101,100,46,10,10,73,102,32,96,82,101,115,117,108,116,96,32,105,115,32,96,102,97,108,115,101,96,44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,96,84,105,109,101,114,82,101,102,96,32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,10,84,104,105,115,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,97,108,114,101,97,100,121,32,104,97,100,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,10,98,101,99,97,117,115,101,32,96,84,105,109,101,114,82,101,102,96,32,110,101,118,101,114,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,10,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,105,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,10,62,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,10,62,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,10,62,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,10,62,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,111,114,32,105,115,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,10,62,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,116,114,117,101,125,96,46,32,73,102,32,117,115,105,110,103,10,62,32,111,112,116,105,111,110,32,96,123,97,115,121,110,99,44,32,102,97,108,115,101,125,96,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,98,108,111,99,107,115,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,10,62,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46,10,10,83,101,101,32,97,108,115,111,32,91,96,101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52,96,93,40,96,115,101,110,100,95,97,102,116,101,114,47,52,96,41,44,10,91,96,101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52,96,93,40,96,115,116,97,114,116,95,116,105,109,101,114,47,52,96,41,44,32,97,110,100,10,91,96,101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50,96,93,40,96,114,101,97,100,95,116,105,109,101,114,47,50,96,41,46>>},#{group => time,specification => [{attribute,{1469,2},spec,{{cancel_timer,2},[{type,{1469,19},bounded_fun,[{type,{1469,19},'fun',[{type,{1469,19},product,[{var,{1469,20},'TimerRef'},{var,{1469,30},'Options'}]},{type,{1469,42},union,[{var,{1469,42},'Result'},{atom,{1469,51},ok}]}]},[{type,{1470,7},constraint,[{atom,{1470,7},is_subtype},[{var,{1470,7},'TimerRef'},{type,{1470,19},reference,[]}]]},{type,{1471,7},constraint,[{atom,{1471,7},is_subtype},[{var,{1471,7},'Async'},{type,{1471,16},boolean,[]}]]},{type,{1472,7},constraint,[{atom,{1472,7},is_subtype},[{var,{1472,7},'Info'},{type,{1472,15},boolean,[]}]]},{type,{1473,7},constraint,[{atom,{1473,7},is_subtype},[{var,{1473,7},'Option'},{type,{1473,17},union,[{type,{1473,17},tuple,[{atom,{1473,18},async},{var,{1473,25},'Async'}]},{type,{1473,34},tuple,[{atom,{1473,35},info},{var,{1473,41},'Info'}]}]}]]},{type,{1474,7},constraint,[{atom,{1474,7},is_subtype},[{var,{1474,7},'Options'},{type,{1474,18},list,[{var,{1474,19},'Option'}]}]]},{type,{1475,7},constraint,[{atom,{1475,7},is_subtype},[{var,{1475,7},'Time'},{type,{1475,15},non_neg_integer,[]}]]},{type,{1476,7},constraint,[{atom,{1476,7},is_subtype},[{var,{1476,7},'Result'},{type,{1476,17},union,[{var,{1476,17},'Time'},{atom,{1476,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,cancel_timer,1},{1413,1},[<<99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,41>>],none,#{group => time,equiv => <<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>}},{{function,call_on_load_function,1},{1399,2},[<<99,97,108,108,95,111,110,95,108,111,97,100,95,102,117,110,99,116,105,111,110,40,80,49,41>>],hidden,#{}},{{function,byte_size,1},{1378,2},[<<98,121,116,101,95,115,105,122,101,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,110,101,101,100,101,100,32,116,111,32,99,111,110,116,97,105,110,32,96,66,105,116,115,116,114,105,110,103,96,46,10,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,96,66,105,116,115,116,114,105,110,103,96,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,10,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32,95,117,112,95,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,51,10,96,96,96>>},#{group => terms,specification => [{attribute,{1393,2},spec,{{byte_size,1},[{type,{1393,16},bounded_fun,[{type,{1393,16},'fun',[{type,{1393,16},product,[{var,{1393,17},'Bitstring'}]},{type,{1393,31},non_neg_integer,[]}]},[{type,{1394,7},constraint,[{atom,{1394,7},is_subtype},[{var,{1394,7},'Bitstring'},{type,{1394,20},bitstring,[]}]]}]]}]}}]}},{{function,bump_reductions,1},{1357,2},[<<98,117,109,112,95,114,101,100,117,99,116,105,111,110,115,40,82,101,100,117,99,116,105,111,110,115,41>>],#{<<101,110>> => <<84,104,105,115,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,99,114,101,109,101,110,116,115,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,102,111,114,32,116,104,101,10,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,10,10,73,110,32,116,104,101,32,66,101,97,109,32,101,109,117,108,97,116,111,114,44,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,105,115,32,110,111,114,109,97,108,108,121,32,105,110,99,114,101,109,101,110,116,101,100,32,98,121,32,111,110,101,32,102,111,114,10,101,97,99,104,32,102,117,110,99,116,105,111,110,32,97,110,100,32,66,73,70,32,99,97,108,108,46,32,65,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,32,105,115,32,102,111,114,99,101,100,32,119,104,101,110,32,116,104,101,32,99,111,117,110,116,101,114,32,114,101,97,99,104,101,115,10,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,40,52,48,48,48,32,114,101,100,117,99,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,49,57,46,50,32,97,110,100,32,108,97,116,101,114,41,46,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,84,104,105,115,32,66,73,70,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,66,101,97,109,32,109,97,99,104,105,110,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,10,62,32,119,97,114,110,105,110,103,46,32,73,116,32,105,115,32,117,110,108,105,107,101,108,121,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,111,116,104,101,114,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>},#{group => processes,specification => [{attribute,{1371,2},spec,{{bump_reductions,1},[{type,{1371,22},bounded_fun,[{type,{1371,22},'fun',[{type,{1371,22},product,[{var,{1371,23},'Reductions'}]},{atom,{1371,38},true}]},[{type,{1372,7},constraint,[{atom,{1372,7},is_subtype},[{var,{1372,7},'Reductions'},{type,{1372,21},pos_integer,[]}]]}]]}]}}]}},{{function,bitstring_to_list,1},{1332,2},[<<98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32,96,66,105,116,115,116,114,105,110,103,96,46,10,10,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,111,102,10,116,104,101,32,108,105,115,116,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,49,45,55,32,98,105,116,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,62,62,41,46,10,91,49,44,49,55,55,93,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,91,49,44,49,55,55,44,60,60,51,58,51,62,62,93,10,96,96,96>>},#{group => terms,specification => [{attribute,{1351,2},spec,{{bitstring_to_list,1},[{type,{1351,24},bounded_fun,[{type,{1351,24},'fun',[{type,{1351,24},product,[{var,{1351,25},'Bitstring'}]},{type,{1351,39},list,[{type,{1351,40},union,[{type,{1351,40},byte,[]},{type,{1351,49},bitstring,[]}]}]}]},[{type,{1352,7},constraint,[{atom,{1352,7},is_subtype},[{var,{1352,7},'Bitstring'},{type,{1352,20},bitstring,[]}]]}]]}]}}]}},{{function,bit_size,1},{1313,2},[<<98,105,116,95,115,105,122,101,40,66,105,116,115,116,114,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,105,116,115,32,111,102,32,96,66,105,116,115,116,114,105,110,103,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,116,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,49,57,10,62,32,98,105,116,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,50,52,10,96,96,96>>},#{group => terms,specification => [{attribute,{1326,2},spec,{{bit_size,1},[{type,{1326,15},bounded_fun,[{type,{1326,15},'fun',[{type,{1326,15},product,[{var,{1326,16},'Bitstring'}]},{type,{1326,30},non_neg_integer,[]}]},[{type,{1327,7},constraint,[{atom,{1327,7},is_subtype},[{var,{1327,7},'Bitstring'},{type,{1327,20},bitstring,[]}]]}]]}]}}]}},{{function,binary_to_term,2},{1250,2},[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,44,32,79,112,116,115,41>>],#{<<101,110>> => <<69,113,117,105,118,97,108,101,110,116,32,116,111,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,41,44,32,98,117,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,116,111,10,102,105,116,32,115,112,101,99,105,97,108,32,112,117,114,112,111,115,101,115,46,10,10,84,104,101,32,97,108,108,111,119,101,100,32,111,112,116,105,111,110,115,32,97,114,101,58,10,10,45,32,42,42,96,115,97,102,101,96,42,42,32,45,32,85,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46,10,10,32,32,87,104,101,110,32,101,110,97,98,108,101,100,44,32,105,116,32,112,114,101,118,101,110,116,115,32,100,101,99,111,100,105,110,103,32,100,97,116,97,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,116,116,97,99,107,32,116,104,101,32,69,114,108,97,110,103,10,32,32,114,117,110,116,105,109,101,46,32,73,110,32,116,104,101,32,101,118,101,110,116,32,111,102,32,114,101,99,101,105,118,105,110,103,32,117,110,115,97,102,101,32,100,97,116,97,44,32,100,101,99,111,100,105,110,103,32,102,97,105,108,115,32,119,105,116,104,32,97,32,96,98,97,100,97,114,103,96,10,32,32,101,114,114,111,114,46,10,10,32,32,84,104,105,115,32,112,114,101,118,101,110,116,115,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,100,105,114,101,99,116,108,121,44,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,105,110,100,105,114,101,99,116,108,121,10,32,32,40,97,115,32,116,104,101,121,32,97,114,101,32,101,109,98,101,100,100,101,100,32,105,110,32,99,101,114,116,97,105,110,32,115,116,114,117,99,116,117,114,101,115,44,32,115,117,99,104,32,97,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,10,32,32,114,101,102,115,44,32,97,110,100,32,102,117,110,115,41,44,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,101,120,116,101,114,110,97,108,32,102,117,110,99,116,105,111,110,32,114,101,102,101,114,101,110,99,101,115,46,32,78,111,110,101,32,111,102,10,32,32,116,104,111,115,101,32,114,101,115,111,117,114,99,101,115,32,97,114,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,44,32,115,111,32,117,110,99,104,101,99,107,101,100,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,109,32,99,97,110,10,32,32,101,120,104,97,117,115,116,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,32,32,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,98,97,100,32,97,114,103,117,109,101,110,116,10,32,32,62,32,104,101,108,108,111,46,10,32,32,104,101,108,108,111,10,32,32,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,32,32,104,101,108,108,111,10,32,32,96,96,96,10,10,32,32,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,32,32,62,10,32,32,62,32,84,104,101,32,96,115,97,102,101,96,32,111,112,116,105,111,110,32,101,110,115,117,114,101,115,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,108,121,32,112,114,111,99,101,115,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,10,32,32,62,32,98,117,116,32,105,116,32,100,111,101,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,32,116,111,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,46,32,89,111,117,32,109,117,115,116,10,32,32,62,32,97,108,119,97,121,115,32,118,97,108,105,100,97,116,101,32,100,97,116,97,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,46,32,73,102,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,115,116,111,114,101,100,32,111,114,10,32,32,62,32,116,114,97,110,115,105,116,115,32,116,104,114,111,117,103,104,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,121,111,117,32,115,104,111,117,108,100,32,97,108,115,111,32,99,111,110,115,105,100,101,114,10,32,32,62,32,99,114,121,112,116,111,103,114,97,112,104,105,99,97,108,108,121,32,115,105,103,110,105,110,103,32,105,116,46,10,10,45,32,42,42,96,117,115,101,100,96,42,42,32,45,32,67,104,97,110,103,101,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,116,111,32,96,123,84,101,114,109,44,32,85,115,101,100,125,96,32,119,104,101,114,101,32,96,85,115,101,100,96,32,105,115,32,116,104,101,10,32,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,99,116,117,97,108,108,121,32,114,101,97,100,32,102,114,111,109,32,96,66,105,110,97,114,121,96,46,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,62,32,73,110,112,117,116,32,61,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,44,34,119,111,114,108,100,34,62,62,46,10,32,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,44,49,49,57,44,49,49,49,44,49,49,52,44,49,48,56,44,49,48,48,62,62,10,32,32,62,32,123,84,101,114,109,44,32,85,115,101,100,125,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,73,110,112,117,116,44,32,91,117,115,101,100,93,41,46,10,32,32,123,104,101,108,108,111,44,32,57,125,10,32,32,62,32,115,112,108,105,116,95,98,105,110,97,114,121,40,73,110,112,117,116,44,32,85,115,101,100,41,46,10,32,32,123,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,44,32,60,60,34,119,111,114,108,100,34,62,62,125,10,32,32,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,115,97,102,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,117,110,115,97,102,101,32,100,97,116,97,32,105,115,32,100,101,99,111,100,101,100,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,44,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49,96,44,32,97,110,100,32,96,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49,96,46>>},#{group => terms,specification => [{attribute,{1303,2},spec,{{binary_to_term,2},[{type,{1303,21},bounded_fun,[{type,{1303,21},'fun',[{type,{1303,21},product,[{var,{1303,22},'Binary'},{var,{1303,30},'Opts'}]},{type,{1303,39},union,[{type,{1303,39},term,[]},{type,{1303,48},tuple,[{type,{1303,49},term,[]},{var,{1303,57},'Used'}]}]}]},[{type,{1304,7},constraint,[{atom,{1304,7},is_subtype},[{var,{1304,7},'Binary'},{user_type,{1304,17},ext_binary,[]}]]},{type,{1305,7},constraint,[{atom,{1305,7},is_subtype},[{var,{1305,7},'Opt'},{type,{1305,14},union,[{atom,{1305,14},safe},{atom,{1305,21},used}]}]]},{type,{1306,7},constraint,[{atom,{1306,7},is_subtype},[{var,{1306,7},'Opts'},{type,{1306,15},list,[{var,{1306,16},'Opt'}]}]]},{type,{1307,7},constraint,[{atom,{1307,7},is_subtype},[{var,{1307,7},'Used'},{type,{1307,15},pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,binary_to_term,1},{1221,2},[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,121,32,111,98,106,101,99,116,32,96,66,105,110,97,114,121,96,44,10,119,104,105,99,104,32,109,117,115,116,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,10,91,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,93,40,101,114,108,95,101,120,116,95,100,105,115,116,46,109,100,41,46,10,10,96,96,96,101,114,108,97,110,103,10,62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111,10,96,96,96,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,87,104,101,110,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,116,104,101,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,109,97,121,32,115,117,98,109,105,116,10,62,32,100,97,116,97,32,105,110,32,97,32,119,97,121,32,116,111,32,99,114,101,97,116,101,32,114,101,115,111,117,114,99,101,115,44,32,115,117,99,104,32,97,115,32,97,116,111,109,115,32,97,110,100,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,115,44,32,116,104,97,116,10,62,32,99,97,110,110,111,116,32,98,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,32,97,110,100,32,108,101,97,100,32,116,111,32,68,101,110,105,97,108,32,111,102,32,83,101,114,118,105,99,101,32,97,116,116,97,99,107,46,32,73,110,32,115,117,99,104,10,62,32,99,97,115,101,115,44,32,99,111,110,115,105,100,101,114,32,117,115,105,110,103,32,91,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,41,32,119,105,116,104,32,116,104,101,32,96,115,97,102,101,96,10,62,32,111,112,116,105,111,110,46,10,10,83,101,101,32,97,108,115,111,32,96,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49,96,32,97,110,100,32,96,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50,96,46>>},#{group => terms,specification => [{attribute,{1244,2},spec,{{binary_to_term,1},[{type,{1244,21},bounded_fun,[{type,{1244,21},'fun',[{type,{1244,21},product,[{var,{1244,22},'Binary'}]},{type,{1244,33},term,[]}]},[{type,{1245,7},constraint,[{atom,{1245,7},is_subtype},[{var,{1245,7},'Binary'},{user_type,{1245,17},ext_binary,[]}]]}]]}]}}]}},{{function,binary_to_list,3},{1201,2},[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,40,66,105,110,97,114,121,44,32,83,116,97,114,116,44,32,83,116,111,112,41>>],#{<<101,110>> => <<65,115,32,91,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49,96,41,44,32,98,117,116,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32,96,83,116,97,114,116,96,32,116,111,32,112,111,115,105,116,105,111,110,32,96,83,116,111,112,96,32,105,110,32,96,66,105,110,97,114,121,96,46,10,84,104,101,32,112,111,115,105,116,105,111,110,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,97,114,101,32,110,117,109,98,101,114,101,100,32,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,95,84,104,101,32,111,110,101,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,32,102,111,114,32,98,105,110,97,114,105,101,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,95,32,78,101,119,10,62,32,99,111,100,101,32,105,115,32,116,111,32,117,115,101,32,96,98,105,110,97,114,121,58,98,105,110,95,116,111,95,108,105,115,116,47,51,96,32,105,110,32,83,84,68,76,73,66,32,105,110,115,116,101,97,100,46,32,65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,10,62,32,109,111,100,117,108,101,32,96,98,105,110,97,114,121,96,32,99,111,110,115,105,115,116,101,110,116,108,121,32,117,115,101,32,122,101,114,111,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,46>>},#{group => terms,specification => [{attribute,{1213,2},spec,{{binary_to_list,3},[{type,{1213,21},bounded_fun,[{type,{1213,21},'fun',[{type,{1213,21},product,[{var,{1213,22},'Binary'},{var,{1213,30},'Start'},{var,{1213,37},'Stop'}]},{type,{1213,46},list,[{type,{1213,47},byte,[]}]}]},[{type,{1214,7},constraint,[{atom,{1214,7},is_subtype},[{var,{1214,7},'Binary'},{type,{1214,17},binary,[]}]]},{type,{1215,7},constraint,[{atom,{1215,7},is_subtype},[{var,{1215,7},'Start'},{type,{1215,16},pos_integer,[]}]]},{type,{1216,7},constraint,[{atom,{1216,7},is_subtype},[{var,{1216,7},'Stop'},{type,{1216,15},pos_integer,[]}]]}]]}]}}]}},{{function,binary_to_list,1},{1193,2},[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32,96,66,105,110,97,114,121,96,46>>},#{group => terms,specification => [{attribute,{1195,2},spec,{{binary_to_list,1},[{type,{1195,21},bounded_fun,[{type,{1195,21},'fun',[{type,{1195,21},product,[{var,{1195,22},'Binary'}]},{type,{1195,33},list,[{type,{1195,34},byte,[]}]}]},[{type,{1196,7},constraint,[{atom,{1196,7},is_subtype},[{var,{1196,7},'Binary'},{type,{1196,17},binary,[]}]]}]]}]}}]}},{{function,binary_to_integer,2},{1015,2},[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,66,105,110,97,114,121,44,32,66,97,115,101,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32,96,66,97,115,101,96,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,51,70,70,34,62,62,44,32,49,54,41,46,10,49,48,50,51,10,96,96,96,10,10,91,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50,96,41,32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,10,97,115,32,96,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{1032,2},spec,{{binary_to_integer,2},[{type,{1032,24},bounded_fun,[{type,{1032,24},'fun',[{type,{1032,24},product,[{var,{1032,25},'Binary'},{var,{1032,33},'Base'}]},{type,{1032,42},integer,[]}]},[{type,{1033,7},constraint,[{atom,{1033,7},is_subtype},[{var,{1033,7},'Binary'},{type,{1033,17},binary,[]}]]},{type,{1034,7},constraint,[{atom,{1034,7},is_subtype},[{var,{1034,7},'Base'},{type,{1034,15},range,[{integer,{1034,15},2},{integer,{1034,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,1},{980,2},[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,49,50,51,34,62,62,41,46,10,49,50,51,10,96,96,96,10,10,91,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49,96,93,40,96,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49,96,41,32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,10,97,115,32,96,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49,96,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>},#{group => terms,specification => [{attribute,{997,2},spec,{{binary_to_integer,1},[{type,{997,24},bounded_fun,[{type,{997,24},'fun',[{type,{997,24},product,[{var,{997,25},'Binary'}]},{type,{997,36},integer,[]}]},[{type,{998,7},constraint,[{atom,{998,7},is_subtype},[{var,{998,7},'Binary'},{type,{998,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_float,1},{956,2},[<<98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,66,105,110,97,114,121,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,60,60,34,50,46,50,48,49,55,55,54,52,101,43,48,34,62,62,41,46,10,50,46,50,48,49,55,55,54,52,10,96,96,96,10,10,84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,10,91,69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,96,41,32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,10,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,66,105,110,97,114,121,96,32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>},#{group => terms,specification => [{attribute,{974,2},spec,{{binary_to_float,1},[{type,{974,22},bounded_fun,[{type,{974,22},'fun',[{type,{974,22},product,[{var,{974,23},'Binary'}]},{type,{974,34},float,[]}]},[{type,{975,7},constraint,[{atom,{975,7},is_subtype},[{var,{975,7},'Binary'},{type,{975,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_existing_atom,2},{914,2},[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<65,115,32,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,44,32,98,117,116,32,116,104,101,32,97,116,111,109,32,109,117,115,116,32,101,120,105,115,116,46,10,10,84,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,104,97,115,32,97,32,91,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,32,102,111,114,32,116,104,101,10,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,44,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,10,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,110,111,116,32,115,97,102,101,32,116,111,32,99,114,101,97,116,101,32,109,97,110,121,32,97,116,111,109,115,32,102,114,111,109,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,99,111,109,101,32,102,114,111,109,32,97,110,10,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,105,108,101,32,102,101,116,99,104,101,100,32,102,114,111,109,32,116,104,101,32,73,110,116,101,114,110,101,116,41,44,32,102,111,114,32,101,120,97,109,112,108,101,44,10,117,115,105,110,103,32,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,117,115,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,111,110,32,119,104,101,110,32,116,104,101,10,105,110,112,117,116,32,98,105,110,97,114,121,32,99,111,109,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46,10,10,65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,97,110,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,119,104,101,110,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,111,114,10,119,104,101,110,32,99,114,101,97,116,101,100,32,112,114,111,103,114,97,109,109,97,116,105,99,97,108,108,121,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,98,121,10,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,41,46,32,83,101,101,32,116,104,101,32,110,101,120,116,32,110,111,116,101,32,102,111,114,32,97,110,32,101,120,97,109,112,108,101,32,111,102,10,119,104,101,110,32,97,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,32,102,111,114,32,97,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,98,117,116,32,110,111,116,32,105,110,32,116,104,101,10,99,111,109,112,105,108,101,100,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,109,111,100,117,108,101,46,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,116,104,101,32,97,116,111,109,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,10,62,32,114,101,119,114,105,116,101,32,91,96,97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41,96,93,40,96,97,116,111,109,95,116,111,95,108,105,115,116,47,49,96,41,32,116,111,32,96,34,115,111,109,101,95,97,116,111,109,34,96,46,32,73,102,10,62,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32,96,115,111,109,101,95,97,116,111,109,96,32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,10,62,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,10,62,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,10,62,32,91,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,60,60,34,115,111,109,101,95,97,116,111,109,34,62,62,44,32,117,116,102,56,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,41,10,62,32,119,105,108,108,32,102,97,105,108,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46>>},#{group => terms,specification => [{attribute,{949,2},spec,{{binary_to_existing_atom,2},[{type,{949,30},bounded_fun,[{type,{949,30},'fun',[{type,{949,30},product,[{var,{949,31},'Binary'},{var,{949,39},'Encoding'}]},{type,{949,52},atom,[]}]},[{type,{950,7},constraint,[{atom,{950,7},is_subtype},[{var,{950,7},'Binary'},{type,{950,17},binary,[]}]]},{type,{951,7},constraint,[{atom,{951,7},is_subtype},[{var,{951,7},'Encoding'},{type,{951,19},union,[{atom,{951,19},latin1},{atom,{951,28},unicode},{atom,{951,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_existing_atom,1},{906,1},[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_atom,2},{857,2},[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,96,66,105,110,97,114,121,96,46,32,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,117,116,102,56,96,10,111,114,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,98,105,110,97,114,121,32,109,117,115,116,32,99,111,110,116,97,105,110,32,118,97,108,105,100,32,85,84,70,45,56,32,115,101,113,117,101,110,99,101,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,32,105,115,10,62,32,99,97,112,97,98,108,101,32,111,102,32,100,101,99,111,100,105,110,103,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,119,111,117,108,100,32,102,97,105,108,32,105,102,32,116,104,101,10,62,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,101,100,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,62,32,50,53,53,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,10,62,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,10,62,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,96,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,10,62,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,119,104,101,116,104,101,114,10,62,32,91,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50,96,41,32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,10,62,32,116,104,97,110,32,91,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,93,40,96,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50,96,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,10,62,32,105,110,32,91,69,102,102,105,99,105,101,110,99,121,32,71,117,105,100,101,32,40,115,101,99,116,105,111,110,32,83,121,115,116,101,109,32,76,105,109,105,116,115,41,93,40,96,101,58,115,121,115,116,101,109,58,115,121,115,116,101,109,95,108,105,109,105,116,115,46,109,100,35,97,116,111,109,115,96,41,46,10,10,69,120,97,109,112,108,101,115,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,34,69,114,108,97,110,103,34,62,62,44,32,108,97,116,105,110,49,41,46,10,39,69,114,108,97,110,103,39,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,49,48,50,52,47,117,116,102,56,62,62,44,32,117,116,102,56,41,46,10,39,208,128,39,10,96,96,96>>},#{group => terms,specification => [{attribute,{894,2},spec,{{binary_to_atom,2},[{type,{894,21},bounded_fun,[{type,{894,21},'fun',[{type,{894,21},product,[{var,{894,22},'Binary'},{var,{894,30},'Encoding'}]},{type,{894,43},atom,[]}]},[{type,{895,7},constraint,[{atom,{895,7},is_subtype},[{var,{895,7},'Binary'},{type,{895,17},binary,[]}]]},{type,{896,7},constraint,[{atom,{896,7},is_subtype},[{var,{896,7},'Encoding'},{type,{896,19},union,[{atom,{896,19},latin1},{atom,{896,28},unicode},{atom,{896,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_atom,1},{849,1},[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_part,3},{840,1},[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,83,116,97,114,116,44,32,76,101,110,103,116,104,41>>],none,#{group => terms,equiv => <<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,123,83,116,97,114,116,44,32,76,101,110,103,116,104,125,41>>,since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_part,2},{798,2},[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,80,111,115,76,101,110,41>>],#{<<101,110>> => <<69,120,116,114,97,99,116,115,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,101,115,99,114,105,98,101,100,32,98,121,32,96,80,111,115,76,101,110,96,46,10,10,78,101,103,97,116,105,118,101,32,108,101,110,103,116,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,120,116,114,97,99,116,32,98,121,116,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,98,105,110,97,114,121,46,32,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,44,49,48,62,62,46,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,98,121,116,101,95,115,105,122,101,40,66,105,110,41,44,32,45,53,125,41,46,10,60,60,54,44,55,44,56,44,57,44,49,48,62,62,10,96,96,96,10,10,70,97,105,108,117,114,101,58,32,96,98,97,100,97,114,103,96,32,105,102,32,96,80,111,115,76,101,110,96,32,105,110,32,97,110,121,32,119,97,121,32,114,101,102,101,114,101,110,99,101,115,32,111,117,116,115,105,100,101,32,116,104,101,32,98,105,110,97,114,121,46,10,10,96,83,116,97,114,116,96,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,116,104,97,116,32,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,62,62,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,48,44,50,125,41,46,10,60,60,49,44,50,62,62,10,96,96,96,10,10,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,96,80,111,115,76,101,110,96,32,115,101,109,97,110,116,105,99,115,44,32,115,101,101,32,96,109,58,98,105,110,97,114,121,96,46>>},#{group => terms,specification => [{attribute,{825,2},spec,{{binary_part,2},[{type,{825,18},bounded_fun,[{type,{825,18},'fun',[{type,{825,18},product,[{var,{825,19},'Subject'},{var,{825,28},'PosLen'}]},{type,{825,39},binary,[]}]},[{type,{826,7},constraint,[{atom,{826,7},is_subtype},[{var,{826,7},'Subject'},{type,{826,18},binary,[]}]]},{type,{827,7},constraint,[{atom,{827,7},is_subtype},[{var,{827,7},'PosLen'},{type,{827,17},tuple,[{ann_type,{827,18},[{var,{827,18},'Start'},{type,{827,27},non_neg_integer,[]}]},{ann_type,{827,46},[{var,{827,46},'Length'},{type,{827,56},integer,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,atom_to_list,1},{772,2},[<<97,116,111,109,95,116,111,95,108,105,115,116,40,65,116,111,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,117,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10,111,102,32,96,65,116,111,109,96,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,69,114,108,97,110,103,39,41,46,10,34,69,114,108,97,110,103,34,10,96,96,96,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,228,189,160,229,165,189,39,41,46,10,91,50,48,51,50,48,44,50,50,57,48,57,93,10,96,96,96,10,10,83,101,101,32,96,109,58,117,110,105,99,111,100,101,96,32,102,111,114,32,104,111,119,32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,116,111,32,100,105,102,102,101,114,101,110,116,32,102,111,114,109,97,116,115,46>>},#{group => terms,specification => [{attribute,{791,2},spec,{{atom_to_list,1},[{type,{791,19},bounded_fun,[{type,{791,19},'fun',[{type,{791,19},product,[{var,{791,20},'Atom'}]},{type,{791,29},string,[]}]},[{type,{792,7},constraint,[{atom,{792,7},is_subtype},[{var,{792,7},'Atom'},{type,{792,15},atom,[]}]]}]]}]}}]}},{{function,atom_to_binary,2},{744,2},[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,69,110,99,111,100,105,110,103,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,96,65,116,111,109,96,46,10,10,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,108,97,116,105,110,49,96,44,32,111,110,101,32,98,121,116,101,32,101,120,105,115,116,115,32,102,111,114,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,116,101,120,116,10,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,73,102,32,96,69,110,99,111,100,105,110,103,96,32,105,115,32,96,117,116,102,56,96,32,111,114,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,10,117,115,105,110,103,32,85,84,70,45,56,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,114,101,113,117,105,114,101,32,109,117,108,116,105,112,108,101,32,98,121,116,101,115,46,10,10,62,32,35,35,35,35,32,67,104,97,110,103,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,97,116,111,109,115,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,97,110,100,10,62,32,91,96,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,108,97,116,105,110,49,41,96,93,40,96,97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50,96,41,32,109,97,121,32,102,97,105,108,32,105,102,32,116,104,101,32,116,101,120,116,10,62,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,96,65,116,111,109,96,32,99,111,110,116,97,105,110,115,32,97,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,62,32,50,53,53,46,10,10,69,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,39,69,114,108,97,110,103,39,44,32,108,97,116,105,110,49,41,46,10,60,60,34,69,114,108,97,110,103,34,62,62,10,96,96,96>>},#{group => terms,specification => [{attribute,{765,2},spec,{{atom_to_binary,2},[{type,{765,21},bounded_fun,[{type,{765,21},'fun',[{type,{765,21},product,[{var,{765,22},'Atom'},{var,{765,28},'Encoding'}]},{type,{765,41},binary,[]}]},[{type,{766,7},constraint,[{atom,{766,7},is_subtype},[{var,{766,7},'Atom'},{type,{766,15},atom,[]}]]},{type,{767,7},constraint,[{atom,{767,7},is_subtype},[{var,{767,7},'Encoding'},{type,{767,19},union,[{atom,{767,19},latin1},{atom,{767,28},unicode},{atom,{767,38},utf8}]}]]}]]}]}}]}},{{function,atom_to_binary,1},{735,1},[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,41>>],none,#{group => terms,equiv => <<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,117,116,102,56,41>>,since => <<79,84,80,32,50,51,46,48>>}},{{function,append_element,2},{706,2},[<<97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,84,117,112,108,101,49,44,32,84,101,114,109,41>>],#{<<101,110>> => <<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,116,104,97,116,32,104,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,109,111,114,101,32,116,104,97,110,32,96,84,117,112,108,101,49,96,44,32,97,110,100,32,99,111,110,116,97,105,110,115,32,116,104,101,10,101,108,101,109,101,110,116,115,32,105,110,32,96,84,117,112,108,101,49,96,32,102,111,108,108,111,119,101,100,32,98,121,32,96,84,101,114,109,96,32,97,115,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,46,10,10,83,101,109,97,110,116,105,99,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,91,96,108,105,115,116,95,116,111,95,116,117,112,108,101,40,116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,49,41,32,43,43,32,91,84,101,114,109,93,41,96,93,40,96,108,105,115,116,95,116,111,95,116,117,112,108,101,47,49,96,41,44,32,98,117,116,32,109,117,99,104,10,102,97,115,116,101,114,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,62,32,101,114,108,97,110,103,58,97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,123,111,110,101,44,32,116,119,111,125,44,32,116,104,114,101,101,41,46,10,123,111,110,101,44,116,119,111,44,116,104,114,101,101,125,10,96,96,96>>},#{group => terms,specification => [{attribute,{722,2},spec,{{append_element,2},[{type,{722,21},bounded_fun,[{type,{722,21},'fun',[{type,{722,21},product,[{var,{722,22},'Tuple1'},{var,{722,30},'Term'}]},{var,{722,39},'Tuple2'}]},[{type,{723,7},constraint,[{atom,{723,7},is_subtype},[{var,{723,7},'Tuple1'},{type,{723,17},tuple,any}]]},{type,{724,7},constraint,[{atom,{724,7},is_subtype},[{var,{724,7},'Tuple2'},{type,{724,17},tuple,any}]]},{type,{725,7},constraint,[{atom,{725,7},is_subtype},[{var,{725,7},'Term'},{type,{725,15},term,[]}]]}]]}]}}]}},{{function,adler32_combine,3},{676,2},[<<97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,70,105,114,115,116,65,100,108,101,114,44,32,83,101,99,111,110,100,65,100,108,101,114,44,32,83,101,99,111,110,100,83,105,122,101,41>>],#{<<101,110>> => <<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,115,46,10,10,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,10,116,111,32,98,101,32,107,110,111,119,110,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,89,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,90,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{698,2},spec,{{adler32_combine,3},[{type,{698,22},bounded_fun,[{type,{698,22},'fun',[{type,{698,22},product,[{var,{698,23},'FirstAdler'},{var,{698,35},'SecondAdler'},{var,{698,48},'SecondSize'}]},{type,{698,63},non_neg_integer,[]}]},[{type,{699,7},constraint,[{atom,{699,7},is_subtype},[{var,{699,7},'FirstAdler'},{type,{699,21},non_neg_integer,[]}]]},{type,{700,7},constraint,[{atom,{700,7},is_subtype},[{var,{700,7},'SecondAdler'},{type,{700,22},non_neg_integer,[]}]]},{type,{701,7},constraint,[{atom,{701,7},is_subtype},[{var,{701,7},'SecondSize'},{type,{701,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,adler32,2},{651,2},[<<97,100,108,101,114,51,50,40,79,108,100,65,100,108,101,114,44,32,68,97,116,97,41>>],#{<<101,110>> => <<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,10,96,79,108,100,65,100,108,101,114,96,44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32,96,68,97,116,97,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58,10,10,96,96,96,101,114,108,97,110,103,10,88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,88,44,68,97,116,97,50,41,46,10,96,96,96,10,10,97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32,96,89,96,32,97,115,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46,10,96,96,96>>},#{group => checksum,specification => [{attribute,{669,2},spec,{{adler32,2},[{type,{669,14},bounded_fun,[{type,{669,14},'fun',[{type,{669,14},product,[{var,{669,15},'OldAdler'},{var,{669,25},'Data'}]},{type,{669,34},non_neg_integer,[]}]},[{type,{670,7},constraint,[{atom,{670,7},is_subtype},[{var,{670,7},'OldAdler'},{type,{670,19},non_neg_integer,[]}]]},{type,{671,7},constraint,[{atom,{671,7},is_subtype},[{var,{671,7},'Data'},{type,{671,15},iodata,[]}]]}]]}]}}]}},{{function,adler32,1},{643,2},[<<97,100,108,101,114,51,50,40,68,97,116,97,41>>],#{<<101,110>> => <<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,102,111,114,32,96,68,97,116,97,96,46>>},#{group => checksum,specification => [{attribute,{645,2},spec,{{adler32,1},[{type,{645,14},bounded_fun,[{type,{645,14},'fun',[{type,{645,14},product,[{var,{645,15},'Data'}]},{type,{645,24},non_neg_integer,[]}]},[{type,{646,7},constraint,[{atom,{646,7},is_subtype},[{var,{646,7},'Data'},{type,{646,15},iodata,[]}]]}]]}]}}]}}]}. \ No newline at end of file diff --git a/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1 index 8555b81a9572..814b3cf2b60c 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1 +++ b/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1 @@ -1 +1 @@ -{docs_v1,[{file,[46,46,47,100,111,99,47,115,114,99,47,114,101,46,109,100]},{location,{1,1}}],erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,#{<<101,110>> => <<84,104,105,115,32,109,111,100,117,108,101,32,99,111,110,116,97,105,110,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,102,111,114,32,115,116,114,105,110,103,115,32,97,110,100,10,98,105,110,97,114,105,101,115,46,10,10,84,104,101,32,91,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,101,114,108,45,108,105,107,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,115,121,110,116,97,120,96,41,32,115,121,110,116,97,120,32,97,110,100,10,115,101,109,97,110,116,105,99,115,32,114,101,115,101,109,98,108,101,32,116,104,97,116,32,111,102,32,80,101,114,108,46,10,10,84,104,101,32,109,97,116,99,104,105,110,103,32,97,108,103,111,114,105,116,104,109,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,97,114,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,44,32,98,117,116,32,110,111,116,10,97,108,108,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,115,32,105,110,116,101,114,102,97,99,101,100,32,97,110,100,32,115,111,109,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,103,111,32,98,101,121,111,110,100,10,119,104,97,116,32,80,67,82,69,32,111,102,102,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,80,67,82,69,32,118,101,114,115,105,111,110,32,56,46,52,48,32,40,114,101,108,101,97,115,101,32,100,97,116,101,32,50,48,49,55,45,48,49,45,49,49,41,32,105,115,32,117,115,101,100,46,10,84,104,101,32,115,101,99,116,105,111,110,115,32,111,102,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,97,114,101,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,10,105,110,99,108,117,100,101,100,32,104,101,114,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,69,114,108,97,110,103,32,108,105,116,101,114,97,108,32,115,121,110,116,97,120,32,102,111,114,32,115,116,114,105,110,103,115,32,117,115,101,115,32,116,104,101,32,96,92,92,96,32,40,98,97,99,107,115,108,97,115,104,41,32,99,104,97,114,97,99,116,101,114,32,97,115,10,62,32,97,110,32,101,115,99,97,112,101,32,99,111,100,101,46,32,89,111,117,32,110,101,101,100,32,116,111,32,101,115,99,97,112,101,32,98,97,99,107,115,108,97,115,104,101,115,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,98,111,116,104,32,105,110,10,62,32,121,111,117,114,32,99,111,100,101,32,97,110,100,32,105,110,32,116,104,101,32,115,104,101,108,108,44,32,119,105,116,104,32,97,110,32,101,120,116,114,97,32,98,97,99,107,115,108,97,115,104,44,32,116,104,97,116,32,105,115,44,32,96,34,92,92,92,92,34,96,32,111,114,10,62,32,96,60,60,34,92,92,92,92,34,62,62,96,46,10,62,10,62,32,83,105,110,99,101,32,69,114,108,97,110,103,47,79,84,80,32,50,55,32,121,111,117,32,99,97,110,32,117,115,101,32,91,118,101,114,98,97,116,105,109,32,115,105,103,105,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,115,105,103,105,108,96,41,10,62,32,116,111,32,119,114,105,116,101,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,46,32,84,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,32,119,111,117,108,100,32,98,101,32,119,114,105,116,116,101,110,32,97,115,32,96,126,83,34,92,34,96,32,111,114,32,96,126,66,34,92,34,96,46,10,10,35,35,32,80,101,114,108,45,76,105,107,101,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,83,121,110,116,97,120,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,99,111,110,116,97,105,110,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,102,111,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,10,117,115,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,119,105,116,104,10,99,104,97,110,103,101,115,32,119,104,101,114,101,32,116,104,105,115,32,109,111,100,117,108,101,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,46,10,10,35,35,32,80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,10,10,84,104,101,32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,32,97,114,101,10,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,46,32,80,101,114,108,39,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,10,100,101,115,99,114,105,98,101,100,32,105,110,32,105,116,115,32,111,119,110,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,101,110,101,114,97,108,32,97,114,101,10,99,111,118,101,114,101,100,32,105,110,32,109,97,110,121,32,98,111,111,107,115,44,32,115,111,109,101,32,119,105,116,104,32,99,111,112,105,111,117,115,32,101,120,97,109,112,108,101,115,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,34,77,97,115,116,101,114,105,110,103,10,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,115,34,44,32,112,117,98,108,105,115,104,101,100,32,98,121,32,79,39,82,101,105,108,108,121,44,32,99,111,118,101,114,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,114,101,97,116,10,100,101,116,97,105,108,46,32,84,104,105,115,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,80,67,82,69,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,105,110,116,101,110,100,101,100,32,97,115,10,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,46,10,10,84,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,58,10,10,45,32,91,83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115,93,40,96,109,58,114,101,35,115,101,99,116,49,96,41,10,45,32,91,67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,50,96,41,10,45,32,91,66,97,99,107,115,108,97,115,104,93,40,96,109,58,114,101,35,115,101,99,116,51,96,41,10,45,32,91,67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114,93,40,96,109,58,114,101,35,115,101,99,116,52,96,41,10,45,32,91,70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,92,78,93,40,96,109,58,114,101,35,115,101,99,116,53,96,41,10,45,32,91,77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116,93,40,96,109,58,114,101,35,115,101,99,116,54,96,41,10,45,32,91,83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,93,40,96,109,58,114,101,35,115,101,99,116,55,96,41,10,45,32,91,80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,93,40,96,109,58,114,101,35,115,101,99,116,56,96,41,10,45,32,91,86,101,114,116,105,99,97,108,32,66,97,114,93,40,96,109,58,114,101,35,115,101,99,116,57,96,41,10,45,32,91,73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103,93,40,96,109,58,114,101,35,115,101,99,116,49,48,96,41,10,45,32,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,10,45,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,10,45,32,91,78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,51,96,41,10,45,32,91,82,101,112,101,116,105,116,105,111,110,93,40,96,109,58,114,101,35,115,101,99,116,49,52,96,41,10,45,32,91,65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,53,96,41,10,45,32,91,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,93,40,96,109,58,114,101,35,115,101,99,116,49,54,96,41,10,45,32,91,65,115,115,101,114,116,105,111,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,55,96,41,10,45,32,91,67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,56,96,41,10,45,32,91,67,111,109,109,101,110,116,115,93,40,96,109,58,114,101,35,115,101,99,116,49,57,96,41,10,45,32,91,82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,50,48,96,41,10,45,32,91,83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,93,40,96,109,58,114,101,35,115,101,99,116,50,49,96,41,10,45,32,91,79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120,93,40,96,109,58,114,101,35,115,101,99,116,50,50,96,41,10,45,32,91,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,93,40,96,109,58,114,101,35,115,101,99,116,50,51,96,41,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,32,125,10,10,35,35,32,83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115,10,10,83,111,109,101,32,111,112,116,105,111,110,115,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,96,99,111,109,112,105,108,101,47,50,96,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,115,112,101,99,105,97,108,32,105,116,101,109,115,10,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,98,117,116,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,10,109,97,107,101,32,116,104,101,115,101,32,111,112,116,105,111,110,115,32,97,99,99,101,115,115,105,98,108,101,32,116,111,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,115,32,119,104,111,32,97,114,101,32,110,111,116,32,97,98,108,101,32,116,111,32,99,104,97,110,103,101,32,116,104,101,10,112,114,111,103,114,97,109,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,99,97,110,32,97,112,112,101,97,114,44,32,98,117,116,10,116,104,101,121,32,109,117,115,116,32,97,108,108,32,98,101,32,116,111,103,101,116,104,101,114,32,114,105,103,104,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,10,108,101,116,116,101,114,115,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46,10,10,95,85,84,70,32,83,117,112,112,111,114,116,95,10,10,85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,115,32,98,97,115,105,99,97,108,108,121,32,85,84,70,45,56,32,98,97,115,101,100,46,32,84,111,32,117,115,101,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,44,32,121,111,117,32,101,105,116,104,101,114,10,99,97,108,108,32,96,99,111,109,112,105,108,101,47,50,96,32,111,114,32,96,114,117,110,47,51,96,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,44,32,111,114,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,115,116,97,114,116,10,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,58,10,10,96,96,96,116,101,120,116,10,40,42,85,84,70,56,41,10,40,42,85,84,70,41,10,96,96,96,10,10,66,111,116,104,32,111,112,116,105,111,110,115,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,44,32,116,104,101,32,105,110,112,117,116,32,115,116,114,105,110,103,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,85,84,70,45,56,46,10,78,111,116,105,99,101,32,116,104,97,116,32,119,105,116,104,32,116,104,101,115,101,32,105,110,115,116,114,117,99,116,105,111,110,115,44,32,116,104,101,32,97,117,116,111,109,97,116,105,99,32,99,111,110,118,101,114,115,105,111,110,32,111,102,32,108,105,115,116,115,32,116,111,32,85,84,70,45,56,10,105,115,32,110,111,116,32,112,101,114,102,111,114,109,101,100,32,98,121,32,116,104,101,32,96,114,101,96,32,102,117,110,99,116,105,111,110,115,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,10,114,101,99,111,109,109,101,110,100,101,100,46,32,65,100,100,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,119,104,101,110,32,114,117,110,110,105,110,103,32,96,99,111,109,112,105,108,101,47,50,96,32,105,110,115,116,101,97,100,46,10,10,83,111,109,101,32,97,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,108,108,111,119,32,116,104,101,105,114,32,117,115,101,114,115,32,116,111,32,115,117,112,112,108,121,32,112,97,116,116,101,114,110,115,32,99,97,110,32,119,105,115,104,32,116,111,32,114,101,115,116,114,105,99,116,10,116,104,101,109,32,116,111,32,110,111,110,45,85,84,70,32,100,97,116,97,32,102,111,114,32,115,101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,46,32,73,102,32,111,112,116,105,111,110,32,96,110,101,118,101,114,95,117,116,102,96,32,105,115,32,115,101,116,32,97,116,10,99,111,109,112,105,108,101,32,116,105,109,101,44,32,40,92,42,85,84,70,41,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,44,32,97,110,100,32,116,104,101,105,114,32,97,112,112,101,97,114,97,110,99,101,32,99,97,117,115,101,115,10,97,110,32,101,114,114,111,114,46,10,10,95,85,110,105,99,111,100,101,32,80,114,111,112,101,114,116,121,32,83,117,112,112,111,114,116,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,97,110,111,116,104,101,114,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,116,104,97,116,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,10,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,42,85,67,80,41,10,96,96,96,10,10,84,104,105,115,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,58,32,105,116,32,99,97,117,115,101,115,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,10,96,92,100,96,32,97,110,100,32,96,92,119,96,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,105,110,115,116,101,97,100,32,111,102,10,114,101,99,111,103,110,105,122,105,110,103,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,115,32,60,32,50,53,54,32,116,104,114,111,117,103,104,32,97,32,108,111,111,107,117,112,32,116,97,98,108,101,46,10,10,95,68,105,115,97,98,108,105,110,103,32,83,116,97,114,116,117,112,32,79,112,116,105,109,105,122,97,116,105,111,110,115,95,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,96,40,42,78,79,95,83,84,65,82,84,95,79,80,84,41,96,44,32,105,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,10,111,112,116,105,111,110,32,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,10,10,95,78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115,95,10,10,91,93,40,41,123,58,32,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115,32,125,10,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,105,118,101,32,99,111,110,118,101,110,116,105,111,110,115,32,102,111,114,32,105,110,100,105,99,97,116,105,110,103,32,108,105,110,101,32,98,114,101,97,107,115,32,105,110,32,115,116,114,105,110,103,115,58,32,97,32,115,105,110,103,108,101,10,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,41,32,99,104,97,114,97,99,116,101,114,44,32,97,32,115,105,110,103,108,101,32,76,70,32,40,108,105,110,101,32,102,101,101,100,41,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,10,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,97,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,44,32,97,110,100,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,10,115,101,113,117,101,110,99,101,46,10,10,65,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,10,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,118,101,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,40,92,42,67,82,41,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,10,10,45,32,42,42,40,92,42,76,70,41,42,42,32,45,32,76,105,110,101,32,102,101,101,100,10,10,45,32,42,42,40,92,42,67,82,76,70,41,42,42,32,45,32,62,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,102,111,108,108,111,119,101,100,32,98,121,32,108,105,110,101,32,102,101,101,100,10,10,45,32,42,42,40,92,42,65,78,89,67,82,76,70,41,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,97,98,111,118,101,10,10,45,32,42,42,40,92,42,65,78,89,41,42,42,32,45,32,65,108,108,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,10,10,84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,96,99,111,109,112,105,108,101,47,50,96,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,99,104,97,110,103,101,115,32,116,104,101,32,99,111,110,118,101,110,116,105,111,110,32,116,111,32,67,82,58,10,10,96,96,96,116,101,120,116,10,40,42,67,82,41,97,46,98,10,96,96,96,10,10,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,96,97,92,110,98,96,44,32,97,115,32,76,70,32,105,115,32,110,111,32,108,111,110,103,101,114,32,97,32,110,101,119,108,105,110,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,10,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,10,10,84,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,97,102,102,101,99,116,115,32,119,104,101,114,101,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,10,116,114,117,101,46,32,73,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,116,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32,96,100,111,116,97,108,108,96,10,105,115,32,110,111,116,32,115,101,116,44,32,97,110,100,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,96,92,78,96,46,32,72,111,119,101,118,101,114,44,32,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,119,104,97,116,32,116,104,101,32,96,92,82,96,10,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,109,97,116,99,104,101,115,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,105,115,32,105,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,102,111,114,10,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,59,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,96,92,82,96,32,105,110,10,115,101,99,116,105,111,110,32,91,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,96,41,46,32,65,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,96,92,82,96,10,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,46,10,10,95,83,101,116,116,105,110,103,32,77,97,116,99,104,32,97,110,100,32,82,101,99,117,114,115,105,111,110,32,76,105,109,105,116,115,95,10,10,84,104,101,32,99,97,108,108,101,114,32,111,102,32,96,114,117,110,47,51,96,32,99,97,110,32,115,101,116,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,10,109,97,116,99,104,40,41,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,110,100,32,111,110,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,46,32,84,104,101,115,101,10,102,97,99,105,108,105,116,105,101,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,99,97,116,99,104,32,114,117,110,97,119,97,121,32,109,97,116,99,104,101,115,32,116,104,97,116,32,97,114,101,32,112,114,111,118,111,107,101,100,32,98,121,32,112,97,116,116,101,114,110,115,10,119,105,116,104,32,104,117,103,101,32,109,97,116,99,104,105,110,103,32,116,114,101,101,115,32,40,97,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,10,114,101,112,101,97,116,115,41,32,97,110,100,32,116,111,32,97,118,111,105,100,32,114,117,110,110,105,110,103,32,111,117,116,32,111,102,32,115,121,115,116,101,109,32,115,116,97,99,107,32,98,121,32,116,111,111,32,109,117,99,104,32,114,101,99,117,114,115,105,111,110,46,32,87,104,101,110,10,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,32,105,115,32,114,101,97,99,104,101,100,44,32,96,112,99,114,101,95,101,120,101,99,40,41,96,32,103,105,118,101,115,32,97,110,32,101,114,114,111,114,32,114,101,116,117,114,110,46,32,84,104,101,32,108,105,109,105,116,115,10,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58,10,10,96,96,96,116,101,120,116,10,40,42,76,73,77,73,84,95,77,65,84,67,72,61,100,41,10,40,42,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,61,100,41,10,96,96,96,10,10,72,101,114,101,32,100,32,105,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,109,117,115,116,10,98,101,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,102,111,114,32,105,116,32,116,111,32,104,97,118,101,10,97,110,121,32,101,102,102,101,99,116,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,32,99,97,110,32,108,111,119,101,114,32,116,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,116,104,101,10,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,110,111,116,32,114,97,105,115,101,32,105,116,46,32,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,101,116,116,105,110,103,32,111,102,32,111,110,101,32,111,102,32,116,104,101,115,101,10,108,105,109,105,116,115,44,32,116,104,101,32,108,111,119,101,114,32,118,97,108,117,101,32,105,115,32,117,115,101,100,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,98,111,116,104,32,116,104,101,32,108,105,109,105,116,115,32,105,115,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,32,78,111,116,105,99,101,10,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,108,105,109,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,115,116,97,99,107,32,100,101,112,116,104,32,111,102,32,116,104,101,32,86,77,44,32,97,115,32,80,67,82,69,32,102,111,114,10,69,114,108,97,110,103,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,32,115,117,99,104,32,97,32,119,97,121,32,116,104,97,116,32,116,104,101,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,100,111,101,115,32,114,101,99,117,114,115,105,111,110,32,111,110,10,116,104,101,32,67,32,115,116,97,99,107,46,10,10,78,111,116,101,32,116,104,97,116,32,96,76,73,77,73,84,95,77,65,84,67,72,96,32,97,110,100,32,96,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,96,32,99,97,110,32,111,110,108,121,32,114,101,100,117,99,101,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,108,105,109,105,116,115,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,44,32,110,111,116,32,105,110,99,114,101,97,115,101,32,116,104,101,109,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,32,125,10,10,35,35,32,67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115,10,10,65,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,102,114,111,109,10,108,101,102,116,32,116,111,32,114,105,103,104,116,46,32,77,111,115,116,32,99,104,97,114,97,99,116,101,114,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,32,97,110,100,32,109,97,116,99,104,32,116,104,101,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,115,32,97,32,116,114,105,118,105,97,108,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,99,97,108,32,116,111,32,105,116,115,101,108,102,58,10,10,96,96,96,116,101,120,116,10,84,104,101,32,113,117,105,99,107,32,98,114,111,119,110,32,102,111,120,10,96,96,96,10,10,87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,40,111,112,116,105,111,110,32,96,99,97,115,101,108,101,115,115,96,41,44,32,108,101,116,116,101,114,115,32,97,114,101,32,109,97,116,99,104,101,100,10,105,110,100,101,112,101,110,100,101,110,116,108,121,32,111,102,32,99,97,115,101,46,10,10,84,104,101,32,112,111,119,101,114,32,111,102,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,97,98,105,108,105,116,121,32,116,111,32,105,110,99,108,117,100,101,32,97,108,116,101,114,110,97,116,105,118,101,115,10,97,110,100,32,114,101,112,101,116,105,116,105,111,110,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,116,104,101,32,117,115,101,32,111,102,10,95,109,101,116,97,99,104,97,114,97,99,116,101,114,115,95,44,32,119,104,105,99,104,32,100,111,32,110,111,116,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,98,117,116,32,105,110,115,116,101,97,100,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,10,105,110,32,115,111,109,101,32,115,112,101,99,105,97,108,32,119,97,121,46,10,10,84,119,111,32,115,101,116,115,32,111,102,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,101,120,105,115,116,58,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,97,110,121,119,104,101,114,101,32,105,110,32,116,104,101,10,112,97,116,116,101,114,110,32,101,120,99,101,112,116,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,119,105,116,104,105,110,10,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,79,117,116,115,105,100,101,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,116,104,101,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,92,96,42,42,32,45,32,71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,109,97,110,121,32,117,115,101,115,10,10,45,32,42,42,96,94,96,42,42,32,45,32,65,115,115,101,114,116,32,115,116,97,114,116,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,10,10,45,32,42,42,96,36,96,42,42,32,45,32,65,115,115,101,114,116,32,101,110,100,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,10,10,45,32,42,42,96,46,96,42,42,32,45,32,77,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,110,101,119,108,105,110,101,32,40,98,121,32,100,101,102,97,117,108,116,41,10,10,45,32,42,42,96,91,96,42,42,32,45,32,83,116,97,114,116,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,10,10,45,32,42,42,96,124,96,42,42,32,45,32,83,116,97,114,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,10,10,45,32,42,42,96,40,96,42,42,32,45,32,83,116,97,114,116,32,115,117,98,112,97,116,116,101,114,110,10,10,45,32,42,42,96,41,96,42,42,32,45,32,69,110,100,32,115,117,98,112,97,116,116,101,114,110,10,10,45,32,42,42,96,63,96,42,42,32,45,32,69,120,116,101,110,100,115,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,40,44,32,97,108,115,111,32,48,32,111,114,32,49,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,113,117,97,110,116,105,102,105,101,114,10,32,32,109,105,110,105,109,105,122,101,114,10,10,45,32,42,42,96,42,96,42,42,32,45,32,48,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,115,10,10,45,32,42,42,96,43,96,42,42,32,45,32,49,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34,10,10,45,32,42,42,96,123,96,42,42,32,45,32,83,116,97,114,116,32,109,105,110,47,109,97,120,32,113,117,97,110,116,105,102,105,101,114,10,10,80,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,32,105,115,32,99,97,108,108,101,100,32,97,32,34,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,34,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,111,110,108,121,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,58,10,10,45,32,42,42,96,92,96,42,42,32,45,32,71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,94,96,42,42,32,45,32,78,101,103,97,116,101,32,116,104,101,32,99,108,97,115,115,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,45,96,42,42,32,45,32,73,110,100,105,99,97,116,101,115,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101,10,10,45,32,42,42,96,91,96,42,42,32,45,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,111,110,108,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,80,111,115,105,120,32,115,121,110,116,97,120,41,10,10,45,32,42,42,96,93,96,42,42,32,45,32,84,101,114,109,105,110,97,116,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,117,115,101,32,111,102,32,101,97,99,104,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,51,32,125,10,10,35,35,32,66,97,99,107,115,108,97,115,104,10,10,84,104,101,32,98,97,99,107,115,108,97,115,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,109,97,110,121,32,117,115,101,115,46,32,70,105,114,115,116,44,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,99,104,97,114,97,99,116,101,114,10,116,104,97,116,32,105,115,32,110,111,116,32,97,32,110,117,109,98,101,114,32,111,114,32,97,32,108,101,116,116,101,114,44,32,105,116,32,116,97,107,101,115,32,97,119,97,121,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,10,99,104,97,114,97,99,116,101,114,32,99,97,110,32,104,97,118,101,46,32,84,104,105,115,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,108,105,101,115,32,98,111,116,104,10,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,34,92,95,34,32,99,104,97,114,97,99,116,101,114,44,32,121,111,117,32,119,114,105,116,101,32,96,92,95,96,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,10,84,104,105,115,32,101,115,99,97,112,105,110,103,32,97,99,116,105,111,110,32,97,112,112,108,105,101,115,32,105,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,32,98,101,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,109,101,116,97,99,104,97,114,97,99,116,101,114,44,32,115,111,32,105,116,32,105,115,32,97,108,119,97,121,115,32,115,97,102,101,32,116,111,32,112,114,101,99,101,100,101,32,97,10,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,119,105,116,104,32,98,97,99,107,115,108,97,115,104,32,116,111,32,115,112,101,99,105,102,121,32,116,104,97,116,32,105,116,32,115,116,97,110,100,115,32,102,111,114,32,105,116,115,101,108,102,46,32,73,110,10,112,97,114,116,105,99,117,108,97,114,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,119,114,105,116,101,32,96,92,92,96,46,10,10,73,110,32,96,117,110,105,99,111,100,101,96,32,109,111,100,101,44,32,111,110,108,121,32,65,83,67,73,73,32,110,117,109,98,101,114,115,32,97,110,100,32,108,101,116,116,101,114,115,32,104,97,118,101,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,97,102,116,101,114,10,97,32,98,97,99,107,115,108,97,115,104,46,32,65,108,108,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,111,115,101,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,10,97,114,101,32,62,32,49,50,55,41,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,108,105,116,101,114,97,108,115,46,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,44,32,119,104,105,116,101,115,112,97,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,40,111,116,104,101,114,32,116,104,97,110,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,41,32,97,110,100,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,10,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,97,114,101,32,105,103,110,111,114,101,100,46,32,65,110,32,101,115,99,97,112,105,110,103,32,98,97,99,107,115,108,97,115,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,10,105,110,99,108,117,100,101,32,97,32,119,104,105,116,101,115,112,97,99,101,32,111,114,32,35,32,99,104,97,114,97,99,116,101,114,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,10,10,84,111,32,114,101,109,111,118,101,32,116,104,101,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,102,114,111,109,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,112,117,116,32,116,104,101,109,32,98,101,116,119,101,101,110,10,96,92,81,96,32,97,110,100,32,96,92,69,96,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,104,97,116,32,96,36,96,32,97,110,100,32,96,64,96,32,97,114,101,32,104,97,110,100,108,101,100,32,97,115,32,108,105,116,101,114,97,108,115,10,105,110,32,96,92,81,96,46,46,46,96,92,69,96,32,115,101,113,117,101,110,99,101,115,32,105,110,32,80,67,82,69,44,32,119,104,105,108,101,32,96,36,96,32,97,110,100,32,96,64,96,32,99,97,117,115,101,32,118,97,114,105,97,98,108,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,105,110,10,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58,10,10,96,96,96,116,101,120,116,10,80,97,116,116,101,114,110,32,32,32,32,32,32,32,32,32,32,32,32,80,67,82,69,32,109,97,116,99,104,101,115,32,32,32,80,101,114,108,32,109,97,116,99,104,101,115,10,10,92,81,97,98,99,36,120,121,122,92,69,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,36,120,121,122,10,92,81,97,98,99,92,36,120,121,122,92,69,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,10,92,81,97,98,99,92,69,92,36,92,81,120,121,122,92,69,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,10,96,96,96,10,10,84,104,101,32,96,92,81,96,46,46,46,96,92,69,96,32,115,101,113,117,101,110,99,101,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,10,65,110,32,105,115,111,108,97,116,101,100,32,96,92,69,96,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,96,92,81,96,32,105,115,32,105,103,110,111,114,101,100,46,32,73,102,32,96,92,81,96,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,10,98,121,32,96,92,69,96,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,116,104,101,32,108,105,116,101,114,97,108,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,99,111,110,116,105,110,117,101,115,32,116,111,32,116,104,101,32,101,110,100,32,111,102,10,116,104,101,32,112,97,116,116,101,114,110,32,40,116,104,97,116,32,105,115,44,32,96,92,69,96,32,105,115,32,97,115,115,117,109,101,100,32,97,116,32,116,104,101,32,101,110,100,41,46,32,73,102,32,116,104,101,32,105,115,111,108,97,116,101,100,32,96,92,81,96,32,105,115,32,105,110,115,105,100,101,10,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,105,115,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,44,32,97,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,110,111,116,10,116,101,114,109,105,110,97,116,101,100,46,10,10,95,78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115,95,10,10,91,93,40,41,123,58,32,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115,32,125,10,10,65,32,115,101,99,111,110,100,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,112,114,111,118,105,100,101,115,32,97,32,119,97,121,32,111,102,32,101,110,99,111,100,105,110,103,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,10,112,97,116,116,101,114,110,115,32,105,110,32,97,32,118,105,115,105,98,108,101,32,109,97,110,110,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,114,101,115,116,114,105,99,116,105,111,110,32,111,110,32,116,104,101,32,97,112,112,101,97,114,97,110,99,101,32,111,102,10,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,97,112,97,114,116,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,32,122,101,114,111,32,116,104,97,116,32,116,101,114,109,105,110,97,116,101,115,32,97,32,112,97,116,116,101,114,110,46,10,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,112,97,114,101,100,32,98,121,32,116,101,120,116,32,101,100,105,116,105,110,103,44,32,105,116,32,105,115,32,111,102,116,101,110,32,101,97,115,105,101,114,32,116,111,32,117,115,101,32,111,110,101,32,111,102,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,110,32,116,104,101,32,98,105,110,97,114,121,32,99,104,97,114,97,99,116,101,114,32,105,116,32,114,101,112,114,101,115,101,110,116,115,58,10,10,45,32,42,42,96,92,97,96,42,42,32,45,32,65,108,97,114,109,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,66,69,76,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,55,41,10,10,45,32,42,42,96,92,99,120,96,42,42,32,45,32,34,67,111,110,116,114,111,108,45,120,34,44,32,119,104,101,114,101,32,120,32,105,115,32,97,110,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,101,96,42,42,32,45,32,69,115,99,97,112,101,32,40,104,101,120,32,49,66,41,10,10,45,32,42,42,96,92,102,96,42,42,32,45,32,70,111,114,109,32,102,101,101,100,32,40,104,101,120,32,48,67,41,10,10,45,32,42,42,96,92,110,96,42,42,32,45,32,76,105,110,101,32,102,101,101,100,32,40,104,101,120,32,48,65,41,10,10,45,32,42,42,96,92,114,96,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,104,101,120,32,48,68,41,10,10,45,32,42,42,96,92,116,96,42,42,32,45,32,84,97,98,32,40,104,101,120,32,48,57,41,10,10,45,32,42,42,96,92,48,100,100,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,48,100,100,10,10,45,32,42,42,96,92,100,100,100,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,44,32,111,114,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,10,45,32,42,42,96,92,111,123,100,100,100,46,46,125,96,42,42,32,45,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,46,46,10,10,45,32,42,42,96,92,120,104,104,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,10,10,45,32,42,42,96,92,120,123,104,104,104,46,46,125,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,104,46,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,96,92,48,100,100,96,32,105,115,32,97,108,119,97,121,115,32,97,110,32,111,99,116,97,108,32,99,111,100,101,44,32,97,110,100,32,116,104,97,116,32,96,92,56,96,32,97,110,100,32,96,92,57,96,32,97,114,101,32,116,104,101,32,108,105,116,101,114,97,108,10,62,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,46,10,10,84,104,101,32,112,114,101,99,105,115,101,32,101,102,102,101,99,116,32,111,102,32,96,92,99,120,96,32,111,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,32,105,115,32,97,10,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,44,32,105,116,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,117,112,112,101,114,32,99,97,115,101,46,32,84,104,101,110,32,98,105,116,32,54,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,40,104,101,120,32,52,48,41,32,105,115,32,105,110,118,101,114,116,101,100,46,32,84,104,117,115,32,96,92,99,65,96,32,116,111,32,96,92,99,90,96,32,98,101,99,111,109,101,32,104,101,120,32,48,49,32,116,111,32,104,101,120,32,49,65,32,40,65,32,105,115,32,52,49,44,32,90,32,105,115,10,53,65,41,44,32,98,117,116,32,96,92,99,123,96,32,98,101,99,111,109,101,115,32,104,101,120,32,51,66,32,40,96,123,96,32,105,115,32,55,66,41,44,32,97,110,100,32,96,92,99,96,59,32,98,101,99,111,109,101,115,32,104,101,120,32,55,66,32,40,59,32,105,115,32,51,66,41,46,32,73,102,10,116,104,101,32,100,97,116,97,32,105,116,101,109,32,40,98,121,116,101,32,111,114,32,49,54,45,98,105,116,32,118,97,108,117,101,41,32,102,111,108,108,111,119,105,110,103,32,96,92,99,96,32,104,97,115,32,97,32,118,97,108,117,101,32,62,32,49,50,55,44,32,97,10,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,84,104,105,115,32,108,111,99,107,115,32,111,117,116,32,110,111,110,45,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,108,108,32,109,111,100,101,115,46,10,10,84,104,101,32,96,92,99,96,32,102,97,99,105,108,105,116,121,32,119,97,115,32,100,101,115,105,103,110,101,100,32,102,111,114,32,117,115,101,32,119,105,116,104,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,44,32,98,117,116,32,119,105,116,104,32,116,104,101,10,101,120,116,101,110,115,105,111,110,32,116,111,32,85,110,105,99,111,100,101,32,105,116,32,105,115,32,101,118,101,110,32,108,101,115,115,32,117,115,101,102,117,108,32,116,104,97,110,32,105,116,32,111,110,99,101,32,119,97,115,46,10,10,65,102,116,101,114,32,96,92,48,96,32,117,112,32,116,111,32,116,119,111,32,102,117,114,116,104,101,114,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,102,101,119,101,114,32,116,104,97,110,32,116,119,111,10,100,105,103,105,116,115,44,32,106,117,115,116,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,112,114,101,115,101,110,116,32,97,114,101,32,117,115,101,100,46,32,84,104,117,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,96,92,48,92,120,92,48,49,53,96,10,115,112,101,99,105,102,105,101,115,32,116,119,111,32,98,105,110,97,114,121,32,122,101,114,111,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,67,82,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,118,97,108,117,101,32,49,51,41,46,32,77,97,107,101,32,115,117,114,101,10,121,111,117,32,115,117,112,112,108,121,32,116,119,111,32,100,105,103,105,116,115,32,97,102,116,101,114,32,116,104,101,32,105,110,105,116,105,97,108,32,122,101,114,111,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,10,102,111,108,108,111,119,115,32,105,115,32,105,116,115,101,108,102,32,97,110,32,111,99,116,97,108,32,100,105,103,105,116,46,10,10,84,104,101,32,101,115,99,97,112,101,32,96,92,111,96,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,111,99,116,97,108,32,100,105,103,105,116,115,44,32,101,110,99,108,111,115,101,100,32,105,110,10,98,114,97,99,101,115,46,32,65,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,105,115,32,97,32,114,101,99,101,110,116,10,97,100,100,105,116,105,111,110,32,116,111,32,80,101,114,108,59,32,105,116,32,112,114,111,118,105,100,101,115,32,119,97,121,32,111,102,32,115,112,101,99,105,102,121,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,111,100,101,32,112,111,105,110,116,115,32,97,115,32,111,99,116,97,108,10,110,117,109,98,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,55,55,55,44,32,97,110,100,32,105,116,32,97,108,115,111,32,97,108,108,111,119,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,97,110,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,10,116,111,32,98,101,32,117,110,97,109,98,105,103,117,111,117,115,108,121,32,115,112,101,99,105,102,105,101,100,46,10,10,70,111,114,32,103,114,101,97,116,101,114,32,99,108,97,114,105,116,121,32,97,110,100,32,117,110,97,109,98,105,103,117,105,116,121,44,32,105,116,32,105,115,32,98,101,115,116,32,116,111,32,97,118,111,105,100,32,102,111,108,108,111,119,105,110,103,32,96,92,96,32,98,121,32,97,32,100,105,103,105,116,10,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,96,92,111,123,125,96,32,111,114,32,96,92,120,123,125,96,32,116,111,32,115,112,101,99,105,102,121,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,115,44,10,97,110,100,32,96,92,103,123,125,96,32,116,111,32,115,112,101,99,105,102,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,114,97,103,114,97,112,104,115,32,100,101,115,99,114,105,98,101,32,116,104,101,10,111,108,100,44,32,97,109,98,105,103,117,111,117,115,32,115,121,110,116,97,120,46,10,10,84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,111,116,104,101,114,32,116,104,97,110,32,48,32,105,115,32,99,111,109,112,108,105,99,97,116,101,100,44,32,97,110,100,10,80,101,114,108,32,104,97,115,32,99,104,97,110,103,101,100,32,105,110,32,114,101,99,101,110,116,32,114,101,108,101,97,115,101,115,44,32,99,97,117,115,105,110,103,32,80,67,82,69,32,97,108,115,111,32,116,111,32,99,104,97,110,103,101,46,32,79,117,116,115,105,100,101,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,80,67,82,69,32,114,101,97,100,115,32,116,104,101,32,100,105,103,105,116,32,97,110,100,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,100,105,103,105,116,115,32,97,115,32,97,32,100,101,99,105,109,97,108,10,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,60,32,56,44,32,111,114,32,105,102,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,97,116,32,108,101,97,115,116,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,105,115,32,116,97,107,101,110,32,97,115,32,97,10,95,98,97,99,107,32,114,101,102,101,114,101,110,99,101,95,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,104,111,119,32,116,104,105,115,32,119,111,114,107,115,32,105,115,32,112,114,111,118,105,100,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,10,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,10,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,96,92,96,32,105,115,32,62,32,55,32,97,110,100,32,116,104,101,114,101,10,104,97,118,101,32,110,111,116,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,80,67,82,69,32,104,97,110,100,108,101,115,32,96,92,56,96,32,97,110,100,32,96,92,57,96,32,97,115,32,116,104,101,10,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,44,32,97,110,100,32,111,116,104,101,114,119,105,115,101,32,114,101,45,114,101,97,100,115,32,117,112,32,116,111,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,10,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,44,32,97,110,100,32,117,115,105,110,103,32,116,104,101,109,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,46,32,65,110,121,10,115,117,98,115,101,113,117,101,110,116,32,100,105,103,105,116,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,45,32,42,42,96,92,48,52,48,96,42,42,32,45,32,65,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,110,32,65,83,67,73,73,32,115,112,97,99,101,10,10,45,32,42,42,96,92,52,48,96,42,42,32,45,32,84,104,101,32,115,97,109,101,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,97,114,101,32,60,32,52,48,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,10,10,45,32,42,42,96,92,55,96,42,42,32,45,32,65,108,119,97,121,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,10,45,32,42,42,96,92,49,49,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,32,116,97,98,10,10,45,32,42,42,96,92,48,49,49,96,42,42,32,45,32,65,108,119,97,121,115,32,97,32,116,97,98,10,10,45,32,42,42,96,92,48,49,49,51,96,42,42,32,45,32,65,32,116,97,98,32,102,111,108,108,111,119,101,100,32,98,121,32,99,104,97,114,97,99,116,101,114,32,34,51,34,10,10,45,32,42,42,96,92,49,49,51,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,10,32,32,49,49,51,10,10,45,32,42,42,96,92,51,55,55,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,118,97,108,117,101,32,50,53,53,32,40,100,101,99,105,109,97,108,41,10,10,45,32,42,42,96,92,56,49,96,42,42,32,45,32,69,105,116,104,101,114,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,116,104,101,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,49,34,10,10,78,111,116,105,99,101,32,116,104,97,116,32,111,99,116,97,108,32,118,97,108,117,101,115,32,62,61,32,49,48,48,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,32,109,117,115,116,32,110,111,116,32,98,101,10,105,110,116,114,111,100,117,99,101,100,32,98,121,32,97,32,108,101,97,100,105,110,103,32,122,101,114,111,44,32,97,115,32,110,111,32,109,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,101,118,101,114,32,114,101,97,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,102,116,101,114,32,96,92,120,96,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,96,123,96,44,32,102,114,111,109,32,122,101,114,111,32,116,111,32,116,119,111,32,104,101,120,97,100,101,99,105,109,97,108,10,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,32,40,108,101,116,116,101,114,115,32,99,97,110,32,98,101,32,105,110,32,117,112,112,101,114,32,111,114,32,108,111,119,101,114,32,99,97,115,101,41,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,10,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,109,97,121,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,96,92,120,123,96,32,97,110,100,32,96,125,96,46,32,73,102,32,97,32,99,104,97,114,97,99,116,101,114,32,111,116,104,101,114,32,116,104,97,110,32,97,10,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,32,97,112,112,101,97,114,115,32,98,101,116,119,101,101,110,32,96,92,120,123,96,32,97,110,100,32,96,125,96,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,116,101,114,109,105,110,97,116,105,110,103,10,96,125,96,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46,10,10,67,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,50,53,54,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,121,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,10,115,121,110,116,97,120,101,115,32,102,111,114,32,96,92,120,96,46,32,84,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,119,97,121,32,116,104,101,121,32,97,114,101,32,104,97,110,100,108,101,100,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,120,100,99,96,32,105,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,96,92,120,123,100,99,125,96,46,10,10,95,67,111,110,115,116,114,97,105,110,116,115,32,111,110,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,95,10,10,67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,110,117,109,98,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,10,99,101,114,116,97,105,110,32,118,97,108,117,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,56,45,98,105,116,32,110,111,110,45,85,84,70,32,109,111,100,101,42,42,32,45,32,60,32,48,120,49,48,48,10,10,45,32,42,42,56,45,98,105,116,32,85,84,70,45,56,32,109,111,100,101,42,42,32,45,32,60,32,48,120,49,48,102,102,102,102,32,97,110,100,32,97,32,118,97,108,105,100,32,99,111,100,101,112,111,105,110,116,10,10,73,110,118,97,108,105,100,32,85,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,115,32,97,114,101,32,116,104,101,32,114,97,110,103,101,32,48,120,100,56,48,48,32,116,111,32,48,120,100,102,102,102,32,40,116,104,101,32,115,111,45,99,97,108,108,101,100,10,34,115,117,114,114,111,103,97,116,101,34,32,99,111,100,101,112,111,105,110,116,115,41,44,32,97,110,100,32,48,120,102,102,101,102,46,10,10,95,69,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,95,10,10,65,108,108,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,100,101,102,105,110,101,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,32,99,97,110,32,98,101,32,117,115,101,100,32,98,111,116,104,32,105,110,115,105,100,101,10,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,108,115,111,44,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,98,96,32,105,115,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,56,41,46,10,10,96,92,78,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,96,92,66,96,44,32,96,92,82,96,44,32,97,110,100,32,96,92,88,96,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,10,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,10,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,10,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,115,46,10,10,95,85,110,115,117,112,112,111,114,116,101,100,32,69,115,99,97,112,101,32,83,101,113,117,101,110,99,101,115,95,10,10,73,110,32,80,101,114,108,44,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,108,96,44,32,96,92,76,96,44,32,96,92,117,96,44,32,97,110,100,32,96,92,85,96,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,105,116,115,32,115,116,114,105,110,103,10,104,97,110,100,108,101,114,32,97,110,100,32,117,115,101,100,32,116,111,32,109,111,100,105,102,121,32,116,104,101,32,99,97,115,101,32,111,102,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,80,67,82,69,32,100,111,101,115,32,110,111,116,10,115,117,112,112,111,114,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,10,10,95,65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,95,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,10,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,44,32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,97,109,101,100,32,98,97,99,107,10,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,99,111,100,101,100,32,97,115,32,96,92,103,123,110,97,109,101,125,96,46,32,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,44,10,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,10,95,65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,83,117,98,114,111,117,116,105,110,101,32,67,97,108,108,115,95,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,10,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,10,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,34,115,117,98,114,111,117,116,105,110,101,34,46,32,68,101,116,97,105,108,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,10,108,97,116,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,103,123,46,46,46,125,96,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,96,92,103,60,46,46,46,62,96,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,10,95,110,111,116,95,32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,97,110,100,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,10,99,97,108,108,46,10,10,95,71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115,95,10,10,91,93,40,41,123,58,32,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115,32,125,10,10,65,110,111,116,104,101,114,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,103,101,110,101,114,105,99,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,58,10,10,45,32,42,42,96,92,100,96,42,42,32,45,32,65,110,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,10,10,45,32,42,42,96,92,68,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,100,101,99,105,109,97,108,32,100,105,103,105,116,10,10,45,32,42,42,96,92,104,96,42,42,32,45,32,65,110,121,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,72,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,115,96,42,42,32,45,32,65,110,121,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,83,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,118,96,42,42,32,45,32,65,110,121,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,86,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,119,96,42,42,32,45,32,65,110,121,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,87,96,42,42,32,45,32,65,110,121,32,34,110,111,110,45,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,10,10,84,104,101,114,101,32,105,115,32,97,108,115,111,32,116,104,101,32,115,105,110,103,108,101,32,115,101,113,117,101,110,99,101,32,96,92,78,96,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,110,111,110,45,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,10,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,34,46,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32,96,100,111,116,97,108,108,96,32,105,115,32,110,111,116,32,115,101,116,46,32,80,101,114,108,32,97,108,115,111,10,117,115,101,115,32,96,92,78,96,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,10,10,69,97,99,104,32,112,97,105,114,32,111,102,32,108,111,119,101,114,99,97,115,101,32,97,110,100,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,112,97,114,116,105,116,105,111,110,115,32,116,104,101,32,99,111,109,112,108,101,116,101,10,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,116,119,111,32,100,105,115,106,111,105,110,116,32,115,101,116,115,46,32,65,110,121,32,103,105,118,101,110,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,111,110,101,44,32,97,110,100,10,111,110,108,121,32,111,110,101,44,32,111,102,32,101,97,99,104,32,112,97,105,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,97,112,112,101,97,114,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,101,121,32,101,97,99,104,32,109,97,116,99,104,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,101,46,32,73,102,32,116,104,101,10,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,108,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,10,105,115,32,110,111,32,99,104,97,114,97,99,116,101,114,32,116,111,32,109,97,116,99,104,46,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,96,92,115,96,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,10,49,49,41,44,32,119,104,105,99,104,32,109,97,100,101,32,105,116,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,116,104,101,32,80,79,83,73,88,32,34,115,112,97,99,101,34,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,10,97,100,100,101,100,32,86,84,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,115,117,105,116,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,84,104,101,32,100,101,102,97,117,108,116,10,96,92,115,96,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,119,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,10,40,51,50,41,44,32,119,104,105,99,104,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,32,105,110,32,116,104,101,32,34,67,34,32,108,111,99,97,108,101,46,32,84,104,105,115,32,108,105,115,116,32,109,97,121,32,118,97,114,121,32,105,102,10,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,115,111,109,101,32,108,111,99,97,108,101,115,32,116,104,101,10,34,110,111,110,45,98,114,101,97,107,105,110,103,32,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,32,40,96,92,120,65,48,96,41,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,44,32,97,110,100,32,105,110,10,111,116,104,101,114,115,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,46,10,10,65,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,117,110,100,101,114,115,99,111,114,101,32,111,114,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,97,32,108,101,116,116,101,114,32,111,114,32,97,10,100,105,103,105,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,108,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,10,80,67,82,69,32,108,111,119,45,118,97,108,117,101,100,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,44,32,105,110,32,69,114,108,97,110,103,39,115,32,99,97,115,101,32,40,97,110,100,32,119,105,116,104,111,117,116,32,111,112,116,105,111,110,10,96,117,110,105,99,111,100,101,96,41,44,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,105,110,32,96,117,110,105,99,111,100,101,96,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,44,32,116,104,97,116,32,105,115,44,32,97,108,108,10,99,104,97,114,97,99,116,101,114,115,32,111,117,116,115,105,100,101,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,44,32,110,101,118,101,114,32,109,97,116,99,104,32,96,92,100,96,44,32,96,92,115,96,44,32,111,114,32,96,92,119,96,44,10,97,110,100,32,97,108,119,97,121,115,32,109,97,116,99,104,32,96,92,68,96,44,32,96,92,83,96,44,32,97,110,100,32,96,92,87,96,46,32,84,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,114,101,116,97,105,110,32,116,104,101,105,114,32,111,114,105,103,105,110,97,108,10,109,101,97,110,105,110,103,115,32,102,114,111,109,32,98,101,102,111,114,101,32,85,84,70,32,115,117,112,112,111,114,116,32,119,97,115,32,97,118,97,105,108,97,98,108,101,44,32,109,97,105,110,108,121,32,102,111,114,32,101,102,102,105,99,105,101,110,99,121,32,114,101,97,115,111,110,115,46,10,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,117,99,112,96,32,105,115,32,115,101,116,44,32,116,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,10,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,92,100,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,96,92,112,123,78,100,125,96,32,109,97,116,99,104,101,115,32,40,100,101,99,105,109,97,108,32,100,105,103,105,116,41,10,10,45,32,42,42,96,92,115,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,96,92,112,123,90,125,96,32,111,114,32,96,92,104,96,32,111,114,32,96,92,118,96,10,10,45,32,42,42,96,92,119,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,109,97,116,99,104,101,115,32,96,92,112,123,76,125,96,32,111,114,32,96,92,112,123,78,125,96,32,109,97,116,99,104,101,115,44,32,112,108,117,115,10,32,32,117,110,100,101,114,115,99,111,114,101,10,10,84,104,101,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,115,32,109,97,116,99,104,32,116,104,101,32,105,110,118,101,114,115,101,32,115,101,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,100,96,10,109,97,116,99,104,101,115,32,111,110,108,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,44,32,119,104,105,108,101,32,96,92,119,96,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,100,105,103,105,116,44,32,97,110,121,32,85,110,105,99,111,100,101,10,108,101,116,116,101,114,44,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,46,32,78,111,116,105,99,101,32,97,108,115,111,32,116,104,97,116,32,96,117,99,112,96,32,97,102,102,101,99,116,115,32,96,92,98,96,32,97,110,100,32,96,92,66,96,44,32,97,115,32,116,104,101,121,32,97,114,101,10,100,101,102,105,110,101,100,32,105,110,32,116,101,114,109,115,32,111,102,32,96,92,119,96,32,97,110,100,32,96,92,87,96,46,32,77,97,116,99,104,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,105,99,101,97,98,108,121,32,115,108,111,119,101,114,10,119,104,101,110,32,96,117,99,112,96,32,105,115,32,115,101,116,46,10,10,84,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,104,96,44,32,96,92,72,96,44,32,96,92,118,96,44,32,97,110,100,32,96,92,86,96,32,97,114,101,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,119,101,114,101,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,105,110,10,114,101,108,101,97,115,101,32,53,46,49,48,46,32,73,110,32,99,111,110,116,114,97,115,116,32,116,111,32,116,104,101,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,119,104,105,99,104,32,109,97,116,99,104,32,111,110,108,121,32,65,83,67,73,73,10,99,104,97,114,97,99,116,101,114,115,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,115,101,32,97,108,119,97,121,115,32,109,97,116,99,104,32,99,101,114,116,97,105,110,32,104,105,103,104,45,118,97,108,117,101,100,32,99,111,100,101,32,112,111,105,110,116,115,44,10,114,101,103,97,114,100,108,101,115,115,32,105,102,32,96,117,99,112,96,32,105,115,32,115,101,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,104,111,114,105,122,111,110,116,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58,10,10,45,32,42,42,85,43,48,48,48,57,42,42,32,45,32,72,111,114,105,122,111,110,116,97,108,32,116,97,98,32,40,72,84,41,10,10,45,32,42,42,85,43,48,48,50,48,42,42,32,45,32,83,112,97,99,101,10,10,45,32,42,42,85,43,48,48,65,48,42,42,32,45,32,78,111,110,45,98,114,101,97,107,32,115,112,97,99,101,10,10,45,32,42,42,85,43,49,54,56,48,42,42,32,45,32,79,103,104,97,109,32,115,112,97,99,101,32,109,97,114,107,10,10,45,32,42,42,85,43,49,56,48,69,42,42,32,45,32,77,111,110,103,111,108,105,97,110,32,118,111,119,101,108,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,85,43,50,48,48,48,42,42,32,45,32,69,110,32,113,117,97,100,10,10,45,32,42,42,85,43,50,48,48,49,42,42,32,45,32,69,109,32,113,117,97,100,10,10,45,32,42,42,85,43,50,48,48,50,42,42,32,45,32,69,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,51,42,42,32,45,32,69,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,52,42,42,32,45,32,84,104,114,101,101,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,53,42,42,32,45,32,70,111,117,114,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,54,42,42,32,45,32,83,105,120,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,55,42,42,32,45,32,70,105,103,117,114,101,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,56,42,42,32,45,32,80,117,110,99,116,117,97,116,105,111,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,57,42,42,32,45,32,84,104,105,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,65,42,42,32,45,32,72,97,105,114,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,50,70,42,42,32,45,32,78,97,114,114,111,119,32,110,111,45,98,114,101,97,107,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,53,70,42,42,32,45,32,77,101,100,105,117,109,32,109,97,116,104,101,109,97,116,105,99,97,108,32,115,112,97,99,101,10,10,45,32,42,42,85,43,51,48,48,48,42,42,32,45,32,73,100,101,111,103,114,97,112,104,105,99,32,115,112,97,99,101,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,101,114,116,105,99,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58,10,10,45,32,42,42,85,43,48,48,48,65,42,42,32,45,32,76,105,110,101,32,102,101,101,100,32,40,76,70,41,10,10,45,32,42,42,85,43,48,48,48,66,42,42,32,45,32,86,101,114,116,105,99,97,108,32,116,97,98,32,40,86,84,41,10,10,45,32,42,42,85,43,48,48,48,67,42,42,32,45,32,70,111,114,109,32,102,101,101,100,32,40,70,70,41,10,10,45,32,42,42,85,43,48,48,48,68,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,41,10,10,45,32,42,42,85,43,48,48,56,53,42,42,32,45,32,78,101,120,116,32,108,105,110,101,32,40,78,69,76,41,10,10,45,32,42,42,85,43,50,48,50,56,42,42,32,45,32,76,105,110,101,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,85,43,50,48,50,57,42,42,32,45,32,80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,10,10,73,110,32,56,45,98,105,116,44,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,111,110,108,121,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,60,32,50,53,54,32,97,114,101,10,114,101,108,101,118,97,110,116,46,10,10,95,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,95,10,10,91,93,40,41,123,58,32,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,32,125,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,82,96,32,109,97,116,99,104,101,115,32,97,110,121,10,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46,32,73,110,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,96,92,82,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,96,96,96,116,101,120,116,10,40,63,62,92,114,92,110,124,92,110,124,92,120,48,98,124,92,102,124,92,114,124,92,120,56,53,41,10,96,96,96,10,10,84,104,105,115,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,97,110,32,34,97,116,111,109,105,99,32,103,114,111,117,112,34,44,32,100,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46,10,10,84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,103,114,111,117,112,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,32,102,111,108,108,111,119,101,100,32,98,121,10,76,70,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,115,32,76,70,32,40,108,105,110,101,32,102,101,101,100,44,32,85,43,48,48,48,65,41,44,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,10,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,32,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,85,43,48,48,48,68,41,44,32,111,114,32,78,69,76,32,40,110,101,120,116,10,108,105,110,101,44,32,85,43,48,48,56,53,41,46,32,84,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,117,110,105,116,32,116,104,97,116,10,99,97,110,110,111,116,32,98,101,32,115,112,108,105,116,46,10,10,73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,116,119,111,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,50,53,53,32,97,114,101,32,97,100,100,101,100,58,32,76,83,10,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,10,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,102,111,114,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,96,92,82,96,32,99,97,110,32,98,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,40,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,10,111,102,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,41,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,98,115,114,95,97,110,121,99,114,108,102,96,32,101,105,116,104,101,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,10,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,46,32,40,66,83,82,32,105,115,32,97,110,32,97,99,114,111,110,121,109,32,102,111,114,32,34,98,97,99,107,115,108,97,115,104,32,82,34,46,41,32,84,104,105,115,32,99,97,110,10,98,101,32,109,97,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,119,104,101,110,32,80,67,82,69,32,105,115,32,98,117,105,108,116,59,32,105,102,32,115,111,44,32,116,104,101,32,111,116,104,101,114,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,10,114,101,113,117,101,115,116,101,100,32,116,104,114,111,117,103,104,32,111,112,116,105,111,110,32,96,98,115,114,95,117,110,105,99,111,100,101,96,46,32,84,104,101,115,101,32,115,101,116,116,105,110,103,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,10,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,40,92,42,66,83,82,95,65,78,89,67,82,76,70,41,42,42,32,45,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,111,110,108,121,10,10,45,32,42,42,40,92,42,66,83,82,95,85,78,73,67,79,68,69,41,42,42,32,45,32,65,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,10,10,84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,44,10,98,117,116,32,116,104,101,121,32,99,97,110,32,116,104,101,109,115,101,108,118,101,115,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,98,121,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,97,32,109,97,116,99,104,105,110,103,10,102,117,110,99,116,105,111,110,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,116,116,105,110,103,115,44,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,97,114,101,10,114,101,99,111,103,110,105,122,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,97,116,32,116,104,101,121,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,10,99,97,115,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,99,97,110,32,98,101,10,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,59,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,99,97,110,32,115,116,97,114,116,10,119,105,116,104,58,10,10,96,96,96,116,101,120,116,10,40,42,65,78,89,41,40,42,66,83,82,95,65,78,89,67,82,76,70,41,10,96,96,96,10,10,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,40,42,85,84,70,56,41,44,32,40,42,85,84,70,41,44,32,111,114,32,40,92,42,85,67,80,41,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,115,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,82,96,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,44,32,97,110,100,32,115,111,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,34,82,34,32,98,121,32,100,101,102,97,117,108,116,46,10,10,95,85,110,105,99,111,100,101,32,67,104,97,114,97,99,116,101,114,32,80,114,111,112,101,114,116,105,101,115,95,10,10,84,104,114,101,101,32,109,111,114,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,115,112,101,99,105,102,105,99,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,10,97,118,97,105,108,97,98,108,101,46,32,87,104,101,110,32,105,110,32,56,45,98,105,116,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,101,115,116,105,110,103,10,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,60,32,50,53,54,44,32,98,117,116,32,116,104,101,121,32,100,111,32,119,111,114,107,32,105,110,32,116,104,105,115,32,109,111,100,101,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,101,120,116,114,97,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,96,92,112,123,95,120,120,95,125,96,42,42,32,45,32,65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,112,114,111,112,101,114,116,121,32,95,120,120,95,10,10,45,32,42,42,96,92,80,123,95,120,120,95,125,96,42,42,32,45,32,65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,112,114,111,112,101,114,116,121,32,95,120,120,95,10,10,45,32,42,42,96,92,88,96,42,42,32,45,32,65,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,10,10,84,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,95,120,120,95,32,97,98,111,118,101,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,115,99,114,105,112,116,10,110,97,109,101,115,44,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,44,32,34,65,110,121,34,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,10,40,105,110,99,108,117,100,105,110,103,32,110,101,119,108,105,110,101,41,44,32,97,110,100,32,115,111,109,101,32,115,112,101,99,105,97,108,32,80,67,82,69,32,112,114,111,112,101,114,116,105,101,115,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,10,115,101,99,116,105,111,110,41,46,32,79,116,104,101,114,32,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,34,73,110,77,117,115,105,99,97,108,83,121,109,98,111,108,115,34,44,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,10,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,80,123,65,110,121,125,96,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,10,97,108,119,97,121,115,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46,10,10,83,101,116,115,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,98,101,108,111,110,103,105,110,103,32,116,111,32,99,101,114,116,97,105,110,32,115,99,114,105,112,116,115,46,32,65,10,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,101,116,115,32,99,97,110,32,98,101,32,109,97,116,99,104,101,100,32,117,115,105,110,103,32,97,32,115,99,114,105,112,116,32,110,97,109,101,44,32,102,111,114,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,92,112,123,71,114,101,101,107,125,32,92,80,123,72,97,110,125,10,96,96,96,10,10,84,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,97,110,32,105,100,101,110,116,105,102,105,101,100,32,115,99,114,105,112,116,32,97,114,101,32,108,117,109,112,101,100,32,116,111,103,101,116,104,101,114,32,97,115,32,34,67,111,109,109,111,110,34,46,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,105,115,116,32,111,102,32,115,99,114,105,112,116,115,58,10,10,45,32,65,114,97,98,105,99,10,45,32,65,114,109,101,110,105,97,110,10,45,32,65,118,101,115,116,97,110,10,45,32,66,97,108,105,110,101,115,101,10,45,32,66,97,109,117,109,10,45,32,66,97,115,115,97,95,86,97,104,10,45,32,66,97,116,97,107,10,45,32,66,101,110,103,97,108,105,10,45,32,66,111,112,111,109,111,102,111,10,45,32,66,114,97,105,108,108,101,10,45,32,66,117,103,105,110,101,115,101,10,45,32,66,117,104,105,100,10,45,32,67,97,110,97,100,105,97,110,95,65,98,111,114,105,103,105,110,97,108,10,45,32,67,97,114,105,97,110,10,45,32,67,97,117,99,97,115,105,97,110,95,65,108,98,97,110,105,97,110,10,45,32,67,104,97,107,109,97,10,45,32,67,104,97,109,10,45,32,67,104,101,114,111,107,101,101,10,45,32,67,111,109,109,111,110,10,45,32,67,111,112,116,105,99,10,45,32,67,117,110,101,105,102,111,114,109,10,45,32,67,121,112,114,105,111,116,10,45,32,67,121,114,105,108,108,105,99,10,45,32,68,101,115,101,114,101,116,10,45,32,68,101,118,97,110,97,103,97,114,105,10,45,32,68,117,112,108,111,121,97,110,10,45,32,69,103,121,112,116,105,97,110,95,72,105,101,114,111,103,108,121,112,104,115,10,45,32,69,108,98,97,115,97,110,10,45,32,69,116,104,105,111,112,105,99,10,45,32,71,101,111,114,103,105,97,110,10,45,32,71,108,97,103,111,108,105,116,105,99,10,45,32,71,111,116,104,105,99,10,45,32,71,114,97,110,116,104,97,10,45,32,71,114,101,101,107,10,45,32,71,117,106,97,114,97,116,105,10,45,32,71,117,114,109,117,107,104,105,10,45,32,72,97,110,10,45,32,72,97,110,103,117,108,10,45,32,72,97,110,117,110,111,111,10,45,32,72,101,98,114,101,119,10,45,32,72,105,114,97,103,97,110,97,10,45,32,73,109,112,101,114,105,97,108,95,65,114,97,109,97,105,99,10,45,32,73,110,104,101,114,105,116,101,100,10,45,32,73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,104,108,97,118,105,10,45,32,73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,114,116,104,105,97,110,10,45,32,74,97,118,97,110,101,115,101,10,45,32,75,97,105,116,104,105,10,45,32,75,97,110,110,97,100,97,10,45,32,75,97,116,97,107,97,110,97,10,45,32,75,97,121,97,104,95,76,105,10,45,32,75,104,97,114,111,115,104,116,104,105,10,45,32,75,104,109,101,114,10,45,32,75,104,111,106,107,105,10,45,32,75,104,117,100,97,119,97,100,105,10,45,32,76,97,111,10,45,32,76,97,116,105,110,10,45,32,76,101,112,99,104,97,10,45,32,76,105,109,98,117,10,45,32,76,105,110,101,97,114,95,65,10,45,32,76,105,110,101,97,114,95,66,10,45,32,76,105,115,117,10,45,32,76,121,99,105,97,110,10,45,32,76,121,100,105,97,110,10,45,32,77,97,104,97,106,97,110,105,10,45,32,77,97,108,97,121,97,108,97,109,10,45,32,77,97,110,100,97,105,99,10,45,32,77,97,110,105,99,104,97,101,97,110,10,45,32,77,101,101,116,101,105,95,77,97,121,101,107,10,45,32,77,101,110,100,101,95,75,105,107,97,107,117,105,10,45,32,77,101,114,111,105,116,105,99,95,67,117,114,115,105,118,101,10,45,32,77,101,114,111,105,116,105,99,95,72,105,101,114,111,103,108,121,112,104,115,10,45,32,77,105,97,111,10,45,32,77,111,100,105,10,45,32,77,111,110,103,111,108,105,97,110,10,45,32,77,114,111,10,45,32,77,121,97,110,109,97,114,10,45,32,78,97,98,97,116,97,101,97,110,10,45,32,78,101,119,95,84,97,105,95,76,117,101,10,45,32,78,107,111,10,45,32,79,103,104,97,109,10,45,32,79,108,95,67,104,105,107,105,10,45,32,79,108,100,95,73,116,97,108,105,99,10,45,32,79,108,100,95,78,111,114,116,104,95,65,114,97,98,105,97,110,10,45,32,79,108,100,95,80,101,114,109,105,99,10,45,32,79,108,100,95,80,101,114,115,105,97,110,10,45,32,79,114,105,121,97,10,45,32,79,108,100,95,83,111,117,116,104,95,65,114,97,98,105,97,110,10,45,32,79,108,100,95,84,117,114,107,105,99,10,45,32,79,115,109,97,110,121,97,10,45,32,80,97,104,97,119,104,95,72,109,111,110,103,10,45,32,80,97,108,109,121,114,101,110,101,10,45,32,80,97,117,95,67,105,110,95,72,97,117,10,45,32,80,104,97,103,115,95,80,97,10,45,32,80,104,111,101,110,105,99,105,97,110,10,45,32,80,115,97,108,116,101,114,95,80,97,104,108,97,118,105,10,45,32,82,101,106,97,110,103,10,45,32,82,117,110,105,99,10,45,32,83,97,109,97,114,105,116,97,110,10,45,32,83,97,117,114,97,115,104,116,114,97,10,45,32,83,104,97,114,97,100,97,10,45,32,83,104,97,118,105,97,110,10,45,32,83,105,100,100,104,97,109,10,45,32,83,105,110,104,97,108,97,10,45,32,83,111,114,97,95,83,111,109,112,101,110,103,10,45,32,83,117,110,100,97,110,101,115,101,10,45,32,83,121,108,111,116,105,95,78,97,103,114,105,10,45,32,83,121,114,105,97,99,10,45,32,84,97,103,97,108,111,103,10,45,32,84,97,103,98,97,110,119,97,10,45,32,84,97,105,95,76,101,10,45,32,84,97,105,95,84,104,97,109,10,45,32,84,97,105,95,86,105,101,116,10,45,32,84,97,107,114,105,10,45,32,84,97,109,105,108,10,45,32,84,101,108,117,103,117,10,45,32,84,104,97,97,110,97,10,45,32,84,104,97,105,10,45,32,84,105,98,101,116,97,110,10,45,32,84,105,102,105,110,97,103,104,10,45,32,84,105,114,104,117,116,97,10,45,32,85,103,97,114,105,116,105,99,10,45,32,86,97,105,10,45,32,87,97,114,97,110,103,95,67,105,116,105,10,45,32,89,105,10,10,69,97,99,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,101,120,97,99,116,108,121,32,111,110,101,32,85,110,105,99,111,100,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,44,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,10,116,119,111,45,108,101,116,116,101,114,32,97,99,114,111,110,121,109,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,110,101,103,97,116,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,10,105,110,99,108,117,100,105,110,103,32,97,32,99,105,114,99,117,109,102,108,101,120,32,98,101,116,119,101,101,110,32,116,104,101,32,111,112,101,110,105,110,103,32,98,114,97,99,101,32,97,110,100,32,116,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,112,123,94,76,117,125,96,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,96,92,80,123,76,117,125,96,46,10,10,73,102,32,111,110,108,121,32,111,110,101,32,108,101,116,116,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,32,96,92,112,96,32,111,114,32,96,92,80,96,44,32,105,116,32,105,110,99,108,117,100,101,115,32,97,108,108,32,116,104,101,32,103,101,110,101,114,97,108,10,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,32,116,104,97,116,32,115,116,97,114,116,32,119,105,116,104,32,116,104,97,116,32,108,101,116,116,101,114,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,10,110,101,103,97,116,105,111,110,44,32,116,104,101,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,105,110,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,97,114,101,32,111,112,116,105,111,110,97,108,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,10,116,119,111,32,101,120,97,109,112,108,101,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,58,10,10,96,96,96,116,101,120,116,10,92,112,123,76,125,10,92,112,76,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,32,99,111,100,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,58,10,10,45,32,42,42,67,42,42,32,45,32,79,116,104,101,114,10,10,45,32,42,42,67,99,42,42,32,45,32,67,111,110,116,114,111,108,10,10,45,32,42,42,67,102,42,42,32,45,32,70,111,114,109,97,116,10,10,45,32,42,42,67,110,42,42,32,45,32,85,110,97,115,115,105,103,110,101,100,10,10,45,32,42,42,67,111,42,42,32,45,32,80,114,105,118,97,116,101,32,117,115,101,10,10,45,32,42,42,67,115,42,42,32,45,32,83,117,114,114,111,103,97,116,101,10,10,45,32,42,42,76,42,42,32,45,32,76,101,116,116,101,114,10,10,45,32,42,42,76,108,42,42,32,45,32,76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,76,109,42,42,32,45,32,77,111,100,105,102,105,101,114,32,108,101,116,116,101,114,10,10,45,32,42,42,76,111,42,42,32,45,32,79,116,104,101,114,32,108,101,116,116,101,114,10,10,45,32,42,42,76,116,42,42,32,45,32,84,105,116,108,101,32,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,76,117,42,42,32,45,32,85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,77,42,42,32,45,32,77,97,114,107,10,10,45,32,42,42,77,99,42,42,32,45,32,83,112,97,99,105,110,103,32,109,97,114,107,10,10,45,32,42,42,77,101,42,42,32,45,32,69,110,99,108,111,115,105,110,103,32,109,97,114,107,10,10,45,32,42,42,77,110,42,42,32,45,32,78,111,110,45,115,112,97,99,105,110,103,32,109,97,114,107,10,10,45,32,42,42,78,42,42,32,45,32,78,117,109,98,101,114,10,10,45,32,42,42,78,100,42,42,32,45,32,68,101,99,105,109,97,108,32,110,117,109,98,101,114,10,10,45,32,42,42,78,108,42,42,32,45,32,76,101,116,116,101,114,32,110,117,109,98,101,114,10,10,45,32,42,42,78,111,42,42,32,45,32,79,116,104,101,114,32,110,117,109,98,101,114,10,10,45,32,42,42,80,42,42,32,45,32,80,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,99,42,42,32,45,32,67,111,110,110,101,99,116,111,114,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,100,42,42,32,45,32,68,97,115,104,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,101,42,42,32,45,32,67,108,111,115,101,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,102,42,42,32,45,32,70,105,110,97,108,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,105,42,42,32,45,32,73,110,105,116,105,97,108,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,111,42,42,32,45,32,79,116,104,101,114,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,115,42,42,32,45,32,79,112,101,110,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,83,42,42,32,45,32,83,121,109,98,111,108,10,10,45,32,42,42,83,99,42,42,32,45,32,67,117,114,114,101,110,99,121,32,115,121,109,98,111,108,10,10,45,32,42,42,83,107,42,42,32,45,32,77,111,100,105,102,105,101,114,32,115,121,109,98,111,108,10,10,45,32,42,42,83,109,42,42,32,45,32,77,97,116,104,101,109,97,116,105,99,97,108,32,115,121,109,98,111,108,10,10,45,32,42,42,83,111,42,42,32,45,32,79,116,104,101,114,32,115,121,109,98,111,108,10,10,45,32,42,42,90,42,42,32,45,32,83,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,108,42,42,32,45,32,76,105,110,101,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,112,42,42,32,45,32,80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,115,42,42,32,45,32,83,112,97,99,101,32,115,101,112,97,114,97,116,111,114,10,10,84,104,101,32,115,112,101,99,105,97,108,32,112,114,111,112,101,114,116,121,32,76,38,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,73,116,32,109,97,116,99,104,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,10,76,117,44,32,76,108,44,32,111,114,32,76,116,32,112,114,111,112,101,114,116,121,44,32,116,104,97,116,32,105,115,44,32,97,32,108,101,116,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,99,108,97,115,115,105,102,105,101,100,32,97,115,32,97,32,109,111,100,105,102,105,101,114,10,111,114,32,34,111,116,104,101,114,34,46,10,10,84,104,101,32,67,115,32,40,83,117,114,114,111,103,97,116,101,41,32,112,114,111,112,101,114,116,121,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,85,43,68,56,48,48,32,116,111,10,85,43,68,70,70,70,46,32,83,117,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,118,97,108,105,100,32,105,110,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,115,32,97,110,100,32,115,111,32,99,97,110,110,111,116,32,98,101,32,116,101,115,116,101,100,10,98,121,32,80,67,82,69,46,32,80,101,114,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,67,115,32,112,114,111,112,101,114,116,121,46,10,10,84,104,101,32,108,111,110,103,32,115,121,110,111,110,121,109,115,32,102,111,114,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,101,114,108,32,40,115,117,99,104,32,97,115,32,96,92,112,123,76,101,116,116,101,114,125,96,41,10,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,73,116,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,116,111,32,112,114,101,102,105,120,32,97,110,121,32,111,102,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,10,119,105,116,104,32,34,73,115,34,46,10,10,78,111,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,32,104,97,115,32,116,104,101,32,67,110,32,40,117,110,97,115,115,105,103,110,101,100,41,32,112,114,111,112,101,114,116,121,46,32,84,104,105,115,10,112,114,111,112,101,114,116,121,32,105,115,32,105,110,115,116,101,97,100,32,97,115,115,117,109,101,100,32,102,111,114,32,97,110,121,32,99,111,100,101,32,112,111,105,110,116,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,46,10,10,83,112,101,99,105,102,121,105,110,103,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,112,123,76,117,125,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,108,121,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,10,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,99,117,114,114,101,110,116,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,46,10,10,77,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,105,115,32,110,111,116,32,102,97,115,116,44,32,97,115,32,80,67,82,69,32,109,117,115,116,32,100,111,32,97,10,109,117,108,116,105,115,116,97,103,101,32,116,97,98,108,101,32,108,111,111,107,117,112,32,116,111,32,102,105,110,100,32,97,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,46,32,84,104,97,116,32,105,115,32,119,104,121,32,116,104,101,10,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,96,92,100,96,32,97,110,100,32,96,92,119,96,32,100,111,32,110,111,116,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,10,105,110,32,80,67,82,69,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,109,97,107,101,32,116,104,101,109,32,100,111,32,115,111,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,32,111,114,10,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,96,40,42,85,67,80,41,96,46,10,10,95,69,120,116,101,110,100,101,100,32,71,114,97,112,104,101,109,101,32,67,108,117,115,116,101,114,115,95,10,10,84,104,101,32,96,92,88,96,32,101,115,99,97,112,101,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,102,111,114,109,32,97,110,32,34,101,120,116,101,110,100,101,100,10,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,34,44,32,97,110,100,32,116,114,101,97,116,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,40,115,101,101,32,98,101,108,111,119,41,46,32,85,112,32,116,111,10,97,110,100,32,105,110,99,108,117,100,105,110,103,32,114,101,108,101,97,115,101,32,56,46,51,49,44,32,80,67,82,69,32,109,97,116,99,104,101,100,32,97,110,32,101,97,114,108,105,101,114,44,32,115,105,109,112,108,101,114,32,100,101,102,105,110,105,116,105,111,110,32,116,104,97,116,32,119,97,115,10,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,40,63,62,92,80,77,92,112,77,42,41,96,46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,100,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,116,104,101,32,34,109,97,114,107,34,10,112,114,111,112,101,114,116,121,44,32,102,111,108,108,111,119,101,100,32,98,121,32,122,101,114,111,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,46,10,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,110,111,110,45,115,112,97,99,105,110,103,32,97,99,99,101,110,116,115,32,116,104,97,116,10,97,102,102,101,99,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,99,104,97,114,97,99,116,101,114,46,10,10,84,104,105,115,32,115,105,109,112,108,101,32,100,101,102,105,110,105,116,105,111,110,32,119,97,115,32,101,120,116,101,110,100,101,100,32,105,110,32,85,110,105,99,111,100,101,32,116,111,32,105,110,99,108,117,100,101,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,107,105,110,100,115,10,111,102,32,99,111,109,112,111,115,105,116,101,32,99,104,97,114,97,99,116,101,114,32,98,121,32,103,105,118,105,110,103,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,97,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,44,10,97,110,100,32,99,114,101,97,116,105,110,103,32,114,117,108,101,115,32,116,104,97,116,32,117,115,101,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,98,111,117,110,100,97,114,105,101,115,32,111,102,10,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,46,32,73,110,32,80,67,82,69,32,114,101,108,101,97,115,101,115,32,108,97,116,101,114,32,116,104,97,110,32,56,46,51,49,44,32,96,92,88,96,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,10,116,104,101,115,101,32,99,108,117,115,116,101,114,115,46,10,10,96,92,88,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,110,32,105,116,32,100,101,99,105,100,101,115,32,119,104,101,116,104,101,114,32,116,111,32,97,100,100,32,109,111,114,101,10,99,104,97,114,97,99,116,101,114,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,117,108,101,115,32,102,111,114,32,101,110,100,105,110,103,32,97,32,99,108,117,115,116,101,114,58,10,10,49,46,32,69,110,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,98,101,116,119,101,101,110,32,67,82,32,97,110,100,32,76,70,59,32,111,116,104,101,114,119,105,115,101,32,101,110,100,32,97,102,116,101,114,32,97,110,121,32,99,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,46,10,49,46,32,68,111,32,110,111,116,32,98,114,101,97,107,32,72,97,110,103,117,108,32,40,97,32,75,111,114,101,97,110,32,115,99,114,105,112,116,41,32,115,121,108,108,97,98,108,101,32,115,101,113,117,101,110,99,101,115,46,32,72,97,110,103,117,108,32,99,104,97,114,97,99,116,101,114,115,10,32,32,32,97,114,101,32,111,102,32,102,105,118,101,32,116,121,112,101,115,58,32,76,44,32,86,44,32,84,44,32,76,86,44,32,97,110,100,32,76,86,84,46,32,65,110,32,76,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,10,32,32,32,76,44,32,86,44,32,76,86,44,32,111,114,32,76,86,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,32,111,114,32,86,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,86,32,111,114,32,84,10,32,32,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,84,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,111,110,108,121,32,98,121,32,97,32,84,32,99,104,97,114,97,99,116,101,114,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,98,101,102,111,114,101,32,101,120,116,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,115,112,97,99,105,110,103,32,109,97,114,107,115,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,10,32,32,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,108,119,97,121,115,32,104,97,118,101,32,116,104,101,32,34,101,120,116,101,110,100,34,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,97,102,116,101,114,32,112,114,101,112,101,110,100,32,99,104,97,114,97,99,116,101,114,115,46,10,49,46,32,79,116,104,101,114,119,105,115,101,44,32,101,110,100,32,116,104,101,32,99,108,117,115,116,101,114,46,10,10,95,80,67,82,69,32,65,100,100,105,116,105,111,110,97,108,32,80,114,111,112,101,114,116,105,101,115,95,10,10,73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,115,116,97,110,100,97,114,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,10,102,111,117,114,32,109,111,114,101,32,116,104,97,116,32,109,97,107,101,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,99,111,110,118,101,114,116,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,10,96,92,119,96,32,97,110,100,32,96,92,115,96,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,46,32,80,67,82,69,32,117,115,101,115,32,116,104,101,115,101,32,110,111,110,45,115,116,97,110,100,97,114,100,44,32,110,111,110,45,80,101,114,108,10,112,114,111,112,101,114,116,105,101,115,32,105,110,116,101,114,110,97,108,108,121,32,119,104,101,110,32,116,104,101,32,96,117,99,112,96,32,111,112,116,105,111,110,32,105,115,32,112,97,115,115,101,100,46,32,72,111,119,101,118,101,114,44,32,116,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,10,117,115,101,100,32,101,120,112,108,105,99,105,116,108,121,46,32,84,104,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,88,97,110,42,42,32,45,32,65,110,121,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,10,32,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,88,112,115,42,42,32,45,32,65,110,121,32,80,111,115,105,120,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,32,102,101,101,100,44,10,32,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,10,32,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,88,115,112,42,42,32,45,32,65,110,121,32,80,101,114,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,44,32,101,120,99,101,112,116,32,116,104,97,116,10,32,32,118,101,114,116,105,99,97,108,32,116,97,98,32,105,115,32,101,120,99,108,117,100,101,100,46,10,10,45,32,42,42,88,119,100,42,42,32,45,32,65,110,121,32,80,101,114,108,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,10,32,32,117,110,100,101,114,115,99,111,114,101,46,10,10,80,101,114,108,32,97,110,100,32,80,79,83,73,88,32,115,112,97,99,101,32,97,114,101,32,110,111,119,32,116,104,101,32,115,97,109,101,46,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,116,111,32,105,116,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,115,101,116,10,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,32,97,110,100,32,80,67,82,69,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,10,10,88,97,110,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,10,112,114,111,112,101,114,116,121,46,32,88,112,115,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,111,114,10,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,10,88,115,112,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,59,32,105,116,32,117,115,101,100,32,116,111,32,101,120,99,108,117,100,101,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,10,98,117,116,32,80,101,114,108,32,99,104,97,110,103,101,100,44,32,97,110,100,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,88,119,100,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,10,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46,10,10,84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,110,111,110,45,115,116,97,110,100,97,114,100,32,112,114,111,112,101,114,116,121,44,32,88,117,99,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,10,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,32,105,110,32,67,43,43,32,97,110,100,32,111,116,104,101,114,32,112,114,111,103,114,97,109,109,105,110,103,10,108,97,110,103,117,97,103,101,115,46,32,84,104,101,115,101,32,97,114,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,96,36,96,44,32,96,64,96,44,32,96,96,32,96,32,96,96,32,40,103,114,97,118,101,32,97,99,99,101,110,116,41,44,32,97,110,100,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,10,119,105,116,104,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,62,61,32,85,43,48,48,65,48,44,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,115,117,114,114,111,103,97,116,101,115,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,10,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,98,97,115,101,32,40,65,83,67,73,73,41,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,120,99,108,117,100,101,100,46,32,40,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,10,78,97,109,101,115,32,97,114,101,32,111,102,32,116,104,101,32,102,111,114,109,32,96,92,117,72,72,72,72,96,32,111,114,32,96,92,85,72,72,72,72,72,72,72,72,96,44,32,119,104,101,114,101,32,72,32,105,115,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,88,117,99,32,112,114,111,112,101,114,116,121,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,98,117,116,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,10,116,104,97,116,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,41,10,10,95,82,101,115,101,116,116,105,110,103,32,116,104,101,32,77,97,116,99,104,32,83,116,97,114,116,95,10,10,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,75,96,32,99,97,117,115,101,115,32,97,110,121,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,116,111,32,98,101,10,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,102,105,110,97,108,32,109,97,116,99,104,101,100,32,115,101,113,117,101,110,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,10,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,98,117,116,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,34,98,97,114,34,58,10,10,96,96,96,116,101,120,116,10,102,111,111,92,75,98,97,114,10,96,96,96,10,10,84,104,105,115,32,102,101,97,116,117,114,101,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,72,111,119,101,118,101,114,44,32,105,110,10,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,98,101,102,111,114,101,32,116,104,101,32,114,101,97,108,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,111,102,10,102,105,120,101,100,32,108,101,110,103,116,104,44,32,97,115,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,100,111,46,32,84,104,101,32,117,115,101,32,111,102,32,96,92,75,96,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,102,101,114,101,10,119,105,116,104,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,10,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,116,104,101,32,102,105,114,115,116,32,115,117,98,115,116,114,105,110,103,32,105,115,32,115,116,105,108,108,32,115,101,116,32,116,111,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,102,111,111,41,92,75,98,97,114,10,96,96,96,10,10,80,101,114,108,32,100,111,99,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,117,115,101,32,111,102,32,96,92,75,96,32,119,105,116,104,105,110,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,34,110,111,116,32,119,101,108,108,32,100,101,102,105,110,101,100,34,46,32,73,110,10,80,67,82,69,44,32,96,92,75,96,32,105,115,32,97,99,116,101,100,32,117,112,111,110,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,44,32,98,117,116,32,105,115,10,105,103,110,111,114,101,100,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,78,111,116,101,32,116,104,97,116,32,119,104,101,110,32,97,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,96,40,63,61,97,98,92,75,41,96,10,109,97,116,99,104,101,115,44,32,116,104,101,32,114,101,112,111,114,116,101,100,32,115,116,97,114,116,32,111,102,32,116,104,101,32,109,97,116,99,104,32,99,97,110,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,109,97,116,99,104,46,10,10,95,83,105,109,112,108,101,32,65,115,115,101,114,116,105,111,110,115,95,10,10,84,104,101,32,102,105,110,97,108,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,46,32,65,110,32,97,115,115,101,114,116,105,111,110,10,115,112,101,99,105,102,105,101,115,32,97,32,99,111,110,100,105,116,105,111,110,32,116,104,97,116,32,109,117,115,116,32,98,101,32,109,101,116,32,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,112,111,105,110,116,32,105,110,32,97,32,109,97,116,99,104,44,32,119,105,116,104,111,117,116,10,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,117,115,101,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,32,102,111,114,10,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,10,98,97,99,107,115,108,97,115,104,101,100,32,97,115,115,101,114,116,105,111,110,115,58,10,10,45,32,42,42,96,92,98,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46,10,10,45,32,42,42,96,92,66,96,42,42,32,45,32,77,97,116,99,104,101,115,32,119,104,101,110,32,110,111,116,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46,10,10,45,32,42,42,96,92,65,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,90,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,10,32,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,122,96,42,42,32,45,32,77,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,71,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,98,96,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,10,99,104,97,114,97,99,116,101,114,46,32,73,102,32,97,110,121,32,111,116,104,101,114,32,111,102,32,116,104,101,115,101,32,97,115,115,101,114,116,105,111,110,115,32,97,112,112,101,97,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,10,100,101,102,97,117,108,116,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,96,92,66,96,32,109,97,116,99,104,101,115,10,116,104,101,32,108,101,116,116,101,114,32,66,41,46,10,10,65,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,104,101,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,104,97,114,97,99,116,101,114,10,97,110,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,97,114,97,99,116,101,114,32,100,111,32,110,111,116,32,98,111,116,104,32,109,97,116,99,104,32,96,92,119,96,32,111,114,32,96,92,87,96,32,40,116,104,97,116,32,105,115,44,32,111,110,101,32,109,97,116,99,104,101,115,10,96,92,119,96,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,109,97,116,99,104,101,115,32,96,92,87,96,41,44,32,111,114,32,116,104,101,32,115,116,97,114,116,32,111,114,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,102,32,116,104,101,32,102,105,114,115,116,10,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,96,92,119,96,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,73,110,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,96,92,119,96,10,97,110,100,32,96,92,87,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,100,111,110,101,44,32,105,116,32,97,108,115,111,10,97,102,102,101,99,116,115,32,96,92,98,96,32,97,110,100,32,96,92,66,96,46,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,111,32,110,111,116,32,104,97,118,101,32,97,32,115,101,112,97,114,97,116,101,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,111,114,10,34,101,110,100,32,111,102,32,119,111,114,100,34,32,109,101,116,97,115,101,113,117,101,110,99,101,46,32,72,111,119,101,118,101,114,44,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,96,92,98,96,32,110,111,114,109,97,108,108,121,32,100,101,116,101,114,109,105,110,101,115,10,119,104,105,99,104,32,105,116,32,105,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,114,97,103,109,101,110,116,32,96,92,98,97,96,32,109,97,116,99,104,101,115,32,34,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,119,111,114,100,46,10,10,84,104,101,32,96,92,65,96,44,32,96,92,90,96,44,32,97,110,100,32,96,92,122,96,32,97,115,115,101,114,116,105,111,110,115,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,10,100,111,108,108,97,114,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,32,105,110,32,116,104,97,116,32,116,104,101,121,32,111,110,108,121,32,101,118,101,114,32,109,97,116,99,104,32,97,116,32,116,104,101,32,118,101,114,121,10,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,97,116,101,118,101,114,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,46,32,84,104,117,115,44,32,116,104,101,121,32,97,114,101,10,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,46,32,84,104,101,115,101,32,116,104,114,101,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,10,111,112,116,105,111,110,115,32,96,110,111,116,98,111,108,96,32,111,114,32,96,110,111,116,101,111,108,96,44,32,119,104,105,99,104,32,97,102,102,101,99,116,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,10,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,32,96,114,117,110,47,51,96,32,105,115,10,110,111,110,45,122,101,114,111,44,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,109,97,116,99,104,105,110,103,32,105,115,32,116,111,32,115,116,97,114,116,32,97,116,32,97,32,112,111,105,110,116,32,111,116,104,101,114,32,116,104,97,110,32,116,104,101,10,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,96,92,65,96,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,46,32,84,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,96,92,90,96,32,97,110,100,10,96,92,122,96,32,105,115,32,116,104,97,116,32,96,92,90,96,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,97,110,100,32,97,116,32,116,104,101,10,118,101,114,121,32,101,110,100,44,32,119,104,105,108,101,32,96,92,122,96,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,46,10,10,84,104,101,32,96,92,71,96,32,97,115,115,101,114,116,105,111,110,32,105,115,32,116,114,117,101,32,111,110,108,121,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,116,104,101,10,115,116,97,114,116,32,112,111,105,110,116,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,10,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,32,73,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,96,92,65,96,32,119,104,101,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,105,115,10,110,111,110,45,122,101,114,111,46,32,66,121,32,99,97,108,108,105,110,103,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,97,112,112,114,111,112,114,105,97,116,101,10,97,114,103,117,109,101,110,116,115,44,32,121,111,117,32,99,97,110,32,109,105,109,105,99,32,116,104,101,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,103,96,44,32,97,110,100,32,105,116,32,105,115,32,105,110,32,116,104,105,115,32,107,105,110,100,32,111,102,10,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,119,104,101,114,101,32,96,92,71,96,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,10,10,78,111,116,105,99,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,32,116,104,101,32,80,67,82,69,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,96,92,71,96,44,32,97,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,10,99,117,114,114,101,110,116,32,109,97,116,99,104,44,32,105,115,32,115,117,98,116,108,121,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,44,32,119,104,105,99,104,32,100,101,102,105,110,101,115,32,105,116,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,112,114,101,118,105,111,117,115,32,109,97,116,99,104,46,32,73,110,32,80,101,114,108,44,32,116,104,101,115,101,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,116,104,101,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,10,115,116,114,105,110,103,32,119,97,115,32,101,109,112,116,121,46,32,65,115,32,80,67,82,69,32,100,111,101,115,32,111,110,108,121,32,111,110,101,32,109,97,116,99,104,32,97,116,32,97,32,116,105,109,101,44,32,105,116,32,99,97,110,110,111,116,32,114,101,112,114,111,100,117,99,101,10,116,104,105,115,32,98,101,104,97,118,105,111,114,46,10,10,73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,98,101,103,105,110,32,119,105,116,104,32,96,92,71,96,44,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,110,99,104,111,114,101,100,10,116,111,32,116,104,101,32,115,116,97,114,116,105,110,103,32,109,97,116,99,104,32,112,111,115,105,116,105,111,110,44,32,97,110,100,32,116,104,101,32,34,97,110,99,104,111,114,101,100,34,32,102,108,97,103,32,105,115,32,115,101,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,10,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,52,32,125,10,10,35,35,32,67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114,10,10,84,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,122,101,114,111,45,119,105,100,116,104,32,97,115,115,101,114,116,105,111,110,115,46,32,84,104,97,116,32,105,115,44,10,116,104,101,121,32,116,101,115,116,32,102,111,114,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,111,110,100,105,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,10,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,105,110,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,116,99,104,105,110,103,32,109,111,100,101,44,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,10,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,10,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,102,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,32,96,114,117,110,47,51,96,32,105,115,10,110,111,110,45,122,101,114,111,44,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,32,105,102,32,111,112,116,105,111,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,117,110,115,101,116,46,32,73,110,115,105,100,101,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,99,105,114,99,117,109,102,108,101,120,32,104,97,115,32,97,110,32,101,110,116,105,114,101,108,121,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,67,105,114,99,117,109,102,108,101,120,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,10,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,101,118,101,114,32,116,111,32,109,97,116,99,104,32,116,104,97,116,32,98,114,97,110,99,104,46,32,73,102,32,97,108,108,32,112,111,115,115,105,98,108,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,10,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,105,116,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,97,110,32,34,97,110,99,104,111,114,101,100,34,32,112,97,116,116,101,114,110,46,10,40,84,104,101,114,101,32,97,114,101,32,97,108,115,111,32,111,116,104,101,114,32,99,111,110,115,116,114,117,99,116,115,32,116,104,97,116,32,99,97,110,32,99,97,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,46,41,10,10,84,104,101,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,10,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,10,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,121,32,100,101,102,97,117,108,116,41,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,10,110,101,119,108,105,110,101,46,32,68,111,108,108,97,114,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,105,110,32,97,110,121,32,98,114,97,110,99,104,32,105,110,32,119,104,105,99,104,10,105,116,32,97,112,112,101,97,114,115,46,32,68,111,108,108,97,114,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,10,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,100,111,108,108,97,114,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,32,111,102,10,116,104,101,32,115,116,114,105,110,103,44,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,10,97,102,102,101,99,116,32,116,104,101,32,96,92,90,96,32,97,115,115,101,114,116,105,111,110,46,10,10,84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,99,104,97,110,103,101,100,32,105,102,32,111,112,116,105,111,110,10,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,97,32,99,105,114,99,117,109,102,108,101,120,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,10,97,102,116,101,114,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,97,110,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,116,32,100,111,101,115,32,110,111,116,10,109,97,116,99,104,32,97,102,116,101,114,32,97,32,110,101,119,108,105,110,101,32,116,104,97,116,32,101,110,100,115,32,116,104,101,32,115,116,114,105,110,103,46,32,65,32,100,111,108,108,97,114,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,110,121,32,110,101,119,108,105,110,101,115,10,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,101,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,32,87,104,101,110,32,110,101,119,108,105,110,101,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,105,115,111,108,97,116,101,100,32,67,82,32,97,110,100,32,76,70,32,99,104,97,114,97,99,116,101,114,115,32,100,111,10,110,111,116,32,105,110,100,105,99,97,116,101,32,110,101,119,108,105,110,101,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,96,47,94,97,98,99,36,47,96,32,109,97,116,99,104,101,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,100,101,102,92,92,110,97,98,99,34,32,40,119,104,101,114,101,10,92,92,110,32,114,101,112,114,101,115,101,110,116,115,32,97,32,110,101,119,108,105,110,101,41,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,98,117,116,32,110,111,116,32,111,116,104,101,114,119,105,115,101,46,32,83,111,44,32,112,97,116,116,101,114,110,115,10,116,104,97,116,32,97,114,101,32,97,110,99,104,111,114,101,100,32,105,110,32,115,105,110,103,108,101,45,108,105,110,101,32,109,111,100,101,32,98,101,99,97,117,115,101,32,97,108,108,32,98,114,97,110,99,104,101,115,32,115,116,97,114,116,32,119,105,116,104,32,94,32,97,114,101,32,110,111,116,10,97,110,99,104,111,114,101,100,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,97,110,100,32,97,32,109,97,116,99,104,32,102,111,114,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,112,111,115,115,105,98,108,101,32,119,104,101,110,32,97,114,103,117,109,101,110,116,10,95,115,116,97,114,116,111,102,102,115,101,116,95,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,105,115,32,110,111,110,45,122,101,114,111,46,32,79,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,105,115,10,105,103,110,111,114,101,100,32,105,102,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,65,96,44,32,96,92,90,96,44,32,97,110,100,32,96,92,122,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,116,97,114,116,32,97,110,100,10,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,110,32,98,111,116,104,32,109,111,100,101,115,46,32,73,102,32,97,108,108,32,98,114,97,110,99,104,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,32,119,105,116,104,32,96,92,65,96,44,10,105,116,32,105,115,32,97,108,119,97,121,115,32,97,110,99,104,111,114,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,53,32,125,10,10,35,35,32,70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,92,78,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,10,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,101,120,99,101,112,116,32,40,98,121,32,100,101,102,97,117,108,116,41,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,10,10,87,104,101,110,32,97,32,108,105,110,101,32,101,110,100,105,110,103,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,100,111,116,32,110,101,118,101,114,32,109,97,116,99,104,101,115,32,116,104,97,116,10,99,104,97,114,97,99,116,101,114,46,32,87,104,101,110,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,117,115,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,10,105,102,32,105,116,32,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,10,40,105,110,99,108,117,100,105,110,103,32,105,115,111,108,97,116,101,100,32,67,82,115,32,97,110,100,32,76,70,115,41,46,32,87,104,101,110,32,97,110,121,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,44,10,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,44,32,76,70,44,32,111,114,32,97,110,121,32,111,102,32,116,104,101,32,111,116,104,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,100,111,116,32,114,101,103,97,114,100,105,110,103,32,110,101,119,108,105,110,101,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,46,32,73,102,32,111,112,116,105,111,110,32,96,100,111,116,97,108,108,96,32,105,115,10,115,101,116,44,32,97,32,100,111,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,44,32,119,105,116,104,111,117,116,32,101,120,99,101,112,116,105,111,110,46,32,73,102,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,10,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,116,97,107,101,115,32,116,119,111,32,100,111,116,115,32,116,111,32,109,97,116,99,104,32,105,116,46,10,10,84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,111,116,32,105,115,32,101,110,116,105,114,101,108,121,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,10,100,111,108,108,97,114,44,32,116,104,101,32,111,110,108,121,32,114,101,108,97,116,105,111,110,115,104,105,112,32,105,115,32,116,104,97,116,32,98,111,116,104,32,105,110,118,111,108,118,101,32,110,101,119,108,105,110,101,115,46,32,68,111,116,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,10,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,10,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,78,96,32,98,101,104,97,118,101,115,32,108,105,107,101,32,97,32,100,111,116,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,10,111,112,116,105,111,110,32,96,80,67,82,69,95,68,79,84,65,76,76,96,46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,111,110,101,32,116,104,97,116,10,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,96,92,78,96,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,32,98,117,116,10,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,54,32,125,10,10,35,35,32,77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,67,96,32,109,97,116,99,104,101,115,32,97,110,121,32,100,97,116,97,32,117,110,105,116,44,10,114,101,103,97,114,100,108,101,115,115,32,105,102,32,97,32,85,84,70,32,109,111,100,101,32,105,115,32,115,101,116,46,32,79,110,101,32,100,97,116,97,32,117,110,105,116,32,105,115,32,111,110,101,32,98,121,116,101,46,32,85,110,108,105,107,101,32,97,32,100,111,116,44,32,96,92,67,96,10,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,102,101,97,116,117,114,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,80,101,114,108,32,116,111,32,109,97,116,99,104,10,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,105,110,32,85,84,70,45,56,32,109,111,100,101,44,32,98,117,116,32,105,116,32,105,115,32,117,110,99,108,101,97,114,32,104,111,119,32,105,116,32,99,97,110,32,117,115,101,102,117,108,108,121,32,98,101,32,117,115,101,100,46,10,65,115,32,96,92,67,96,32,98,114,101,97,107,115,32,117,112,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,44,32,109,97,116,99,104,105,110,103,32,111,110,101,32,117,110,105,116,32,119,105,116,104,10,96,92,67,96,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,32,97,32,109,97,108,102,111,114,109,101,100,32,85,84,70,10,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,114,101,115,117,108,116,115,44,32,97,115,32,80,67,82,69,32,97,115,115,117,109,101,115,32,116,104,97,116,32,105,116,32,100,101,97,108,115,32,119,105,116,104,32,118,97,108,105,100,10,85,84,70,32,115,116,114,105,110,103,115,46,10,10,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,96,92,67,96,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,32,105,110,10,97,32,85,84,70,32,109,111,100,101,44,32,97,115,32,116,104,105,115,32,119,111,117,108,100,32,109,97,107,101,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,10,108,111,111,107,98,101,104,105,110,100,46,10,10,84,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,105,115,32,98,101,115,116,32,97,118,111,105,100,101,100,46,32,72,111,119,101,118,101,114,44,32,111,110,101,32,119,97,121,32,111,102,32,117,115,105,110,103,32,105,116,32,116,104,97,116,10,97,118,111,105,100,115,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,116,111,32,117,115,101,32,97,32,108,111,111,107,97,104,101,97,100,32,116,111,32,99,104,101,99,107,10,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,10,119,105,116,104,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58,10,10,96,96,96,116,101,120,116,10,40,63,124,32,40,63,61,91,92,120,48,48,45,92,120,55,102,93,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,56,48,45,92,120,123,55,102,102,125,93,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,56,48,48,125,45,92,120,123,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,49,48,48,48,48,125,45,92,120,123,49,102,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,40,92,67,41,41,10,96,96,96,10,10,65,32,103,114,111,117,112,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,40,63,124,32,114,101,115,101,116,115,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,110,117,109,98,101,114,115,32,105,110,32,101,97,99,104,10,97,108,116,101,114,110,97,116,105,118,101,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,41,46,32,84,104,101,10,97,115,115,101,114,116,105,111,110,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,32,99,104,101,99,107,32,116,104,101,32,110,101,120,116,32,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,32,102,111,114,32,118,97,108,117,101,115,10,119,104,111,115,101,32,101,110,99,111,100,105,110,103,32,117,115,101,115,32,49,44,32,50,44,32,51,44,32,111,114,32,52,32,98,121,116,101,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,111,102,10,116,104,101,32,99,104,97,114,97,99,116,101,114,32,97,114,101,32,116,104,101,110,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,110,117,109,98,101,114,32,111,102,32,103,114,111,117,112,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,55,32,125,10,10,35,35,32,83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,10,10,65,110,32,111,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,99,108,111,115,105,110,103,10,115,113,117,97,114,101,32,98,114,97,99,107,101,116,46,32,65,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,115,112,101,99,105,97,108,32,98,121,32,100,101,102,97,117,108,116,46,10,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,80,67,82,69,95,74,65,86,65,83,67,82,73,80,84,95,67,79,77,80,65,84,96,32,105,115,32,115,101,116,44,32,97,32,108,111,110,101,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,10,98,114,97,99,107,101,116,32,99,97,117,115,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,32,73,102,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,10,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,40,97,102,116,101,114,10,97,110,32,105,110,105,116,105,97,108,32,99,105,114,99,117,109,102,108,101,120,44,32,105,102,32,112,114,101,115,101,110,116,41,32,111,114,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46,10,10,65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,116,104,101,10,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,100,97,116,97,32,117,110,105,116,32,108,111,110,103,46,32,65,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,105,110,10,116,104,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,44,32,117,110,108,101,115,115,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,10,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,32,105,115,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,115,117,98,106,101,99,116,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,110,111,116,10,98,101,32,105,110,32,116,104,101,32,115,101,116,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,46,32,73,102,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,10,116,104,101,32,99,108,97,115,115,44,32,101,110,115,117,114,101,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,101,115,99,97,112,101,32,105,116,32,119,105,116,104,32,97,10,98,97,99,107,115,108,97,115,104,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,96,91,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,44,32,119,104,105,108,101,10,96,91,94,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,10,99,105,114,99,117,109,102,108,101,120,32,105,115,32,106,117,115,116,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,10,105,110,32,116,104,101,32,99,108,97,115,115,32,98,121,32,101,110,117,109,101,114,97,116,105,110,103,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,46,32,65,32,99,108,97,115,115,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,97,10,99,105,114,99,117,109,102,108,101,120,32,105,115,32,110,111,116,32,97,110,32,97,115,115,101,114,116,105,111,110,59,32,105,116,32,115,116,105,108,108,32,99,111,110,115,117,109,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,10,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,105,116,32,102,97,105,108,115,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,101,114,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,115,116,114,105,110,103,46,10,10,73,110,32,85,84,70,45,56,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,40,48,120,102,102,102,102,41,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,99,108,97,115,115,10,97,115,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,111,114,32,98,121,32,117,115,105,110,103,32,116,104,101,32,96,92,120,123,96,32,101,115,99,97,112,105,110,103,32,109,101,99,104,97,110,105,115,109,46,10,10,87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,97,110,121,32,108,101,116,116,101,114,115,32,105,110,32,97,32,99,108,97,115,115,32,114,101,112,114,101,115,101,110,116,32,98,111,116,104,32,116,104,101,105,114,10,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,118,101,114,115,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,99,97,115,101,108,101,115,115,32,96,91,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,34,65,34,10,97,110,100,32,34,97,34,44,32,97,110,100,32,97,32,99,97,115,101,108,101,115,115,32,96,91,94,97,101,105,111,117,93,96,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,65,34,44,32,98,117,116,32,97,32,99,97,115,101,102,117,108,32,118,101,114,115,105,111,110,10,119,111,117,108,100,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,97,108,119,97,121,115,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,10,119,104,111,115,101,32,118,97,108,117,101,115,32,97,114,101,32,60,32,50,53,54,44,32,115,111,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,46,32,70,111,114,32,99,104,97,114,97,99,116,101,114,115,10,119,105,116,104,32,104,105,103,104,101,114,32,118,97,108,117,101,115,44,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,105,115,32,115,117,112,112,111,114,116,101,100,32,111,110,108,121,32,105,102,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,10,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,110,32,97,32,85,84,70,10,109,111,100,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,62,61,44,32,101,110,115,117,114,101,32,116,104,97,116,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,10,115,117,112,112,111,114,116,32,97,110,100,32,119,105,116,104,32,85,84,70,32,115,117,112,112,111,114,116,46,10,10,67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,99,97,110,32,105,110,100,105,99,97,116,101,32,108,105,110,101,32,98,114,101,97,107,115,32,97,114,101,32,110,101,118,101,114,32,116,114,101,97,116,101,100,32,105,110,32,97,110,121,32,115,112,101,99,105,97,108,32,119,97,121,10,119,104,101,110,32,109,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,44,32,119,104,97,116,101,118,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,115,101,113,117,101,110,99,101,32,105,115,32,105,110,32,117,115,101,44,32,97,110,100,10,119,104,97,116,101,118,101,114,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,115,32,96,80,67,82,69,95,68,79,84,65,76,76,96,32,97,110,100,32,96,80,67,82,69,95,77,85,76,84,73,76,73,78,69,96,32,105,115,32,117,115,101,100,46,32,65,32,99,108,97,115,115,10,115,117,99,104,32,97,115,32,96,91,94,97,93,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,109,105,110,117,115,32,40,104,121,112,104,101,110,41,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,112,101,99,105,102,121,32,97,32,114,97,110,103,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,100,45,109,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,98,101,116,119,101,101,110,32,100,32,97,110,100,32,109,44,10,105,110,99,108,117,115,105,118,101,46,32,73,102,32,97,32,109,105,110,117,115,32,99,104,97,114,97,99,116,101,114,32,105,115,32,114,101,113,117,105,114,101,100,32,105,110,32,97,32,99,108,97,115,115,44,32,105,116,32,109,117,115,116,32,98,101,32,101,115,99,97,112,101,100,32,119,105,116,104,10,97,32,98,97,99,107,115,108,97,115,104,32,111,114,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,105,116,32,99,97,110,110,111,116,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,100,105,99,97,116,105,110,103,10,97,32,114,97,110,103,101,44,32,116,121,112,105,99,97,108,108,121,32,97,115,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,10,97,102,116,101,114,32,97,32,114,97,110,103,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,98,45,100,45,122,93,96,32,109,97,116,99,104,101,115,32,108,101,116,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,98,32,116,111,32,100,44,32,97,10,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,122,46,10,10,84,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,34,93,34,32,99,97,110,110,111,116,32,98,101,32,116,104,101,32,101,110,100,32,99,104,97,114,97,99,116,101,114,32,111,102,32,97,32,114,97,110,103,101,46,32,65,32,112,97,116,116,101,114,110,32,115,117,99,104,10,97,115,32,96,91,87,45,93,52,54,93,96,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,111,102,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,40,34,87,34,32,97,110,100,32,34,45,34,41,32,102,111,108,108,111,119,101,100,10,98,121,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,34,52,54,93,34,44,32,115,111,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,87,52,54,93,34,32,111,114,32,34,45,52,54,93,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,34,93,34,10,105,115,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,114,97,110,103,101,44,32,115,111,10,96,91,87,45,92,93,52,54,93,96,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,99,111,110,116,97,105,110,105,110,103,32,97,32,114,97,110,103,101,32,102,111,108,108,111,119,101,100,32,98,121,32,116,119,111,32,111,116,104,101,114,10,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,34,93,34,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,116,111,10,101,110,100,32,97,32,114,97,110,103,101,46,10,10,65,110,32,101,114,114,111,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,32,80,79,83,73,88,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,115,101,101,32,98,101,108,111,119,41,32,111,114,32,97,110,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,32,111,116,104,101,114,32,116,104,97,110,32,111,110,101,32,116,104,97,116,32,100,101,102,105,110,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,101,97,114,115,32,97,116,32,97,32,112,111,105,110,116,32,119,104,101,114,101,10,97,32,114,97,110,103,101,32,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,32,105,115,32,101,120,112,101,99,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,122,45,92,120,102,102,93,96,32,105,115,32,118,97,108,105,100,44,32,98,117,116,10,96,91,65,45,92,100,93,96,32,97,110,100,32,96,91,65,45,91,58,100,105,103,105,116,58,93,93,96,32,97,114,101,32,110,111,116,46,10,10,82,97,110,103,101,115,32,111,112,101,114,97,116,101,32,105,110,32,116,104,101,32,99,111,108,108,97,116,105,110,103,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,46,32,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,10,117,115,101,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,110,117,109,101,114,105,99,97,108,108,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,96,91,92,48,48,48,45,92,48,51,55,93,96,46,32,82,97,110,103,101,115,10,99,97,110,32,105,110,99,108,117,100,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,118,97,108,105,100,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,46,10,10,73,102,32,97,32,114,97,110,103,101,32,116,104,97,116,32,105,110,99,108,117,100,101,115,32,108,101,116,116,101,114,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,105,116,10,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,115,32,105,110,32,101,105,116,104,101,114,32,99,97,115,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,87,45,99,93,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,96,32,91,93,91,92,92,94,95,96,119,120,121,122,97,98,99,93,32,96,96,44,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,46,32,73,110,32,97,32,110,111,110,45,85,84,70,32,109,111,100,101,44,32,105,102,32,99,104,97,114,97,99,116,101,114,10,116,97,98,108,101,115,32,102,111,114,32,97,32,70,114,101,110,99,104,32,108,111,99,97,108,101,32,97,114,101,32,105,110,32,117,115,101,44,32,96,91,92,120,99,56,45,92,120,99,98,93,96,32,109,97,116,99,104,101,115,32,97,99,99,101,110,116,101,100,32,69,10,99,104,97,114,97,99,116,101,114,115,32,105,110,32,98,111,116,104,32,99,97,115,101,115,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,10,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,111,110,108,121,32,119,104,101,110,32,105,116,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,10,115,117,112,112,111,114,116,46,10,10,84,104,101,32,99,104,97,114,97,99,116,101,114,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,96,92,100,96,44,32,96,92,68,96,44,32,96,92,104,96,44,32,96,92,72,96,44,32,96,92,112,96,44,32,96,92,80,96,44,32,96,92,115,96,44,32,96,92,83,96,44,32,96,92,118,96,44,32,96,92,86,96,44,10,96,92,119,96,44,32,97,110,100,32,96,92,87,96,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,110,100,32,97,100,100,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,10,109,97,116,99,104,32,116,111,32,116,104,101,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,92,100,65,66,67,68,69,70,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,73,110,10,85,84,70,32,109,111,100,101,115,44,32,111,112,116,105,111,110,32,96,117,99,112,96,32,97,102,102,101,99,116,115,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,96,92,100,96,44,32,96,92,115,96,44,32,96,92,119,96,32,97,110,100,32,116,104,101,105,114,10,117,112,112,101,114,99,97,115,101,32,112,97,114,116,110,101,114,115,44,32,106,117,115,116,32,97,115,32,105,116,32,100,111,101,115,32,119,104,101,110,32,116,104,101,121,32,97,112,112,101,97,114,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115,93,40,96,109,58,114,101,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115,96,41,32,101,97,114,108,105,101,114,46,32,84,104,101,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,32,96,92,98,96,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,10,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,66,96,44,32,96,92,78,96,44,32,96,92,82,96,44,32,97,110,100,32,96,92,88,96,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,10,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,97,110,121,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,10,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,78,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,10,10,65,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,99,111,110,118,101,110,105,101,110,116,108,121,32,98,101,32,117,115,101,100,32,119,105,116,104,32,116,104,101,32,117,112,112,101,114,99,97,115,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,32,116,111,10,115,112,101,99,105,102,121,32,97,32,109,111,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,108,111,119,101,114,99,97,115,101,32,116,121,112,101,46,10,70,111,114,32,101,120,97,109,112,108,101,44,32,99,108,97,115,115,32,96,91,94,92,87,95,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,111,114,32,100,105,103,105,116,44,32,98,117,116,32,110,111,116,32,117,110,100,101,114,115,99,111,114,101,44,10,119,104,105,108,101,32,96,91,92,119,93,96,32,105,110,99,108,117,100,101,115,32,117,110,100,101,114,115,99,111,114,101,46,32,65,32,112,111,115,105,116,105,118,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,116,111,32,98,101,32,114,101,97,100,32,97,115,10,34,115,111,109,101,116,104,105,110,103,32,79,82,32,115,111,109,101,116,104,105,110,103,32,79,82,32,46,46,46,34,32,97,110,100,32,97,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,32,97,115,32,34,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,10,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,46,46,46,34,46,10,10,79,110,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,58,10,10,45,32,66,97,99,107,115,108,97,115,104,10,45,32,72,121,112,104,101,110,32,40,111,110,108,121,32,119,104,101,114,101,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,97,32,114,97,110,103,101,41,10,45,32,67,105,114,99,117,109,102,108,101,120,32,40,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,41,10,45,32,79,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,40,111,110,108,121,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,116,114,111,100,117,99,105,110,103,32,97,32,80,111,115,105,120,10,32,32,99,108,97,115,115,32,110,97,109,101,44,32,111,114,32,102,111,114,32,97,32,115,112,101,99,105,97,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,102,101,97,116,117,114,101,59,32,115,101,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,115,101,99,116,105,111,110,115,41,10,45,32,84,101,114,109,105,110,97,116,105,110,103,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,10,10,72,111,119,101,118,101,114,44,32,101,115,99,97,112,105,110,103,32,111,116,104,101,114,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,100,111,101,115,32,110,111,32,104,97,114,109,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,56,32,125,10,10,35,35,32,80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,10,10,80,101,114,108,32,115,117,112,112,111,114,116,115,32,116,104,101,32,80,111,115,105,120,32,110,111,116,97,116,105,111,110,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,105,115,32,117,115,101,115,32,110,97,109,101,115,32,101,110,99,108,111,115,101,100,10,98,121,32,96,91,58,96,32,97,110,100,32,96,58,93,96,32,119,105,116,104,105,110,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,80,67,82,69,32,97,108,115,111,32,115,117,112,112,111,114,116,115,32,116,104,105,115,10,110,111,116,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,48,34,44,32,34,49,34,44,32,97,110,121,32,97,108,112,104,97,98,101,116,105,99,32,99,104,97,114,97,99,116,101,114,44,10,111,114,32,34,37,34,58,10,10,96,96,96,116,101,120,116,10,91,48,49,91,58,97,108,112,104,97,58,93,37,93,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,115,117,112,112,111,114,116,101,100,32,99,108,97,115,115,32,110,97,109,101,115,58,10,10,45,32,42,42,97,108,110,117,109,42,42,32,45,32,76,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,10,10,45,32,42,42,97,108,112,104,97,42,42,32,45,32,76,101,116,116,101,114,115,10,10,45,32,42,42,98,108,97,110,107,42,42,32,45,32,83,112,97,99,101,32,111,114,32,116,97,98,32,111,110,108,121,10,10,45,32,42,42,99,110,116,114,108,42,42,32,45,32,67,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,115,10,10,45,32,42,42,100,105,103,105,116,42,42,32,45,32,68,101,99,105,109,97,108,32,100,105,103,105,116,115,32,40,115,97,109,101,32,97,115,32,96,92,100,96,41,10,10,45,32,42,42,103,114,97,112,104,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,115,112,97,99,101,10,10,45,32,42,42,108,111,119,101,114,42,42,32,45,32,76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,10,10,45,32,42,42,112,114,105,110,116,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,115,112,97,99,101,10,10,45,32,42,42,112,117,110,99,116,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,108,101,116,116,101,114,115,44,32,100,105,103,105,116,115,44,32,97,110,100,32,115,112,97,99,101,10,10,45,32,42,42,115,112,97,99,101,42,42,32,45,32,87,104,105,116,101,115,112,97,99,101,32,40,116,104,101,32,115,97,109,101,32,97,115,32,96,92,115,96,32,102,114,111,109,32,80,67,82,69,32,56,46,51,52,41,10,10,45,32,42,42,117,112,112,101,114,42,42,32,45,32,85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,10,10,45,32,42,42,119,111,114,100,42,42,32,45,32,34,87,111,114,100,34,32,99,104,97,114,97,99,116,101,114,115,32,40,115,97,109,101,32,97,115,32,96,92,119,96,41,10,10,45,32,42,42,120,100,105,103,105,116,42,42,32,45,32,72,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,10,10,84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,97,115,99,105,105,96,44,32,116,104,97,116,32,101,114,114,111,110,101,111,117,115,108,121,32,109,97,116,99,104,101,115,32,76,97,116,105,110,45,49,10,99,104,97,114,97,99,116,101,114,115,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,48,45,49,50,55,32,114,97,110,103,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,80,79,83,73,88,46,32,84,104,105,115,32,99,97,110,110,111,116,32,98,101,32,102,105,120,101,100,10,119,105,116,104,111,117,116,32,97,108,116,101,114,105,110,103,32,116,104,101,32,98,101,104,97,118,105,111,117,114,32,111,102,32,111,116,104,101,114,32,99,108,97,115,115,101,115,44,32,115,111,32,119,101,32,114,101,99,111,109,109,101,110,100,32,109,97,116,99,104,105,110,103,32,116,104,101,10,114,97,110,103,101,32,119,105,116,104,32,96,91,92,92,48,45,92,120,55,102,93,96,32,105,110,115,116,101,97,100,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,34,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,10,97,110,100,32,115,112,97,99,101,32,40,51,50,41,46,32,73,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,44,32,116,104,101,32,108,105,115,116,32,111,102,32,115,112,97,99,101,10,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,100,105,102,102,101,114,101,110,116,59,32,116,104,101,114,101,32,109,97,121,32,98,101,32,102,101,119,101,114,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,109,46,32,34,83,112,97,99,101,34,32,117,115,101,100,32,116,111,10,98,101,32,100,105,102,102,101,114,101,110,116,32,116,111,32,96,92,115,96,44,32,119,104,105,99,104,32,100,105,100,32,110,111,116,32,105,110,99,108,117,100,101,32,86,84,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,10,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,34,83,112,97,99,101,34,32,97,110,100,32,96,92,115,96,10,110,111,119,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,110,97,109,101,32,34,119,111,114,100,34,32,105,115,32,97,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,44,32,97,110,100,32,34,98,108,97,110,107,34,32,105,115,32,97,32,71,78,85,32,101,120,116,101,110,115,105,111,110,32,102,114,111,109,32,80,101,114,108,10,53,46,56,46,32,65,110,111,116,104,101,114,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,32,105,115,32,110,101,103,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,94,32,99,104,97,114,97,99,116,101,114,10,97,102,116,101,114,32,116,104,101,32,99,111,108,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,49,34,44,32,34,50,34,44,32,111,114,32,97,110,121,32,110,111,110,45,100,105,103,105,116,58,10,10,96,96,96,116,101,120,116,10,91,49,50,91,58,94,100,105,103,105,116,58,93,93,10,96,96,96,10,10,80,67,82,69,32,40,97,110,100,32,80,101,114,108,41,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,32,116,104,101,32,80,111,115,105,120,32,115,121,110,116,97,120,32,96,91,46,99,104,46,93,96,32,97,110,100,32,96,91,61,99,104,61,93,96,32,119,104,101,114,101,32,34,99,104,34,10,105,115,32,97,32,34,99,111,108,108,97,116,105,110,103,32,101,108,101,109,101,110,116,34,44,32,98,117,116,32,116,104,101,115,101,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,97,110,100,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,10,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,100,111,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,111,102,32,116,104,101,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,10,99,108,97,115,115,101,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,80,67,82,69,95,85,67,80,96,32,105,115,32,112,97,115,115,101,100,32,116,111,32,96,112,99,114,101,95,99,111,109,112,105,108,101,40,41,96,44,32,115,111,109,101,32,111,102,10,116,104,101,32,99,108,97,115,115,101,115,32,97,114,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,84,104,105,115,32,105,115,10,97,99,104,105,101,118,101,100,32,98,121,32,114,101,112,108,97,99,105,110,103,32,99,101,114,116,97,105,110,32,80,111,115,105,120,32,99,108,97,115,115,101,115,32,98,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,91,58,97,108,110,117,109,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,97,110,125,96,95,10,10,45,32,42,42,96,91,58,97,108,112,104,97,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,125,96,95,10,10,45,32,42,42,96,91,58,98,108,97,110,107,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,104,96,95,10,10,45,32,42,42,96,91,58,100,105,103,105,116,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,78,100,125,96,95,10,10,45,32,42,42,96,91,58,108,111,119,101,114,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,108,125,96,95,10,10,45,32,42,42,96,91,58,115,112,97,99,101,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,112,115,125,96,95,10,10,45,32,42,42,96,91,58,117,112,112,101,114,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,117,125,96,95,10,10,45,32,42,42,96,91,58,119,111,114,100,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,119,100,125,96,95,10,10,78,101,103,97,116,101,100,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,97,115,32,96,91,58,94,97,108,112,104,97,58,93,96,44,32,117,115,101,32,96,92,80,96,32,105,110,115,116,101,97,100,32,111,102,32,96,92,112,96,46,32,84,104,114,101,101,32,111,116,104,101,114,32,80,79,83,73,88,10,99,108,97,115,115,101,115,32,97,114,101,32,104,97,110,100,108,101,100,32,115,112,101,99,105,97,108,108,121,32,105,110,32,85,67,80,32,109,111,100,101,58,10,10,45,32,42,42,96,91,58,103,114,97,112,104,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,103,108,121,112,104,115,32,116,104,97,116,32,109,97,114,107,32,116,104,101,32,112,97,103,101,10,32,32,119,104,101,110,32,112,114,105,110,116,101,100,46,32,73,110,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,116,101,114,109,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,76,44,10,32,32,77,44,32,78,44,32,80,44,32,83,44,32,111,114,32,67,102,32,112,114,111,112,101,114,116,105,101,115,44,32,101,120,99,101,112,116,32,102,111,114,58,10,10,32,32,45,32,42,42,85,43,48,54,49,67,42,42,32,45,32,65,114,97,98,105,99,32,76,101,116,116,101,114,32,77,97,114,107,10,10,32,32,45,32,42,42,85,43,49,56,48,69,42,42,32,45,32,77,111,110,103,111,108,105,97,110,32,86,111,119,101,108,32,83,101,112,97,114,97,116,111,114,10,10,32,32,45,32,42,42,85,43,50,48,54,54,32,45,32,85,43,50,48,54,57,42,42,32,45,32,86,97,114,105,111,117,115,32,34,105,115,111,108,97,116,101,34,115,10,10,45,32,42,42,96,91,58,112,114,105,110,116,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,96,91,58,103,114,97,112,104,58,93,96,32,112,108,117,115,32,115,112,97,99,101,10,32,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,99,111,110,116,114,111,108,115,44,32,116,104,97,116,32,105,115,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,90,115,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,96,91,58,112,117,110,99,116,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,85,110,105,99,111,100,101,32,80,10,32,32,40,112,117,110,99,116,117,97,116,105,111,110,41,32,112,114,111,112,101,114,116,121,44,32,112,108,117,115,32,116,104,111,115,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,108,101,115,115,32,116,104,97,110,10,32,32,49,50,56,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,83,32,40,83,121,109,98,111,108,41,32,112,114,111,112,101,114,116,121,46,10,10,84,104,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,117,110,99,104,97,110,103,101,100,44,32,97,110,100,32,109,97,116,99,104,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,10,112,111,105,110,116,115,32,108,101,115,115,32,116,104,97,110,32,49,50,56,46,10,10,95,67,111,109,112,97,116,105,98,105,108,105,116,121,32,70,101,97,116,117,114,101,32,102,111,114,32,87,111,114,100,32,66,111,117,110,100,97,114,105,101,115,95,10,10,73,110,32,116,104,101,32,80,79,83,73,88,46,50,32,99,111,109,112,108,105,97,110,116,32,108,105,98,114,97,114,121,32,116,104,97,116,32,119,97,115,32,105,110,99,108,117,100,101,100,32,105,110,32,52,46,52,66,83,68,32,85,110,105,120,44,32,116,104,101,32,117,103,108,121,10,115,121,110,116,97,120,32,96,91,91,58,60,58,93,93,96,32,97,110,100,32,96,91,91,58,62,58,93,93,96,32,105,115,32,117,115,101,100,32,102,111,114,32,109,97,116,99,104,105,110,103,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,97,110,100,32,34,101,110,100,32,111,102,10,119,111,114,100,34,46,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,115,101,32,105,116,101,109,115,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,91,91,58,60,58,93,93,96,42,42,32,45,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,92,98,40,63,61,92,119,41,96,10,10,45,32,42,42,96,91,91,58,62,58,93,93,96,42,42,32,45,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,92,98,40,63,60,61,92,119,41,96,10,10,79,110,108,121,32,116,104,101,115,101,32,101,120,97,99,116,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,46,32,65,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,10,96,91,97,91,58,60,58,93,98,93,96,32,112,114,111,118,111,107,101,115,32,101,114,114,111,114,32,102,111,114,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,80,79,83,73,88,32,99,108,97,115,115,32,110,97,109,101,46,32,84,104,105,115,32,115,117,112,112,111,114,116,32,105,115,10,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,105,115,32,112,114,111,118,105,100,101,100,32,116,111,32,104,101,108,112,32,109,105,103,114,97,116,105,111,110,115,32,102,114,111,109,32,111,116,104,101,114,10,101,110,118,105,114,111,110,109,101,110,116,115,44,32,97,110,100,32,105,115,32,98,101,115,116,32,110,111,116,32,117,115,101,100,32,105,110,32,97,110,121,32,110,101,119,32,112,97,116,116,101,114,110,115,46,32,78,111,116,101,32,116,104,97,116,32,96,92,98,96,32,109,97,116,99,104,101,115,32,97,116,10,116,104,101,32,115,116,97,114,116,32,97,110,100,32,116,104,101,32,101,110,100,32,111,102,32,97,32,119,111,114,100,32,40,115,101,101,32,34,83,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,34,32,97,98,111,118,101,41,44,32,97,110,100,32,105,110,32,97,10,80,101,114,108,45,115,116,121,108,101,32,112,97,116,116,101,114,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,111,114,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,110,111,114,109,97,108,108,121,32,115,104,111,119,115,32,119,104,105,99,104,32,105,115,10,119,97,110,116,101,100,44,32,119,105,116,104,111,117,116,32,116,104,101,32,110,101,101,100,32,102,111,114,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,97,98,111,118,101,32,105,110,32,111,114,100,101,114,32,116,111,32,103,105,118,101,10,101,120,97,99,116,108,121,32,116,104,101,32,80,79,83,73,88,32,98,101,104,97,118,105,111,117,114,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,57,32,125,10,10,35,35,32,86,101,114,116,105,99,97,108,32,66,97,114,10,10,86,101,114,116,105,99,97,108,32,98,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,97,108,116,101,114,110,97,116,105,118,101,32,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,34,103,105,108,98,101,114,116,34,32,111,114,32,34,115,117,108,108,105,118,97,110,34,58,10,10,96,96,96,116,101,120,116,10,103,105,108,98,101,114,116,124,115,117,108,108,105,118,97,110,10,96,96,96,10,10,65,110,121,32,110,117,109,98,101,114,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,97,112,112,101,97,114,44,32,97,110,100,32,97,110,32,101,109,112,116,121,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,112,101,114,109,105,116,116,101,100,10,40,109,97,116,99,104,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,41,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,10,116,117,114,110,44,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,105,115,32,117,115,101,100,46,32,73,102,32,116,104,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,100,101,102,105,110,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,41,44,32,34,115,117,99,99,101,101,100,115,34,32,109,101,97,110,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,109,97,105,110,10,112,97,116,116,101,114,110,32,97,110,100,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,48,32,125,10,10,35,35,32,73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103,10,10,84,104,101,32,115,101,116,116,105,110,103,115,32,111,102,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,96,99,97,115,101,108,101,115,115,96,44,32,96,109,117,108,116,105,108,105,110,101,96,44,32,96,100,111,116,97,108,108,96,44,10,97,110,100,32,96,101,120,116,101,110,100,101,100,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,114,111,109,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,80,101,114,108,10,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,101,110,99,108,111,115,101,100,32,98,101,116,119,101,101,110,32,34,40,63,34,32,97,110,100,32,34,41,34,46,32,84,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,105,42,42,32,45,32,70,111,114,32,96,99,97,115,101,108,101,115,115,96,10,10,45,32,42,42,109,42,42,32,45,32,70,111,114,32,96,109,117,108,116,105,108,105,110,101,96,10,10,45,32,42,42,115,42,42,32,45,32,70,111,114,32,96,100,111,116,97,108,108,96,10,10,45,32,42,42,120,42,42,32,45,32,70,111,114,32,96,101,120,116,101,110,100,101,100,96,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,96,40,63,105,109,41,96,32,115,101,116,115,32,99,97,115,101,108,101,115,115,44,32,109,117,108,116,105,108,105,110,101,32,109,97,116,99,104,105,110,103,46,32,84,104,101,115,101,32,111,112,116,105,111,110,115,32,99,97,110,32,97,108,115,111,10,98,101,32,117,110,115,101,116,32,98,121,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,108,101,116,116,101,114,32,119,105,116,104,32,97,32,104,121,112,104,101,110,46,32,65,32,99,111,109,98,105,110,101,100,32,115,101,116,116,105,110,103,32,97,110,100,32,117,110,115,101,116,116,105,110,103,10,115,117,99,104,32,97,115,32,96,40,63,105,109,45,115,120,41,96,44,32,119,104,105,99,104,32,115,101,116,115,32,96,99,97,115,101,108,101,115,115,96,32,97,110,100,32,96,109,117,108,116,105,108,105,110,101,96,44,32,119,104,105,108,101,32,117,110,115,101,116,116,105,110,103,10,96,100,111,116,97,108,108,96,32,97,110,100,32,96,101,120,116,101,110,100,101,100,96,44,32,105,115,32,97,108,115,111,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,97,32,108,101,116,116,101,114,32,97,112,112,101,97,114,115,32,98,111,116,104,32,98,101,102,111,114,101,32,97,110,100,10,97,102,116,101,114,32,116,104,101,32,104,121,112,104,101,110,44,32,116,104,101,32,111,112,116,105,111,110,32,105,115,32,117,110,115,101,116,46,10,10,84,104,101,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,96,100,117,112,110,97,109,101,115,96,44,32,96,117,110,103,114,101,101,100,121,96,44,32,97,110,100,32,96,101,120,116,114,97,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,105,110,10,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,98,121,32,117,115,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,74,44,32,85,44,32,97,110,100,32,88,10,114,101,115,112,101,99,116,105,118,101,108,121,46,10,10,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,111,110,32,99,104,97,110,103,101,115,32,111,99,99,117,114,115,32,97,116,32,116,111,112,45,108,101,118,101,108,32,40,116,104,97,116,32,105,115,44,32,110,111,116,32,105,110,115,105,100,101,10,115,117,98,112,97,116,116,101,114,110,32,112,97,114,101,110,116,104,101,115,101,115,41,44,32,116,104,101,32,99,104,97,110,103,101,32,97,112,112,108,105,101,115,32,116,111,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,116,104,97,116,10,102,111,108,108,111,119,115,46,10,10,65,110,32,111,112,116,105,111,110,32,99,104,97,110,103,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,41,10,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,97,116,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,116,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,109,97,116,99,104,101,115,32,97,98,99,32,97,110,100,32,97,66,99,32,97,110,100,32,110,111,32,111,116,104,101,114,32,115,116,114,105,110,103,115,32,40,97,115,115,117,109,105,110,103,32,96,99,97,115,101,108,101,115,115,96,32,105,115,32,110,111,116,32,117,115,101,100,41,58,10,10,96,96,96,116,101,120,116,10,40,97,40,63,105,41,98,41,99,10,96,96,96,10,10,66,121,32,116,104,105,115,32,109,101,97,110,115,44,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,115,101,116,116,105,110,103,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,112,97,114,116,115,10,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,99,104,97,110,103,101,115,32,109,97,100,101,32,105,110,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,100,111,32,99,97,114,114,121,32,111,110,32,105,110,116,111,32,115,117,98,115,101,113,117,101,110,116,10,98,114,97,110,99,104,101,115,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,40,63,105,41,98,124,99,41,10,96,96,96,10,10,109,97,116,99,104,101,115,32,34,97,98,34,44,32,34,97,66,34,44,32,34,99,34,44,32,97,110,100,32,34,67,34,44,32,97,108,116,104,111,117,103,104,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,67,34,32,116,104,101,32,102,105,114,115,116,32,98,114,97,110,99,104,32,105,115,10,97,98,97,110,100,111,110,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,102,102,101,99,116,115,32,111,102,32,111,112,116,105,111,110,10,115,101,116,116,105,110,103,115,32,111,99,99,117,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,101,114,101,32,119,111,117,108,100,32,98,101,32,115,111,109,101,32,119,101,105,114,100,32,98,101,104,97,118,105,111,114,32,111,116,104,101,114,119,105,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,116,104,101,114,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,119,104,101,110,32,116,104,101,32,99,111,109,112,105,108,105,110,103,10,62,32,111,114,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,115,112,101,99,105,97,108,10,62,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,40,92,42,67,82,76,70,41,44,32,116,111,32,111,118,101,114,114,105,100,101,32,119,104,97,116,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,104,97,115,32,115,101,116,10,62,32,111,114,32,119,104,97,116,32,104,97,115,32,98,101,101,110,32,100,101,102,97,117,108,116,101,100,46,32,68,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,105,110,32,115,101,99,116,105,111,110,10,62,32,91,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,96,41,32,101,97,114,108,105,101,114,46,10,62,10,62,32,84,104,101,32,40,42,85,84,70,56,41,32,97,110,100,32,40,42,85,67,80,41,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,116,32,85,84,70,32,97,110,100,32,85,110,105,99,111,100,101,10,62,32,112,114,111,112,101,114,116,121,32,109,111,100,101,115,46,32,84,104,101,121,32,97,114,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,115,32,96,117,110,105,99,111,100,101,96,32,97,110,100,32,96,117,99,112,96,44,10,62,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,32,105,115,32,97,32,103,101,110,101,114,105,99,32,118,101,114,115,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,10,62,32,97,110,121,32,111,102,32,116,104,101,32,108,105,98,114,97,114,105,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,99,97,110,32,115,101,116,32,111,112,116,105,111,110,32,96,110,101,118,101,114,95,117,116,102,96,44,10,62,32,119,104,105,99,104,32,108,111,99,107,115,32,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,49,32,125,10,10,35,35,32,83,117,98,112,97,116,116,101,114,110,115,10,10,83,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,112,97,114,101,110,116,104,101,115,101,115,32,40,114,111,117,110,100,32,98,114,97,99,107,101,116,115,41,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,10,84,117,114,110,105,110,103,32,112,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,116,119,111,32,116,104,105,110,103,115,58,10,10,45,32,42,42,49,46,42,42,32,45,32,73,116,32,108,111,99,97,108,105,122,101,115,32,97,32,115,101,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,32,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,99,97,116,97,114,97,99,116,34,44,32,34,99,97,116,101,114,112,105,108,108,97,114,34,44,32,111,114,32,34,99,97,116,34,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,99,97,116,40,97,114,97,99,116,124,101,114,112,105,108,108,97,114,124,41,10,32,32,96,96,96,10,10,32,32,87,105,116,104,111,117,116,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,44,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,99,97,116,97,114,97,99,116,34,44,32,34,101,114,112,105,108,108,97,114,34,44,32,111,114,32,97,110,32,101,109,112,116,121,10,32,32,115,116,114,105,110,103,46,10,10,45,32,42,42,50,46,42,42,32,45,32,73,116,32,115,101,116,115,32,117,112,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,10,32,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,116,104,97,116,32,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,116,104,114,111,117,103,104,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,10,32,32,96,114,117,110,47,51,96,46,10,10,79,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,40,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,41,32,116,111,32,111,98,116,97,105,110,10,110,117,109,98,101,114,115,32,102,111,114,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,114,101,100,32,107,105,110,103,34,10,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,114,101,100,10,107,105,110,103,34,44,32,34,114,101,100,34,44,32,97,110,100,32,34,107,105,110,103,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,44,32,50,44,32,97,110,100,32,51,44,32,114,101,115,112,101,99,116,105,118,101,108,121,58,10,10,96,96,96,116,101,120,116,10,116,104,101,32,40,40,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41,10,96,96,96,10,10,73,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,104,101,108,112,102,117,108,32,116,104,97,116,32,112,108,97,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,102,117,108,102,105,108,108,32,116,119,111,32,102,117,110,99,116,105,111,110,115,46,32,79,102,116,101,110,32,97,10,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,111,117,116,32,97,32,99,97,112,116,117,114,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,46,32,73,102,32,97,110,32,111,112,101,110,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,97,110,100,32,97,32,99,111,108,111,110,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,10,100,111,32,97,110,121,32,99,97,112,116,117,114,105,110,103,44,32,97,110,100,32,105,115,32,110,111,116,32,99,111,117,110,116,101,100,32,119,104,101,110,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,110,121,32,115,117,98,115,101,113,117,101,110,116,10,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,119,104,105,116,101,32,113,117,101,101,110,34,32,105,115,32,109,97,116,99,104,101,100,10,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,119,104,105,116,101,32,113,117,101,101,110,34,32,97,110,100,10,34,113,117,101,101,110,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,32,97,110,100,32,50,58,10,10,96,96,96,116,101,120,116,10,116,104,101,32,40,40,63,58,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41,10,96,96,96,10,10,84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,54,53,53,51,53,46,10,10,65,115,32,97,32,99,111,110,118,101,110,105,101,110,116,32,115,104,111,114,116,104,97,110,100,44,32,105,102,32,97,110,121,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,97,114,101,32,114,101,113,117,105,114,101,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,10,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,34,63,34,32,97,110,100,32,34,58,34,46,10,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,115,116,114,105,110,103,115,58,10,10,96,96,96,116,101,120,116,10,40,63,105,58,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,40,63,58,40,63,105,41,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,96,96,96,10,10,65,115,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,97,114,101,32,116,114,105,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,111,112,116,105,111,110,115,32,97,114,101,32,110,111,116,32,114,101,115,101,116,10,117,110,116,105,108,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,97,99,104,101,100,44,32,97,110,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,105,110,32,111,110,101,32,98,114,97,110,99,104,32,100,111,101,115,10,97,102,102,101,99,116,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,44,32,115,111,32,116,104,101,32,97,98,111,118,101,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,98,111,116,104,32,34,83,85,78,68,65,89,34,32,97,110,100,10,34,83,97,116,117,114,100,97,121,34,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,50,32,125,10,10,35,35,32,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,10,10,80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,97,32,102,101,97,116,117,114,101,32,119,104,101,114,101,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,10,115,97,109,101,32,110,117,109,98,101,114,115,32,102,111,114,32,105,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46,32,83,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,96,40,63,124,96,10,97,110,100,32,105,115,32,105,116,115,101,108,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,124,40,83,97,116,41,117,114,124,40,83,117,110,41,41,100,97,121,10,96,96,96,10,10,65,115,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,115,105,100,101,32,97,32,96,40,63,124,96,32,103,114,111,117,112,44,32,98,111,116,104,32,115,101,116,115,32,111,102,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,111,110,101,46,32,84,104,117,115,44,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,121,111,117,32,99,97,110,32,108,111,111,107,32,97,116,10,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,110,117,109,98,101,114,32,111,110,101,44,32,119,104,105,99,104,101,118,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,99,111,110,115,116,114,117,99,116,32,105,115,10,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,99,97,112,116,117,114,101,32,97,32,112,97,114,116,44,32,98,117,116,32,110,111,116,32,97,108,108,44,32,111,102,32,111,110,101,32,111,102,32,109,97,110,121,10,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,110,115,105,100,101,32,97,32,96,40,63,124,96,32,103,114,111,117,112,44,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,116,104,101,10,110,117,109,98,101,114,32,105,115,32,114,101,115,101,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,46,32,84,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,110,121,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,102,111,108,108,111,119,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,32,97,102,116,101,114,32,116,104,101,32,104,105,103,104,101,115,116,32,110,117,109,98,101,114,32,117,115,101,100,32,105,110,10,97,110,121,32,98,114,97,110,99,104,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,105,115,32,102,114,111,109,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,59,32,116,104,101,32,110,117,109,98,101,114,115,10,117,110,100,101,114,110,101,97,116,104,32,115,104,111,119,32,105,110,32,119,104,105,99,104,32,98,117,102,102,101,114,32,116,104,101,32,99,97,112,116,117,114,101,100,32,99,111,110,116,101,110,116,32,105,115,32,115,116,111,114,101,100,58,10,10,96,96,96,116,101,120,116,10,35,32,98,101,102,111,114,101,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,98,114,97,110,99,104,45,114,101,115,101,116,45,45,45,45,45,45,45,45,45,45,45,32,97,102,116,101,114,10,47,32,40,32,97,32,41,32,32,40,63,124,32,120,32,40,32,121,32,41,32,122,32,124,32,40,112,32,40,113,41,32,114,41,32,124,32,40,116,41,32,117,32,40,118,41,32,41,32,40,32,122,32,41,32,47,120,10,35,32,49,32,32,32,32,32,32,32,32,32,32,32,32,50,32,32,32,32,32,32,32,32,32,50,32,32,51,32,32,32,32,32,32,32,32,50,32,32,32,32,32,51,32,32,32,32,32,52,10,96,96,96,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,118,97,108,117,101,32,116,104,97,116,32,105,115,32,115,101,116,10,102,111,114,32,116,104,97,116,32,110,117,109,98,101,114,32,98,121,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,10,34,100,101,102,100,101,102,34,58,10,10,96,96,96,116,101,120,116,10,47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,92,49,47,10,96,96,96,10,10,73,110,32,99,111,110,116,114,97,115,116,44,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,114,101,102,101,114,115,32,116,111,32,116,104,101,10,102,105,114,115,116,32,111,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,10,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,97,98,99,34,58,10,10,96,96,96,116,101,120,116,10,47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,40,63,49,41,47,10,96,96,96,10,10,73,102,32,97,32,99,111,110,100,105,116,105,111,110,32,116,101,115,116,32,102,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,118,105,110,103,32,109,97,116,99,104,101,100,32,114,101,102,101,114,115,32,116,111,32,97,32,110,111,110,45,117,110,105,113,117,101,10,110,117,109,98,101,114,44,32,116,104,101,32,116,101,115,116,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,118,101,32,109,97,116,99,104,101,100,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,117,115,105,110,103,32,116,104,105,115,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,102,101,97,116,117,114,101,32,105,115,32,116,111,32,117,115,101,32,100,117,112,108,105,99,97,116,101,10,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,51,32,125,10,10,35,35,32,78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115,10,10,73,100,101,110,116,105,102,121,105,110,103,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,98,121,32,110,117,109,98,101,114,32,105,115,32,115,105,109,112,108,101,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,104,97,114,100,32,116,111,10,107,101,101,112,32,116,114,97,99,107,32,111,102,32,116,104,101,32,110,117,109,98,101,114,115,32,105,110,32,99,111,109,112,108,105,99,97,116,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,46,32,65,108,115,111,44,32,105,102,32,97,110,10,101,120,112,114,101,115,115,105,111,110,32,105,115,32,109,111,100,105,102,105,101,100,44,32,116,104,101,32,110,117,109,98,101,114,115,32,99,97,110,32,99,104,97,110,103,101,46,32,84,111,32,104,101,108,112,32,119,105,116,104,32,116,104,105,115,32,100,105,102,102,105,99,117,108,116,121,44,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,110,97,109,105,110,103,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,110,111,116,32,97,100,100,101,100,32,116,111,32,80,101,114,108,10,117,110,116,105,108,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,80,121,116,104,111,110,32,104,97,100,32,116,104,101,32,102,101,97,116,117,114,101,32,101,97,114,108,105,101,114,44,32,97,110,100,32,80,67,82,69,32,105,110,116,114,111,100,117,99,101,100,32,105,116,32,97,116,10,114,101,108,101,97,115,101,32,52,46,48,44,32,117,115,105,110,103,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,67,82,69,32,110,111,119,32,115,117,112,112,111,114,116,115,32,98,111,116,104,32,116,104,101,32,80,101,114,108,32,97,110,100,32,116,104,101,10,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,101,114,108,32,97,108,108,111,119,115,32,105,100,101,110,116,105,99,97,108,108,121,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,10,110,97,109,101,115,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,46,10,10,73,110,32,80,67,82,69,44,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,110,97,109,101,100,32,105,110,32,111,110,101,32,111,102,32,116,104,114,101,101,32,119,97,121,115,58,32,96,40,63,60,110,97,109,101,62,46,46,46,41,96,32,111,114,10,96,40,63,39,110,97,109,101,39,46,46,46,41,96,32,97,115,32,105,110,32,80,101,114,108,44,32,111,114,32,96,40,63,80,60,110,97,109,101,62,46,46,46,41,96,32,97,115,32,105,110,32,80,121,116,104,111,110,46,32,82,101,102,101,114,101,110,99,101,115,32,116,111,10,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,102,114,111,109,32,111,116,104,101,114,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,115,117,99,104,32,97,115,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,44,10,114,101,99,117,114,115,105,111,110,44,32,97,110,100,32,99,111,110,100,105,116,105,111,110,115,44,32,99,97,110,32,98,101,32,109,97,100,101,32,98,121,32,110,97,109,101,32,97,110,100,32,98,121,32,110,117,109,98,101,114,46,10,10,78,97,109,101,115,32,99,111,110,115,105,115,116,32,111,102,32,117,112,32,116,111,32,51,50,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,115,44,32,98,117,116,32,109,117,115,116,10,115,116,97,114,116,32,119,105,116,104,32,97,32,110,111,110,45,100,105,103,105,116,46,32,78,97,109,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,115,116,105,108,108,32,97,108,108,111,99,97,116,101,100,32,110,117,109,98,101,114,115,10,97,115,32,119,101,108,108,32,97,115,32,110,97,109,101,115,44,32,101,120,97,99,116,108,121,32,97,115,32,105,102,32,116,104,101,32,110,97,109,101,115,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,101,32,96,99,97,112,116,117,114,101,96,10,115,112,101,99,105,102,105,99,97,116,105,111,110,32,116,111,32,96,114,117,110,47,51,96,32,99,97,110,32,117,115,101,32,110,97,109,101,100,32,118,97,108,117,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,32,110,97,109,101,32,109,117,115,116,32,98,101,32,117,110,105,113,117,101,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,44,32,98,117,116,32,116,104,105,115,32,99,111,110,115,116,114,97,105,110,116,32,99,97,110,32,98,101,10,114,101,108,97,120,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,100,117,112,110,97,109,101,115,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,40,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,10,97,108,119,97,121,115,32,112,101,114,109,105,116,116,101,100,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,115,101,116,32,117,112,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,10,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,32,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,116,116,101,114,110,115,32,119,104,101,114,101,32,111,110,108,121,32,111,110,101,10,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,109,97,116,99,104,46,32,83,117,112,112,111,115,101,32,116,104,97,116,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,104,101,10,110,97,109,101,32,111,102,32,97,32,119,101,101,107,100,97,121,44,32,101,105,116,104,101,114,32,97,115,32,97,32,51,45,108,101,116,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,32,111,114,32,97,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,44,32,97,110,100,32,105,110,10,98,111,116,104,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,101,120,116,114,97,99,116,32,116,104,101,32,97,98,98,114,101,118,105,97,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,40,105,103,110,111,114,105,110,103,10,116,104,101,32,108,105,110,101,32,98,114,101,97,107,115,41,32,100,111,101,115,32,116,104,101,32,106,111,98,58,10,10,96,96,96,116,101,120,116,10,40,63,60,68,78,62,77,111,110,124,70,114,105,124,83,117,110,41,40,63,58,100,97,121,41,63,124,10,40,63,60,68,78,62,84,117,101,41,40,63,58,115,100,97,121,41,63,124,10,40,63,60,68,78,62,87,101,100,41,40,63,58,110,101,115,100,97,121,41,63,124,10,40,63,60,68,78,62,84,104,117,41,40,63,58,114,115,100,97,121,41,63,124,10,40,63,60,68,78,62,83,97,116,41,40,63,58,117,114,100,97,121,41,63,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,102,105,118,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,115,116,114,105,110,103,115,44,32,98,117,116,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,115,101,116,32,97,102,116,101,114,32,97,32,109,97,116,99,104,46,32,40,65,110,10,97,108,116,101,114,110,97,116,105,118,101,32,119,97,121,32,111,102,32,115,111,108,118,105,110,103,32,116,104,105,115,32,112,114,111,98,108,101,109,32,105,115,32,116,111,32,117,115,101,32,97,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,115,117,98,112,97,116,116,101,114,110,44,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,10,10,70,111,114,32,99,97,112,116,117,114,105,110,103,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,119,104,105,99,104,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,117,110,105,113,117,101,44,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,10,111,99,99,117,114,114,101,110,99,101,32,40,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,41,32,105,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,96,114,117,110,47,51,96,44,10,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,96,118,97,108,117,101,115,96,32,112,97,114,116,32,111,102,32,116,104,101,32,96,99,97,112,116,117,114,101,96,32,115,116,97,116,101,109,101,110,116,46,32,84,104,101,10,96,97,108,108,95,110,97,109,101,115,96,32,99,97,112,116,117,114,105,110,103,32,118,97,108,117,101,32,109,97,116,99,104,101,115,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,116,119,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,10,62,32,115,97,109,101,32,110,117,109,98,101,114,44,32,97,115,32,80,67,82,69,32,117,115,101,115,32,111,110,108,121,32,116,104,101,32,110,117,109,98,101,114,115,32,119,104,101,110,32,109,97,116,99,104,105,110,103,46,32,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,32,97,110,10,62,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,105,102,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,10,62,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,115,112,101,99,105,102,121,32,116,104,101,32,115,97,109,101,32,110,97,109,101,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,10,62,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,101,118,101,110,32,119,104,101,110,32,96,100,117,112,110,97,109,101,115,96,32,105,115,32,110,111,116,32,115,101,116,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,52,32,125,10,10,35,35,32,82,101,112,101,116,105,116,105,111,110,10,10,82,101,112,101,116,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,113,117,97,110,116,105,102,105,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,102,111,108,108,111,119,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,105,116,101,109,115,58,10,10,45,32,65,32,108,105,116,101,114,97,108,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,10,45,32,84,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,10,45,32,84,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,84,104,101,32,96,92,88,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,84,104,101,32,96,92,82,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,65,110,32,101,115,99,97,112,101,32,115,117,99,104,32,97,115,32,96,92,100,96,32,111,114,32,96,92,112,76,96,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,10,45,32,65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,45,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,10,45,32,65,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,40,105,110,99,108,117,100,105,110,103,32,97,115,115,101,114,116,105,111,110,115,41,10,45,32,65,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,114,101,99,117,114,115,105,118,101,32,111,114,32,111,116,104,101,114,119,105,115,101,41,10,10,84,104,101,32,103,101,110,101,114,97,108,32,114,101,112,101,116,105,116,105,111,110,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,32,109,105,110,105,109,117,109,32,97,110,100,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,112,101,114,109,105,116,116,101,100,32,109,97,116,99,104,101,115,44,32,98,121,32,103,105,118,105,110,103,32,116,104,101,32,116,119,111,32,110,117,109,98,101,114,115,32,105,110,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,40,98,114,97,99,101,115,41,44,10,115,101,112,97,114,97,116,101,100,32,98,121,32,97,32,99,111,109,109,97,46,32,84,104,101,32,110,117,109,98,101,114,115,32,109,117,115,116,32,98,101,32,60,32,54,53,53,51,54,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,109,117,115,116,32,98,101,32,108,101,115,115,10,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,115,101,99,111,110,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,122,122,34,44,32,34,122,122,122,34,44,32,111,114,10,34,122,122,122,122,34,58,10,10,96,96,96,116,101,120,116,10,122,123,50,44,52,125,10,96,96,96,10,10,65,32,99,108,111,115,105,110,103,32,98,114,97,99,101,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,97,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,105,115,10,111,109,105,116,116,101,100,44,32,98,117,116,32,116,104,101,32,99,111,109,109,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,114,101,32,105,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,10,97,110,100,32,116,104,101,32,99,111,109,109,97,32,97,114,101,32,98,111,116,104,32,111,109,105,116,116,101,100,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,101,120,97,99,116,32,110,117,109,98,101,114,32,111,102,10,114,101,113,117,105,114,101,100,32,109,97,116,99,104,101,115,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,116,104,114,101,101,32,115,117,99,99,101,115,115,105,118,101,32,118,111,119,101,108,115,44,10,98,117,116,32,99,97,110,32,109,97,116,99,104,32,109,97,110,121,32,109,111,114,101,58,10,10,96,96,96,116,101,120,116,10,91,97,101,105,111,117,93,123,51,44,125,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,101,120,97,99,116,108,121,32,101,105,103,104,116,32,100,105,103,105,116,115,58,10,10,96,96,96,116,101,120,116,10,92,100,123,56,125,10,96,96,96,10,10,65,110,32,111,112,101,110,105,110,103,32,99,117,114,108,121,32,98,114,97,99,107,101,116,32,116,104,97,116,32,97,112,112,101,97,114,115,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,10,97,108,108,111,119,101,100,44,32,111,114,32,111,110,101,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,121,110,116,97,120,32,111,102,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,105,115,32,116,97,107,101,110,32,97,115,32,97,10,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,123,44,54,92,125,32,105,115,32,110,111,116,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,10,111,102,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46,10,10,73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,113,117,97,110,116,105,102,105,101,114,115,32,97,112,112,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,10,117,110,105,116,115,46,32,84,104,117,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,96,92,120,123,49,48,48,125,123,50,125,96,32,109,97,116,99,104,101,115,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,10,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,50,45,98,121,116,101,32,115,101,113,117,101,110,99,101,32,105,110,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,46,32,83,105,109,105,108,97,114,108,121,44,32,96,92,88,123,51,125,96,10,109,97,116,99,104,101,115,32,116,104,114,101,101,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,99,97,110,32,98,101,32,109,97,110,121,32,100,97,116,97,10,117,110,105,116,115,32,108,111,110,103,32,40,97,110,100,32,116,104,101,121,32,99,97,110,32,98,101,32,111,102,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,41,46,10,10,84,104,101,32,113,117,97,110,116,105,102,105,101,114,32,92,123,48,92,125,32,105,115,32,112,101,114,109,105,116,116,101,100,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,116,111,32,98,101,104,97,118,101,32,97,115,32,105,102,32,116,104,101,10,112,114,101,118,105,111,117,115,32,105,116,101,109,32,97,110,100,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,10,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,40,98,117,116,32,115,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,10,91,68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,98,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121,93,40,96,109,58,114,101,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115,96,41,41,46,10,73,116,101,109,115,32,111,116,104,101,114,32,116,104,97,110,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,104,97,118,101,32,97,32,92,123,48,92,125,32,113,117,97,110,116,105,102,105,101,114,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,10,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,46,10,10,70,111,114,32,99,111,110,118,101,110,105,101,110,99,101,44,32,116,104,101,32,116,104,114,101,101,32,109,111,115,116,32,99,111,109,109,111,110,32,113,117,97,110,116,105,102,105,101,114,115,32,104,97,118,101,32,115,105,110,103,108,101,45,99,104,97,114,97,99,116,101,114,10,97,98,98,114,101,118,105,97,116,105,111,110,115,58,10,10,45,32,42,42,92,42,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,48,44,92,125,10,10,45,32,42,42,43,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,49,44,92,125,10,10,45,32,42,42,63,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,48,44,49,92,125,10,10,73,110,102,105,110,105,116,101,32,108,111,111,112,115,32,99,97,110,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,102,111,108,108,111,119,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,109,97,116,99,104,32,110,111,10,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,97,32,113,117,97,110,116,105,102,105,101,114,32,116,104,97,116,32,104,97,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,63,41,42,10,96,96,96,10,10,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,32,97,110,100,32,80,67,82,69,32,117,115,101,100,32,116,111,32,103,105,118,101,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,102,111,114,32,115,117,99,104,10,112,97,116,116,101,114,110,115,46,32,72,111,119,101,118,101,114,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,44,32,115,117,99,104,32,112,97,116,116,101,114,110,115,10,97,114,101,32,110,111,119,32,97,99,99,101,112,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,110,121,32,114,101,112,101,116,105,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,10,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,108,111,111,112,32,105,115,32,102,111,114,99,105,98,108,121,32,98,114,111,107,101,110,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,34,103,114,101,101,100,121,34,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,109,97,116,99,104,32,97,115,32,109,117,99,104,32,97,115,10,112,111,115,115,105,98,108,101,32,40,117,112,32,116,111,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,116,105,109,101,115,41,44,32,119,105,116,104,111,117,116,32,99,97,117,115,105,110,103,32,116,104,101,10,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,114,101,32,116,104,105,115,32,103,105,118,101,115,32,112,114,111,98,108,101,109,115,32,105,115,10,105,110,32,116,114,121,105,110,103,32,116,111,32,109,97,116,99,104,32,99,111,109,109,101,110,116,115,32,105,110,32,67,32,112,114,111,103,114,97,109,115,46,32,84,104,101,115,101,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,47,95,32,97,110,100,32,95,47,46,10,87,105,116,104,105,110,32,116,104,101,32,99,111,109,109,101,110,116,44,32,105,110,100,105,118,105,100,117,97,108,32,92,42,32,97,110,100,32,47,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,46,32,65,110,32,97,116,116,101,109,112,116,32,116,111,10,109,97,116,99,104,32,67,32,99,111,109,109,101,110,116,115,32,98,121,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,47,92,42,46,42,92,42,47,10,96,96,96,10,10,116,111,32,116,104,101,32,115,116,114,105,110,103,10,10,96,96,96,116,101,120,116,10,47,42,32,102,105,114,115,116,32,99,111,109,109,101,110,116,32,42,47,32,32,110,111,116,32,99,111,109,109,101,110,116,32,32,47,42,32,115,101,99,111,110,100,32,99,111,109,109,101,110,116,32,42,47,10,96,96,96,10,10,102,97,105,108,115,44,32,97,115,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,111,119,105,110,103,32,116,111,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,46,92,42,32,105,116,101,109,46,10,10,72,111,119,101,118,101,114,44,32,105,102,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,44,32,105,116,32,99,101,97,115,101,115,32,116,111,32,98,101,32,103,114,101,101,100,121,44,10,97,110,100,32,105,110,115,116,101,97,100,32,109,97,116,99,104,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,112,111,115,115,105,98,108,101,44,32,115,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,32,100,111,101,115,32,116,104,101,32,114,105,103,104,116,32,116,104,105,110,103,32,119,105,116,104,32,116,104,101,32,67,32,99,111,109,109,101,110,116,115,58,10,10,96,96,96,116,101,120,116,10,47,92,42,46,42,63,92,42,47,10,96,96,96,10,10,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,118,97,114,105,111,117,115,32,113,117,97,110,116,105,102,105,101,114,115,32,105,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32,99,104,97,110,103,101,100,44,32,111,110,108,121,32,116,104,101,10,112,114,101,102,101,114,114,101,100,32,110,117,109,98,101,114,32,111,102,32,109,97,116,99,104,101,115,46,32,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,116,104,105,115,32,117,115,101,32,111,102,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,119,105,116,104,32,105,116,115,10,117,115,101,32,97,115,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,110,32,105,116,115,32,111,119,110,32,114,105,103,104,116,46,32,65,115,32,105,116,32,104,97,115,32,116,119,111,32,117,115,101,115,44,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,10,97,112,112,101,97,114,32,100,111,117,98,108,101,100,44,32,97,115,32,105,110,10,10,96,96,96,116,101,120,116,10,92,100,63,63,92,100,10,96,96,96,10,10,119,104,105,99,104,32,109,97,116,99,104,101,115,32,111,110,101,32,100,105,103,105,116,32,98,121,32,112,114,101,102,101,114,101,110,99,101,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,105,102,32,116,104,97,116,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,10,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,46,10,10,73,102,32,111,112,116,105,111,110,32,96,117,110,103,114,101,101,100,121,96,32,105,115,32,115,101,116,32,40,97,110,32,111,112,116,105,111,110,32,116,104,97,116,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,80,101,114,108,41,44,32,116,104,101,10,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,105,110,100,105,118,105,100,117,97,108,32,111,110,101,115,32,99,97,110,32,98,101,32,109,97,100,101,32,103,114,101,101,100,121,32,98,121,10,102,111,108,108,111,119,105,110,103,32,116,104,101,109,32,119,105,116,104,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,110,118,101,114,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,46,10,10,87,104,101,110,32,97,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,113,117,97,110,116,105,102,105,101,100,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,114,101,112,101,97,116,32,99,111,117,110,116,32,116,104,97,116,10,105,115,32,62,32,49,32,111,114,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,109,97,120,105,109,117,109,44,32,109,111,114,101,32,109,101,109,111,114,121,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,116,104,101,32,99,111,109,112,105,108,101,100,10,112,97,116,116,101,114,110,44,32,105,110,32,112,114,111,112,111,114,116,105,111,110,32,116,111,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,105,110,105,109,117,109,32,111,114,32,109,97,120,105,109,117,109,46,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,46,92,42,32,111,114,32,46,92,123,48,44,92,125,32,97,110,100,32,111,112,116,105,111,110,32,96,100,111,116,97,108,108,96,32,40,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,10,111,112,116,105,111,110,32,96,47,115,96,41,32,105,115,32,115,101,116,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,100,111,116,32,116,111,32,109,97,116,99,104,32,110,101,119,108,105,110,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,44,32,98,101,99,97,117,115,101,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,105,115,32,116,114,105,101,100,32,97,103,97,105,110,115,116,32,101,118,101,114,121,32,99,104,97,114,97,99,116,101,114,10,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,83,111,44,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,114,101,116,114,121,105,110,103,32,116,104,101,32,111,118,101,114,97,108,108,10,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,115,105,116,105,111,110,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,46,32,80,67,82,69,32,110,111,114,109,97,108,108,121,32,116,114,101,97,116,115,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,97,115,32,105,102,10,105,116,32,119,97,115,32,112,114,101,99,101,100,101,100,32,98,121,32,96,92,65,96,46,10,10,73,110,32,99,97,115,101,115,32,119,104,101,114,101,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,111,32,110,101,119,108,105,110,101,115,44,32,105,116,32,105,115,10,119,111,114,116,104,32,115,101,116,116,105,110,103,32,96,100,111,116,97,108,108,96,32,116,111,32,111,98,116,97,105,110,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,44,32,111,114,32,97,108,116,101,114,110,97,116,105,118,101,108,121,32,117,115,105,110,103,32,94,32,116,111,10,105,110,100,105,99,97,116,101,32,97,110,99,104,111,114,105,110,103,32,101,120,112,108,105,99,105,116,108,121,46,10,10,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,87,104,101,110,32,46,92,42,32,105,115,10,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,115,117,98,106,101,99,116,32,111,102,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,101,108,115,101,119,104,101,114,101,10,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,10,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,46,42,41,97,98,99,92,49,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,120,121,122,49,50,51,97,98,99,49,50,51,34,44,32,116,104,101,32,109,97,116,99,104,32,112,111,105,110,116,32,105,115,32,116,104,101,32,102,111,117,114,116,104,32,99,104,97,114,97,99,116,101,114,46,10,84,104,101,114,101,102,111,114,101,44,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,46,10,10,65,110,111,116,104,101,114,32,99,97,115,101,32,119,104,101,114,101,32,105,109,112,108,105,99,105,116,32,97,110,99,104,111,114,105,110,103,32,105,115,32,110,111,116,32,97,112,112,108,105,101,100,32,105,115,32,119,104,101,110,32,116,104,101,32,108,101,97,100,105,110,103,32,46,92,42,32,105,115,10,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,97,103,97,105,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,10,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,62,46,42,63,97,41,98,10,96,96,96,10,10,73,116,32,109,97,116,99,104,101,115,32,34,97,98,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,34,97,97,98,34,46,32,84,104,101,32,117,115,101,32,111,102,32,116,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,115,10,40,42,80,82,85,78,69,41,32,97,110,100,32,40,42,83,75,73,80,41,32,97,108,115,111,32,100,105,115,97,98,108,101,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,46,10,10,87,104,101,110,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,112,101,97,116,101,100,44,32,116,104,101,32,118,97,108,117,101,32,99,97,112,116,117,114,101,100,32,105,115,32,116,104,101,32,115,117,98,115,116,114,105,110,103,10,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,102,105,110,97,108,32,105,116,101,114,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114,10,10,96,96,96,116,101,120,116,10,40,116,119,101,101,100,108,101,91,100,117,109,101,93,123,51,125,92,115,42,41,43,10,96,96,96,10,10,104,97,115,32,109,97,116,99,104,101,100,32,34,116,119,101,101,100,108,101,100,117,109,32,116,119,101,101,100,108,101,100,101,101,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,10,34,116,119,101,101,100,108,101,100,101,101,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,101,115,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,116,104,101,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,115,101,116,32,105,110,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,115,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,97,102,116,101,114,10,10,96,96,96,116,101,120,116,10,47,40,97,124,40,98,41,41,43,47,10,96,96,96,10,10,109,97,116,99,104,101,115,32,34,97,98,97,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,98,34,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,53,32,125,10,10,35,35,32,65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115,10,10,87,105,116,104,32,98,111,116,104,32,109,97,120,105,109,105,122,105,110,103,32,40,34,103,114,101,101,100,121,34,41,32,97,110,100,32,109,105,110,105,109,105,122,105,110,103,32,40,34,117,110,103,114,101,101,100,121,34,32,111,114,32,34,108,97,122,121,34,41,10,114,101,112,101,116,105,116,105,111,110,44,32,102,97,105,108,117,114,101,32,111,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,110,111,114,109,97,108,108,121,32,99,97,117,115,101,115,32,116,104,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,32,116,111,32,98,101,10,114,101,45,101,118,97,108,117,97,116,101,100,32,116,111,32,115,101,101,32,105,102,32,97,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,32,111,102,32,114,101,112,101,97,116,115,32,97,108,108,111,119,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,10,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,46,32,83,111,109,101,116,105,109,101,115,32,105,116,32,105,115,32,117,115,101,102,117,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,105,115,44,32,101,105,116,104,101,114,32,116,111,32,99,104,97,110,103,101,32,116,104,101,10,110,97,116,117,114,101,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,111,114,32,116,111,32,99,97,117,115,101,32,105,116,32,116,111,32,102,97,105,108,32,101,97,114,108,105,101,114,32,116,104,97,110,32,105,116,32,111,116,104,101,114,119,105,115,101,32,109,105,103,104,116,44,10,119,104,101,110,32,116,104,101,32,97,117,116,104,111,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,107,110,111,119,115,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,99,97,114,114,121,105,110,103,32,111,110,46,10,10,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,96,92,100,43,102,111,111,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,106,101,99,116,10,108,105,110,101,58,10,10,96,96,96,116,101,120,116,10,49,50,51,52,53,54,98,97,114,10,96,96,96,10,10,65,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,108,108,32,115,105,120,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,44,32,116,104,101,32,110,111,114,109,97,108,32,97,99,116,105,111,110,10,111,102,32,116,104,101,32,109,97,116,99,104,101,114,32,105,115,32,116,111,32,116,114,121,32,97,103,97,105,110,32,119,105,116,104,32,111,110,108,121,32,102,105,118,101,32,100,105,103,105,116,115,32,109,97,116,99,104,105,110,103,32,105,116,101,109,32,96,92,100,43,96,44,32,97,110,100,10,116,104,101,110,32,119,105,116,104,32,102,111,117,114,44,32,97,110,100,32,115,111,32,111,110,44,32,98,101,102,111,114,101,32,117,108,116,105,109,97,116,101,108,121,32,102,97,105,108,105,110,103,46,32,34,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,34,32,40,97,32,116,101,114,109,10,116,97,107,101,110,32,102,114,111,109,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,98,111,111,107,41,32,112,114,111,118,105,100,101,115,32,116,104,101,32,109,101,97,110,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,97,116,32,111,110,99,101,32,97,10,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,109,97,116,99,104,101,100,44,32,105,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,105,110,32,116,104,105,115,32,119,97,121,46,10,10,73,102,32,97,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,105,115,32,117,115,101,100,32,102,111,114,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,103,105,118,101,115,32,117,112,10,105,109,109,101,100,105,97,116,101,108,121,32,111,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,105,115,32,97,32,107,105,110,100,32,111,102,10,115,112,101,99,105,97,108,32,112,97,114,101,110,116,104,101,115,105,115,44,32,115,116,97,114,116,105,110,103,32,119,105,116,104,32,96,40,63,62,96,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,63,62,92,100,43,41,102,111,111,10,96,96,96,10,10,84,104,105,115,32,107,105,110,100,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,34,108,111,99,107,115,32,117,112,34,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,32,99,111,110,116,97,105,110,115,32,111,110,99,101,32,105,116,10,104,97,115,32,109,97,116,99,104,101,100,44,32,97,110,100,32,97,32,102,97,105,108,117,114,101,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,118,101,110,116,101,100,32,102,114,111,109,10,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,112,97,115,116,32,105,116,32,116,111,32,112,114,101,118,105,111,117,115,32,105,116,101,109,115,44,32,104,111,119,101,118,101,114,44,32,119,111,114,107,115,32,97,115,10,110,111,114,109,97,108,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,101,115,99,114,105,112,116,105,111,110,32,105,115,32,116,104,97,116,32,97,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,105,115,32,116,121,112,101,32,109,97,116,99,104,101,115,32,116,104,101,32,115,116,114,105,110,103,10,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,110,32,105,100,101,110,116,105,99,97,108,32,115,116,97,110,100,97,108,111,110,101,32,112,97,116,116,101,114,110,32,119,111,117,108,100,32,109,97,116,99,104,44,32,105,102,32,97,110,99,104,111,114,101,100,32,97,116,10,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,83,105,109,112,108,101,32,99,97,115,101,115,32,115,117,99,104,32,97,115,10,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,109,97,120,105,109,105,122,105,110,103,32,114,101,112,101,97,116,32,116,104,97,116,32,109,117,115,116,32,115,119,97,108,108,111,119,10,101,118,101,114,121,116,104,105,110,103,32,105,116,32,99,97,110,46,32,83,111,44,32,119,104,105,108,101,32,98,111,116,104,32,96,92,100,43,96,32,97,110,100,32,96,92,100,43,63,96,32,97,114,101,32,112,114,101,112,97,114,101,100,32,116,111,32,97,100,106,117,115,116,32,116,104,101,10,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,109,97,107,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,44,32,96,40,63,62,92,100,43,41,96,32,99,97,110,10,111,110,108,121,32,109,97,116,99,104,32,97,110,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,46,10,10,65,116,111,109,105,99,32,103,114,111,117,112,115,32,105,110,32,103,101,110,101,114,97,108,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,99,111,109,112,108,105,99,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,110,100,32,99,97,110,32,98,101,10,110,101,115,116,101,100,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,102,111,114,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,106,117,115,116,32,97,32,115,105,110,103,108,101,10,114,101,112,101,97,116,101,100,32,105,116,101,109,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,97,32,115,105,109,112,108,101,114,32,110,111,116,97,116,105,111,110,44,32,99,97,108,108,101,100,32,97,32,34,112,111,115,115,101,115,115,105,118,101,10,113,117,97,110,116,105,102,105,101,114,34,32,99,97,110,32,98,101,32,117,115,101,100,46,32,84,104,105,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,110,32,101,120,116,114,97,32,43,32,99,104,97,114,97,99,116,101,114,32,102,111,108,108,111,119,105,110,103,32,97,10,113,117,97,110,116,105,102,105,101,114,46,32,85,115,105,110,103,32,116,104,105,115,32,110,111,116,97,116,105,111,110,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,97,115,10,10,96,96,96,116,101,120,116,10,92,100,43,43,102,111,111,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,32,101,110,116,105,114,101,32,103,114,111,117,112,44,32,102,111,114,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,124,120,121,122,41,123,50,44,51,125,43,10,96,96,96,10,10,80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,97,108,119,97,121,115,32,103,114,101,101,100,121,59,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,32,96,117,110,103,114,101,101,100,121,96,32,105,115,10,105,103,110,111,114,101,100,46,32,84,104,101,121,32,97,114,101,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,105,109,112,108,101,114,32,102,111,114,109,115,32,111,102,32,97,110,32,97,116,111,109,105,99,10,103,114,111,117,112,46,32,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,10,97,110,100,32,116,104,101,32,101,113,117,105,118,97,108,101,110,116,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,98,117,116,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,100,105,102,102,101,114,101,110,99,101,59,10,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,112,114,111,98,97,98,108,121,32,115,108,105,103,104,116,108,121,32,102,97,115,116,101,114,46,10,10,84,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,115,121,110,116,97,120,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,116,104,101,32,80,101,114,108,32,53,46,56,32,115,121,110,116,97,120,46,32,74,101,102,102,114,101,121,10,70,114,105,101,100,108,32,111,114,105,103,105,110,97,116,101,100,32,116,104,101,32,105,100,101,97,32,40,97,110,100,32,116,104,101,32,110,97,109,101,41,32,105,110,32,116,104,101,32,102,105,114,115,116,32,101,100,105,116,105,111,110,32,111,102,32,104,105,115,32,98,111,111,107,46,32,77,105,107,101,10,77,99,67,108,111,115,107,101,121,32,108,105,107,101,100,32,105,116,44,32,115,111,32,105,109,112,108,101,109,101,110,116,101,100,32,105,116,32,119,104,101,110,32,104,101,32,98,117,105,108,116,32,116,104,101,32,83,117,110,32,74,97,118,97,32,112,97,99,107,97,103,101,44,32,97,110,100,10,80,67,82,69,32,99,111,112,105,101,100,32,105,116,32,102,114,111,109,32,116,104,101,114,101,46,32,73,116,32,117,108,116,105,109,97,116,101,108,121,32,102,111,117,110,100,32,105,116,115,32,119,97,121,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,10,53,46,49,48,46,10,10,80,67,82,69,32,104,97,115,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,34,112,111,115,115,101,115,115,105,102,105,101,115,34,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,10,112,97,116,116,101,114,110,32,99,111,110,115,116,114,117,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,115,101,113,117,101,110,99,101,32,65,43,66,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,65,43,43,66,44,32,97,115,32,116,104,101,114,101,10,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,65,58,115,32,119,104,101,110,32,66,32,109,117,115,116,32,102,111,108,108,111,119,46,10,10,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,105,116,115,101,108,102,10,98,101,32,114,101,112,101,97,116,101,100,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,116,104,101,32,111,110,108,121,10,119,97,121,32,116,111,32,97,118,111,105,100,32,115,111,109,101,32,102,97,105,108,105,110,103,32,109,97,116,99,104,101,115,32,116,97,107,105,110,103,32,97,32,108,111,110,103,32,116,105,109,101,46,32,84,104,101,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,40,92,68,43,124,60,92,100,43,62,41,42,91,33,63,93,10,96,96,96,10,10,109,97,116,99,104,101,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,32,116,104,97,116,32,101,105,116,104,101,114,32,99,111,110,115,105,115,116,32,111,102,32,110,111,110,45,100,105,103,105,116,115,44,32,111,114,10,100,105,103,105,116,115,32,101,110,99,108,111,115,101,100,32,105,110,32,96,60,62,96,44,32,102,111,108,108,111,119,101,100,32,98,121,32,96,33,96,32,111,114,32,96,63,96,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,44,32,105,116,32,114,117,110,115,32,113,117,105,99,107,108,121,46,10,72,111,119,101,118,101,114,44,32,105,102,32,105,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,10,10,96,96,96,116,101,120,116,10,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,10,96,96,96,10,10,105,116,32,116,97,107,101,115,32,97,32,108,111,110,103,32,116,105,109,101,32,98,101,102,111,114,101,32,114,101,112,111,114,116,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,115,116,114,105,110,103,32,99,97,110,32,98,101,10,100,105,118,105,100,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,96,92,68,43,96,32,114,101,112,101,97,116,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,92,42,32,114,101,112,101,97,116,32,105,110,32,109,97,110,121,10,119,97,121,115,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,114,105,101,100,46,32,40,84,104,101,32,101,120,97,109,112,108,101,32,117,115,101,115,32,96,91,33,63,93,96,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,115,105,110,103,108,101,10,99,104,97,114,97,99,116,101,114,32,97,116,32,116,104,101,32,101,110,100,44,32,97,115,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,104,97,118,101,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,108,108,111,119,115,32,102,111,114,10,102,97,115,116,32,102,97,105,108,117,114,101,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,114,101,109,101,109,98,101,114,32,116,104,101,32,108,97,115,116,32,115,105,110,103,108,101,10,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,32,109,97,116,99,104,44,32,97,110,100,32,102,97,105,108,32,101,97,114,108,121,32,105,102,32,105,116,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,10,116,104,101,32,115,116,114,105,110,103,46,41,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,117,115,101,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,108,105,107,101,32,116,104,101,10,102,111,108,108,111,119,105,110,103,44,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,100,105,103,105,116,115,32,99,97,110,110,111,116,32,98,101,32,98,114,111,107,101,110,44,32,97,110,100,32,102,97,105,108,117,114,101,32,104,97,112,112,101,110,115,10,113,117,105,99,107,108,121,58,10,10,96,96,96,116,101,120,116,10,40,40,63,62,92,68,43,41,124,60,92,100,43,62,41,42,91,33,63,93,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,54,32,125,10,10,35,35,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,62,32,48,32,40,97,110,100,32,112,111,115,115,105,98,108,121,10,102,117,114,116,104,101,114,32,100,105,103,105,116,115,41,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,101,97,114,108,105,101,114,32,40,116,104,97,116,32,105,115,44,10,116,111,32,105,116,115,32,108,101,102,116,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,105,115,32,60,32,49,48,44,32,105,116,32,105,115,32,97,108,119,97,121,115,10,116,97,107,101,110,32,97,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,97,110,100,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,116,32,116,104,97,116,32,109,97,110,121,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,10,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,100,111,32,110,101,101,100,32,110,111,116,32,98,101,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,110,117,109,98,101,114,115,32,60,32,49,48,46,32,65,10,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,110,32,109,97,107,101,32,115,101,110,115,101,32,119,104,101,110,32,97,32,114,101,112,101,116,105,116,105,111,110,32,105,115,10,105,110,118,111,108,118,101,100,32,97,110,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,114,105,103,104,116,32,104,97,115,32,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,97,110,32,101,97,114,108,105,101,114,10,105,116,101,114,97,116,105,111,110,46,10,10,73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,118,101,32,97,32,110,117,109,101,114,105,99,97,108,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,10,119,104,111,115,101,32,110,117,109,98,101,114,32,105,115,32,49,48,32,111,114,32,109,111,114,101,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,44,32,97,115,32,97,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,96,92,53,48,96,32,105,115,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,104,97,114,97,99,116,101,114,32,100,101,102,105,110,101,100,32,105,110,32,111,99,116,97,108,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,10,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,44,32,115,101,101,32,115,101,99,116,105,111,110,10,91,78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115,93,40,96,109,58,114,101,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115,96,41,32,101,97,114,108,105,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,10,115,117,99,104,32,112,114,111,98,108,101,109,32,119,104,101,110,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,46,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,10,105,115,32,112,111,115,115,105,98,108,101,32,117,115,105,110,103,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,65,110,111,116,104,101,114,32,119,97,121,32,116,111,32,97,118,111,105,100,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,105,110,104,101,114,101,110,116,32,105,110,32,116,104,101,32,117,115,101,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,10,98,97,99,107,115,108,97,115,104,32,105,115,32,116,111,32,117,115,101,32,116,104,101,32,96,92,103,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,10,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,32,97,114,101,32,105,100,101,110,116,105,99,97,108,58,10,10,96,96,96,116,101,120,116,10,40,114,105,110,103,41,44,32,92,49,10,40,114,105,110,103,41,44,32,92,103,49,10,40,114,105,110,103,41,44,32,92,103,123,49,125,10,96,96,96,10,10,65,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,97,98,115,111,108,117,116,101,32,114,101,102,101,114,101,110,99,101,32,119,105,116,104,111,117,116,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,116,104,97,116,32,105,115,10,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,111,108,100,101,114,32,115,121,110,116,97,120,46,32,73,116,32,105,115,32,97,108,115,111,32,117,115,101,102,117,108,32,119,104,101,110,32,108,105,116,101,114,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,32,116,104,101,10,114,101,102,101,114,101,110,99,101,46,32,65,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,105,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,40,100,101,102,41,103,104,105,41,92,103,123,45,49,125,10,96,96,96,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,103,123,45,49,125,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,115,116,97,114,116,101,100,32,99,97,112,116,117,114,105,110,103,10,115,117,98,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,96,92,103,96,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,92,50,96,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,46,10,83,105,109,105,108,97,114,108,121,44,32,96,92,103,123,45,50,125,96,32,119,111,117,108,100,32,98,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,92,49,96,46,32,84,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,10,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,105,110,32,108,111,110,103,32,112,97,116,116,101,114,110,115,44,32,97,110,100,32,97,108,115,111,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,99,114,101,97,116,101,100,32,98,121,10,106,111,105,110,105,110,103,32,102,114,97,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,119,105,116,104,105,110,32,116,104,101,109,115,101,108,118,101,115,46,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,119,104,97,116,101,118,101,114,32,109,97,116,99,104,101,100,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,10,99,117,114,114,101,110,116,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,97,116,104,101,114,32,116,104,97,110,32,97,110,121,116,104,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,116,115,101,108,102,10,40,115,101,99,116,105,111,110,32,91,83,117,98,112,97,116,116,101,114,110,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,93,40,96,109,58,114,101,35,115,101,99,116,50,49,96,41,32,100,101,115,99,114,105,98,101,115,32,97,32,119,97,121,32,111,102,32,100,111,105,110,103,10,116,104,97,116,41,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,10,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121,10,96,96,96,10,10,73,102,32,99,97,115,101,102,117,108,32,109,97,116,99,104,105,110,103,32,105,115,32,105,110,32,102,111,114,99,101,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,116,104,101,32,99,97,115,101,32,111,102,10,108,101,116,116,101,114,115,32,105,115,32,114,101,108,101,118,97,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,114,97,104,32,114,97,104,34,32,97,110,100,32,34,82,65,72,32,82,65,72,34,44,10,98,117,116,32,110,111,116,32,34,82,65,72,32,114,97,104,34,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,111,114,105,103,105,110,97,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,10,99,97,115,101,108,101,115,115,108,121,58,10,10,96,96,96,116,101,120,116,10,40,40,63,105,41,114,97,104,41,92,115,43,92,49,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,111,102,32,119,114,105,116,105,110,103,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,84,104,101,32,46,78,69,84,32,115,121,110,116,97,120,32,96,92,107,123,110,97,109,101,125,96,32,97,110,100,32,116,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,96,92,107,60,110,97,109,101,62,96,32,111,114,32,96,92,107,39,110,97,109,101,39,96,32,97,114,101,10,115,117,112,112,111,114,116,101,100,44,32,97,115,32,105,115,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,32,96,40,63,80,61,110,97,109,101,41,96,46,32,84,104,101,32,117,110,105,102,105,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,115,121,110,116,97,120,32,105,110,32,80,101,114,108,32,53,46,49,48,44,32,105,110,32,119,104,105,99,104,32,96,92,103,96,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,98,111,116,104,32,110,117,109,101,114,105,99,32,97,110,100,32,110,97,109,101,100,10,114,101,102,101,114,101,110,99,101,115,44,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,84,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,107,60,112,49,62,10,40,63,39,112,49,39,40,63,105,41,114,97,104,41,92,115,43,92,107,123,112,49,125,10,40,63,80,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,40,63,80,61,112,49,41,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,103,123,112,49,125,10,96,96,96,10,10,65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,110,97,109,101,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,111,114,10,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,10,10,84,104,101,114,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,97,10,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,110,111,116,32,98,101,101,110,32,117,115,101,100,32,105,110,32,97,32,112,97,114,116,105,99,117,108,97,114,32,109,97,116,99,104,44,32,97,110,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,105,116,10,97,108,119,97,121,115,32,102,97,105,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,102,97,105,108,115,32,105,102,32,105,116,32,115,116,97,114,116,115,32,116,111,10,109,97,116,99,104,32,34,97,34,32,114,97,116,104,101,114,32,116,104,97,110,32,34,98,99,34,58,10,10,96,96,96,116,101,120,116,10,40,97,124,40,98,99,41,41,92,50,10,96,96,96,10,10,65,115,32,116,104,101,114,101,32,99,97,110,32,98,101,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,108,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,10,116,104,101,32,98,97,99,107,115,108,97,115,104,32,97,114,101,32,116,97,107,101,110,32,97,115,32,112,97,114,116,32,111,102,32,97,32,112,111,116,101,110,116,105,97,108,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,10,112,97,116,116,101,114,110,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,97,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,44,32,115,111,109,101,32,100,101,108,105,109,105,116,101,114,32,109,117,115,116,32,98,101,32,117,115,101,100,32,116,111,10,116,101,114,109,105,110,97,116,101,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,73,102,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,44,32,116,104,105,115,32,99,97,110,32,98,101,10,119,104,105,116,101,115,112,97,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,110,32,101,109,112,116,121,32,99,111,109,109,101,110,116,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,67,111,109,109,101,110,116,115,93,40,96,109,58,114,101,35,115,101,99,116,49,57,96,41,41,10,99,97,110,32,98,101,32,117,115,101,100,46,10,10,95,82,101,99,117,114,115,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,95,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,32,102,97,105,108,115,10,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,102,105,114,115,116,32,117,115,101,100,44,32,115,111,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,40,96,97,92,49,96,41,32,110,101,118,101,114,32,109,97,116,99,104,101,115,46,10,72,111,119,101,118,101,114,44,32,115,117,99,104,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,115,105,100,101,32,114,101,112,101,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,34,97,34,115,32,97,110,100,32,97,108,115,111,32,34,97,98,97,34,44,32,34,97,98,97,98,98,97,97,34,44,32,97,110,100,10,115,111,32,111,110,58,10,10,96,96,96,116,101,120,116,10,40,97,124,98,92,49,41,43,10,96,96,96,10,10,65,116,32,101,97,99,104,32,105,116,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,46,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,44,32,116,104,101,10,112,97,116,116,101,114,110,32,109,117,115,116,32,98,101,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,105,116,101,114,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,98,97,99,107,10,114,101,102,101,114,101,110,99,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,100,111,110,101,32,117,115,105,110,103,32,97,108,116,101,114,110,97,116,105,111,110,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,111,114,32,98,121,32,97,10,113,117,97,110,116,105,102,105,101,114,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,111,102,32,122,101,114,111,46,10,10,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,117,115,101,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,121,32,114,101,102,101,114,101,110,99,101,32,116,111,32,98,101,32,116,114,101,97,116,101,100,10,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,116,104,101,32,119,104,111,108,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,10,102,97,105,108,117,114,101,32,99,97,110,110,111,116,32,99,97,117,115,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,116,104,101,32,103,114,111,117,112,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,55,32,125,10,10,35,35,32,65,115,115,101,114,116,105,111,110,115,10,10,65,110,32,97,115,115,101,114,116,105,111,110,32,105,115,32,97,32,116,101,115,116,32,111,110,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,102,111,108,108,111,119,105,110,103,32,111,114,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,99,117,114,114,101,110,116,10,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,115,117,109,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,32,99,111,100,101,100,10,97,115,32,96,92,98,96,44,32,96,92,66,96,44,32,96,92,65,96,44,32,96,92,71,96,44,32,96,92,90,96,44,32,96,92,122,96,44,32,96,94,96,44,32,97,110,100,32,96,36,96,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,10,115,101,99,116,105,111,110,115,46,10,10,77,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,99,111,100,101,100,32,97,115,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,114,101,32,97,114,101,32,116,119,111,32,107,105,110,100,115,58,32,116,104,111,115,101,10,116,104,97,116,32,108,111,111,107,32,97,104,101,97,100,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,10,108,111,111,107,32,98,101,104,105,110,100,32,105,116,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,105,110,32,116,104,101,32,110,111,114,109,97,108,32,119,97,121,44,32,101,120,99,101,112,116,10,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,116,111,32,98,101,32,99,104,97,110,103,101,100,46,10,10,65,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,73,102,32,115,117,99,104,32,97,110,32,97,115,115,101,114,116,105,111,110,10,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,105,110,32,105,116,44,32,116,104,101,115,101,32,97,114,101,32,99,111,117,110,116,101,100,32,102,111,114,32,116,104,101,32,112,117,114,112,111,115,101,115,32,111,102,10,110,117,109,98,101,114,105,110,103,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,115,117,98,115,116,114,105,110,103,10,99,97,112,116,117,114,105,110,103,32,105,115,32,100,111,110,101,32,111,110,108,121,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,40,80,101,114,108,32,115,111,109,101,116,105,109,101,115,44,32,98,117,116,32,110,111,116,32,97,108,119,97,121,115,44,10,112,101,114,102,111,114,109,115,32,99,97,112,116,117,114,105,110,103,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,41,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,73,102,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,111,110,101,32,111,114,32,109,111,114,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,115,117,99,99,101,101,100,115,44,10,62,32,98,117,116,32,102,97,105,108,117,114,101,32,116,111,32,109,97,116,99,104,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,118,101,114,32,116,104,105,115,10,62,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,99,97,112,116,117,114,101,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,101,116,32,111,110,108,121,32,105,102,32,110,111,32,104,105,103,104,101,114,10,62,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,101,115,32,97,114,101,32,97,108,114,101,97,100,121,32,115,101,116,46,32,84,104,105,115,32,105,115,44,32,117,110,102,111,114,116,117,110,97,116,101,108,121,44,32,97,32,102,117,110,100,97,109,101,110,116,97,108,10,62,32,108,105,109,105,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,97,115,32,80,67,82,69,49,32,105,115,32,110,111,119,32,105,110,10,62,32,109,97,105,110,116,101,110,97,110,99,101,45,111,110,108,121,32,115,116,97,116,117,115,44,32,105,116,32,105,115,32,117,110,108,105,107,101,108,121,32,101,118,101,114,32,116,111,32,99,104,97,110,103,101,46,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,114,101,112,101,97,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,116,10,109,97,107,101,115,32,110,111,32,115,101,110,115,101,32,116,111,32,97,115,115,101,114,116,32,116,104,101,32,115,97,109,101,32,116,104,105,110,103,32,109,97,110,121,32,116,105,109,101,115,44,32,116,104,101,32,115,105,100,101,32,101,102,102,101,99,116,32,111,102,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,111,99,99,97,115,105,111,110,97,108,108,121,32,98,101,32,117,115,101,102,117,108,46,32,73,110,32,112,114,97,99,116,105,99,101,44,32,116,104,101,114,101,32,97,114,101,32,111,110,108,121,32,116,104,114,101,101,32,99,97,115,101,115,58,10,10,45,32,73,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,92,123,48,92,125,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,118,101,114,32,111,98,101,121,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,10,32,32,72,111,119,101,118,101,114,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,103,114,111,117,112,115,32,116,104,97,116,32,97,114,101,10,32,32,99,97,108,108,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,116,104,114,111,117,103,104,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,101,99,104,97,110,105,115,109,46,10,45,32,73,102,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,92,123,48,44,110,92,125,44,32,119,104,101,114,101,32,110,32,62,32,48,44,32,105,116,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,105,102,32,105,116,32,119,97,115,32,92,123,48,44,49,92,125,46,32,65,116,10,32,32,114,117,110,116,105,109,101,44,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,105,115,32,116,114,105,101,100,32,119,105,116,104,32,97,110,100,32,119,105,116,104,111,117,116,32,116,104,101,32,97,115,115,101,114,116,105,111,110,44,10,32,32,116,104,101,32,111,114,100,101,114,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,46,10,45,32,73,102,32,116,104,101,32,109,105,110,105,109,117,109,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,62,32,48,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,10,32,32,111,98,101,121,101,100,32,111,110,108,121,32,111,110,99,101,32,119,104,101,110,32,101,110,99,111,117,110,116,101,114,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,10,10,95,76,111,111,107,97,104,101,97,100,32,65,115,115,101,114,116,105,111,110,115,95,10,10,76,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,92,33,32,102,111,114,10,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,32,119,111,114,100,32,102,111,108,108,111,119,101,100,32,98,121,32,97,10,115,101,109,105,99,111,108,111,110,44,32,98,117,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,115,101,109,105,99,111,108,111,110,32,105,110,32,116,104,101,32,109,97,116,99,104,58,10,10,96,96,96,116,101,120,116,10,92,119,43,40,63,61,59,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,102,111,111,34,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,97,114,34,58,10,10,96,96,96,116,101,120,116,10,102,111,111,40,63,33,98,97,114,41,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,112,112,97,114,101,110,116,108,121,32,115,105,109,105,108,97,114,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,40,63,33,102,111,111,41,98,97,114,10,96,96,96,10,10,100,111,101,115,32,110,111,116,32,102,105,110,100,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,10,34,102,111,111,34,46,32,73,116,32,102,105,110,100,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,119,104,97,116,115,111,101,118,101,114,44,32,97,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,63,92,33,102,111,111,41,32,105,115,10,97,108,119,97,121,115,32,116,114,117,101,32,119,104,101,110,32,116,104,101,32,110,101,120,116,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,34,98,97,114,34,46,32,65,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,105,115,10,110,101,101,100,101,100,32,116,111,32,97,99,104,105,101,118,101,32,116,104,101,32,111,116,104,101,114,32,101,102,102,101,99,116,46,10,10,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,102,111,114,99,101,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,97,116,32,115,111,109,101,32,112,111,105,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,109,111,115,116,10,99,111,110,118,101,110,105,101,110,116,32,119,97,121,32,116,111,32,100,111,32,105,116,32,105,115,32,119,105,116,104,32,40,63,92,33,41,44,32,97,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,46,32,83,111,44,32,97,110,10,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,114,101,113,117,105,114,101,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,117,115,116,32,97,108,119,97,121,115,32,102,97,105,108,46,32,84,104,101,10,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,32,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,32,105,115,32,97,32,115,121,110,111,110,121,109,32,102,111,114,32,40,63,92,33,41,46,10,10,95,76,111,111,107,98,101,104,105,110,100,32,65,115,115,101,114,116,105,111,110,115,95,10,10,76,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,60,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,60,92,33,32,102,111,114,10,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,110,100,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,10,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,33,102,111,111,41,98,97,114,10,96,96,96,10,10,84,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,117,99,104,32,116,104,97,116,32,97,108,108,32,116,104,101,32,115,116,114,105,110,103,115,10,105,116,32,109,97,116,99,104,101,115,32,109,117,115,116,32,104,97,118,101,32,97,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,110,121,32,116,111,112,45,108,101,118,101,108,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,116,104,101,121,32,100,111,32,110,111,116,32,97,108,108,32,104,97,118,101,32,116,111,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,84,104,117,115,44,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,105,115,32,112,101,114,109,105,116,116,101,100,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,98,117,108,108,111,99,107,124,100,111,110,107,101,121,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,58,10,10,96,96,96,116,101,120,116,10,40,63,60,33,100,111,103,115,63,124,99,97,116,115,63,41,10,96,96,96,10,10,66,114,97,110,99,104,101,115,32,116,104,97,116,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,10,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,80,101,114,108,44,32,119,104,105,99,104,10,114,101,113,117,105,114,101,115,32,97,108,108,32,98,114,97,110,99,104,101,115,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,108,101,110,103,116,104,32,111,102,32,115,116,114,105,110,103,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,99,104,32,97,115,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,44,32,97,115,32,105,116,115,32,115,105,110,103,108,101,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,32,99,97,110,32,109,97,116,99,104,32,116,119,111,10,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,97,98,40,99,124,100,101,41,41,10,96,96,96,10,10,72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,116,111,32,80,67,82,69,32,105,102,32,114,101,119,114,105,116,116,101,110,32,116,111,32,117,115,101,32,116,119,111,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,101,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,97,98,99,124,97,98,100,101,41,10,96,96,96,10,10,83,111,109,101,116,105,109,101,115,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,75,96,32,40,115,101,101,32,97,98,111,118,101,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,10,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,116,111,32,103,101,116,32,114,111,117,110,100,32,116,104,101,32,102,105,120,101,100,45,108,101,110,103,116,104,32,114,101,115,116,114,105,99,116,105,111,110,46,10,10,84,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,44,32,102,111,114,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,111,32,109,111,118,101,10,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,98,97,99,107,32,116,101,109,112,111,114,97,114,105,108,121,32,98,121,32,116,104,101,32,102,105,120,101,100,32,108,101,110,103,116,104,32,97,110,100,32,116,104,101,110,32,116,114,121,32,116,111,32,109,97,116,99,104,46,10,73,102,32,116,104,101,114,101,32,97,114,101,32,105,110,115,117,102,102,105,99,105,101,110,116,32,99,104,97,114,97,99,116,101,114,115,32,98,101,102,111,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,102,97,105,108,115,46,10,10,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,116,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,40,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,100,97,116,97,10,117,110,105,116,32,101,118,101,110,32,105,110,32,97,32,85,84,70,32,109,111,100,101,41,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,10,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46,32,84,104,101,32,96,92,88,96,32,97,110,100,32,96,92,82,96,32,101,115,99,97,112,101,115,44,10,119,104,105,99,104,32,99,97,110,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,115,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,101,105,116,104,101,114,46,10,10,34,83,117,98,114,111,117,116,105,110,101,34,32,99,97,108,108,115,32,40,115,101,101,32,98,101,108,111,119,41,44,32,115,117,99,104,32,97,115,32,40,63,50,41,32,111,114,32,40,63,38,88,41,44,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,10,108,111,111,107,98,101,104,105,110,100,115,44,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,46,32,82,101,99,117,114,115,105,111,110,44,10,104,111,119,101,118,101,114,44,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,10,10,80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,116,111,32,115,112,101,99,105,102,121,10,101,102,102,105,99,105,101,110,116,32,109,97,116,99,104,105,110,103,32,111,102,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,115,46,10,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,97,32,108,111,110,103,32,115,116,114,105,110,103,32,116,104,97,116,32,100,111,101,115,10,110,111,116,32,109,97,116,99,104,58,10,10,96,96,96,116,101,120,116,10,97,98,99,100,36,10,96,96,96,10,10,65,115,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,101,100,115,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,80,67,82,69,32,108,111,111,107,115,32,102,111,114,32,101,97,99,104,32,34,97,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,10,97,110,100,32,116,104,101,110,32,115,101,101,115,32,105,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,109,97,116,99,104,101,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,10,10,96,96,96,116,101,120,116,10,94,46,42,97,98,99,100,36,10,96,96,96,10,10,116,104,101,32,105,110,105,116,105,97,108,32,46,92,42,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,97,116,32,102,105,114,115,116,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,105,115,32,102,97,105,108,115,32,40,97,115,10,116,104,101,114,101,32,105,115,32,110,111,32,102,111,108,108,111,119,105,110,103,32,34,97,34,41,44,32,105,116,32,98,97,99,107,116,114,97,99,107,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,44,10,116,104,101,110,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,97,110,100,32,115,111,32,111,110,46,32,79,110,99,101,32,97,103,97,105,110,32,116,104,101,32,115,101,97,114,99,104,32,102,111,114,32,34,97,34,10,99,111,118,101,114,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,44,32,102,114,111,109,32,114,105,103,104,116,32,116,111,32,108,101,102,116,44,32,115,111,32,119,101,32,97,114,101,32,110,111,32,98,101,116,116,101,114,32,111,102,102,46,32,72,111,119,101,118,101,114,44,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,97,115,10,10,96,96,96,116,101,120,116,10,94,46,42,43,40,63,60,61,97,98,99,100,41,10,96,96,96,10,10,116,104,101,114,101,32,99,97,110,32,98,101,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,102,111,114,32,116,104,101,32,46,92,42,43,32,105,116,101,109,59,32,105,116,32,99,97,110,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,101,110,116,105,114,101,10,115,116,114,105,110,103,46,32,84,104,101,32,115,117,98,115,101,113,117,101,110,116,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,97,32,115,105,110,103,108,101,32,116,101,115,116,32,111,110,32,116,104,101,32,108,97,115,116,32,102,111,117,114,10,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,105,116,32,102,97,105,108,115,44,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,105,109,109,101,100,105,97,116,101,108,121,46,32,70,111,114,32,108,111,110,103,32,115,116,114,105,110,103,115,44,32,116,104,105,115,10,97,112,112,114,111,97,99,104,32,109,97,107,101,115,32,97,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,105,110,103,32,116,105,109,101,46,10,10,95,85,115,105,110,103,32,77,117,108,116,105,112,108,101,32,65,115,115,101,114,116,105,111,110,115,95,10,10,77,97,110,121,32,97,115,115,101,114,116,105,111,110,115,32,40,111,102,32,97,110,121,32,115,111,114,116,41,32,99,97,110,32,111,99,99,117,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,41,40,63,60,33,57,57,57,41,102,111,111,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,101,97,99,104,32,111,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,97,112,112,108,105,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,105,110,116,32,105,110,10,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,70,105,114,115,116,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,112,114,101,118,105,111,117,115,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,10,97,114,101,32,97,108,108,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,10,34,57,57,57,34,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,95,110,111,116,95,32,109,97,116,99,104,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,102,105,114,115,116,10,111,102,32,119,104,105,99,104,32,97,114,101,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,32,108,97,115,116,32,116,104,114,101,101,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,10,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,49,50,51,97,98,99,102,111,111,34,46,32,65,32,112,97,116,116,101,114,110,32,116,111,32,100,111,32,116,104,97,116,32,105,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,46,46,46,41,40,63,60,33,57,57,57,41,102,111,111,10,96,96,96,10,10,84,104,105,115,32,116,105,109,101,32,116,104,101,32,102,105,114,115,116,32,97,115,115,101,114,116,105,111,110,32,108,111,111,107,115,32,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,99,104,101,99,107,115,32,116,104,97,116,10,116,104,101,32,102,105,114,115,116,32,116,104,114,101,101,32,97,114,101,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,32,115,101,99,111,110,100,32,97,115,115,101,114,116,105,111,110,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,10,112,114,101,99,101,100,105,110,103,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,10,10,65,115,115,101,114,116,105,111,110,115,32,99,97,110,32,98,101,32,110,101,115,116,101,100,32,105,110,32,97,110,121,32,99,111,109,98,105,110,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,10,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,122,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,34,98,97,114,34,44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,10,98,121,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,40,63,60,33,102,111,111,41,98,97,114,41,98,97,122,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,97,110,100,32,97,110,121,32,116,104,114,101,101,10,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,40,63,33,57,57,57,41,46,46,46,41,102,111,111,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,56,32,125,10,10,35,35,32,67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115,10,10,73,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,99,97,117,115,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,111,32,111,98,101,121,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,100,105,116,105,111,110,97,108,108,121,10,111,114,32,116,111,32,99,104,111,111,115,101,32,98,101,116,119,101,101,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,32,115,117,98,112,97,116,116,101,114,110,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,110,10,97,115,115,101,114,116,105,111,110,44,32,111,114,32,119,104,101,116,104,101,114,32,97,32,115,112,101,99,105,102,105,99,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,109,97,116,99,104,101,100,46,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,116,119,111,32,112,111,115,115,105,98,108,101,32,102,111,114,109,115,32,111,102,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,41,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,124,110,111,45,112,97,116,116,101,114,110,41,10,96,96,96,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,115,97,116,105,115,102,105,101,100,44,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,110,111,45,112,97,116,116,101,114,110,10,40,105,102,32,112,114,101,115,101,110,116,41,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,101,120,105,115,116,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,97,10,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,69,97,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,105,116,115,101,108,102,32,99,111,110,116,97,105,110,10,110,101,115,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,97,110,121,32,102,111,114,109,44,32,105,110,99,108,117,100,105,110,103,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,115,59,32,116,104,101,10,114,101,115,116,114,105,99,116,105,111,110,32,116,111,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,108,101,118,101,108,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,99,111,109,112,108,101,120,58,10,10,96,96,96,116,101,120,116,10,40,63,40,49,41,32,40,65,124,66,124,67,41,32,124,32,40,68,32,124,32,40,63,40,50,41,69,124,70,41,32,124,32,69,41,32,41,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,102,111,117,114,32,107,105,110,100,115,32,111,102,32,99,111,110,100,105,116,105,111,110,58,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,44,32,114,101,102,101,114,101,110,99,101,115,32,116,111,10,114,101,99,117,114,115,105,111,110,44,32,97,32,112,115,101,117,100,111,45,99,111,110,100,105,116,105,111,110,32,99,97,108,108,101,100,32,68,69,70,73,78,69,44,32,97,110,100,32,97,115,115,101,114,116,105,111,110,115,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,117,109,98,101,114,95,10,10,73,102,32,116,104,101,32,116,101,120,116,32,98,101,116,119,101,101,110,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,44,32,116,104,101,10,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,115,32,112,114,101,118,105,111,117,115,108,121,10,109,97,116,99,104,101,100,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,101,120,105,115,116,115,32,40,115,101,101,10,115,101,99,116,105,111,110,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,32,101,97,114,108,105,101,114,41,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,10,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,109,32,104,97,118,101,32,109,97,116,99,104,101,100,46,32,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,110,111,116,97,116,105,111,110,32,105,115,32,116,111,32,112,114,101,99,101,100,101,32,116,104,101,10,100,105,103,105,116,115,32,119,105,116,104,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,110,117,109,98,101,114,32,105,115,10,114,101,108,97,116,105,118,101,32,114,97,116,104,101,114,32,116,104,97,110,32,97,98,115,111,108,117,116,101,46,32,84,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,98,101,10,114,101,102,101,114,101,110,99,101,100,32,98,121,32,40,63,40,45,49,41,44,32,116,104,101,32,110,101,120,116,32,109,111,115,116,32,114,101,99,101,110,116,32,98,121,32,40,63,40,45,50,41,44,32,97,110,100,32,115,111,32,111,110,46,32,73,110,115,105,100,101,32,108,111,111,112,115,44,10,105,116,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,115,101,110,115,101,32,116,111,32,114,101,102,101,114,32,116,111,32,115,117,98,115,101,113,117,101,110,116,32,103,114,111,117,112,115,46,32,84,104,101,32,110,101,120,116,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,98,101,10,111,112,101,110,101,100,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,40,63,40,43,49,41,44,32,97,110,100,32,115,111,32,111,110,46,32,40,84,104,101,32,118,97,108,117,101,32,122,101,114,111,32,105,110,32,97,110,121,32,111,102,32,116,104,101,115,101,10,102,111,114,109,115,32,105,115,32,110,111,116,32,117,115,101,100,59,32,105,116,32,112,114,111,118,111,107,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,41,10,10,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,111,110,116,97,105,110,115,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,32,116,111,10,109,97,107,101,32,105,116,32,109,111,114,101,32,114,101,97,100,97,98,108,101,32,40,97,115,115,117,109,101,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,41,32,97,110,100,32,116,111,32,100,105,118,105,100,101,32,105,116,32,105,110,116,111,32,116,104,114,101,101,10,112,97,114,116,115,32,102,111,114,32,101,97,115,101,32,111,102,32,100,105,115,99,117,115,115,105,111,110,58,10,10,96,96,96,116,101,120,116,10,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,49,41,32,92,41,32,41,10,96,96,96,10,10,84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,97,110,100,32,105,102,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,32,105,115,10,112,114,101,115,101,110,116,44,32,115,101,116,115,32,105,116,32,97,115,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,112,97,114,116,32,109,97,116,99,104,101,115,32,111,110,101,32,111,114,10,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,101,110,116,104,101,115,101,115,46,32,84,104,101,32,116,104,105,114,100,32,112,97,114,116,32,105,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,10,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,101,100,32,111,114,32,110,111,116,46,32,73,102,10,116,104,101,121,32,100,105,100,44,32,116,104,97,116,32,105,115,44,32,105,102,32,115,117,98,106,101,99,116,32,115,116,97,114,116,101,100,32,119,105,116,104,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,10,105,115,32,116,114,117,101,44,32,97,110,100,32,115,111,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,101,120,101,99,117,116,101,100,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,10,114,101,113,117,105,114,101,100,46,32,79,116,104,101,114,119,105,115,101,44,32,97,115,32,110,111,45,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,10,110,111,116,104,105,110,103,46,32,84,104,97,116,32,105,115,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,44,32,111,112,116,105,111,110,97,108,108,121,10,101,110,99,108,111,115,101,100,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,101,109,98,101,100,100,101,100,32,105,110,32,97,32,108,97,114,103,101,114,32,111,110,101,44,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,58,10,10,96,96,96,116,101,120,116,10,46,46,46,111,116,104,101,114,32,115,116,117,102,102,46,46,46,32,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,45,49,41,32,92,41,32,41,32,46,46,46,10,96,96,96,10,10,84,104,105,115,32,109,97,107,101,115,32,116,104,101,32,102,114,97,103,109,101,110,116,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,97,109,101,95,10,10,80,101,114,108,32,117,115,101,115,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,60,110,97,109,101,62,41,46,46,46,41,32,111,114,32,40,63,40,39,110,97,109,101,39,41,46,46,46,41,32,116,111,32,116,101,115,116,32,102,111,114,32,97,32,117,115,101,100,10,115,117,98,112,97,116,116,101,114,110,32,98,121,32,110,97,109,101,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,67,82,69,44,32,119,104,105,99,104,32,104,97,100,10,116,104,105,115,32,102,97,99,105,108,105,116,121,32,98,101,102,111,114,101,32,80,101,114,108,44,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,110,97,109,101,41,46,46,46,41,32,105,115,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,100,46,10,10,82,101,119,114,105,116,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,116,111,32,117,115,101,32,97,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,103,105,118,101,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,79,80,69,78,62,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,60,79,80,69,78,62,41,32,92,41,32,41,10,96,96,96,10,10,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,10,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,104,97,115,32,109,97,116,99,104,101,100,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,80,97,116,116,101,114,110,32,82,101,99,117,114,115,105,111,110,95,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,82,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,82,44,10,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,32,111,114,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,10,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,73,102,32,100,105,103,105,116,115,32,111,114,32,97,32,110,97,109,101,32,112,114,101,99,101,100,101,100,32,98,121,32,97,109,112,101,114,115,97,110,100,32,102,111,108,108,111,119,32,116,104,101,32,108,101,116,116,101,114,32,82,44,10,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,63,40,82,51,41,46,46,46,41,32,111,114,32,40,63,40,82,38,110,97,109,101,41,46,46,46,41,10,96,96,96,10,10,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,32,105,115,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,10,110,117,109,98,101,114,32,111,114,32,110,97,109,101,32,105,115,32,103,105,118,101,110,46,32,84,104,105,115,32,99,111,110,100,105,116,105,111,110,32,100,111,101,115,32,110,111,116,32,99,104,101,99,107,32,116,104,101,32,101,110,116,105,114,101,32,114,101,99,117,114,115,105,111,110,10,115,116,97,99,107,46,32,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,10,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,10,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,46,10,10,65,116,32,34,116,111,112,45,108,101,118,101,108,34,44,32,97,108,108,32,116,104,101,115,101,32,114,101,99,117,114,115,105,111,110,32,116,101,115,116,32,99,111,110,100,105,116,105,111,110,115,32,97,114,101,32,102,97,108,115,101,46,32,84,104,101,32,115,121,110,116,97,120,32,102,111,114,10,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,95,68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,66,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121,95,10,10,91,93,40,41,123,58,32,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115,32,125,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,68,69,70,73,78,69,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,10,110,97,109,101,32,68,69,70,73,78,69,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,102,97,108,115,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,111,110,108,121,32,111,110,101,10,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,116,32,105,115,32,97,108,119,97,121,115,32,115,107,105,112,112,101,100,32,105,102,32,99,111,110,116,114,111,108,32,114,101,97,99,104,101,115,32,116,104,105,115,10,112,111,105,110,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,105,100,101,97,32,111,102,32,68,69,70,73,78,69,32,105,115,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,102,105,110,101,10,34,115,117,98,114,111,117,116,105,110,101,115,34,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,46,32,40,84,104,101,32,117,115,101,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,115,10,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,41,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,115,117,99,104,32,97,115,10,34,49,57,50,46,49,54,56,46,50,51,46,50,52,53,34,44,32,99,97,110,32,98,101,32,119,114,105,116,116,101,110,32,108,105,107,101,32,116,104,105,115,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58,10,10,96,96,96,116,101,120,116,10,40,63,40,68,69,70,73,78,69,41,32,40,63,60,98,121,116,101,62,32,50,91,48,45,52,93,92,100,32,124,32,50,53,91,48,45,53,93,32,124,32,49,92,100,92,100,32,124,32,91,49,45,57,93,63,92,100,41,32,41,32,92,98,32,40,63,38,98,121,116,101,41,32,40,92,46,40,63,38,98,121,116,101,41,41,123,51,125,32,92,98,10,96,96,96,10,10,84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,32,68,69,70,73,78,69,32,103,114,111,117,112,32,105,110,115,105,100,101,32,119,104,105,99,104,32,105,115,32,97,32,97,110,111,116,104,101,114,32,103,114,111,117,112,10,110,97,109,101,100,32,34,98,121,116,101,34,32,105,115,32,100,101,102,105,110,101,100,46,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,110,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,110,101,110,116,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,10,40,97,32,110,117,109,98,101,114,32,60,32,50,53,54,41,46,32,87,104,101,110,32,109,97,116,99,104,105,110,103,32,116,97,107,101,115,32,112,108,97,99,101,44,32,116,104,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,115,107,105,112,112,101,100,44,32,97,115,32,68,69,70,73,78,69,32,97,99,116,115,32,108,105,107,101,32,97,32,102,97,108,115,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,117,115,101,115,10,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,110,97,109,101,100,32,103,114,111,117,112,32,116,111,32,109,97,116,99,104,32,116,104,101,32,102,111,117,114,32,100,111,116,45,115,101,112,97,114,97,116,101,100,32,99,111,109,112,111,110,101,110,116,115,32,111,102,32,97,110,10,73,80,118,52,32,97,100,100,114,101,115,115,44,32,105,110,115,105,115,116,105,110,103,32,111,110,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,97,116,32,101,97,99,104,32,101,110,100,46,10,10,95,65,115,115,101,114,116,105,111,110,32,67,111,110,100,105,116,105,111,110,115,95,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,110,111,116,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,102,111,114,109,97,116,115,44,32,105,116,32,109,117,115,116,32,98,101,32,97,110,32,97,115,115,101,114,116,105,111,110,46,10,84,104,105,115,32,99,97,110,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,111,114,32,110,101,103,97,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,111,114,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,67,111,110,115,105,100,101,114,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,99,111,110,116,97,105,110,105,110,103,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,44,32,97,110,100,32,119,105,116,104,32,116,104,101,32,116,119,111,10,97,108,116,101,114,110,97,116,105,118,101,115,32,111,110,32,116,104,101,32,115,101,99,111,110,100,32,108,105,110,101,58,10,10,96,96,96,116,101,120,116,10,40,63,40,63,61,91,94,97,45,122,93,42,91,97,45,122,93,41,10,92,100,123,50,125,45,91,97,45,122,93,123,51,125,45,92,100,123,50,125,32,32,124,32,32,92,100,123,50,125,45,92,100,123,50,125,45,92,100,123,50,125,32,41,10,96,96,96,10,10,84,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,10,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,108,101,116,116,101,114,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,101,116,116,101,114,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,101,115,116,115,32,102,111,114,32,116,104,101,32,112,114,101,115,101,110,99,101,10,111,102,32,97,116,32,108,101,97,115,116,32,111,110,101,32,108,101,116,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,102,32,97,32,108,101,116,116,101,114,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,10,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,10,115,101,99,111,110,100,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,115,116,114,105,110,103,115,32,105,110,32,111,110,101,32,111,102,32,116,104,101,32,116,119,111,32,102,111,114,109,115,32,100,100,45,97,97,97,45,100,100,32,111,114,10,100,100,45,100,100,45,100,100,44,32,119,104,101,114,101,32,97,97,97,32,97,114,101,32,108,101,116,116,101,114,115,32,97,110,100,32,100,100,32,97,114,101,32,100,105,103,105,116,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,57,32,125,10,10,35,35,32,67,111,109,109,101,110,116,115,10,10,84,104,101,114,101,32,97,114,101,32,116,119,111,32,119,97,121,115,32,116,111,32,105,110,99,108,117,100,101,32,99,111,109,109,101,110,116,115,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,112,114,111,99,101,115,115,101,100,32,98,121,32,80,67,82,69,46,10,73,110,32,98,111,116,104,32,99,97,115,101,115,44,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,111,109,109,101,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,110,10,116,104,101,32,109,105,100,100,108,101,32,111,102,32,97,110,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,32,111,102,32,114,101,108,97,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,115,117,99,104,32,97,115,32,40,63,58,32,111,114,32,97,10,115,117,98,112,97,116,116,101,114,110,32,110,97,109,101,32,111,114,32,110,117,109,98,101,114,46,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,109,97,107,101,32,117,112,32,97,32,99,111,109,109,101,110,116,32,112,108,97,121,32,110,111,32,112,97,114,116,32,105,110,10,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,105,110,103,46,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,40,63,35,32,109,97,114,107,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,109,109,101,110,116,32,116,104,97,116,32,99,111,110,116,105,110,117,101,115,32,117,112,32,116,111,32,116,104,101,32,110,101,120,116,10,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,111,112,116,105,111,110,10,80,67,82,69,95,69,88,84,69,78,68,69,68,32,105,115,32,115,101,116,44,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,99,104,97,114,97,99,116,101,114,32,97,108,115,111,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,109,109,101,110,116,44,32,119,104,105,99,104,10,105,110,32,116,104,105,115,32,99,97,115,101,32,99,111,110,116,105,110,117,101,115,32,116,111,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,32,111,114,10,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,87,104,105,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,110,101,119,108,105,110,101,115,10,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,111,112,116,105,111,110,115,32,112,97,115,115,101,100,32,116,111,32,97,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,32,111,114,32,98,121,32,97,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115,96,41,32,101,97,114,108,105,101,114,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,105,115,32,116,121,112,101,32,111,102,32,99,111,109,109,101,110,116,32,105,115,32,97,32,108,105,116,101,114,97,108,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,10,112,97,116,116,101,114,110,59,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,104,97,112,112,101,110,32,116,111,32,114,101,112,114,101,115,101,110,116,32,97,32,110,101,119,108,105,110,101,32,100,111,32,110,111,116,32,99,111,117,110,116,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,119,104,101,110,32,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,10,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,105,110,32,102,111,114,99,101,58,10,10,96,96,96,116,101,120,116,10,97,98,99,32,35,99,111,109,109,101,110,116,32,92,110,32,115,116,105,108,108,32,99,111,109,109,101,110,116,10,96,96,96,10,10,79,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,99,104,97,114,97,99,116,101,114,32,35,44,32,96,112,99,114,101,95,99,111,109,112,105,108,101,40,41,96,32,115,107,105,112,115,32,97,108,111,110,103,44,32,108,111,111,107,105,110,103,32,102,111,114,32,97,32,110,101,119,108,105,110,101,10,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,110,96,32,105,115,32,115,116,105,108,108,32,108,105,116,101,114,97,108,32,97,116,32,116,104,105,115,32,115,116,97,103,101,44,32,115,111,32,105,116,32,100,111,101,115,32,110,111,116,10,116,101,114,109,105,110,97,116,101,32,116,104,101,32,99,111,109,109,101,110,116,46,32,79,110,108,121,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,99,111,100,101,32,118,97,108,117,101,32,48,120,48,97,32,40,116,104,101,32,100,101,102,97,117,108,116,10,110,101,119,108,105,110,101,41,32,100,111,101,115,32,115,111,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,48,32,125,10,10,35,35,32,82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115,10,10,67,111,110,115,105,100,101,114,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,116,99,104,105,110,103,32,97,32,115,116,114,105,110,103,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,117,110,108,105,109,105,116,101,100,10,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,46,32,87,105,116,104,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,114,101,99,117,114,115,105,111,110,44,32,116,104,101,32,98,101,115,116,32,116,104,97,116,32,99,97,110,32,98,101,32,100,111,110,101,32,105,115,10,116,111,32,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,117,112,32,116,111,32,115,111,109,101,32,102,105,120,101,100,32,100,101,112,116,104,32,111,102,32,110,101,115,116,105,110,103,46,32,73,116,32,105,115,32,110,111,116,10,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,97,110,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,32,100,101,112,116,104,46,10,10,70,111,114,32,115,111,109,101,32,116,105,109,101,44,32,80,101,114,108,32,104,97,115,32,112,114,111,118,105,100,101,100,32,97,32,102,97,99,105,108,105,116,121,32,116,104,97,116,32,97,108,108,111,119,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,116,111,10,114,101,99,117,114,115,101,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,46,32,73,116,32,100,111,101,115,32,116,104,105,115,32,98,121,32,105,110,116,101,114,112,111,108,97,116,105,110,103,32,80,101,114,108,32,99,111,100,101,32,105,110,32,116,104,101,10,101,120,112,114,101,115,115,105,111,110,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,116,104,101,32,99,111,100,101,32,99,97,110,32,114,101,102,101,114,32,116,111,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,116,115,101,108,102,46,32,65,32,80,101,114,108,10,112,97,116,116,101,114,110,32,117,115,105,110,103,32,99,111,100,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,99,97,110,32,98,101,32,99,114,101,97,116,101,100,10,108,105,107,101,32,116,104,105,115,58,10,10,96,96,96,116,101,120,116,10,36,114,101,32,61,32,113,114,123,92,40,32,40,63,58,32,40,63,62,91,94,40,41,93,43,41,32,124,32,40,63,112,123,36,114,101,125,41,32,41,42,32,92,41,125,120,59,10,96,96,96,10,10,73,116,101,109,32,40,63,112,92,123,46,46,46,92,125,41,32,105,110,116,101,114,112,111,108,97,116,101,115,32,80,101,114,108,32,99,111,100,101,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,114,101,102,101,114,115,10,114,101,99,117,114,115,105,118,101,108,121,32,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46,10,10,79,98,118,105,111,117,115,108,121,44,32,80,67,82,69,32,99,97,110,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,111,102,32,80,101,114,108,32,99,111,100,101,46,32,73,110,115,116,101,97,100,44,32,105,116,10,115,117,112,112,111,114,116,115,32,115,112,101,99,105,97,108,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,111,110,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,10,115,117,98,112,97,116,116,101,114,110,32,114,101,99,117,114,115,105,111,110,46,32,65,102,116,101,114,32,105,116,115,32,105,110,116,114,111,100,117,99,116,105,111,110,32,105,110,32,80,67,82,69,32,97,110,100,32,80,121,116,104,111,110,44,32,116,104,105,115,32,107,105,110,100,32,111,102,10,114,101,99,117,114,115,105,111,110,32,119,97,115,32,108,97,116,101,114,32,105,110,116,114,111,100,117,99,101,100,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46,10,10,65,32,115,112,101,99,105,97,108,32,105,116,101,109,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,40,63,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,117,109,98,101,114,32,62,32,48,32,97,110,100,32,97,32,99,108,111,115,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,103,105,118,101,110,10,110,117,109,98,101,114,44,32,105,102,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,46,32,40,73,102,32,110,111,116,44,32,105,116,32,105,115,32,97,32,110,111,110,45,114,101,99,117,114,115,105,118,101,10,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,44,32,119,104,105,99,104,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,41,32,84,104,101,32,115,112,101,99,105,97,108,32,105,116,101,109,32,40,63,82,41,10,111,114,32,40,63,48,41,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,84,104,105,115,32,80,67,82,69,32,112,97,116,116,101,114,110,32,115,111,108,118,101,115,32,116,104,101,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,40,97,115,115,117,109,101,32,116,104,97,116,32,111,112,116,105,111,110,10,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,32,115,111,32,116,104,97,116,32,119,104,105,116,101,115,112,97,99,101,32,105,115,32,105,103,110,111,114,101,100,41,58,10,10,96,96,96,116,101,120,116,10,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,82,41,32,41,42,32,92,41,10,96,96,96,10,10,70,105,114,115,116,32,105,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,10,115,117,98,115,116,114,105,110,103,115,44,32,119,104,105,99,104,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,111,114,32,97,32,114,101,99,117,114,115,105,118,101,10,109,97,116,99,104,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,116,104,97,116,32,105,115,44,32,97,32,99,111,114,114,101,99,116,108,121,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,115,116,114,105,110,103,41,46,10,70,105,110,97,108,108,121,32,116,104,101,114,101,32,105,115,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,10,113,117,97,110,116,105,102,105,101,114,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,116,104,105,115,32,119,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,121,111,117,32,119,111,117,108,100,32,110,111,116,32,119,97,110,116,32,116,111,32,114,101,99,117,114,115,101,32,116,104,101,32,101,110,116,105,114,101,10,112,97,116,116,101,114,110,44,32,115,111,32,105,110,115,116,101,97,100,32,121,111,117,32,99,97,110,32,117,115,101,58,10,10,96,96,96,116,101,120,116,10,40,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,49,41,32,41,42,32,92,41,32,41,10,96,96,96,10,10,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,104,101,114,101,32,119,105,116,104,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,115,111,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,114,101,102,101,114,115,32,116,111,32,116,104,101,109,10,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,10,10,73,110,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,107,101,101,112,105,110,103,32,116,114,97,99,107,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,110,117,109,98,101,114,115,32,99,97,110,32,98,101,32,116,114,105,99,107,121,46,32,84,104,105,115,32,105,115,10,109,97,100,101,32,101,97,115,105,101,114,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,46,32,73,110,115,116,101,97,100,32,111,102,32,40,63,49,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,97,98,111,118,101,44,32,121,111,117,32,99,97,110,32,119,114,105,116,101,32,40,63,45,50,41,32,116,111,32,114,101,102,101,114,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,10,112,97,114,101,110,116,104,101,115,101,115,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,99,111,117,110,116,115,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,108,101,102,116,119,97,114,100,115,32,102,114,111,109,32,116,104,101,32,112,111,105,110,116,32,97,116,32,119,104,105,99,104,32,105,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,73,116,32,105,115,32,97,108,115,111,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,102,101,114,32,116,111,32,108,97,116,101,114,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,44,32,98,121,32,119,114,105,116,105,110,103,32,114,101,102,101,114,101,110,99,101,115,10,115,117,99,104,32,97,115,32,40,63,43,50,41,46,32,72,111,119,101,118,101,114,44,32,116,104,101,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,99,117,114,115,105,118,101,44,32,97,115,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,110,111,116,10,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,46,32,84,104,101,121,32,97,114,101,32,97,108,119,97,121,115,32,110,111,110,45,114,101,99,117,114,115,105,118,101,10,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,105,115,32,116,111,32,117,115,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,115,116,101,97,100,46,32,84,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,102,111,114,10,116,104,105,115,32,105,115,32,40,63,38,110,97,109,101,41,46,32,84,104,101,32,101,97,114,108,105,101,114,32,80,67,82,69,32,115,121,110,116,97,120,32,40,63,80,62,110,97,109,101,41,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,87,101,32,99,97,110,10,114,101,119,114,105,116,101,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,110,62,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,38,112,110,41,32,41,42,32,92,41,32,41,10,96,96,96,10,10,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,116,104,101,32,101,97,114,108,105,101,115,116,32,111,110,101,32,105,115,10,117,115,101,100,46,10,10,84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,101,120,97,109,112,108,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,119,101,32,104,97,118,101,32,115,116,117,100,105,101,100,32,99,111,110,116,97,105,110,115,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,10,114,101,112,101,97,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,102,111,114,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,115,32,111,102,10,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,105,115,32,105,109,112,111,114,116,97,110,116,32,119,104,101,110,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,115,116,114,105,110,103,115,32,116,104,97,116,32,100,111,32,110,111,116,10,109,97,116,99,104,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,10,10,96,96,96,116,101,120,116,10,40,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,40,41,10,96,96,96,10,10,105,116,32,103,105,118,101,115,32,34,110,111,32,109,97,116,99,104,34,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,117,115,101,100,44,10,116,104,101,32,109,97,116,99,104,32,114,117,110,115,32,102,111,114,32,97,32,108,111,110,103,32,116,105,109,101,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,115,111,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,116,104,101,32,43,32,97,110,100,32,92,42,10,114,101,112,101,97,116,115,32,99,97,110,32,99,97,114,118,101,32,117,112,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,101,115,116,101,100,32,98,101,102,111,114,101,32,102,97,105,108,117,114,101,32,99,97,110,32,98,101,10,114,101,112,111,114,116,101,100,46,10,10,65,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,109,97,116,99,104,44,32,116,104,101,32,118,97,108,117,101,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,116,104,111,115,101,32,102,114,111,109,32,116,104,101,10,111,117,116,101,114,109,111,115,116,32,108,101,118,101,108,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,10,10,96,96,96,116,101,120,116,10,40,97,98,40,99,100,41,101,102,41,10,96,96,96,10,10,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,105,110,110,101,114,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,40,110,117,109,98,101,114,101,100,32,50,41,32,105,115,32,34,101,102,34,44,32,119,104,105,99,104,32,105,115,32,116,104,101,10,108,97,115,116,32,118,97,108,117,101,32,116,97,107,101,110,32,111,110,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,46,32,73,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,109,97,116,99,104,101,100,10,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,105,116,115,32,102,105,110,97,108,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,32,105,115,32,117,110,115,101,116,44,32,101,118,101,110,32,105,102,32,105,116,32,119,97,115,10,40,116,101,109,112,111,114,97,114,105,108,121,41,32,115,101,116,32,97,116,32,97,32,100,101,101,112,101,114,32,108,101,118,101,108,32,100,117,114,105,110,103,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,46,10,10,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,105,116,101,109,32,40,63,82,41,32,119,105,116,104,32,99,111,110,100,105,116,105,111,110,32,40,82,41,44,32,119,104,105,99,104,32,116,101,115,116,115,32,102,111,114,32,114,101,99,117,114,115,105,111,110,46,32,67,111,110,115,105,100,101,114,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,116,101,120,116,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,10,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,46,32,79,110,108,121,32,100,105,103,105,116,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,110,101,115,116,101,100,32,98,114,97,99,107,101,116,115,32,40,116,104,97,116,32,105,115,44,32,119,104,101,110,10,114,101,99,117,114,115,105,110,103,41,44,32,119,104,105,108,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46,10,10,96,96,96,116,101,120,116,10,60,32,40,63,58,32,40,63,40,82,41,32,92,100,43,43,32,32,124,32,91,94,60,62,93,42,43,41,32,124,32,40,63,82,41,41,32,42,32,62,10,96,96,96,10,10,72,101,114,101,32,40,63,40,82,41,32,105,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,44,32,119,105,116,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,10,97,108,116,101,114,110,97,116,105,118,101,115,32,102,111,114,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,97,110,100,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,99,97,115,101,115,46,32,73,116,101,109,32,40,63,82,41,32,105,115,32,116,104,101,32,97,99,116,117,97,108,10,114,101,99,117,114,115,105,118,101,32,99,97,108,108,46,10,10,95,68,105,102,102,101,114,101,110,99,101,115,32,105,110,32,82,101,99,117,114,115,105,111,110,32,80,114,111,99,101,115,115,105,110,103,32,98,101,116,119,101,101,110,32,80,67,82,69,32,97,110,100,32,80,101,114,108,95,10,10,82,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,110,32,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,119,111,32,105,109,112,111,114,116,97,110,116,32,119,97,121,115,46,32,73,110,32,80,67,82,69,10,40,108,105,107,101,32,80,121,116,104,111,110,44,32,98,117,116,32,117,110,108,105,107,101,32,80,101,114,108,41,44,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,105,115,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,10,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,10,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,10,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,105,108,108,117,115,116,114,97,116,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,10,119,104,105,99,104,32,109,101,97,110,115,32,116,111,32,109,97,116,99,104,32,97,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,40,102,111,114,32,101,120,97,109,112,108,101,44,32,34,97,34,44,32,34,97,98,97,34,44,32,34,97,98,99,98,97,34,44,32,34,97,98,99,100,99,98,97,34,41,58,10,10,96,96,96,116,101,120,116,10,94,40,46,124,40,46,41,40,63,49,41,92,50,41,36,10,96,96,96,10,10,84,104,101,32,105,100,101,97,32,105,115,32,116,104,97,116,32,105,116,32,101,105,116,104,101,114,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,116,119,111,32,105,100,101,110,116,105,99,97,108,10,99,104,97,114,97,99,116,101,114,115,32,115,117,114,114,111,117,110,100,105,110,103,32,97,32,115,117,98,112,97,108,105,110,100,114,111,109,101,46,32,73,110,32,80,101,114,108,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,119,111,114,107,115,59,32,105,110,32,80,67,82,69,32,105,116,10,100,111,101,115,32,110,111,116,32,119,111,114,107,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,10,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,97,98,99,98,97,34,46,10,10,65,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,101,110,100,32,111,102,10,116,104,101,32,115,116,114,105,110,103,44,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,102,97,105,108,115,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,97,107,101,110,44,32,97,110,100,10,116,104,101,32,114,101,99,117,114,115,105,111,110,32,107,105,99,107,115,32,105,110,46,32,84,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,115,117,98,112,97,116,116,101,114,110,32,49,32,115,117,99,99,101,115,115,102,117,108,108,121,32,109,97,116,99,104,101,115,10,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,98,34,41,46,32,40,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,97,110,100,32,101,110,100,32,111,102,32,108,105,110,101,32,116,101,115,116,115,32,97,114,101,10,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,41,10,10,66,97,99,107,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,99,34,41,32,105,115,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,119,104,97,116,32,115,117,98,112,97,116,116,101,114,110,10,50,32,109,97,116,99,104,101,100,44,32,119,104,105,99,104,32,119,97,115,32,34,97,34,46,32,84,104,105,115,32,102,97,105,108,115,46,32,65,115,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,10,103,114,111,117,112,44,32,116,104,101,114,101,32,97,114,101,32,110,111,119,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,112,111,105,110,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,40,80,101,114,108,32,99,97,110,32,110,111,119,32,114,101,45,101,110,116,101,114,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,97,110,100,32,116,114,121,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,46,41,32,72,111,119,101,118,101,114,44,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,119,105,116,104,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,111,116,104,101,114,32,111,114,100,101,114,44,32,116,104,105,110,103,115,32,97,114,101,10,100,105,102,102,101,114,101,110,116,58,10,10,96,96,96,116,101,120,116,10,94,40,40,46,41,40,63,49,41,92,50,124,46,41,36,10,96,96,96,10,10,84,104,105,115,32,116,105,109,101,44,32,116,104,101,32,114,101,99,117,114,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,114,105,101,100,32,102,105,114,115,116,44,32,97,110,100,32,99,111,110,116,105,110,117,101,115,32,116,111,32,114,101,99,117,114,115,101,10,117,110,116,105,108,32,105,116,32,114,117,110,115,32,111,117,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,97,116,32,119,104,105,99,104,32,112,111,105,110,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,115,46,32,66,117,116,32,116,104,105,115,10,116,105,109,101,32,119,101,32,104,97,118,101,32,97,110,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,116,114,121,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,46,32,84,104,97,116,32,105,115,32,116,104,101,10,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,58,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,97,115,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,97,116,32,97,10,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,108,101,118,101,108,44,32,119,104,105,99,104,32,80,67,82,69,32,99,97,110,110,111,116,32,117,115,101,46,10,10,84,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,115,44,32,110,111,116,32,111,110,108,121,32,116,104,111,115,101,10,119,105,116,104,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,105,116,32,105,115,32,116,101,109,112,116,105,110,103,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,105,115,58,10,10,96,96,96,116,101,120,116,10,94,40,40,46,41,40,63,49,41,92,50,124,46,63,41,36,10,96,96,96,10,10,65,103,97,105,110,44,32,116,104,105,115,32,119,111,114,107,115,32,105,110,32,80,101,114,108,44,32,98,117,116,32,110,111,116,32,105,110,32,80,67,82,69,44,32,97,110,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,114,101,97,115,111,110,46,32,87,104,101,110,32,97,10,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,104,97,115,32,109,97,116,99,104,101,100,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,101,110,116,101,114,101,100,32,97,103,97,105,110,32,116,111,10,109,97,116,99,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46,32,84,104,101,32,115,111,108,117,116,105,111,110,32,105,115,32,116,111,32,115,101,112,97,114,97,116,101,32,116,104,101,32,116,119,111,32,99,97,115,101,115,44,32,97,110,100,32,119,114,105,116,101,32,111,117,116,10,116,104,101,32,111,100,100,32,97,110,100,32,101,118,101,110,32,99,97,115,101,115,32,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,58,10,10,96,96,96,116,101,120,116,10,94,40,63,58,40,40,46,41,40,63,49,41,92,50,124,41,124,40,40,46,41,40,63,51,41,92,52,124,46,41,41,10,96,96,96,10,10,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,97,108,105,110,100,114,111,109,105,99,32,112,104,114,97,115,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,105,103,110,111,114,101,32,97,108,108,10,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,100,111,110,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,96,96,96,116,101,120,116,10,94,92,87,42,43,40,63,58,40,40,46,41,92,87,42,43,40,63,49,41,92,87,42,43,92,50,124,41,124,40,40,46,41,92,87,42,43,40,63,51,41,92,87,42,43,92,52,124,92,87,42,43,46,92,87,42,43,41,41,92,87,42,43,36,10,96,96,96,10,10,73,102,32,114,117,110,32,119,105,116,104,32,111,112,116,105,111,110,32,96,99,97,115,101,108,101,115,115,96,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,112,104,114,97,115,101,115,32,115,117,99,104,32,97,115,32,34,65,32,109,97,110,44,32,97,10,112,108,97,110,44,32,97,32,99,97,110,97,108,58,32,80,97,110,97,109,97,92,33,34,32,97,110,100,32,105,116,32,119,111,114,107,115,32,119,101,108,108,32,105,110,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,10,111,102,32,116,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,92,42,43,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,10,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,46,32,87,105,116,104,111,117,116,32,116,104,105,115,44,32,80,67,82,69,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,40,49,48,32,116,105,109,101,115,32,111,114,32,109,111,114,101,41,32,116,111,10,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,104,114,97,115,101,115,44,32,97,110,100,32,80,101,114,108,32,116,97,107,101,115,32,115,111,32,108,111,110,103,32,116,104,97,116,32,121,111,117,32,116,104,105,110,107,32,105,116,32,104,97,115,32,103,111,110,101,32,105,110,116,111,32,97,10,108,111,111,112,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,112,97,108,105,110,100,114,111,109,101,45,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,115,32,97,98,111,118,101,32,119,111,114,107,32,111,110,108,121,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,100,111,101,115,10,62,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,112,97,108,105,110,100,114,111,109,101,32,116,104,97,116,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,70,111,114,10,62,32,101,120,97,109,112,108,101,44,32,97,108,116,104,111,117,103,104,32,34,97,98,99,98,97,34,32,105,115,32,99,111,114,114,101,99,116,108,121,32,109,97,116,99,104,101,100,44,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,98,97,34,44,10,62,32,80,67,82,69,32,102,105,110,100,115,32,112,97,108,105,110,100,114,111,109,101,32,34,97,98,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,44,32,97,110,100,32,116,104,101,110,32,102,97,105,108,115,32,97,116,32,116,111,112,32,108,101,118,101,108,44,32,97,115,32,116,104,101,10,62,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,102,111,108,108,111,119,46,32,79,110,99,101,32,97,103,97,105,110,44,32,105,116,32,99,97,110,110,111,116,32,106,117,109,112,32,98,97,99,107,32,105,110,116,111,32,116,104,101,10,62,32,114,101,99,117,114,115,105,111,110,32,116,111,32,116,114,121,32,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,10,84,104,101,32,115,101,99,111,110,100,32,119,97,121,32,105,110,32,119,104,105,99,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,105,102,102,101,114,32,105,110,32,116,104,101,105,114,32,114,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,115,32,105,110,10,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,46,32,73,110,32,80,101,114,108,44,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,10,114,101,99,117,114,115,105,118,101,108,121,32,111,114,32,97,115,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,44,32,105,116,32,104,97,115,32,110,111,32,97,99,99,101,115,115,32,116,111,32,97,110,121,10,118,97,108,117,101,115,32,116,104,97,116,32,119,101,114,101,32,99,97,112,116,117,114,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,73,110,32,80,67,82,69,32,116,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,10,114,101,102,101,114,101,110,99,101,100,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,94,40,46,41,40,92,49,124,97,40,63,50,41,41,10,96,96,96,10,10,73,110,32,80,67,82,69,44,32,105,116,32,109,97,116,99,104,101,115,32,34,98,97,98,34,46,32,84,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,110,32,105,110,10,116,104,101,32,115,101,99,111,110,100,32,103,114,111,117,112,44,32,119,104,101,110,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,96,92,49,96,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,115,101,99,111,110,100,10,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,115,32,34,97,34,44,32,97,110,100,32,116,104,101,110,32,114,101,99,117,114,115,101,115,46,32,73,110,32,116,104,101,32,114,101,99,117,114,115,105,111,110,44,32,96,92,49,96,32,100,111,101,115,32,110,111,119,32,109,97,116,99,104,10,34,98,34,32,97,110,100,32,115,111,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,46,32,73,110,32,80,101,114,108,44,32,116,104,101,32,112,97,116,116,101,114,110,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,98,101,99,97,117,115,101,10,105,110,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,96,92,49,96,32,99,97,110,110,111,116,32,97,99,99,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,108,121,32,115,101,116,32,118,97,108,117,101,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,49,32,125,10,10,35,35,32,83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,10,10,73,102,32,116,104,101,32,115,121,110,116,97,120,32,102,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,40,101,105,116,104,101,114,32,98,121,32,110,117,109,98,101,114,32,111,114,32,98,121,32,110,97,109,101,41,32,105,115,10,117,115,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,44,32,105,116,32,111,112,101,114,97,116,101,115,32,108,105,107,101,32,97,32,115,117,98,114,111,117,116,105,110,101,10,105,110,32,97,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,46,32,84,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,10,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,117,109,98,101,114,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,44,32,97,115,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58,10,10,96,96,96,116,101,120,116,10,40,46,46,46,40,97,98,115,111,108,117,116,101,41,46,46,46,41,46,46,46,40,63,50,41,46,46,46,10,40,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,41,46,46,46,40,63,45,49,41,46,46,46,10,40,46,46,46,40,63,43,49,41,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,10,96,96,96,10,10,65,110,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,32,112,111,105,110,116,101,100,32,111,117,116,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,10,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,10,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121,10,96,96,96,10,10,73,102,32,105,110,115,116,101,97,100,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,105,116,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,10,97,110,100,32,116,104,101,32,111,116,104,101,114,32,116,119,111,32,115,116,114,105,110,103,115,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,40,63,49,41,105,98,105,108,105,116,121,10,96,96,96,10,10,65,110,111,116,104,101,114,32,101,120,97,109,112,108,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,68,69,70,73,78,69,32,101,97,114,108,105,101,114,46,10,10,65,108,108,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,114,101,99,117,114,115,105,118,101,32,111,114,32,110,111,116,44,32,97,114,101,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,116,111,109,105,99,32,103,114,111,117,112,115,46,10,84,104,97,116,32,105,115,44,32,111,110,99,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,10,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,10,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,65,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,100,117,114,105,110,103,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,10,99,97,108,108,32,114,101,118,101,114,116,32,116,111,32,116,104,101,105,114,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,115,32,97,102,116,101,114,119,97,114,100,115,46,10,10,80,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,115,32,115,117,99,104,32,97,115,32,99,97,115,101,45,105,110,100,101,112,101,110,100,101,110,99,101,32,97,114,101,32,102,105,120,101,100,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,10,100,101,102,105,110,101,100,44,32,115,111,32,105,102,32,105,116,32,105,115,32,117,115,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,115,117,99,104,32,111,112,116,105,111,110,115,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,10,100,105,102,102,101,114,101,110,116,32,99,97,108,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,98,117,116,32,110,111,116,10,34,97,98,99,65,66,67,34,44,32,97,115,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,112,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,99,97,108,108,101,100,10,115,117,98,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,41,40,63,105,58,40,63,45,49,41,41,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,50,32,125,10,10,35,35,32,79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,10,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,10,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,112,111,115,115,105,98,108,121,32,114,101,99,117,114,115,105,118,101,108,121,46,32,72,101,114,101,10,102,111,108,108,111,119,115,32,116,119,111,32,111,102,32,116,104,101,32,101,120,97,109,112,108,101,115,32,117,115,101,100,32,97,98,111,118,101,44,32,114,101,119,114,105,116,116,101,110,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,110,62,32,92,40,32,40,32,40,63,62,91,94,40,41,93,43,41,32,124,32,92,103,60,112,110,62,32,41,42,32,92,41,32,41,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,103,39,49,39,105,98,105,108,105,116,121,10,96,96,96,10,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,79,110,105,103,117,114,117,109,97,58,32,105,102,32,97,32,110,117,109,98,101,114,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,97,32,112,108,117,115,32,111,114,10,109,105,110,117,115,32,115,105,103,110,44,32,105,116,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,41,40,63,105,58,92,103,60,45,49,62,41,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,96,92,103,123,46,46,46,125,96,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,96,92,103,60,46,46,46,62,96,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32,95,110,111,116,95,10,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,59,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,51,32,125,10,10,35,35,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,10,10,80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,115,111,109,101,32,34,83,112,101,99,105,97,108,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,32,86,101,114,98,115,34,44,32,119,104,105,99,104,32,97,114,101,32,115,116,105,108,108,10,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,115,32,34,101,120,112,101,114,105,109,101,110,116,97,108,32,97,110,100,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,111,114,10,114,101,109,111,118,97,108,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,80,101,114,108,34,46,32,73,116,32,103,111,101,115,32,111,110,32,116,111,32,115,97,121,58,32,34,84,104,101,105,114,32,117,115,97,103,101,32,105,110,10,112,114,111,100,117,99,116,105,111,110,32,99,111,100,101,32,115,104,111,117,108,100,32,98,101,32,110,111,116,101,100,32,116,111,32,97,118,111,105,100,32,112,114,111,98,108,101,109,115,32,100,117,114,105,110,103,32,117,112,103,114,97,100,101,115,46,34,32,84,104,101,32,115,97,109,101,10,114,101,109,97,114,107,115,32,97,112,112,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,102,101,97,116,117,114,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,105,115,32,115,101,99,116,105,111,110,46,10,10,84,104,101,32,110,101,119,32,118,101,114,98,115,32,109,97,107,101,32,117,115,101,32,111,102,32,119,104,97,116,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,105,110,118,97,108,105,100,32,115,121,110,116,97,120,58,32,97,110,32,111,112,101,110,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,97,115,116,101,114,105,115,107,46,32,84,104,101,121,32,97,114,101,32,103,101,110,101,114,97,108,108,121,32,111,102,32,116,104,101,32,102,111,114,109,32,40,42,86,69,82,66,41,32,111,114,10,40,42,86,69,82,66,58,78,65,77,69,41,46,32,83,111,109,101,32,99,97,110,32,116,97,107,101,32,101,105,116,104,101,114,32,102,111,114,109,44,32,112,111,115,115,105,98,108,121,32,98,101,104,97,118,105,110,103,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,10,111,110,32,119,104,101,116,104,101,114,32,97,32,110,97,109,101,32,105,115,32,112,114,101,115,101,110,116,46,32,65,32,110,97,109,101,32,105,115,32,97,110,121,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,10,105,110,99,108,117,100,101,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,32,109,97,120,105,109,117,109,32,110,97,109,101,32,108,101,110,103,116,104,32,105,115,32,50,53,53,32,105,110,32,116,104,101,32,56,45,98,105,116,10,108,105,98,114,97,114,121,32,97,110,100,32,54,53,53,51,53,32,105,110,32,116,104,101,32,49,54,45,98,105,116,32,97,110,100,32,51,50,45,98,105,116,32,108,105,98,114,97,114,105,101,115,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,101,109,112,116,121,44,32,116,104,97,116,10,105,115,44,32,105,102,32,116,104,101,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,115,32,116,104,101,32,99,111,108,111,110,44,32,116,104,101,32,101,102,102,101,99,116,32,105,115,32,97,115,10,105,102,32,116,104,101,32,99,111,108,111,110,32,119,97,115,32,110,111,116,32,116,104,101,114,101,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,99,97,110,32,111,99,99,117,114,32,105,110,32,97,32,112,97,116,116,101,114,110,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,44,32,97,115,115,101,114,116,105,111,110,115,44,32,97,110,100,32,105,110,32,115,117,98,112,97,116,116,101,114,110,115,10,99,97,108,108,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,40,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,114,101,99,117,114,115,105,118,101,108,121,41,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,95,79,112,116,105,109,105,122,97,116,105,111,110,115,32,84,104,97,116,32,65,102,102,101,99,116,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,95,10,10,80,67,82,69,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,116,111,32,115,112,101,101,100,32,117,112,32,109,97,116,99,104,105,110,103,32,98,121,32,114,117,110,110,105,110,103,10,115,111,109,101,32,99,104,101,99,107,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,109,97,116,99,104,32,97,116,116,101,109,112,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,99,97,110,32,107,110,111,119,32,116,104,101,10,109,105,110,105,109,117,109,32,108,101,110,103,116,104,32,111,102,32,109,97,116,99,104,105,110,103,32,115,117,98,106,101,99,116,44,32,111,114,32,116,104,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,10,112,114,101,115,101,110,116,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,112,97,115,115,101,115,32,116,104,101,32,114,117,110,110,105,110,103,32,111,102,32,97,32,109,97,116,99,104,44,32,97,110,121,10,105,110,99,108,117,100,101,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,112,114,111,99,101,115,115,101,100,46,32,112,114,111,99,101,115,115,101,100,46,32,89,111,117,32,99,97,110,32,115,117,112,112,114,101,115,115,32,116,104,101,10,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,119,104,101,110,32,99,97,108,108,105,110,103,10,96,99,111,109,112,105,108,101,47,50,96,32,111,114,32,96,114,117,110,47,51,96,44,32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,92,42,78,79,95,83,84,65,82,84,95,79,80,84,41,46,10,10,69,120,112,101,114,105,109,101,110,116,115,32,119,105,116,104,32,80,101,114,108,32,115,117,103,103,101,115,116,32,116,104,97,116,32,105,116,32,116,111,111,32,104,97,115,32,115,105,109,105,108,97,114,32,111,112,116,105,109,105,122,97,116,105,111,110,115,44,32,115,111,109,101,116,105,109,101,115,10,108,101,97,100,105,110,103,32,116,111,32,97,110,111,109,97,108,111,117,115,32,114,101,115,117,108,116,115,46,10,10,95,86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,73,109,109,101,100,105,97,116,101,108,121,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,97,99,116,32,97,115,32,115,111,111,110,32,97,115,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,101,121,32,109,117,115,116,32,110,111,116,32,98,101,10,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,46,10,10,96,96,96,116,101,120,116,10,40,42,65,67,67,69,80,84,41,10,96,96,96,10,10,84,104,105,115,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,101,110,100,32,115,117,99,99,101,115,115,102,117,108,108,121,44,32,115,107,105,112,112,105,110,103,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,10,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,105,116,32,105,115,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,10,111,110,108,121,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,101,110,100,101,100,32,115,117,99,99,101,115,115,102,117,108,108,121,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,116,32,116,104,101,32,111,117,116,101,114,10,108,101,118,101,108,46,32,73,102,32,40,92,42,65,67,67,69,80,84,41,32,105,115,32,116,114,105,103,103,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,115,117,99,99,101,101,100,115,59,32,105,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46,10,10,73,102,32,40,92,42,65,67,67,69,80,84,41,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,44,32,116,104,101,32,100,97,116,97,32,115,111,32,102,97,114,32,105,115,32,99,97,112,116,117,114,101,100,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,65,65,68,34,44,32,111,114,32,34,65,67,68,34,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,66,34,10,105,115,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,111,117,116,101,114,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,96,96,96,116,101,120,116,10,65,40,40,63,58,65,124,66,40,42,65,67,67,69,80,84,41,124,67,41,68,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,44,32,102,111,114,99,105,110,103,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,111,99,99,117,114,46,32,73,116,10,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,40,63,92,33,41,32,98,117,116,32,101,97,115,105,101,114,32,116,111,32,114,101,97,100,46,10,10,96,96,96,116,101,120,116,10,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,10,96,96,96,10,10,84,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,116,97,116,101,115,32,116,104,97,116,32,105,116,32,105,115,32,112,114,111,98,97,98,108,121,32,117,115,101,102,117,108,32,111,110,108,121,32,119,104,101,110,32,99,111,109,98,105,110,101,100,32,119,105,116,104,10,40,63,92,123,92,125,41,32,111,114,32,40,63,63,92,123,92,125,41,46,32,84,104,111,115,101,32,97,114,101,32,80,101,114,108,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,80,67,82,69,46,10,10,65,32,109,97,116,99,104,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,34,97,97,97,97,34,32,97,108,119,97,121,115,32,102,97,105,108,115,44,32,98,117,116,32,116,104,101,32,99,97,108,108,111,117,116,32,105,115,32,116,97,107,101,110,32,98,101,102,111,114,101,10,101,97,99,104,32,98,97,99,107,116,114,97,99,107,32,111,99,99,117,114,115,32,40,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,44,32,49,48,32,116,105,109,101,115,41,46,10,10,95,82,101,99,111,114,100,105,110,103,32,87,104,105,99,104,32,80,97,116,104,32,87,97,115,32,84,97,107,101,110,95,10,10,84,104,101,32,109,97,105,110,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,118,101,114,98,32,105,115,32,116,111,32,116,114,97,99,107,32,104,111,119,32,97,32,109,97,116,99,104,32,119,97,115,32,97,114,114,105,118,101,100,32,97,116,44,32,97,108,116,104,111,117,103,104,10,105,116,32,97,108,115,111,32,104,97,115,32,97,32,115,101,99,111,110,100,97,114,121,32,117,115,101,32,105,110,32,119,105,116,104,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,40,115,101,101,10,40,92,42,83,75,73,80,41,32,98,101,108,111,119,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,110,32,69,114,108,97,110,103,44,32,116,104,101,114,101,32,105,115,32,110,111,32,105,110,116,101,114,102,97,99,101,32,116,111,32,114,101,116,114,105,101,118,101,32,97,32,109,97,114,107,32,119,105,116,104,32,91,96,114,117,110,47,50,44,51,96,93,40,96,114,117,110,47,50,96,41,44,10,62,32,115,111,32,111,110,108,121,32,116,104,101,32,115,101,99,111,110,100,97,114,121,32,112,117,114,112,111,115,101,32,105,115,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,46,10,62,10,62,32,84,104,101,32,114,101,115,116,32,111,102,32,116,104,105,115,32,115,101,99,116,105,111,110,32,105,115,32,116,104,101,114,101,102,111,114,101,32,100,101,108,105,98,101,114,97,116,101,108,121,32,110,111,116,32,97,100,97,112,116,101,100,32,102,111,114,32,114,101,97,100,105,110,103,32,98,121,10,62,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,116,104,101,32,101,120,97,109,112,108,101,115,32,99,97,110,32,104,101,108,112,32,105,110,32,117,110,100,101,114,115,116,97,110,100,105,110,103,32,78,65,77,69,83,32,97,115,10,62,32,116,104,101,121,32,99,97,110,32,98,101,32,117,115,101,100,32,98,121,32,40,92,42,83,75,73,80,41,46,10,10,96,96,96,116,101,120,116,10,40,42,77,65,82,75,58,78,65,77,69,41,32,111,114,32,40,42,58,78,65,77,69,41,10,96,96,96,10,10,65,32,110,97,109,101,32,105,115,32,97,108,119,97,121,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,32,116,104,105,115,32,118,101,114,98,46,32,84,104,101,114,101,32,99,97,110,32,98,101,32,97,115,32,109,97,110,121,32,105,110,115,116,97,110,99,101,115,32,111,102,10,40,92,42,77,65,82,75,41,32,97,115,32,121,111,117,32,108,105,107,101,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,101,105,114,32,110,97,109,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,117,110,105,113,117,101,46,10,10,87,104,101,110,32,97,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,40,42,77,65,82,75,58,78,65,77,69,41,44,10,40,42,80,82,85,78,69,58,78,65,77,69,41,44,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,32,111,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,114,97,32,100,97,116,97,32,102,111,114,32,96,112,99,114,101,95,101,120,101,99,40,41,96,34,32,105,110,32,116,104,101,32,96,112,99,114,101,97,112,105,96,10,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,73,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,111,102,32,96,112,99,114,101,116,101,115,116,96,32,111,117,116,112,117,116,44,32,116,104,101,32,47,75,32,109,111,100,105,102,105,101,114,10,114,101,113,117,101,115,116,115,32,116,104,101,32,114,101,116,114,105,101,118,97,108,32,97,110,100,32,111,117,116,112,117,116,116,105,110,103,32,111,102,32,40,42,77,65,82,75,41,32,100,97,116,97,58,10,10,96,96,96,116,101,120,116,10,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,89,10,32,48,58,32,88,89,10,77,75,58,32,65,10,88,90,10,32,48,58,32,88,90,10,77,75,58,32,66,10,96,96,96,10,10,84,104,101,32,40,92,42,77,65,82,75,41,32,110,97,109,101,32,105,115,32,116,97,103,103,101,100,32,119,105,116,104,32,34,77,75,58,34,32,105,110,32,116,104,105,115,32,111,117,116,112,117,116,44,32,97,110,100,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,105,116,10,105,110,100,105,99,97,116,101,115,32,119,104,105,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,105,115,32,97,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,119,97,121,32,111,102,10,111,98,116,97,105,110,105,110,103,32,116,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,110,32,112,117,116,116,105,110,103,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,105,116,115,32,111,119,110,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,97,32,118,101,114,98,32,119,105,116,104,32,97,32,110,97,109,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,116,104,101,10,110,97,109,101,32,105,115,32,114,101,99,111,114,100,101,100,32,97,110,100,32,112,97,115,115,101,100,32,98,97,99,107,32,105,102,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,10,111,99,99,117,114,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,111,114,32,102,97,105,108,105,110,103,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,10,10,65,102,116,101,114,32,97,32,112,97,114,116,105,97,108,32,109,97,116,99,104,32,111,114,32,97,32,102,97,105,108,101,100,32,109,97,116,99,104,44,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,110,97,109,101,32,105,110,32,116,104,101,32,101,110,116,105,114,101,10,109,97,116,99,104,32,112,114,111,99,101,115,115,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,80,10,78,111,32,109,97,116,99,104,44,32,109,97,114,107,32,61,32,66,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,105,110,32,116,104,105,115,32,117,110,97,110,99,104,111,114,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,114,107,32,105,115,32,114,101,116,97,105,110,101,100,32,102,114,111,109,32,116,104,101,32,109,97,116,99,104,10,97,116,116,101,109,112,116,32,116,104,97,116,32,115,116,97,114,116,101,100,32,97,116,32,108,101,116,116,101,114,32,34,88,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,83,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,115,10,115,116,97,114,116,105,110,103,32,97,116,32,34,80,34,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,100,111,32,110,111,116,32,103,101,116,32,97,115,32,102,97,114,32,97,115,32,116,104,101,32,40,92,42,77,65,82,75,41,10,105,116,101,109,44,32,110,101,118,101,114,116,104,101,108,101,115,115,32,100,111,32,110,111,116,32,114,101,115,101,116,32,105,116,46,10,10,95,86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,97,102,116,101,114,32,66,97,99,107,116,114,97,99,107,105,110,103,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,100,111,32,110,111,116,104,105,110,103,32,119,104,101,110,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,77,97,116,99,104,105,110,103,32,99,111,110,116,105,110,117,101,115,10,119,105,116,104,32,119,104,97,116,32,102,111,108,108,111,119,115,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,44,32,99,97,117,115,105,110,103,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,10,116,104,101,32,118,101,114,98,44,32,97,32,102,97,105,108,117,114,101,32,105,115,32,102,111,114,99,101,100,46,32,84,104,97,116,32,105,115,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,112,97,115,115,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,10,116,104,101,32,118,101,114,98,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,97,112,112,101,97,114,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,110,10,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,105,116,115,32,101,102,102,101,99,116,32,105,115,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,97,116,32,103,114,111,117,112,44,32,97,115,32,111,110,99,101,32,116,104,101,32,103,114,111,117,112,10,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,116,104,101,114,101,32,105,115,32,110,101,118,101,114,32,97,110,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,73,110,32,116,104,105,115,32,115,105,116,117,97,116,105,111,110,44,10,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,34,106,117,109,112,32,98,97,99,107,34,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,10,97,115,115,101,114,116,105,111,110,46,32,40,82,101,109,101,109,98,101,114,32,97,108,115,111,44,32,97,115,32,115,116,97,116,101,100,32,97,98,111,118,101,44,32,116,104,97,116,32,116,104,105,115,32,108,111,99,97,108,105,122,97,116,105,111,110,32,97,108,115,111,32,97,112,112,108,105,101,115,10,105,110,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,46,41,10,10,84,104,101,115,101,32,118,101,114,98,115,32,100,105,102,102,101,114,32,105,110,32,101,120,97,99,116,108,121,32,119,104,97,116,32,107,105,110,100,32,111,102,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,10,114,101,97,99,104,101,115,32,116,104,101,109,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,32,105,115,32,119,104,97,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,118,101,114,98,32,105,115,32,110,111,116,10,105,110,32,97,32,115,117,98,114,111,117,116,105,110,101,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,83,117,98,115,101,113,117,101,110,116,32,115,101,99,116,105,111,110,115,32,99,111,118,101,114,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,99,97,115,101,115,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,105,99,104,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,44,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,10,116,111,32,102,97,105,108,32,111,117,116,114,105,103,104,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,10,116,111,32,114,101,97,99,104,32,105,116,46,32,69,118,101,110,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,110,111,32,102,117,114,116,104,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,102,105,110,100,32,97,10,109,97,116,99,104,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,116,97,107,101,32,112,108,97,99,101,46,10,10,96,96,96,116,101,120,116,10,40,42,67,79,77,77,73,84,41,10,96,96,96,10,10,73,102,32,40,92,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,111,110,108,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,116,104,97,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,44,32,111,110,99,101,32,105,116,32,104,97,115,10,98,101,101,110,32,112,97,115,115,101,100,44,32,91,96,114,117,110,47,50,44,51,96,93,40,96,114,117,110,47,50,96,41,32,105,115,32,99,111,109,109,105,116,116,101,100,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,10,115,116,97,114,116,105,110,103,32,112,111,105,110,116,44,32,111,114,32,110,111,116,32,97,116,32,97,108,108,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,97,43,40,42,67,79,77,77,73,84,41,98,10,96,96,96,10,10,84,104,105,115,32,109,97,116,99,104,101,115,32,34,120,120,97,97,98,34,32,98,117,116,32,110,111,116,32,34,97,97,99,97,97,98,34,46,32,73,116,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,107,105,110,100,32,111,102,32,100,121,110,97,109,105,99,10,97,110,99,104,111,114,44,32,111,114,32,34,73,39,118,101,32,115,116,97,114,116,101,100,44,32,115,111,32,73,32,109,117,115,116,32,102,105,110,105,115,104,34,46,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,10,112,97,115,115,101,100,32,40,42,77,65,82,75,41,32,105,110,32,116,104,101,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,119,104,101,110,32,40,42,67,79,77,77,73,84,41,32,102,111,114,99,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46,10,10,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,101,120,105,115,116,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,32,100,105,102,102,101,114,101,110,116,32,111,110,101,32,116,104,97,116,10,102,111,108,108,111,119,115,32,40,42,67,79,77,77,73,84,41,32,99,97,110,32,98,101,32,116,114,105,103,103,101,114,101,100,32,102,105,114,115,116,44,32,115,111,32,109,101,114,101,108,121,32,112,97,115,115,105,110,103,32,40,42,67,79,77,77,73,84,41,32,100,117,114,105,110,103,32,97,10,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,97,108,119,97,121,115,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,32,109,97,116,99,104,32,109,117,115,116,32,98,101,32,97,116,32,116,104,105,115,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,40,92,42,67,79,77,77,73,84,41,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,97,110,32,97,110,99,104,111,114,44,10,117,110,108,101,115,115,32,116,104,101,32,80,67,82,69,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,97,114,101,32,116,117,114,110,101,100,32,111,102,102,44,32,97,115,32,115,104,111,119,110,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,93,41,46,10,123,109,97,116,99,104,44,91,34,97,98,99,34,93,125,10,50,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,44,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,93,41,46,10,110,111,109,97,116,99,104,10,96,96,96,10,10,70,111,114,32,116,104,105,115,32,112,97,116,116,101,114,110,44,32,80,67,82,69,32,107,110,111,119,115,32,116,104,97,116,32,97,110,121,32,109,97,116,99,104,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,34,97,34,44,32,115,111,32,116,104,101,10,111,112,116,105,109,105,122,97,116,105,111,110,32,115,107,105,112,115,32,97,108,111,110,103,32,116,104,101,32,115,117,98,106,101,99,116,32,116,111,32,34,97,34,32,98,101,102,111,114,101,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,101,10,102,105,114,115,116,32,115,101,116,32,111,102,32,100,97,116,97,46,32,84,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,101,110,32,115,117,99,99,101,101,100,115,46,32,73,110,32,116,104,101,32,115,101,99,111,110,100,32,99,97,108,108,32,116,104,101,10,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,100,105,115,97,98,108,101,115,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,115,107,105,112,115,32,97,108,111,110,103,32,116,111,32,116,104,101,32,102,105,114,115,116,10,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,110,111,119,32,97,112,112,108,105,101,100,32,115,116,97,114,116,105,110,103,32,97,116,32,34,120,34,44,32,97,110,100,32,115,111,32,116,104,101,32,40,92,42,67,79,77,77,73,84,41,10,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,116,114,121,105,110,103,32,97,110,121,32,111,116,104,101,114,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,115,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,10,116,104,101,32,115,117,98,106,101,99,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,10,114,101,97,99,104,32,105,116,58,10,10,96,96,96,116,101,120,116,10,40,42,80,82,85,78,69,41,32,111,114,32,40,42,80,82,85,78,69,58,78,65,77,69,41,10,96,96,96,10,10,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,110,111,114,109,97,108,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,10,115,116,97,114,116,105,110,103,32,99,104,97,114,97,99,116,101,114,32,116,104,101,110,32,111,99,99,117,114,115,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,111,99,99,117,114,32,97,115,32,117,115,117,97,108,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,10,40,42,80,82,85,78,69,41,44,32,98,101,102,111,114,101,32,105,116,32,105,115,32,114,101,97,99,104,101,100,44,32,111,114,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,116,111,32,116,104,101,32,114,105,103,104,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,117,116,10,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,99,114,111,115,115,32,40,42,80,82,85,78,69,41,46,32,73,110,32,115,105,109,112,108,101,10,99,97,115,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,40,42,80,82,85,78,69,41,32,105,115,32,106,117,115,116,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,10,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,117,115,101,115,32,111,102,32,40,42,80,82,85,78,69,41,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,10,101,120,112,114,101,115,115,101,100,32,105,110,32,97,110,121,32,111,116,104,101,114,32,119,97,121,46,32,73,110,32,97,110,32,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,44,32,40,42,80,82,85,78,69,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,10,97,115,32,40,92,42,67,79,77,77,73,84,41,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,80,82,85,78,69,41,46,32,73,116,32,105,115,10,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,10,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,92,42,80,82,85,78,69,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,62,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,101,110,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,111,117,116,32,97,32,110,97,109,101,44,32,105,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,44,32,101,120,99,101,112,116,32,116,104,97,116,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,110,111,116,32,116,111,32,116,104,101,32,110,101,120,116,10,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,116,111,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,96,96,96,116,101,120,116,10,40,42,83,75,73,80,41,10,96,96,96,10,10,40,92,42,83,75,73,80,41,32,115,105,103,110,105,102,105,101,115,32,116,104,97,116,32,119,104,97,116,101,118,101,114,32,116,101,120,116,32,119,97,115,32,109,97,116,99,104,101,100,32,108,101,97,100,105,110,103,32,117,112,32,116,111,32,105,116,32,99,97,110,110,111,116,32,98,101,10,112,97,114,116,32,111,102,32,97,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,46,32,67,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,97,43,40,42,83,75,73,80,41,98,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,97,97,97,99,46,46,46,34,44,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,102,97,105,108,115,32,40,115,116,97,114,116,105,110,103,32,97,116,10,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,116,114,105,110,103,41,44,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,115,107,105,112,115,32,111,110,32,116,111,32,115,116,97,114,116,32,116,104,101,10,110,101,120,116,32,97,116,116,101,109,112,116,32,97,116,32,34,99,34,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,104,101,32,115,97,109,101,10,101,102,102,101,99,116,32,97,115,32,116,104,105,115,32,101,120,97,109,112,108,101,59,32,97,108,116,104,111,117,103,104,32,105,116,32,119,111,117,108,100,32,115,117,112,112,114,101,115,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,100,117,114,105,110,103,32,116,104,101,32,102,105,114,115,116,10,109,97,116,99,104,32,97,116,116,101,109,112,116,44,32,116,104,101,32,115,101,99,111,110,100,32,97,116,116,101,109,112,116,32,119,111,117,108,100,32,115,116,97,114,116,32,97,116,32,116,104,101,32,115,101,99,111,110,100,32,99,104,97,114,97,99,116,101,114,32,105,110,115,116,101,97,100,32,111,102,10,115,107,105,112,112,105,110,103,32,111,110,32,116,111,32,34,99,34,46,10,10,87,104,101,110,32,40,92,42,83,75,73,80,41,32,104,97,115,32,97,110,32,97,115,115,111,99,105,97,116,101,100,32,110,97,109,101,44,32,105,116,115,32,98,101,104,97,118,105,111,114,32,105,115,32,109,111,100,105,102,105,101,100,58,10,10,96,96,96,116,101,120,116,10,40,42,83,75,73,80,58,78,65,77,69,41,10,96,96,96,10,10,87,104,101,110,32,116,104,105,115,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,112,97,116,104,32,116,104,114,111,117,103,104,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,101,97,114,99,104,101,100,32,102,111,114,10,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,40,42,77,65,82,75,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,110,97,109,101,46,32,73,102,32,111,110,101,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,10,97,100,118,97,110,99,101,32,105,115,32,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,112,111,115,105,116,105,111,110,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,97,116,32,40,42,77,65,82,75,41,32,105,110,115,116,101,97,100,32,111,102,10,116,111,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,32,73,102,32,110,111,32,40,42,77,65,82,75,41,32,119,105,116,104,32,97,32,109,97,116,99,104,105,110,103,32,110,97,109,101,32,105,115,32,102,111,117,110,100,44,10,40,92,42,83,75,73,80,41,32,105,115,32,105,103,110,111,114,101,100,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,98,121,32,40,42,77,65,82,75,58,78,65,77,69,41,46,32,73,116,32,105,103,110,111,114,101,115,10,110,97,109,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,98,121,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,105,110,110,101,114,109,111,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,119,104,101,110,10,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,99,101,108,115,32,97,110,121,32,102,117,114,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,119,105,116,104,105,110,32,116,104,101,10,99,117,114,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,46,10,10,96,96,96,116,101,120,116,10,40,42,84,72,69,78,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,10,96,96,96,10,10,84,104,101,32,118,101,114,98,32,110,97,109,101,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,111,98,115,101,114,118,97,116,105,111,110,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,97,32,112,97,116,116,101,114,110,45,98,97,115,101,100,10,105,102,45,116,104,101,110,45,101,108,115,101,32,98,108,111,99,107,58,10,10,96,96,96,116,101,120,116,10,40,32,67,79,78,68,49,32,40,42,84,72,69,78,41,32,70,79,79,32,124,32,67,79,78,68,50,32,40,42,84,72,69,78,41,32,66,65,82,32,124,32,67,79,78,68,51,32,40,42,84,72,69,78,41,32,66,65,90,32,41,32,46,46,46,10,96,96,96,10,10,73,102,32,116,104,101,32,67,79,78,68,49,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,70,79,79,32,105,115,32,116,114,105,101,100,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,105,116,101,109,115,32,97,102,116,101,114,32,116,104,101,10,101,110,100,32,111,102,32,116,104,101,32,103,114,111,117,112,32,105,102,32,70,79,79,32,115,117,99,99,101,101,100,115,41,46,32,79,110,32,102,97,105,108,117,114,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,115,107,105,112,115,32,116,111,32,116,104,101,32,115,101,99,111,110,100,10,97,108,116,101,114,110,97,116,105,118,101,32,97,110,100,32,116,114,105,101,115,32,67,79,78,68,50,44,32,119,105,116,104,111,117,116,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,67,79,78,68,49,46,32,73,102,32,116,104,97,116,32,115,117,99,99,101,101,100,115,10,97,110,100,32,66,65,82,32,102,97,105,108,115,44,32,67,79,78,68,51,32,105,115,32,116,114,105,101,100,46,32,73,102,32,66,65,90,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,114,101,32,105,115,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,119,104,97,116,101,118,101,114,32,99,97,109,101,32,98,101,102,111,114,101,32,116,104,101,32,101,110,116,105,114,101,32,103,114,111,117,112,46,10,73,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,97,110,32,97,108,116,101,114,110,97,116,105,111,110,44,32,105,116,32,97,99,116,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,84,72,69,78,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,84,72,69,78,41,46,32,73,116,32,105,115,10,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,10,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,92,42,84,72,69,78,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,62,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46,10,10,65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,124,32,99,104,97,114,97,99,116,101,114,32,105,115,32,106,117,115,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,101,110,99,108,111,115,105,110,103,10,97,108,116,101,114,110,97,116,105,118,101,59,32,105,116,32,105,115,32,110,111,116,32,97,32,110,101,115,116,101,100,32,97,108,116,101,114,110,97,116,105,111,110,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,46,32,84,104,101,10,101,102,102,101,99,116,32,111,102,32,40,92,42,84,72,69,78,41,32,101,120,116,101,110,100,115,32,98,101,121,111,110,100,32,115,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,101,110,99,108,111,115,105,110,103,10,97,108,116,101,114,110,97,116,105,118,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,10,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,111,110,116,97,105,110,32,97,110,121,32,124,32,99,104,97,114,97,99,116,101,114,115,32,97,116,32,116,104,105,115,32,108,101,118,101,108,58,10,10,96,96,96,116,101,120,116,10,65,32,40,66,40,42,84,72,69,78,41,67,41,32,124,32,68,10,96,96,96,10,10,73,102,32,65,32,97,110,100,32,66,32,97,114,101,32,109,97,116,99,104,101,100,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,10,105,110,116,111,32,65,59,32,105,110,115,116,101,97,100,32,105,116,32,109,111,118,101,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,104,97,116,32,105,115,44,32,68,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,10,115,117,98,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,105,110,103,32,40,92,42,84,72,69,78,41,32,105,115,32,103,105,118,101,110,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,105,116,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,58,10,10,96,96,96,116,101,120,116,10,65,32,40,66,40,42,84,72,69,78,41,67,32,124,32,40,42,70,65,73,76,41,41,32,124,32,68,10,96,96,96,10,10,84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,119,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,101,32,105,110,110,101,114,32,115,117,98,112,97,116,116,101,114,110,46,32,65,102,116,101,114,32,97,32,102,97,105,108,117,114,101,10,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,109,111,118,101,115,32,116,111,32,40,42,70,65,73,76,41,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,44,32,97,115,10,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,116,111,32,116,114,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,119,32,98,97,99,107,116,114,97,99,107,10,105,110,116,111,32,65,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,104,97,118,105,110,103,32,116,119,111,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,97,115,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,117,115,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,32,105,110,32,97,10,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,46,32,73,103,110,111,114,105,110,103,32,119,104,105,116,101,115,112,97,99,101,44,32,99,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,94,46,42,63,32,40,63,40,63,61,97,41,32,97,32,124,32,98,40,42,84,72,69,78,41,99,32,41,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,98,97,34,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,46,32,65,115,32,46,95,63,32,105,115,32,117,110,103,114,101,101,100,121,44,32,105,116,10,105,110,105,116,105,97,108,108,121,32,109,97,116,99,104,101,115,32,122,101,114,111,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,32,40,63,61,97,41,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,34,98,34,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,34,99,34,32,105,115,32,110,111,116,46,32,65,116,32,116,104,105,115,32,112,111,105,110,116,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,116,111,10,46,95,63,32,97,115,32,99,97,110,32,112,101,114,104,97,112,115,32,98,101,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,10,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,97,108,116,101,114,110,97,116,105,118,101,32,116,104,97,116,32,99,111,109,112,114,105,115,101,115,32,116,104,101,10,119,104,111,108,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,115,111,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,73,102,32,116,104,101,114,101,32,119,97,115,32,97,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,46,92,42,63,44,10,97,108,108,111,119,105,110,103,32,105,116,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,109,97,116,99,104,32,119,111,117,108,100,32,115,117,99,99,101,101,100,46,41,10,10,84,104,101,32,118,101,114,98,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,112,114,111,118,105,100,101,32,102,111,117,114,32,100,105,102,102,101,114,101,110,116,32,34,115,116,114,101,110,103,116,104,115,34,32,111,102,32,99,111,110,116,114,111,108,32,119,104,101,110,10,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,115,58,10,10,45,32,40,92,42,84,72,69,78,41,32,105,115,32,116,104,101,32,119,101,97,107,101,115,116,44,32,99,97,114,114,121,105,110,103,32,111,110,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,46,10,45,32,40,92,42,80,82,85,78,69,41,32,99,111,109,101,115,32,110,101,120,116,44,32,102,97,105,108,115,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,44,32,98,117,116,10,32,32,97,108,108,111,119,115,32,97,110,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,97,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,41,46,10,45,32,40,92,42,83,75,73,80,41,32,105,115,32,115,105,109,105,108,97,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,97,100,118,97,110,99,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,10,45,32,40,92,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,115,116,114,111,110,103,101,115,116,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,10,10,95,77,111,114,101,32,116,104,97,110,32,79,110,101,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,95,10,10,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,111,110,101,32,116,104,97,116,32,105,115,10,98,97,99,107,116,114,97,99,107,101,100,32,111,110,116,111,32,102,105,114,115,116,32,97,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,10,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,58,10,10,96,96,96,116,101,120,116,10,40,65,40,42,67,79,77,77,73,84,41,66,40,42,84,72,69,78,41,67,124,65,66,68,41,10,96,96,96,10,10,73,102,32,65,32,109,97,116,99,104,101,115,32,98,117,116,32,66,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,10,102,97,105,108,46,32,72,111,119,101,118,101,114,44,32,105,102,32,65,32,97,110,100,32,66,32,109,97,116,99,104,44,32,98,117,116,32,67,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,10,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,40,65,66,68,41,32,116,111,32,98,101,32,116,114,105,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,44,32,98,117,116,32,105,115,32,110,111,116,10,97,108,119,97,121,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,32,73,116,32,109,101,97,110,115,32,116,104,97,116,32,105,102,32,116,119,111,32,111,114,32,109,111,114,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,10,97,112,112,101,97,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,44,32,116,104,101,32,108,97,115,116,32,111,102,32,116,104,101,109,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,46,46,46,40,42,67,79,77,77,73,84,41,40,42,80,82,85,78,69,41,46,46,46,10,96,96,96,10,10,73,102,32,116,104,101,114,101,32,105,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,110,116,111,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,10,105,116,32,116,111,32,98,101,32,116,114,105,103,103,101,114,101,100,44,32,97,110,100,32,105,116,115,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,84,104,101,114,101,32,99,97,110,32,110,101,118,101,114,32,98,101,32,97,32,98,97,99,107,116,114,97,99,107,32,111,110,116,111,10,40,42,67,79,77,77,73,84,41,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,82,101,112,101,97,116,101,100,32,71,114,111,117,112,115,95,10,10,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,105,116,115,32,104,97,110,100,108,105,110,103,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,46,10,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,47,40,97,40,42,67,79,77,77,73,84,41,98,41,43,97,99,47,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,99,34,44,32,80,101,114,108,32,109,97,116,99,104,101,115,44,32,98,117,116,32,80,67,82,69,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,116,104,101,32,40,92,42,67,79,77,77,73,84,41,32,105,110,10,116,104,101,32,115,101,99,111,110,100,32,114,101,112,101,97,116,32,111,102,32,116,104,101,32,103,114,111,117,112,32,97,99,116,115,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,65,115,115,101,114,116,105,111,110,115,95,10,10,40,92,42,70,65,73,76,41,32,105,110,32,97,110,32,97,115,115,101,114,116,105,111,110,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,10,98,97,99,107,116,114,97,99,107,46,10,10,40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,10,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,73,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,40,42,65,67,67,69,80,84,41,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,10,102,97,105,108,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,10,10,84,104,101,32,111,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,116,114,101,97,116,101,100,32,115,112,101,99,105,97,108,108,121,32,105,102,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,97,10,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,40,92,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,10,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,111,110,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,105,115,32,105,115,32,119,105,116,104,105,110,10,116,104,101,32,97,115,115,101,114,116,105,111,110,46,10,10,78,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,44,32,104,111,119,101,118,101,114,44,32,100,105,102,102,101,114,101,110,116,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,99,104,97,110,103,105,110,103,32,97,32,112,111,115,105,116,105,118,101,10,97,115,115,101,114,116,105,111,110,32,105,110,116,111,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,104,97,110,103,101,115,32,105,116,115,32,114,101,115,117,108,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,10,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,111,114,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,44,32,119,105,116,104,111,117,116,10,99,111,110,115,105,100,101,114,105,110,103,32,97,110,121,32,102,117,114,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,10,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,40,116,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,41,44,32,98,117,116,32,105,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,115,117,99,104,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,10,40,42,84,72,69,78,41,32,98,101,104,97,118,101,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,83,117,98,114,111,117,116,105,110,101,115,95,10,10,84,104,101,115,101,32,98,101,104,97,118,105,111,114,115,32,111,99,99,117,114,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,46,32,84,104,101,10,116,114,101,97,116,109,101,110,116,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,110,32,80,101,114,108,32,105,115,32,100,105,102,102,101,114,101,110,116,32,105,110,32,115,111,109,101,32,99,97,115,101,115,46,10,10,45,32,40,92,42,70,65,73,76,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,10,32,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46,10,45,32,40,92,42,65,67,67,69,80,84,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,10,32,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,102,116,101,114,32,116,104,101,10,32,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46,10,45,32,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,97,110,100,32,40,92,42,80,82,85,78,69,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,10,32,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,10,45,32,40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,119,105,116,104,105,110,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,10,32,32,115,117,98,112,97,116,116,101,114,110,44,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>},#{otp_doc_vsn => {1,0,0}},[{{type,replace_fun,0},{58,2},[<<114,101,112,108,97,99,101,95,102,117,110,40,41>>],none,#{exported => false}},{{type,capture,0},{55,2},[<<99,97,112,116,117,114,101,40,41>>],none,#{exported => false}},{{type,option,0},{46,2},[<<111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,options,0},{45,2},[<<111,112,116,105,111,110,115,40,41>>],none,#{exported => true}},{{type,compile_option,0},{38,2},[<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,compile_options,0},{37,2},[<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,40,41>>],none,#{exported => true}},{{type,nl_spec,0},{35,2},[<<110,108,95,115,112,101,99,40,41>>],none,#{exported => false}},{{type,mp,0},{26,2},[<<109,112,40,41>>],#{<<101,110>> => <<79,112,97,113,117,101,32,100,97,116,97,32,116,121,112,101,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,96,116,58,109,112,47,48,96,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,97,32,116,117,112,108,101,40,41,32,104,97,118,105,110,103,32,116,104,101,32,97,116,111,109,32,96,114,101,95,112,97,116,116,101,114,110,96,32,97,115,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,116,111,10,97,108,108,111,119,32,102,111,114,32,109,97,116,99,104,105,110,103,32,105,110,32,103,117,97,114,100,115,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,116,117,112,108,101,32,111,114,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,111,116,104,101,114,10,102,105,101,108,100,115,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,115,46>>},#{exported => true,specification => [{attribute,{33,2},type,{mp,{type,{33,15},tuple,[{atom,{33,16},re_pattern},{var,{33,28},'_'},{var,{33,31},'_'},{var,{33,34},'_'},{var,{33,37},'_'}]},[]}}]}},{{function,grun,3},{1768,2},[<<103,114,117,110,47,51>>],hidden,#{}},{{function,urun,3},{1727,2},[<<117,114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],hidden,#{}},{{function,ucompile,2},{1714,2},[<<117,99,111,109,112,105,108,101,40,82,69,44,32,79,112,116,105,111,110,115,41>>],hidden,#{}},{{function,replace,4},{1259,2},[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,112,108,97,99,101,115,32,116,104,101,32,109,97,116,99,104,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,96,83,117,98,106,101,99,116,96,32,115,116,114,105,110,103,32,119,105,116,104,32,96,82,101,112,108,97,99,101,109,101,110,116,96,46,10,10,84,104,101,32,112,101,114,109,105,115,115,105,98,108,101,32,111,112,116,105,111,110,115,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32,96,114,117,110,47,51,96,44,32,101,120,99,101,112,116,32,116,104,97,116,10,111,112,116,105,111,110,96,32,99,97,112,116,117,114,101,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,32,73,110,115,116,101,97,100,32,97,32,96,123,114,101,116,117,114,110,44,32,82,101,116,117,114,110,84,121,112,101,125,96,32,105,115,32,112,114,101,115,101,110,116,46,10,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,96,105,111,100,97,116,97,96,44,32,99,111,110,115,116,114,117,99,116,101,100,32,105,110,32,97,32,119,97,121,32,116,111,32,109,105,110,105,109,105,122,101,32,99,111,112,121,105,110,103,46,10,84,104,101,32,96,105,111,100,97,116,97,96,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,117,115,101,100,32,100,105,114,101,99,116,108,121,32,105,110,32,109,97,110,121,32,73,47,79,32,111,112,101,114,97,116,105,111,110,115,46,32,73,102,32,97,32,102,108,97,116,10,96,116,58,108,105,115,116,47,48,96,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32,96,123,114,101,116,117,114,110,44,32,108,105,115,116,125,96,46,32,73,102,32,97,32,98,105,110,97,114,121,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,10,96,123,114,101,116,117,114,110,44,32,98,105,110,97,114,121,125,96,46,10,10,65,115,32,105,110,32,102,117,110,99,116,105,111,110,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,44,32,97,110,32,96,116,58,109,112,47,48,96,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,10,114,101,113,117,105,114,101,115,32,96,83,117,98,106,101,99,116,96,32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,10,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32,96,117,110,105,99,111,100,101,96,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,10,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,96,83,117,98,106,101,99,116,96,32,97,114,101,32,116,111,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,10,96,99,104,97,114,108,105,115,116,40,41,96,115,46,10,10,73,102,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,115,116,114,105,110,103,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,10,96,38,96,44,32,119,104,105,99,104,32,105,110,115,101,114,116,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,32,96,92,96,78,32,40,119,104,101,114,101,32,78,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,62,32,48,41,44,32,96,92,103,96,78,44,32,111,114,32,96,92,103,123,96,78,96,125,96,44,32,114,101,115,117,108,116,105,110,103,32,105,110,32,116,104,101,10,115,117,98,101,120,112,114,101,115,115,105,111,110,32,110,117,109,98,101,114,32,78,44,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,73,102,32,110,111,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,105,116,104,32,116,104,97,116,10,110,117,109,98,101,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,46,10,10,84,111,32,105,110,115,101,114,116,32,97,110,32,38,32,111,114,32,97,32,92,92,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,112,114,101,99,101,100,101,32,105,116,32,119,105,116,104,32,97,32,92,92,46,32,78,111,116,105,99,101,32,116,104,97,116,32,69,114,108,97,110,103,10,97,108,114,101,97,100,121,32,103,105,118,101,115,32,97,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,111,32,92,92,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,115,111,32,97,32,115,105,110,103,108,101,32,92,92,32,109,117,115,116,32,98,101,10,119,114,105,116,116,101,110,32,97,115,32,96,34,92,92,34,96,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,97,32,100,111,117,98,108,101,32,92,92,32,97,115,32,96,34,92,92,92,92,34,96,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,34,97,98,91,99,93,100,34,10,96,96,96,10,10,119,104,105,108,101,10,10,96,96,96,101,114,108,97,110,103,10,50,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,92,92,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,34,97,98,91,38,93,100,34,10,96,96,96,10,10,73,102,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,102,117,110,44,32,105,116,32,119,105,108,108,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,10,101,120,112,114,101,115,115,105,111,110,32,97,115,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,97,110,100,32,97,32,108,105,115,116,32,111,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,10,111,114,100,101,114,32,105,110,32,119,104,105,99,104,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,105,108,108,32,98,101,10,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,51,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,32,34,46,40,46,41,34,44,10,32,32,32,32,102,117,110,40,87,104,111,108,101,44,32,91,60,60,67,62,62,93,41,32,45,62,10,32,32,32,32,32,32,32,32,32,60,60,36,35,44,32,87,104,111,108,101,47,98,105,110,97,114,121,44,32,36,45,44,32,40,67,32,45,32,36,97,32,43,32,36,65,41,44,32,36,35,62,62,10,32,32,32,32,101,110,100,44,10,32,32,32,32,91,123,114,101,116,117,114,110,44,32,108,105,115,116,125,93,41,46,10,34,35,97,98,45,66,35,99,100,34,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,110,45,109,97,116,99,104,105,110,103,32,111,112,116,105,111,110,97,108,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,105,108,108,32,110,111,116,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,111,102,10,62,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,116,104,101,32,108,97,115,116,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,62,32,101,120,112,114,101,115,115,105,111,110,46,10,62,10,62,32,95,69,120,97,109,112,108,101,58,95,10,62,10,62,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,34,40,97,41,40,98,41,63,40,99,41,63,34,96,32,40,34,97,34,44,32,111,112,116,105,111,110,97,108,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,34,44,10,62,32,111,112,116,105,111,110,97,108,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,34,99,34,41,32,119,105,108,108,32,99,114,101,97,116,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,108,105,115,116,115,58,10,62,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,34,98,34,62,62,44,32,60,60,34,99,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,98,99,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,62,62,44,32,60,60,34,99,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,99,120,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,34,98,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,98,120,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,120,120,34,96,10,10,65,115,32,119,105,116,104,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,114,97,105,115,101,32,116,104,101,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,10,96,99,111,109,112,105,108,101,47,50,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,114,114,111,114,46>>},#{specification => [{attribute,{1334,2},spec,{{replace,4},[{type,{1334,14},bounded_fun,[{type,{1334,14},'fun',[{type,{1334,14},product,[{var,{1334,15},'Subject'},{var,{1334,24},'RE'},{var,{1334,28},'Replacement'},{var,{1334,41},'Options'}]},{type,{1334,53},union,[{type,{1334,53},iodata,[]},{remote_type,{1334,64},[{atom,{1334,64},unicode},{atom,{1334,72},charlist},[]]}]}]},[{type,{1335,7},constraint,[{atom,{1335,7},is_subtype},[{var,{1335,7},'Subject'},{type,{1335,18},union,[{type,{1335,18},iodata,[]},{remote_type,{1335,29},[{atom,{1335,29},unicode},{atom,{1335,37},charlist},[]]}]}]]},{type,{1336,7},constraint,[{atom,{1336,7},is_subtype},[{var,{1336,7},'RE'},{type,{1336,13},union,[{user_type,{1336,13},mp,[]},{type,{1336,20},iodata,[]},{remote_type,{1336,31},[{atom,{1336,31},unicode},{atom,{1336,39},charlist},[]]}]}]]},{type,{1337,7},constraint,[{atom,{1337,7},is_subtype},[{var,{1337,7},'Replacement'},{type,{1337,22},union,[{type,{1337,22},iodata,[]},{remote_type,{1337,33},[{atom,{1337,33},unicode},{atom,{1337,41},charlist},[]]},{user_type,{1337,54},replace_fun,[]}]}]]},{type,{1338,7},constraint,[{atom,{1338,7},is_subtype},[{var,{1338,7},'Options'},{type,{1338,18},list,[{var,{1338,19},'Option'}]}]]},{type,{1339,7},constraint,[{atom,{1339,7},is_subtype},[{var,{1339,7},'Option'},{type,{1339,17},union,[{atom,{1339,17},anchored},{atom,{1339,28},global},{atom,{1339,37},notbol},{atom,{1339,46},noteol},{atom,{1339,55},notempty},{atom,{1340,10},notempty_atstart},{type,{1341,17},tuple,[{atom,{1341,18},offset},{type,{1341,26},non_neg_integer,[]}]},{type,{1341,47},tuple,[{atom,{1341,48},newline},{var,{1341,57},'NLSpec'}]},{atom,{1341,67},bsr_anycrlf},{type,{1342,17},tuple,[{atom,{1342,18},match_limit},{type,{1342,31},non_neg_integer,[]}]},{type,{1343,17},tuple,[{atom,{1343,18},match_limit_recursion},{type,{1343,41},non_neg_integer,[]}]},{atom,{1344,17},bsr_unicode},{type,{1344,31},tuple,[{atom,{1344,32},return},{var,{1344,40},'ReturnType'}]},{var,{1344,54},'CompileOpt'}]}]]},{type,{1345,7},constraint,[{atom,{1345,7},is_subtype},[{var,{1345,7},'ReturnType'},{type,{1345,21},union,[{atom,{1345,21},iodata},{atom,{1345,30},list},{atom,{1345,37},binary}]}]]},{type,{1346,7},constraint,[{atom,{1346,7},is_subtype},[{var,{1346,7},'CompileOpt'},{user_type,{1346,21},compile_option,[]}]]},{type,{1347,7},constraint,[{atom,{1347,7},is_subtype},[{var,{1347,7},'NLSpec'},{type,{1347,17},union,[{atom,{1347,17},cr},{atom,{1347,22},crlf},{atom,{1347,29},lf},{atom,{1347,34},anycrlf},{atom,{1347,44},any}]}]]}]]}]}}]}},{{function,replace,3},{1251,1},[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,41>>],none,#{equiv => <<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,91,93,41>>}},{{function,split,3},{889,2},[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,112,108,105,116,115,32,116,104,101,32,105,110,112,117,116,32,105,110,116,111,32,112,97,114,116,115,32,98,121,32,102,105,110,100,105,110,103,32,116,111,107,101,110,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,32,115,117,112,112,108,105,101,100,46,10,10,84,104,101,32,115,112,108,105,116,116,105,110,103,32,105,115,32,98,97,115,105,99,97,108,108,121,32,100,111,110,101,32,98,121,32,114,117,110,110,105,110,103,32,97,32,103,108,111,98,97,108,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,97,110,100,32,100,105,118,105,100,105,110,103,32,116,104,101,32,105,110,105,116,105,97,108,32,115,116,114,105,110,103,32,119,104,101,114,101,118,101,114,32,97,32,109,97,116,99,104,32,111,99,99,117,114,115,46,32,84,104,101,10,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,111,117,116,112,117,116,46,10,10,65,115,32,105,110,32,96,114,117,110,47,51,96,44,32,97,110,32,96,116,58,109,112,47,48,96,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,114,101,113,117,105,114,101,115,32,96,83,117,98,106,101,99,116,96,32,116,111,10,98,101,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32,96,117,110,105,99,111,100,101,96,10,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,10,97,110,100,32,96,83,117,98,106,101,99,116,96,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,115,46,10,10,84,104,101,32,114,101,115,117,108,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,108,105,115,116,32,111,102,32,34,115,116,114,105,110,103,115,34,44,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,100,97,116,97,32,116,121,112,101,32,115,112,101,99,105,102,105,101,100,32,105,110,10,111,112,116,105,111,110,32,96,114,101,116,117,114,110,96,32,40,100,101,102,97,117,108,116,32,96,105,111,100,97,116,97,96,41,46,10,10,73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,109,97,116,99,104,105,110,103,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,97,115,32,119,101,108,108,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,110,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,34,44,34,103,34,93,10,96,96,96,10,10,119,104,105,108,101,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,108,34,44,34,97,34,44,34,110,34,44,34,103,34,93,10,96,96,96,10,10,84,104,101,32,116,101,120,116,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,41,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,119,104,101,114,101,32,105,116,32,119,97,115,32,102,111,117,110,100,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,10,99,111,110,99,97,116,101,110,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,32,115,112,108,105,116,32,119,104,101,114,101,32,116,104,101,32,119,104,111,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,10,115,105,110,103,108,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,97,115,32,105,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,41,32,97,108,119,97,121,115,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,111,114,105,103,105,110,97,108,10,115,116,114,105,110,103,46,10,10,65,115,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,102,111,114,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,40,116,104,101,10,34,103,34,41,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,84,111,32,109,97,107,101,32,116,104,101,32,103,114,111,117,112,32,111,102,32,115,116,114,105,110,103,115,32,97,110,100,32,116,104,101,32,112,97,114,116,115,10,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,111,114,101,32,111,98,118,105,111,117,115,44,32,111,110,101,32,99,97,110,32,117,115,101,32,111,112,116,105,111,110,32,96,103,114,111,117,112,96,44,32,119,104,105,99,104,10,103,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,104,101,110,32,116,104,101,32,115,116,114,105,110,103,32,119,97,115,32,115,112,108,105,116,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,103,114,111,117,112,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,91,34,69,114,34,44,34,108,34,93,44,91,34,97,34,44,34,110,34,93,44,91,34,103,34,93,93,10,96,96,96,10,10,72,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,102,105,114,115,116,32,109,97,116,99,104,101,100,32,116,104,101,32,34,108,34,44,32,99,97,117,115,105,110,103,32,34,69,114,34,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,10,112,97,114,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,87,104,101,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,100,44,32,116,104,101,32,40,111,110,108,121,41,10,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,98,111,117,110,100,32,116,111,32,116,104,101,32,34,108,34,44,32,115,111,32,116,104,101,32,34,108,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,103,114,111,117,112,32,116,111,103,101,116,104,101,114,10,119,105,116,104,32,34,69,114,34,46,32,84,104,101,32,110,101,120,116,32,109,97,116,99,104,32,105,115,32,111,102,32,116,104,101,32,34,110,34,44,32,109,97,107,105,110,103,32,34,97,34,32,116,104,101,32,110,101,120,116,32,112,97,114,116,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,46,32,65,115,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,105,115,32,98,111,117,110,100,32,116,111,32,115,117,98,115,116,114,105,110,103,32,34,110,34,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,34,110,34,10,105,115,32,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,105,115,32,103,114,111,117,112,46,32,84,104,101,32,108,97,115,116,32,103,114,111,117,112,32,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,44,32,97,115,10,110,111,32,109,111,114,101,32,109,97,116,99,104,101,115,32,97,114,101,32,102,111,117,110,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,108,108,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,44,32,97,114,101,32,114,101,116,117,114,110,101,100,10,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,34,44,91,93,93,10,96,96,96,10,10,97,115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,111,102,32,116,104,101,32,34,103,34,32,105,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,108,101,97,118,101,115,32,97,110,32,101,109,112,116,121,32,114,101,115,116,44,32,119,104,105,99,104,10,105,115,32,97,108,115,111,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,115,112,108,105,116,10,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,44,32,119,104,101,114,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,98,121,32,100,101,102,97,117,108,116,32,114,101,109,111,118,101,100,46,32,84,111,32,103,101,116,10,116,104,101,32,34,116,114,105,109,109,105,110,103,34,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,80,101,114,108,44,32,115,112,101,99,105,102,121,32,96,116,114,105,109,96,32,97,115,32,97,110,32,111,112,116,105,111,110,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,116,114,105,109,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,34,93,10,96,96,96,10,10,84,104,101,32,34,116,114,105,109,34,32,111,112,116,105,111,110,32,115,97,121,115,59,32,34,103,105,118,101,32,109,101,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,101,120,99,101,112,116,32,116,104,101,32,101,109,112,116,121,10,111,110,101,115,34,44,32,119,104,105,99,104,32,115,111,109,101,116,105,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,32,89,111,117,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,104,111,119,32,109,97,110,121,32,112,97,114,116,115,32,121,111,117,10,119,97,110,116,44,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,96,78,96,125,96,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,50,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,103,34,93,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,115,32,34,97,110,103,34,44,32,110,111,116,32,34,97,110,34,44,32,97,115,32,115,112,108,105,116,116,105,110,103,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,105,110,116,111,10,116,119,111,32,112,97,114,116,115,44,32,97,110,100,32,116,104,101,32,115,112,108,105,116,116,105,110,103,32,115,116,111,112,115,32,119,104,101,110,32,101,110,111,117,103,104,32,112,97,114,116,115,32,97,114,101,32,103,105,118,101,110,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,116,104,101,10,114,101,115,117,108,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,97,116,32,111,102,32,96,116,114,105,109,96,46,10,10,77,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,112,97,114,116,115,32,97,114,101,32,110,111,116,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,116,104,105,115,32,105,110,100,97,116,97,44,32,115,111,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,52,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,118,105,101,119,101,100,32,97,115,32,34,97,110,32,105,110,102,105,110,105,116,101,10,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,34,46,10,10,83,112,101,99,105,102,121,105,110,103,32,96,48,96,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,111,112,116,105,111,110,32,96,116,114,105,109,96,46,32,73,102,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,99,97,112,116,117,114,101,100,44,32,101,109,112,116,121,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,97,108,115,111,10,115,116,114,105,112,112,101,100,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,105,102,32,96,116,114,105,109,96,32,111,114,32,96,123,112,97,114,116,115,44,48,125,96,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,10,84,104,101,32,96,116,114,105,109,96,32,98,101,104,97,118,105,111,114,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,100,101,102,97,117,108,116,46,32,96,123,112,97,114,116,115,44,78,125,96,44,32,119,104,101,114,101,10,78,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,105,116,104,32,97,10,112,111,115,105,116,105,118,101,32,110,117,109,101,114,105,99,97,108,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,46,32,84,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,10,91,96,115,112,108,105,116,47,51,96,93,40,96,115,112,108,105,116,47,51,96,41,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,10,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,32,102,111,114,32,116,104,101,32,80,101,114,108,32,114,111,117,116,105,110,101,46,10,10,83,117,109,109,97,114,121,32,111,102,32,111,112,116,105,111,110,115,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,100,101,115,99,114,105,98,101,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,58,10,10,45,32,42,42,96,123,114,101,116,117,114,110,44,82,101,116,117,114,110,84,121,112,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,104,111,119,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,32,97,114,101,10,32,32,112,114,101,115,101,110,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,46,32,86,97,108,105,100,32,116,121,112,101,115,58,10,10,32,32,45,32,42,42,96,105,111,100,97,116,97,96,42,42,32,45,32,84,104,101,32,118,97,114,105,97,110,116,32,111,102,32,96,116,58,105,111,100,97,116,97,47,48,96,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,108,101,97,115,116,32,99,111,112,121,105,110,103,32,111,102,10,32,32,32,32,100,97,116,97,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,40,111,102,116,101,110,32,97,32,98,105,110,97,114,121,44,32,98,117,116,32,100,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,10,32,32,32,32,105,116,41,46,10,10,32,32,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,98,105,110,97,114,105,101,115,46,10,10,32,32,45,32,42,42,96,108,105,115,116,96,42,42,32,45,32,65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,34,115,116,114,105,110,103,115,34,41,46,10,10,45,32,42,42,96,103,114,111,117,112,96,42,42,32,45,32,71,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,10,32,32,115,116,114,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,32,116,104,105,115,32,99,97,115,101,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,10,32,32,96,116,58,108,105,115,116,47,48,96,115,46,32,69,97,99,104,32,115,117,98,108,105,115,116,32,98,101,103,105,110,115,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,112,105,99,107,101,100,32,111,117,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,10,32,32,115,116,114,105,110,103,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,101,97,99,104,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,111,114,100,101,114,32,111,102,10,32,32,111,99,99,117,114,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,45,32,42,42,96,123,112,97,114,116,115,44,78,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,116,111,32,98,101,10,32,32,115,112,108,105,116,32,105,110,116,111,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,105,115,32,116,111,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,10,32,32,111,102,32,112,97,114,116,115,44,32,97,110,100,32,96,105,110,102,105,110,105,116,121,96,32,102,111,114,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,112,111,115,115,105,98,108,101,32,40,116,104,101,10,32,32,100,101,102,97,117,108,116,41,46,32,83,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,48,125,96,32,103,105,118,101,115,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,100,105,115,114,101,103,97,114,100,105,110,103,10,32,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,44,32,116,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,96,116,114,105,109,96,46,10,10,45,32,42,42,96,116,114,105,109,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,97,114,101,32,116,111,10,32,32,98,101,32,100,105,115,114,101,103,97,114,100,101,100,46,32,84,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,48,125,96,46,32,84,104,105,115,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,96,115,112,108,105,116,96,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,46>>},#{specification => [{attribute,{1058,2},spec,{{split,3},[{type,{1058,12},bounded_fun,[{type,{1058,12},'fun',[{type,{1058,12},product,[{var,{1058,13},'Subject'},{var,{1058,22},'RE'},{var,{1058,26},'Options'}]},{var,{1058,38},'SplitList'}]},[{type,{1059,7},constraint,[{atom,{1059,7},is_subtype},[{var,{1059,7},'Subject'},{type,{1059,18},union,[{type,{1059,18},iodata,[]},{remote_type,{1059,29},[{atom,{1059,29},unicode},{atom,{1059,37},charlist},[]]}]}]]},{type,{1060,7},constraint,[{atom,{1060,7},is_subtype},[{var,{1060,7},'RE'},{type,{1060,13},union,[{user_type,{1060,13},mp,[]},{type,{1060,20},iodata,[]},{remote_type,{1060,31},[{atom,{1060,31},unicode},{atom,{1060,39},charlist},[]]}]}]]},{type,{1061,7},constraint,[{atom,{1061,7},is_subtype},[{var,{1061,7},'Options'},{type,{1061,18},list,[{var,{1061,20},'Option'}]}]]},{type,{1062,7},constraint,[{atom,{1062,7},is_subtype},[{var,{1062,7},'Option'},{type,{1062,17},union,[{atom,{1062,17},anchored},{atom,{1062,28},notbol},{atom,{1062,37},noteol},{atom,{1062,46},notempty},{atom,{1062,57},notempty_atstart},{type,{1063,17},tuple,[{atom,{1063,18},offset},{type,{1063,26},non_neg_integer,[]}]},{type,{1063,47},tuple,[{atom,{1063,48},newline},{user_type,{1063,57},nl_spec,[]}]},{type,{1064,17},tuple,[{atom,{1064,18},match_limit},{type,{1064,31},non_neg_integer,[]}]},{type,{1065,17},tuple,[{atom,{1065,18},match_limit_recursion},{type,{1065,41},non_neg_integer,[]}]},{atom,{1066,17},bsr_anycrlf},{atom,{1066,31},bsr_unicode},{type,{1066,45},tuple,[{atom,{1066,46},return},{var,{1066,54},'ReturnType'}]},{type,{1067,17},tuple,[{atom,{1067,18},parts},{var,{1067,25},'NumParts'}]},{atom,{1067,37},group},{atom,{1067,45},trim},{var,{1067,52},'CompileOpt'}]}]]},{type,{1068,7},constraint,[{atom,{1068,7},is_subtype},[{var,{1068,7},'NumParts'},{type,{1068,19},union,[{type,{1068,19},non_neg_integer,[]},{atom,{1068,39},infinity}]}]]},{type,{1069,7},constraint,[{atom,{1069,7},is_subtype},[{var,{1069,7},'ReturnType'},{type,{1069,21},union,[{atom,{1069,21},iodata},{atom,{1069,30},list},{atom,{1069,37},binary}]}]]},{type,{1070,7},constraint,[{atom,{1070,7},is_subtype},[{var,{1070,7},'CompileOpt'},{user_type,{1070,21},compile_option,[]}]]},{type,{1071,7},constraint,[{atom,{1071,7},is_subtype},[{var,{1071,7},'SplitList'},{type,{1071,20},union,[{type,{1071,20},list,[{var,{1071,21},'RetData'}]},{type,{1071,32},list,[{var,{1071,33},'GroupedRetData'}]}]}]]},{type,{1072,7},constraint,[{atom,{1072,7},is_subtype},[{var,{1072,7},'GroupedRetData'},{type,{1072,25},list,[{var,{1072,26},'RetData'}]}]]},{type,{1073,7},constraint,[{atom,{1073,7},is_subtype},[{var,{1073,7},'RetData'},{type,{1073,18},union,[{type,{1073,18},iodata,[]},{remote_type,{1073,29},[{atom,{1073,29},unicode},{atom,{1073,37},charlist},[]]},{type,{1073,50},binary,[]},{type,{1073,61},list,[]}]}]]}]]}]}}]}},{{function,split,2},{881,1},[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,41>>],none,#{equiv => <<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>}},{{function,inspect,2},{820,2},[<<105,110,115,112,101,99,116,40,77,80,44,32,73,116,101,109,41>>],#{<<101,110>> => <<84,97,107,101,115,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,97,110,32,105,116,101,109,44,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,114,101,108,101,118,97,110,116,32,100,97,116,97,10,102,114,111,109,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,84,104,101,32,111,110,108,121,32,115,117,112,112,111,114,116,101,100,32,105,116,101,109,32,105,115,32,96,110,97,109,101,108,105,115,116,96,44,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32,96,123,110,97,109,101,108,105,115,116,44,32,91,98,105,110,97,114,121,40,41,93,125,96,44,10,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,40,117,110,105,113,117,101,41,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,111,107,44,77,80,68,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,67,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,44,91,100,117,112,110,97,109,101,115,93,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,56,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,52,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,68,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,96,96,96,10,10,78,111,116,105,99,101,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,101,120,97,109,112,108,101,32,116,104,97,116,32,116,104,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,32,111,110,108,121,32,111,99,99,117,114,115,32,111,110,99,101,32,105,110,32,116,104,101,10,114,101,116,117,114,110,101,100,32,108,105,115,116,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,108,105,115,116,32,105,115,32,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,114,101,10,116,104,101,32,110,97,109,101,115,32,97,114,101,32,112,111,115,105,116,105,111,110,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,110,97,109,101,115,32,105,115,10,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,111,114,100,101,114,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,102,32,96,123,99,97,112,116,117,114,101,44,32,97,108,108,95,110,97,109,101,115,125,96,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,32,97,110,32,111,112,116,105,111,110,32,116,111,32,96,114,117,110,47,51,96,46,32,89,111,117,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,99,114,101,97,116,101,32,97,32,110,97,109,101,45,116,111,45,118,97,108,117,101,10,109,97,112,112,105,110,103,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,108,105,107,101,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,123,110,97,109,101,108,105,115,116,44,32,78,125,32,61,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,109,97,116,99,104,44,76,125,32,61,32,114,101,58,114,117,110,40,34,65,65,34,44,77,80,44,91,123,99,97,112,116,117,114,101,44,97,108,108,95,110,97,109,101,115,44,98,105,110,97,114,121,125,93,41,46,10,123,109,97,116,99,104,44,91,60,60,34,65,34,62,62,44,60,60,62,62,44,60,60,62,62,93,125,10,52,62,32,78,97,109,101,77,97,112,32,61,32,108,105,115,116,115,58,122,105,112,40,78,44,76,41,46,10,91,123,60,60,34,65,34,62,62,44,60,60,34,65,34,62,62,125,44,123,60,60,34,66,34,62,62,44,60,60,62,62,125,44,123,60,60,34,67,34,62,62,44,60,60,62,62,125,93,10,96,96,96>>},#{specification => [{attribute,{865,2},spec,{{inspect,2},[{type,{865,14},bounded_fun,[{type,{865,14},'fun',[{type,{865,14},product,[{var,{865,15},'MP'},{var,{865,18},'Item'}]},{type,{865,27},tuple,[{atom,{865,28},namelist},{type,{865,38},list,[{type,{865,40},binary,[]}]}]}]},[{type,{866,7},constraint,[{atom,{866,7},is_subtype},[{var,{866,7},'MP'},{user_type,{866,13},mp,[]}]]},{type,{867,7},constraint,[{atom,{867,7},is_subtype},[{var,{867,7},'Item'},{atom,{867,15},namelist}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,internal_run,4},{785,2},[<<105,110,116,101,114,110,97,108,95,114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,44,32,70,105,114,115,116,67,97,108,108,41>>],hidden,#{}},{{function,run,3},{249,2},[<<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,120,101,99,117,116,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,44,32,97,110,100,32,114,101,116,117,114,110,115,32,96,109,97,116,99,104,47,123,109,97,116,99,104,44,32,67,97,112,116,117,114,101,100,125,96,32,111,114,10,96,110,111,109,97,116,99,104,96,46,10,10,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,101,105,116,104,101,114,32,97,115,32,96,116,58,105,111,100,97,116,97,47,48,96,32,105,110,10,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,111,109,112,105,108,101,100,32,40,97,115,32,98,121,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,41,32,97,110,100,10,101,120,101,99,117,116,101,100,44,32,111,114,32,97,115,32,97,32,112,114,101,99,111,109,112,105,108,101,100,32,96,116,58,109,112,47,48,96,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,10,115,117,98,106,101,99,116,32,100,105,114,101,99,116,108,121,46,10,10,87,104,101,110,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,44,32,101,120,99,101,112,116,105,111,110,32,96,98,97,100,97,114,103,96,32,105,115,32,116,104,114,111,119,110,32,105,102,32,97,32,99,111,109,112,105,108,97,116,105,111,110,10,101,114,114,111,114,32,111,99,99,117,114,115,46,32,67,97,108,108,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,32,116,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,44,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,111,110,108,121,10,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58,10,10,45,32,96,97,110,99,104,111,114,101,100,96,10,45,32,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,10,45,32,96,103,108,111,98,97,108,96,10,45,32,96,123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,10,45,32,96,110,111,116,98,111,108,96,10,45,32,96,110,111,116,101,109,112,116,121,96,10,45,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,10,45,32,96,110,111,116,101,111,108,96,10,45,32,96,123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,10,10,79,116,104,101,114,119,105,115,101,32,97,108,108,32,111,112,116,105,111,110,115,32,118,97,108,105,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,32,97,114,101,32,97,108,115,111,10,97,108,108,111,119,101,100,46,32,79,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,98,111,116,104,32,102,111,114,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,44,32,110,97,109,101,108,121,10,96,97,110,99,104,111,114,101,100,96,32,97,110,100,32,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,44,32,97,102,102,101,99,116,32,98,111,116,104,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,105,102,10,112,114,101,115,101,110,116,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,110,111,110,45,112,114,101,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,44,10,96,83,117,98,106,101,99,116,96,32,105,115,32,116,111,32,98,101,32,112,114,111,118,105,100,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,44,32,111,116,104,101,114,119,105,115,101,32,97,110,121,10,96,116,58,105,111,100,97,116,97,47,48,96,32,119,105,108,108,32,100,111,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,10,115,112,101,99,105,102,105,101,100,44,32,98,111,116,104,32,96,83,117,98,106,101,99,116,96,32,97,110,100,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,10,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,115,40,41,96,46,10,10,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,32,100,101,102,105,110,101,115,32,119,104,97,116,32,116,111,32,114,101,116,117,114,110,32,102,114,111,109,10,116,104,101,32,102,117,110,99,116,105,111,110,32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,46,32,84,104,101,32,96,99,97,112,116,117,114,101,96,32,116,117,112,108,101,32,99,97,110,32,99,111,110,116,97,105,110,32,98,111,116,104,32,97,10,118,97,108,117,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,119,104,105,99,104,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,44,32,97,110,100,32,97,32,116,121,112,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,32,40,97,115,32,105,110,100,101,120,32,116,117,112,108,101,115,44,32,108,105,115,116,115,44,32,111,114,32,98,105,110,97,114,105,101,115,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,10,100,101,116,97,105,108,32,98,101,108,111,119,46,10,10,73,102,32,116,104,101,32,99,97,112,116,117,114,101,32,111,112,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,97,116,32,110,111,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,116,111,32,98,101,32,100,111,110,101,10,40,96,123,99,97,112,116,117,114,101,44,32,110,111,110,101,125,96,41,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32,96,109,97,116,99,104,96,32,117,112,111,110,10,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,116,117,112,108,101,32,96,123,109,97,116,99,104,44,32,86,97,108,117,101,76,105,115,116,125,96,46,32,68,105,115,97,98,108,105,110,103,10,99,97,112,116,117,114,105,110,103,32,99,97,110,32,98,101,32,100,111,110,101,32,101,105,116,104,101,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,110,111,110,101,96,32,111,114,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,97,115,10,96,86,97,108,117,101,83,112,101,99,96,46,10,10,79,112,116,105,111,110,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,32,97,100,100,115,32,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,116,104,97,116,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,10,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,109,97,116,99,104,105,110,103,32,101,114,114,111,114,32,40,96,109,97,116,99,104,95,108,105,109,105,116,96,32,111,114,10,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,41,44,32,111,114,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,44,32,119,104,101,114,101,32,116,104,101,32,101,114,114,111,114,32,116,117,112,108,101,32,104,97,115,32,116,104,101,10,102,111,114,109,97,116,32,96,123,101,114,114,111,114,44,32,123,99,111,109,112,105,108,101,44,32,67,111,109,112,105,108,101,69,114,114,125,125,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,10,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,101,114,114,111,114,32,116,117,112,108,101,115,44,32,98,117,116,32,114,101,112,111,114,116,115,10,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,97,115,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,102,97,105,108,101,100,32,109,97,116,99,104,101,115,32,98,101,99,97,117,115,101,32,111,102,10,101,120,99,101,101,100,101,100,32,109,97,116,99,104,32,108,105,109,105,116,115,32,115,105,109,112,108,121,32,97,115,32,96,110,111,109,97,116,99,104,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,114,101,108,101,118,97,110,116,32,102,111,114,32,101,120,101,99,117,116,105,111,110,58,10,10,45,32,42,42,96,97,110,99,104,111,114,101,100,96,42,42,32,45,32,76,105,109,105,116,115,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,116,111,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,10,32,32,112,111,115,105,116,105,111,110,46,32,73,102,32,97,32,112,97,116,116,101,114,110,32,119,97,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,96,97,110,99,104,111,114,101,100,96,44,32,111,114,32,116,117,114,110,101,100,32,111,117,116,32,116,111,32,98,101,10,32,32,97,110,99,104,111,114,101,100,32,98,121,32,118,105,114,116,117,101,32,111,102,32,105,116,115,32,99,111,110,116,101,110,116,115,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,109,97,100,101,32,117,110,97,110,99,104,111,114,101,100,32,97,116,32,109,97,116,99,104,105,110,103,10,32,32,116,105,109,101,44,32,104,101,110,99,101,32,116,104,101,114,101,32,105,115,32,110,111,32,96,117,110,97,110,99,104,111,114,101,100,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,103,108,111,98,97,108,96,42,42,32,45,32,73,109,112,108,101,109,101,110,116,115,32,103,108,111,98,97,108,32,40,114,101,112,101,116,105,116,105,118,101,41,32,115,101,97,114,99,104,32,40,102,108,97,103,32,96,103,96,32,105,110,32,80,101,114,108,41,46,32,69,97,99,104,10,32,32,109,97,116,99,104,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,96,116,58,108,105,115,116,47,48,96,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,99,32,109,97,116,99,104,32,97,110,100,10,32,32,97,110,121,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,40,111,114,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,111,112,116,105,111,110,32,96,99,97,112,116,117,114,101,96,46,32,84,104,101,10,32,32,96,67,97,112,116,117,114,101,100,96,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,104,101,110,99,101,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,32,96,116,58,108,105,115,116,47,48,96,115,32,119,104,101,110,10,32,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,10,32,32,84,104,101,32,105,110,116,101,114,97,99,116,105,111,110,32,111,102,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,119,105,116,104,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,10,32,32,101,109,112,116,121,32,115,116,114,105,110,103,32,115,117,114,112,114,105,115,101,115,32,115,111,109,101,32,117,115,101,114,115,46,32,87,104,101,110,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,104,97,110,100,108,101,115,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,80,101,114,108,58,32,97,10,32,32,122,101,114,111,45,108,101,110,103,116,104,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,105,110,116,32,105,115,32,97,108,115,111,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,10,32,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,46,32,73,102,32,116,104,97,116,32,115,101,97,114,99,104,32,103,105,118,101,115,32,97,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,44,10,32,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,105,110,99,108,117,100,101,100,46,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,99,97,116,34,44,34,40,124,97,116,41,34,44,91,103,108,111,98,97,108,93,41,46,10,32,32,96,96,96,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,105,110,103,115,32,97,114,101,32,112,101,114,102,111,114,109,101,100,58,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,48,96,42,42,32,45,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,40,124,97,116,41,96,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,32,116,104,101,10,32,32,32,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,32,111,102,32,115,116,114,105,110,103,32,96,99,97,116,96,44,32,103,105,118,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,115,101,116,32,96,91,123,48,44,48,125,44,123,48,44,48,125,93,96,32,40,116,104,101,10,32,32,32,32,115,101,99,111,110,100,32,96,123,48,44,48,125,96,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,41,46,10,32,32,32,32,65,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,32,105,115,32,48,44,32,119,101,32,100,111,32,110,111,116,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,112,111,115,105,116,105,111,110,32,121,101,116,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,48,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,115,105,116,105,111,110,44,10,32,32,32,32,119,104,105,99,104,32,100,111,101,115,32,110,111,116,32,103,105,118,101,32,97,110,121,32,105,110,116,101,114,101,115,116,105,110,103,32,114,101,115,117,108,116,32,111,102,32,108,111,110,103,101,114,32,108,101,110,103,116,104,44,32,115,111,32,116,104,101,32,115,101,97,114,99,104,10,32,32,32,32,112,111,115,105,116,105,111,110,32,105,115,32,97,100,118,97,110,99,101,100,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,96,97,96,41,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,114,101,115,117,108,116,115,32,105,110,32,96,91,123,49,44,48,125,44,123,49,44,48,125,93,96,44,32,115,111,32,116,104,105,115,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,97,108,115,111,32,114,101,112,101,97,116,101,100,32,119,105,116,104,32,116,104,101,32,101,120,116,114,97,32,111,112,116,105,111,110,115,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,65,108,116,101,114,110,97,116,105,118,101,32,96,97,98,96,32,105,115,10,32,32,32,32,102,111,117,110,100,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,92,91,92,123,49,44,50,92,125,44,92,123,49,44,50,92,125,93,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,10,32,32,32,32,111,102,32,114,101,115,117,108,116,115,32,97,110,100,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,101,97,114,99,104,32,115,116,114,105,110,103,32,105,115,32,97,100,118,97,110,99,101,100,32,116,119,111,32,115,116,101,112,115,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,51,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,111,110,99,101,32,97,103,97,105,110,32,109,97,116,99,104,101,115,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,103,105,118,105,110,103,10,32,32,32,32,96,91,123,51,44,48,125,44,123,51,44,48,125,93,96,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,84,104,105,115,32,103,105,118,101,115,32,110,111,32,114,101,115,117,108,116,10,32,32,32,32,111,102,32,108,101,110,103,116,104,32,62,32,48,32,97,110,100,32,119,101,32,97,114,101,32,97,116,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,44,32,115,111,32,116,104,101,32,103,108,111,98,97,108,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,99,111,109,112,108,101,116,101,46,10,10,32,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,108,108,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,91,123,48,44,48,125,44,123,48,44,48,125,93,44,91,123,49,44,48,125,44,123,49,44,48,125,93,44,91,123,49,44,50,125,44,123,49,44,50,125,93,44,91,123,51,44,48,125,44,123,51,44,48,125,93,93,125,10,32,32,96,96,96,10,10,45,32,42,42,96,110,111,116,101,109,112,116,121,96,42,42,32,45,32,65,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,97,32,118,97,108,105,100,32,109,97,116,99,104,32,105,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,105,115,116,44,32,116,104,101,121,32,97,114,101,32,116,114,105,101,100,46,32,73,102,10,32,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,10,32,32,95,69,120,97,109,112,108,101,58,95,10,10,32,32,73,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,32,115,116,114,105,110,103,32,110,111,116,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,34,97,34,32,111,114,32,34,98,34,44,10,32,32,105,116,32,119,111,117,108,100,32,110,111,114,109,97,108,108,121,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,97,63,98,63,10,32,32,96,96,96,10,10,32,32,87,105,116,104,32,111,112,116,105,111,110,32,96,110,111,116,101,109,112,116,121,96,44,32,116,104,105,115,32,109,97,116,99,104,32,105,115,32,105,110,118,97,108,105,100,44,32,115,111,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,115,101,97,114,99,104,101,115,10,32,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,115,116,114,105,110,103,32,102,111,114,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,34,97,34,32,111,114,32,34,98,34,46,10,10,45,32,42,42,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,42,42,32,45,32,76,105,107,101,32,96,110,111,116,101,109,112,116,121,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,97,116,99,104,10,32,32,116,104,97,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,32,32,97,110,99,104,111,114,101,100,44,32,115,117,99,104,32,97,32,109,97,116,99,104,32,99,97,110,32,111,99,99,117,114,32,111,110,108,121,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,92,92,75,46,10,10,32,32,80,101,114,108,32,104,97,115,32,110,111,32,100,105,114,101,99,116,32,101,113,117,105,118,97,108,101,110,116,32,111,102,32,96,110,111,116,101,109,112,116,121,96,32,111,114,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,44,32,98,117,116,32,105,116,32,100,111,101,115,10,32,32,109,97,107,101,32,97,32,115,112,101,99,105,97,108,32,99,97,115,101,32,111,102,32,97,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,111,102,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,119,105,116,104,105,110,32,105,116,115,32,115,112,108,105,116,40,41,10,32,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,119,104,101,110,32,117,115,105,110,103,32,109,111,100,105,102,105,101,114,32,96,47,103,96,46,32,84,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,101,109,117,108,97,116,101,100,10,32,32,97,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,32,110,117,108,108,32,115,116,114,105,110,103,32,98,121,32,102,105,114,115,116,32,116,114,121,105,110,103,32,116,104,101,32,109,97,116,99,104,32,97,103,97,105,110,32,97,116,32,116,104,101,32,115,97,109,101,10,32,32,111,102,102,115,101,116,32,119,105,116,104,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,32,97,110,100,32,96,97,110,99,104,111,114,101,100,96,44,32,97,110,100,32,116,104,101,110,44,32,105,102,32,116,104,97,116,32,102,97,105,108,115,44,32,98,121,10,32,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,111,102,102,115,101,116,32,40,115,101,101,32,98,101,108,111,119,41,32,97,110,100,32,116,114,121,105,110,103,32,97,110,32,111,114,100,105,110,97,114,121,32,109,97,116,99,104,32,97,103,97,105,110,46,10,10,45,32,42,42,96,110,111,116,98,111,108,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,10,32,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,10,32,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32,96,109,117,108,116,105,108,105,110,101,96,32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,10,32,32,99,105,114,99,117,109,102,108,101,120,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,97,102,102,101,99,116,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,10,32,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,92,65,46,10,10,45,32,42,42,96,110,111,116,101,111,108,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,101,110,100,32,111,102,10,32,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,105,116,32,110,111,114,32,40,101,120,99,101,112,116,32,105,110,10,32,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,32,97,32,110,101,119,108,105,110,101,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,10,32,32,96,109,117,108,116,105,108,105,110,101,96,32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,100,111,108,108,97,114,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,10,32,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,92,90,10,32,32,111,114,32,92,92,122,46,10,10,45,32,42,42,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,42,42,32,45,32,71,105,118,101,115,32,98,101,116,116,101,114,32,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,105,110,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,32,87,104,101,110,32,115,112,101,99,105,102,105,101,100,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,40,105,102,32,116,104,101,32,114,101,103,117,108,97,114,10,32,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,109,112,105,108,101,100,41,32,97,110,100,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,32,97,114,101,32,101,120,112,108,105,99,105,116,108,121,32,114,101,116,117,114,110,101,100,10,32,32,97,115,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,46,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,111,115,115,105,98,108,101,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,58,10,10,32,32,45,32,42,42,96,109,97,116,99,104,95,108,105,109,105,116,96,42,42,32,45,32,84,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,115,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,116,104,101,10,32,32,32,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,99,97,108,108,101,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,108,105,98,114,97,114,121,10,32,32,32,32,99,111,109,112,105,108,101,100,32,102,111,114,32,69,114,108,97,110,103,46,32,73,102,32,96,123,101,114,114,111,114,44,32,109,97,116,99,104,95,108,105,109,105,116,125,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,10,32,32,32,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,104,97,115,32,114,101,97,99,104,101,100,32,116,104,105,115,32,108,105,109,105,116,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,111,32,98,101,10,32,32,32,32,114,101,103,97,114,100,101,100,32,97,115,32,97,32,96,110,111,109,97,116,99,104,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,44,10,32,32,32,32,98,117,116,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,44,32,121,111,117,32,97,114,101,32,105,110,102,111,114,109,101,100,32,119,104,101,110,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,10,32,32,32,32,98,101,99,97,117,115,101,32,111,102,32,116,111,111,32,109,97,110,121,32,105,110,116,101,114,110,97,108,32,99,97,108,108,115,46,10,10,32,32,45,32,42,42,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,42,42,32,45,32,84,104,105,115,32,101,114,114,111,114,32,105,115,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,96,109,97,116,99,104,95,108,105,109,105,116,96,44,10,32,32,32,32,98,117,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,111,102,32,80,67,82,69,32,105,115,32,34,114,101,99,117,114,115,105,118,101,108,121,34,32,99,97,108,108,101,100,10,32,32,32,32,109,111,114,101,32,116,105,109,101,115,32,116,104,97,110,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,32,108,105,109,105,116,44,32,119,104,105,99,104,32,100,101,102,97,117,108,116,115,32,116,111,10,32,32,32,32,49,48,44,48,48,48,44,48,48,48,32,97,115,32,119,101,108,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,97,110,100,10,32,32,32,32,96,109,97,116,99,104,95,108,105,109,105,116,95,100,101,102,97,117,108,116,96,32,118,97,108,117,101,115,32,97,114,101,32,107,101,112,116,32,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,44,32,116,104,101,10,32,32,32,32,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,32,101,114,114,111,114,32,99,97,110,110,111,116,32,111,99,99,117,114,44,32,97,115,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,101,114,114,111,114,10,32,32,32,32,111,99,99,117,114,115,32,98,101,102,111,114,101,32,116,104,97,116,32,40,101,97,99,104,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,105,115,32,97,108,115,111,32,97,32,99,97,108,108,44,32,98,117,116,32,110,111,116,32,99,111,110,118,101,114,115,101,108,121,41,46,10,32,32,32,32,66,111,116,104,32,108,105,109,105,116,115,32,99,97,110,32,104,111,119,101,118,101,114,32,98,101,32,99,104,97,110,103,101,100,44,32,101,105,116,104,101,114,32,98,121,32,115,101,116,116,105,110,103,32,108,105,109,105,116,115,32,100,105,114,101,99,116,108,121,32,105,110,32,116,104,101,10,32,32,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,116,114,105,110,103,32,40,115,101,101,32,115,101,99,116,105,111,110,10,32,32,32,32,91,80,67,82,69,32,82,101,103,117,108,97,114,32,69,101,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,99,114,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,100,101,116,97,105,108,115,96,41,41,32,111,114,32,98,121,10,32,32,32,32,115,112,101,99,105,102,121,105,110,103,32,111,112,116,105,111,110,115,32,116,111,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,10,10,32,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,117,110,100,101,114,115,116,97,110,100,32,116,104,97,116,32,119,104,97,116,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,34,114,101,99,117,114,115,105,111,110,34,32,119,104,101,110,10,32,32,108,105,109,105,116,105,110,103,32,109,97,116,99,104,101,115,32,105,115,32,110,111,116,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,111,114,32,111,110,10,32,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,10,32,32,109,97,99,104,105,110,101,32,34,104,101,97,112,34,32,109,101,109,111,114,121,32,116,111,32,115,116,111,114,101,32,118,97,108,117,101,115,32,116,104,97,116,32,109,117,115,116,32,98,101,32,107,101,112,116,32,111,118,101,114,32,114,101,99,117,114,115,105,111,110,32,105,110,10,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,46,10,10,45,32,42,42,96,123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,97,32,109,97,116,99,104,32,105,110,10,32,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58,10,10,32,32,62,32,84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,32,102,105,101,108,100,32,112,114,111,118,105,100,101,115,32,97,32,109,101,97,110,115,32,111,102,32,112,114,101,118,101,110,116,105,110,103,32,80,67,82,69,32,102,114,111,109,32,117,115,105,110,103,10,32,32,62,32,117,112,32,97,32,118,97,115,116,32,97,109,111,117,110,116,32,111,102,32,114,101,115,111,117,114,99,101,115,32,119,104,101,110,32,114,117,110,110,105,110,103,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,103,111,105,110,103,10,32,32,62,32,116,111,32,109,97,116,99,104,44,32,98,117,116,32,119,104,105,99,104,32,104,97,118,101,32,97,32,118,101,114,121,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,112,111,115,115,105,98,105,108,105,116,105,101,115,32,105,110,32,116,104,101,105,114,10,32,32,62,32,115,101,97,114,99,104,32,116,114,101,101,115,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,117,115,101,115,32,110,101,115,116,101,100,10,32,32,62,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,46,10,32,32,62,10,32,32,62,32,73,110,116,101,114,110,97,108,108,121,44,32,112,99,114,101,95,101,120,101,99,40,41,32,117,115,101,115,32,97,32,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,109,97,116,99,104,40,41,44,32,119,104,105,99,104,32,105,116,32,99,97,108,108,115,10,32,32,62,32,114,101,112,101,97,116,101,100,108,121,32,40,115,111,109,101,116,105,109,101,115,32,114,101,99,117,114,115,105,118,101,108,121,41,46,32,84,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,109,97,116,99,104,95,108,105,109,105,116,32,105,115,10,32,32,62,32,105,109,112,111,115,101,100,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,44,10,32,32,62,32,119,104,105,99,104,32,104,97,115,32,116,104,101,32,101,102,102,101,99,116,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,104,97,116,32,99,97,110,10,32,32,62,32,116,97,107,101,32,112,108,97,99,101,46,32,70,111,114,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,44,32,116,104,101,32,99,111,117,110,116,32,114,101,115,116,97,114,116,115,10,32,32,62,32,102,114,111,109,32,122,101,114,111,32,102,111,114,32,101,97,99,104,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,32,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,114,117,110,97,119,97,121,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,99,97,110,32,102,97,105,108,32,102,97,115,116,101,114,32,105,102,32,116,104,101,10,32,32,108,105,109,105,116,32,105,115,32,108,111,119,101,114,101,100,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,49,48,44,48,48,48,44,48,48,48,32,105,115,32,99,111,109,112,105,108,101,100,10,32,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,105,110,32,110,111,32,119,97,121,32,97,102,102,101,99,116,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,105,110,32,116,101,114,109,115,32,111,102,10,32,32,62,32,34,108,111,110,103,32,114,117,110,110,105,110,103,32,66,73,70,115,34,46,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,97,108,119,97,121,115,32,103,105,118,101,115,32,99,111,110,116,114,111,108,32,98,97,99,107,32,116,111,32,116,104,101,10,32,32,62,32,115,99,104,101,100,117,108,101,114,32,111,102,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,105,110,116,101,114,118,97,108,115,32,116,104,97,116,32,101,110,115,117,114,101,115,32,116,104,101,32,114,101,97,108,45,116,105,109,101,10,32,32,62,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,46,10,10,45,32,42,42,96,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,97,110,100,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,44,32,118,101,114,121,32,115,105,109,105,108,97,114,10,32,32,116,111,32,96,109,97,116,99,104,95,108,105,109,105,116,96,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58,10,10,32,32,62,32,84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,32,102,105,101,108,100,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,109,97,116,99,104,95,108,105,109,105,116,44,32,98,117,116,32,105,110,115,116,101,97,100,10,32,32,62,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,97,116,32,109,97,116,99,104,40,41,32,105,115,32,99,97,108,108,101,100,44,32,105,116,10,32,32,62,32,108,105,109,105,116,115,32,116,104,101,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,111,110,46,32,84,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,105,115,32,97,32,115,109,97,108,108,101,114,32,110,117,109,98,101,114,10,32,32,62,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,97,108,108,115,44,32,98,101,99,97,117,115,101,32,110,111,116,32,97,108,108,32,99,97,108,108,115,32,116,111,32,109,97,116,99,104,40,41,32,97,114,101,10,32,32,62,32,114,101,99,117,114,115,105,118,101,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,111,102,32,117,115,101,32,111,110,108,121,32,105,102,32,105,116,32,105,115,32,115,101,116,32,115,109,97,108,108,101,114,32,116,104,97,110,10,32,32,62,32,109,97,116,99,104,95,108,105,109,105,116,46,10,32,32,62,10,32,32,62,32,76,105,109,105,116,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,97,99,104,105,110,101,32,115,116,97,99,107,32,116,104,97,116,10,32,32,62,32,99,97,110,32,98,101,32,117,115,101,100,44,32,111,114,44,32,119,104,101,110,32,80,67,82,69,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,116,111,32,117,115,101,32,109,101,109,111,114,121,32,111,110,32,116,104,101,32,104,101,97,112,10,32,32,62,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,115,116,97,99,107,44,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,104,101,97,112,32,109,101,109,111,114,121,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,32,32,84,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,97,32,80,67,82,69,32,108,105,98,114,97,114,121,32,119,104,101,114,101,32,104,101,97,112,32,109,101,109,111,114,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,114,101,103,117,108,97,114,10,32,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,114,101,99,117,114,115,105,111,110,32,111,99,99,117,114,115,46,32,84,104,105,115,32,116,104,101,114,101,102,111,114,101,32,108,105,109,105,116,115,32,116,104,101,32,117,115,101,32,111,102,32,109,97,99,104,105,110,101,10,32,32,104,101,97,112,44,32,110,111,116,32,67,32,115,116,97,99,107,46,10,10,32,32,83,112,101,99,105,102,121,105,110,103,32,97,32,108,111,119,101,114,32,118,97,108,117,101,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,116,99,104,101,115,32,119,105,116,104,32,100,101,101,112,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,105,110,103,44,10,32,32,119,104,101,110,32,116,104,101,121,32,115,104,111,117,108,100,32,104,97,118,101,32,109,97,116,99,104,101,100,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,49,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,41,46,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,52,125,44,123,48,44,49,51,125,93,125,10,32,32,50,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,93,41,46,10,32,32,110,111,109,97,116,99,104,10,32,32,51,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,44,114,101,112,111,114,116,95,101,114,114,111,114,115,93,41,46,10,32,32,123,101,114,114,111,114,44,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,125,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,97,110,100,32,111,112,116,105,111,110,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,97,114,101,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,97,115,101,115,46,10,32,32,85,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,110,116,101,114,110,97,108,115,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,98,101,102,111,114,101,32,116,97,109,112,101,114,105,110,103,10,32,32,119,105,116,104,32,116,104,101,115,101,32,108,105,109,105,116,115,46,10,10,45,32,42,42,96,123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,83,116,97,114,116,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,111,102,102,115,101,116,32,40,112,111,115,105,116,105,111,110,41,10,32,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,111,102,102,115,101,116,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,115,111,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,105,115,32,96,123,111,102,102,115,101,116,44,48,125,96,32,40,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,41,46,10,10,45,32,42,42,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,42,42,32,45,32,79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,10,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46,10,10,32,32,45,32,42,42,96,99,114,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,67,82,32,40,65,83,67,73,73,32,49,51,41,46,10,10,32,32,45,32,42,42,96,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,10,32,32,32,32,100,101,102,97,117,108,116,46,10,10,32,32,45,32,42,42,96,99,114,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,10,32,32,32,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46,10,10,32,32,45,32,42,42,96,97,110,121,99,114,108,102,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,32,32,45,32,42,42,96,97,110,121,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,10,32,32,32,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,10,32,32,32,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,10,10,45,32,42,42,96,98,115,114,95,97,110,121,99,114,108,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,10,32,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,32,40,79,118,101,114,114,105,100,101,115,10,32,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41,10,10,45,32,42,42,96,98,115,114,95,117,110,105,99,111,100,101,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,10,32,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,10,32,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41,10,10,45,32,42,42,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,96,47,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,10,32,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,110,100,32,105,110,32,119,104,97,116,32,102,111,114,109,97,116,46,32,66,121,32,100,101,102,97,117,108,116,44,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,99,97,112,116,117,114,101,115,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,97,110,100,32,97,108,108,10,32,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,40,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,112,116,117,114,101,100,41,46,32,84,104,101,10,32,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,40,122,101,114,111,45,98,97,115,101,100,41,32,105,110,100,101,120,101,115,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,112,97,114,116,115,32,111,102,32,116,104,101,10,32,32,115,116,114,105,110,103,44,32,115,112,101,99,105,102,105,101,100,32,97,115,32,96,123,79,102,102,115,101,116,44,76,101,110,103,116,104,125,96,32,112,97,105,114,115,32,40,116,104,101,32,96,105,110,100,101,120,96,32,96,84,121,112,101,96,32,111,102,10,32,32,99,97,112,116,117,114,105,110,103,41,46,10,10,32,32,65,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,32,114,101,116,117,114,110,115,44,32,97,115,32,102,105,114,115,116,10,32,32,97,110,100,32,111,110,108,121,32,99,97,112,116,117,114,101,100,32,115,116,114,105,110,103,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,40,34,97,98,99,100,34,32,105,110,32,116,104,101,10,32,32,109,105,100,100,108,101,41,32,97,115,32,97,110,32,105,110,100,101,120,32,112,97,105,114,32,96,123,51,44,52,125,96,44,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,122,101,114,111,45,98,97,115,101,100,44,10,32,32,106,117,115,116,32,97,115,32,105,110,32,111,102,102,115,101,116,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,97,98,99,100,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,105,115,32,99,97,108,108,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,96,96,96,10,10,32,32,65,110,111,116,104,101,114,32,40,97,110,100,32,113,117,105,116,101,32,99,111,109,109,111,110,41,32,99,97,115,101,32,105,115,32,119,104,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,97,108,108,32,111,102,10,32,32,116,104,101,32,115,117,98,106,101,99,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,97,98,99,100,46,42,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,72,101,114,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,108,121,32,112,111,105,110,116,115,32,111,117,116,32,97,108,108,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,101,103,105,110,110,105,110,103,10,32,32,97,116,32,105,110,100,101,120,32,48,44,32,97,110,100,32,105,116,32,105,115,32,49,48,32,99,104,97,114,97,99,116,101,114,115,32,108,111,110,103,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,93,125,10,32,32,96,96,96,10,10,32,32,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,108,105,107,101,32,105,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,101,100,32,115,117,98,106,101,99,116,32,105,115,32,99,97,112,116,117,114,101,100,44,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,93,125,10,32,32,96,96,96,10,10,32,32,84,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,103,105,118,101,115,32,116,104,101,32,102,105,114,115,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,97,110,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,111,99,99,117,114,114,101,100,32,105,110,32,116,104,101,10,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,32,32,84,104,101,32,99,97,112,116,117,114,101,32,116,117,112,108,101,32,105,115,32,98,117,105,108,116,32,117,112,32,97,115,32,102,111,108,108,111,119,115,58,10,10,32,32,45,32,42,42,96,86,97,108,117,101,83,112,101,99,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,40,115,117,98,41,112,97,116,116,101,114,110,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,10,32,32,32,32,96,86,97,108,117,101,83,112,101,99,96,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,97,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,32,111,102,32,114,101,116,117,114,110,10,32,32,32,32,118,97,108,117,101,115,44,32,111,114,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,105,110,100,101,120,101,115,32,111,114,32,116,104,101,32,110,97,109,101,115,32,111,102,32,115,112,101,99,105,102,105,99,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,115,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,58,10,10,32,32,32,32,45,32,42,42,96,97,108,108,96,42,42,32,45,32,65,108,108,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,10,32,32,32,32,32,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,10,32,32,32,32,45,32,42,42,96,97,108,108,95,110,97,109,101,115,96,42,42,32,45,32,65,108,108,32,95,110,97,109,101,100,95,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,115,32,105,102,10,32,32,32,32,32,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,95,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,95,32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,10,32,32,32,32,32,32,108,105,115,116,32,111,102,32,97,108,108,32,110,97,109,101,115,32,99,97,110,32,97,108,115,111,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32,96,105,110,115,112,101,99,116,47,50,96,46,10,10,32,32,32,32,45,32,42,42,96,102,105,114,115,116,96,42,42,32,45,32,79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,105,115,32,97,108,119,97,121,115,32,116,104,101,10,32,32,32,32,32,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,10,32,32,32,32,32,32,97,114,101,32,100,105,115,99,97,114,100,101,100,46,10,10,32,32,32,32,45,32,42,42,96,97,108,108,95,98,117,116,95,102,105,114,115,116,96,42,42,32,45,32,65,108,108,32,98,117,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,97,116,32,105,115,44,32,97,108,108,10,32,32,32,32,32,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,98,117,116,32,110,111,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,115,32,97,32,119,104,111,108,101,10,32,32,32,32,32,32,109,97,116,99,104,101,115,32,97,32,108,97,114,103,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,98,117,116,32,116,104,101,32,112,97,114,116,32,121,111,117,32,97,114,101,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,10,32,32,32,32,32,32,105,110,32,97,110,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,96,108,105,115,116,96,32,111,114,10,32,32,32,32,32,32,96,98,105,110,97,114,121,96,44,32,110,111,116,32,114,101,116,117,114,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,121,111,117,32,97,114,101,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,97,32,103,111,111,100,10,32,32,32,32,32,32,119,97,121,32,116,111,32,111,112,116,105,109,105,122,101,46,10,10,32,32,32,32,45,32,42,42,96,110,111,110,101,96,42,42,32,45,32,82,101,116,117,114,110,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,103,105,118,101,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,10,32,32,32,32,32,32,96,109,97,116,99,104,96,32,97,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,115,117,99,99,101,115,115,102,117,108,108,121,10,32,32,32,32,32,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,96,123,109,97,116,99,104,44,32,108,105,115,116,40,41,125,96,32,114,101,116,117,114,110,46,32,83,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,103,105,118,101,115,10,32,32,32,32,32,32,116,104,101,32,115,97,109,101,32,98,101,104,97,118,105,111,114,46,10,10,32,32,32,32,84,104,101,32,118,97,108,117,101,32,108,105,115,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,100,101,120,101,115,32,102,111,114,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,44,32,119,104,101,114,101,10,32,32,32,32,105,110,100,101,120,32,48,32,105,115,32,102,111,114,32,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,49,32,105,115,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,99,97,112,116,117,114,105,110,103,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,110,100,32,115,111,32,111,110,46,32,87,104,101,110,32,117,115,105,110,103,32,110,97,109,101,100,32,99,97,112,116,117,114,101,100,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,115,32,40,115,101,101,32,98,101,108,111,119,41,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,111,110,101,32,99,97,110,32,117,115,101,32,96,116,58,97,116,111,109,47,48,96,115,10,32,32,32,32,111,114,32,96,116,58,115,116,114,105,110,103,47,48,96,115,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,32,32,32,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58,10,10,32,32,32,32,96,96,96,116,101,120,116,10,32,32,32,32,34,46,42,40,97,98,99,100,41,46,42,34,10,32,32,32,32,96,96,96,10,10,32,32,32,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,115,116,114,105,110,103,32,34,65,66,67,97,98,99,100,65,66,67,34,44,32,99,97,112,116,117,114,105,110,103,32,111,110,108,121,32,116,104,101,32,34,97,98,99,100,34,32,112,97,114,116,32,40,116,104,101,10,32,32,32,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,115,117,98,112,97,116,116,101,114,110,41,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,101,32,99,97,108,108,32,103,105,118,101,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,115,117,108,116,44,32,97,115,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,34,40,97,98,99,100,41,34,44,32,109,97,116,99,104,105,110,103,32,34,97,98,99,100,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,116,32,40,122,101,114,111,45,98,97,115,101,100,41,10,32,32,32,32,112,111,115,105,116,105,111,110,32,51,44,32,111,102,32,108,101,110,103,116,104,32,52,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,32,32,96,96,96,10,10,32,32,32,32,67,111,110,115,105,100,101,114,32,116,104,101,32,115,97,109,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,101,120,112,108,105,99,105,116,108,121,10,32,32,32,32,110,97,109,101,100,32,39,70,79,79,39,58,10,10,32,32,32,32,96,96,96,116,101,120,116,10,32,32,32,32,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,10,32,32,32,32,96,96,96,10,10,32,32,32,32,87,105,116,104,32,116,104,105,115,32,101,120,112,114,101,115,115,105,111,110,44,32,119,101,32,99,111,117,108,100,32,115,116,105,108,108,32,103,105,118,101,32,116,104,101,32,105,110,100,101,120,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,10,32,32,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,103,105,118,105,110,103,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,98,101,102,111,114,101,46,32,66,117,116,44,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,97,109,101,100,44,32,119,101,32,99,97,110,10,32,32,32,32,97,108,115,111,32,115,112,101,99,105,102,121,32,105,116,115,32,110,97,109,101,32,105,110,32,116,104,101,32,118,97,108,117,101,32,108,105,115,116,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,39,70,79,79,39,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,105,115,32,119,111,117,108,100,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,115,44,32,110,97,109,101,108,121,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,101,32,118,97,108,117,101,115,32,108,105,115,116,32,99,97,110,32,115,112,101,99,105,102,121,32,105,110,100,101,120,101,115,32,111,114,32,110,97,109,101,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,32,32,32,32,101,120,112,114,101,115,115,105,111,110,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,118,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,116,121,112,101,46,32,73,102,10,32,32,32,32,116,104,101,32,116,121,112,101,32,105,115,32,96,105,110,100,101,120,96,44,32,116,104,101,32,116,117,112,108,101,32,96,123,45,49,44,48,125,96,32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,118,97,108,117,101,115,32,119,105,116,104,32,110,111,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,102,111,114,32,116,104,101,32,111,116,104,101,114,32,116,121,112,101,115,10,32,32,32,32,40,96,98,105,110,97,114,121,96,32,97,110,100,32,96,108,105,115,116,96,41,44,32,116,104,101,32,118,97,108,117,101,115,32,97,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,10,32,32,32,32,114,101,115,112,101,99,116,105,118,101,108,121,46,10,10,32,32,45,32,42,42,96,84,121,112,101,96,42,42,32,45,32,79,112,116,105,111,110,97,108,108,121,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,32,32,32,32,114,101,116,117,114,110,101,100,46,32,73,102,32,111,109,105,116,116,101,100,44,32,116,104,101,32,100,101,102,97,117,108,116,32,111,102,32,96,105,110,100,101,120,96,32,105,115,32,117,115,101,100,46,10,10,32,32,32,32,96,84,121,112,101,96,32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,32,32,45,32,42,42,96,105,110,100,101,120,96,42,42,32,45,32,82,101,116,117,114,110,115,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,112,97,105,114,115,32,111,102,32,98,121,116,101,32,105,110,100,101,120,101,115,32,105,110,116,111,10,32,32,32,32,32,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,110,100,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,40,97,115,32,105,102,10,32,32,32,32,32,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,97,115,32,102,108,97,116,116,101,110,101,100,32,119,105,116,104,32,96,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,32,111,114,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50,96,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,112,116,105,111,110,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,96,32,114,101,115,117,108,116,115,32,105,110,32,95,98,121,116,101,45,111,114,105,101,110,116,101,100,95,32,105,110,100,101,120,101,115,32,105,110,32,97,32,40,112,111,115,115,105,98,108,121,32,118,105,114,116,117,97,108,41,10,32,32,32,32,32,32,95,85,84,70,45,56,32,101,110,99,111,100,101,100,95,32,98,105,110,97,114,121,46,32,65,32,98,121,116,101,32,105,110,100,101,120,32,116,117,112,108,101,32,96,123,48,44,50,125,96,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,114,101,112,114,101,115,101,110,116,10,32,32,32,32,32,32,111,110,101,32,111,114,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,119,104,101,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,105,110,32,101,102,102,101,99,116,46,32,84,104,105,115,32,99,97,110,32,115,101,101,109,10,32,32,32,32,32,32,99,111,117,110,116,101,114,45,105,110,116,117,105,116,105,118,101,44,32,98,117,116,32,104,97,115,32,98,101,101,110,32,100,101,101,109,101,100,32,116,104,101,32,109,111,115,116,32,101,102,102,101,99,116,105,118,101,32,97,110,100,32,117,115,101,102,117,108,32,119,97,121,10,32,32,32,32,32,32,116,111,32,100,111,32,105,116,46,32,84,111,32,114,101,116,117,114,110,32,108,105,115,116,115,32,105,110,115,116,101,97,100,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,115,105,109,112,108,101,114,32,99,111,100,101,32,105,102,32,116,104,97,116,32,105,115,10,32,32,32,32,32,32,100,101,115,105,114,101,100,46,32,84,104,105,115,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,10,32,32,32,32,45,32,42,42,96,108,105,115,116,96,42,42,32,45,32,82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,69,114,108,97,110,103,10,32,32,32,32,32,32,96,116,58,115,116,114,105,110,103,47,48,96,115,41,46,32,73,116,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,117,115,101,100,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,92,92,67,10,32,32,32,32,32,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,10,32,32,32,32,32,32,98,121,116,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,118,97,108,105,100,32,85,84,70,45,56,32,40,92,92,67,32,109,97,116,99,104,101,115,32,98,121,116,101,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,99,104,97,114,97,99,116,101,114,10,32,32,32,32,32,32,101,110,99,111,100,105,110,103,41,46,32,73,110,32,116,104,97,116,32,99,97,115,101,32,116,104,101,32,96,108,105,115,116,96,32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,116,104,101,32,115,97,109,101,32,116,121,112,101,115,10,32,32,32,32,32,32,111,102,32,116,117,112,108,101,115,32,116,104,97,116,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50,96,32,99,97,110,32,114,101,116,117,114,110,44,32,110,97,109,101,108,121,10,32,32,32,32,32,32,116,104,114,101,101,45,116,117,112,108,101,115,32,119,105,116,104,32,116,97,103,32,96,105,110,99,111,109,112,108,101,116,101,96,32,111,114,32,96,101,114,114,111,114,96,44,32,116,104,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,111,110,118,101,114,116,101,100,10,32,32,32,32,32,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,116,104,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,32,116,97,105,108,32,111,102,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,10,32,32,32,32,32,32,98,101,115,116,32,115,116,114,97,116,101,103,121,32,105,115,32,116,111,32,97,118,111,105,100,32,117,115,105,110,103,32,116,104,101,32,92,92,67,32,115,101,113,117,101,110,99,101,32,119,104,101,110,32,99,97,112,116,117,114,105,110,103,32,108,105,115,116,115,46,10,10,32,32,32,32,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,98,105,110,97,114,105,101,115,46,32,73,102,32,111,112,116,105,111,110,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,96,32,105,115,32,117,115,101,100,44,32,116,104,101,115,101,32,98,105,110,97,114,105,101,115,32,97,114,101,32,105,110,32,85,84,70,45,56,46,32,73,102,32,116,104,101,32,92,92,67,32,115,101,113,117,101,110,99,101,32,105,115,10,32,32,32,32,32,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,98,105,110,97,114,105,101,115,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,46,10,10,32,32,73,110,32,103,101,110,101,114,97,108,44,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,119,101,114,101,32,110,111,116,32,97,115,115,105,103,110,101,100,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,109,97,116,99,104,32,97,114,101,10,32,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,116,117,112,108,101,32,96,123,45,49,44,48,125,96,32,119,104,101,110,32,96,116,121,112,101,96,32,105,115,32,96,105,110,100,101,120,96,46,32,85,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,115,10,32,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,102,111,114,32,111,116,104,101,114,32,114,101,116,117,114,110,10,32,32,116,121,112,101,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,34,46,42,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,46,42,34,10,32,32,96,96,96,10,10,32,32,84,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,119,104,101,114,101,32,116,104,101,32,111,112,101,110,105,110,103,10,32,32,112,97,114,101,110,116,104,101,115,105,115,32,112,111,115,105,116,105,111,110,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,111,114,100,101,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,104,101,110,99,101,10,32,32,96,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,49,44,32,96,40,63,60,70,79,79,62,97,98,100,100,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,10,32,32,105,110,100,101,120,32,50,44,32,97,110,100,32,96,40,46,46,100,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,51,46,32,87,104,101,110,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,32,32,115,116,114,105,110,103,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,34,65,66,67,97,98,99,100,65,66,67,34,10,32,32,96,96,96,10,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,44,32,97,115,32,34,97,98,100,100,34,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,10,32,32,115,116,114,105,110,103,44,32,98,117,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,40,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,10,32,32,96,97,40,46,46,100,41,96,41,46,32,84,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,110,97,115,115,105,103,110,101,100,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,44,123,45,49,44,48,125,44,123,52,44,51,125,93,125,10,32,32,96,96,96,10,10,32,32,83,101,116,116,105,110,103,32,116,104,101,32,99,97,112,116,117,114,101,32,96,84,121,112,101,96,32,116,111,32,96,98,105,110,97,114,121,96,32,103,105,118,101,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,60,60,34,65,66,67,97,98,99,100,65,66,67,34,62,62,44,60,60,34,97,98,99,100,34,62,62,44,60,60,62,62,44,60,60,34,98,99,100,34,62,62,93,125,10,32,32,96,96,96,10,10,32,32,72,101,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,40,96,60,60,62,62,96,41,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,117,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,110,32,116,104,101,10,32,32,96,98,105,110,97,114,121,96,32,99,97,115,101,44,32,115,111,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,116,104,101,114,101,102,111,114,101,32,108,111,115,116,44,32,97,115,10,32,32,96,60,60,62,62,96,32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,99,97,112,116,117,114,101,100,46,10,10,32,32,73,102,32,100,105,102,102,101,114,101,110,116,105,97,116,105,111,110,32,98,101,116,119,101,101,110,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,97,110,100,32,110,111,110,45,101,120,105,115,116,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,10,32,32,110,101,99,101,115,115,97,114,121,44,32,117,115,101,32,116,104,101,32,96,116,121,112,101,96,32,96,105,110,100,101,120,96,32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,116,104,101,32,102,105,110,97,108,32,116,121,112,101,32,105,110,10,32,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,87,104,101,110,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,105,115,32,115,112,101,99,105,105,102,105,101,100,44,32,116,104,101,32,96,99,97,112,116,117,114,101,96,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,102,102,101,99,116,115,32,101,97,99,104,10,32,32,109,97,116,99,104,32,115,101,112,97,114,97,116,101,108,121,44,32,115,111,32,116,104,97,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,99,97,99,98,34,44,34,99,40,97,124,98,41,34,44,91,103,108,111,98,97,108,44,123,99,97,112,116,117,114,101,44,91,49,93,44,108,105,115,116,125,93,41,46,10,32,32,96,96,96,10,10,32,32,103,105,118,101,115,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,91,34,97,34,93,44,91,34,98,34,93,93,125,10,32,32,96,96,96,10,10,70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,111,112,116,105,111,110,115,32,111,110,108,121,32,97,102,102,101,99,116,105,110,103,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,115,116,101,112,44,32,115,101,101,10,96,99,111,109,112,105,108,101,47,50,96,46>>},#{specification => [{attribute,{765,2},spec,{{run,3},[{type,{765,10},bounded_fun,[{type,{765,10},'fun',[{type,{765,10},product,[{var,{765,11},'Subject'},{var,{765,20},'RE'},{var,{765,24},'Options'}]},{type,{765,36},union,[{type,{765,36},tuple,[{atom,{765,37},match},{var,{765,44},'Captured'}]},{atom,{766,36},match},{atom,{767,36},nomatch},{type,{768,8},tuple,[{atom,{768,9},error},{var,{768,16},'ErrType'}]}]}]},[{type,{769,7},constraint,[{atom,{769,7},is_subtype},[{var,{769,7},'Subject'},{type,{769,18},union,[{type,{769,18},iodata,[]},{remote_type,{769,29},[{atom,{769,29},unicode},{atom,{769,37},charlist},[]]}]}]]},{type,{770,7},constraint,[{atom,{770,7},is_subtype},[{var,{770,7},'RE'},{type,{770,13},union,[{user_type,{770,13},mp,[]},{type,{770,20},iodata,[]},{remote_type,{770,31},[{atom,{770,31},unicode},{atom,{770,39},charlist},[]]}]}]]},{type,{771,7},constraint,[{atom,{771,7},is_subtype},[{var,{771,7},'Options'},{user_type,{771,18},options,[]}]]},{type,{772,7},constraint,[{atom,{772,7},is_subtype},[{var,{772,7},'Captured'},{type,{772,19},union,[{type,{772,19},list,[{var,{772,20},'CaptureData'}]},{type,{772,35},list,[{type,{772,36},list,[{var,{772,37},'CaptureData'}]}]}]}]]},{type,{773,7},constraint,[{atom,{773,7},is_subtype},[{var,{773,7},'CaptureData'},{type,{773,22},union,[{type,{773,22},tuple,[{type,{773,23},integer,[]},{type,{773,34},integer,[]}]},{var,{774,22},'ListConversionData'},{type,{775,22},binary,[]}]}]]},{type,{776,7},constraint,[{atom,{776,7},is_subtype},[{var,{776,7},'ListConversionData'},{type,{776,29},union,[{type,{776,29},string,[]},{type,{777,29},tuple,[{atom,{777,30},error},{type,{777,37},string,[]},{type,{777,47},binary,[]}]},{type,{778,29},tuple,[{atom,{778,30},incomplete},{type,{778,42},string,[]},{type,{778,52},binary,[]}]}]}]]},{type,{779,7},constraint,[{atom,{779,7},is_subtype},[{var,{779,7},'ErrType'},{type,{779,18},union,[{atom,{779,18},match_limit},{atom,{779,32},match_limit_recursion},{type,{779,56},tuple,[{atom,{779,57},compile},{var,{779,67},'CompileErr'}]}]}]]},{type,{780,7},constraint,[{atom,{780,7},is_subtype},[{var,{780,7},'CompileErr'},{type,{780,21},tuple,[{ann_type,{780,22},[{var,{780,22},'ErrString'},{type,{780,35},string,[]}]},{ann_type,{780,45},[{var,{780,45},'Position'},{type,{780,57},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,run,2},{246,1},[<<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,41>>],none,#{equiv => <<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>}},{{function,compile,2},{89,2},[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,111,109,112,105,108,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,119,105,116,104,32,116,104,101,32,115,121,110,116,97,120,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,44,32,105,110,116,111,32,97,110,32,105,110,116,101,114,110,97,108,10,102,111,114,109,97,116,32,116,111,32,98,101,32,117,115,101,100,32,108,97,116,101,114,32,97,115,32,97,32,112,97,114,97,109,101,116,101,114,32,116,111,32,96,114,117,110,47,50,96,32,97,110,100,32,96,114,117,110,47,51,96,46,10,10,67,111,109,112,105,108,105,110,103,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,115,97,109,101,10,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,109,97,116,99,104,105,110,103,32,97,103,97,105,110,115,116,32,109,117,108,116,105,112,108,101,32,115,117,98,106,101,99,116,115,32,100,117,114,105,110,103,32,116,104,101,10,108,105,102,101,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,103,114,97,109,46,32,67,111,109,112,105,108,105,110,103,32,111,110,99,101,32,97,110,100,32,101,120,101,99,117,116,105,110,103,32,109,97,110,121,32,116,105,109,101,115,32,105,115,32,102,97,114,32,109,111,114,101,10,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,111,109,112,105,108,105,110,103,32,101,97,99,104,32,116,105,109,101,32,111,110,101,32,119,97,110,116,115,32,116,111,32,109,97,116,99,104,46,10,10,87,104,101,110,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,10,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,44,32,111,116,104,101,114,119,105,115,101,32,97,115,32,97,110,121,32,118,97,108,105,100,32,96,116,58,105,111,100,97,116,97,47,48,96,46,10,10,91,93,40,41,123,58,32,35,99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,32,125,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,117,110,105,99,111,100,101,96,42,42,32,45,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,10,32,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,100,101,32,105,115,32,116,111,32,98,101,32,114,117,110,32,97,103,97,105,110,115,116,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,10,32,32,96,99,104,97,114,108,105,115,116,40,41,96,32,115,117,98,106,101,99,116,46,32,65,108,115,111,32,99,111,110,115,105,100,101,114,32,111,112,116,105,111,110,32,96,117,99,112,96,32,119,104,101,110,32,117,115,105,110,103,32,85,110,105,99,111,100,101,10,32,32,99,104,97,114,97,99,116,101,114,115,46,10,10,45,32,42,42,96,97,110,99,104,111,114,101,100,96,42,42,32,45,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,102,111,114,99,101,100,32,116,111,32,98,101,32,34,97,110,99,104,111,114,101,100,34,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,10,32,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,10,32,32,115,101,97,114,99,104,101,100,32,40,116,104,101,32,34,115,117,98,106,101,99,116,32,115,116,114,105,110,103,34,41,46,32,84,104,105,115,32,101,102,102,101,99,116,32,99,97,110,32,97,108,115,111,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,10,32,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,110,115,116,114,117,99,116,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,46,10,10,45,32,42,42,96,99,97,115,101,108,101,115,115,96,42,42,32,45,32,76,101,116,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,98,111,116,104,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,10,32,32,108,101,116,116,101,114,115,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,105,96,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,10,32,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,105,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,85,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,32,97,114,101,10,32,32,100,101,102,105,110,101,100,32,97,115,32,105,110,32,116,104,101,32,73,83,79,32,56,56,53,57,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46,10,10,45,32,42,42,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,42,42,32,45,32,65,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,10,32,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,111,112,116,105,111,110,44,32,97,32,100,111,108,108,97,114,32,97,108,115,111,32,109,97,116,99,104,101,115,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,117,116,32,110,111,116,32,98,101,102,111,114,101,32,97,110,121,10,32,32,111,116,104,101,114,32,110,101,119,108,105,110,101,115,41,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,105,103,110,111,114,101,100,32,105,102,32,111,112,116,105,111,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,32,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,44,32,97,110,100,32,105,116,32,99,97,110,110,111,116,32,98,101,32,115,101,116,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,100,111,116,97,108,108,96,42,42,32,45,32,65,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,116,104,111,115,101,10,32,32,105,110,100,105,99,97,116,105,110,103,32,110,101,119,108,105,110,101,46,32,87,105,116,104,111,117,116,32,105,116,44,32,97,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,10,32,32,105,115,32,97,116,32,97,32,110,101,119,108,105,110,101,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,115,96,32,97,110,100,32,105,116,32,99,97,110,32,98,101,10,32,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,115,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,65,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,44,32,115,117,99,104,32,97,115,10,32,32,96,91,94,97,93,96,44,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,101,120,116,101,110,100,101,100,96,42,42,32,45,32,73,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,101,116,44,32,109,111,115,116,32,119,104,105,116,101,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,10,32,32,112,97,116,116,101,114,110,32,97,114,101,32,116,111,116,97,108,108,121,32,105,103,110,111,114,101,100,32,101,120,99,101,112,116,32,119,104,101,110,32,101,115,99,97,112,101,100,32,111,114,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,32,32,72,111,119,101,118,101,114,44,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,96,40,63,62,96,32,116,104,97,116,10,32,32,105,110,116,114,111,100,117,99,101,32,118,97,114,105,111,117,115,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,110,111,114,32,119,105,116,104,105,110,32,97,32,110,117,109,101,114,105,99,97,108,32,113,117,97,110,116,105,102,105,101,114,10,32,32,115,117,99,104,32,97,115,32,96,123,49,44,51,125,96,46,32,72,111,119,101,118,101,114,44,32,105,103,110,111,114,97,98,108,101,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,98,101,116,119,101,101,110,32,97,110,32,105,116,101,109,10,32,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,98,101,116,119,101,101,110,32,97,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,43,32,116,104,97,116,10,32,32,105,110,100,105,99,97,116,101,115,32,112,111,115,115,101,115,115,105,118,101,110,101,115,115,46,10,10,32,32,87,104,105,116,101,32,115,112,97,99,101,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,98,101,99,97,117,115,101,32,80,101,114,108,10,32,32,100,105,100,32,110,111,116,32,116,114,101,97,116,32,116,104,105,115,32,99,104,97,114,97,99,116,101,114,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,10,32,32,53,46,49,56,44,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,44,32,97,110,100,32,86,84,32,105,115,32,110,111,119,32,116,114,101,97,116,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,10,10,32,32,84,104,105,115,32,97,108,115,111,32,99,97,117,115,101,115,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,32,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,44,32,105,110,99,108,117,115,105,118,101,44,32,116,111,32,98,101,32,105,103,110,111,114,101,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,39,115,10,32,32,96,47,120,96,32,111,112,116,105,111,110,44,32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,120,41,96,32,111,112,116,105,111,110,10,32,32,115,101,116,116,105,110,103,46,10,10,32,32,87,105,116,104,32,116,104,105,115,32,111,112,116,105,111,110,44,32,99,111,109,109,101,110,116,115,32,105,110,115,105,100,101,32,99,111,109,112,108,105,99,97,116,101,100,32,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,46,10,32,32,72,111,119,101,118,101,114,44,32,110,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,115,46,32,87,104,105,116,101,115,112,97,99,101,10,32,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,110,101,118,101,114,32,97,112,112,101,97,114,32,119,105,116,104,105,110,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,10,32,32,102,111,114,32,101,120,97,109,112,108,101,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,32,96,40,63,40,96,32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,102,105,114,115,116,108,105,110,101,96,42,42,32,45,32,65,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,111,114,32,97,116,32,116,104,101,10,32,32,102,105,114,115,116,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,109,97,116,99,104,101,100,32,116,101,120,116,32,99,97,110,32,99,111,110,116,105,110,117,101,10,32,32,111,118,101,114,32,116,104,101,32,110,101,119,108,105,110,101,46,10,10,45,32,42,42,96,109,117,108,116,105,108,105,110,101,96,42,42,32,45,32,66,121,32,100,101,102,97,117,108,116,44,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,115,32,99,111,110,115,105,115,116,105,110,103,32,111,102,10,32,32,97,32,115,105,110,103,108,101,32,108,105,110,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,110,101,119,108,105,110,101,115,41,46,32,84,104,101,32,34,115,116,97,114,116,32,111,102,10,32,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40,96,94,96,41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,119,104,105,108,101,32,116,104,101,10,32,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40,96,36,96,41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,111,114,10,32,32,98,101,102,111,114,101,32,97,32,116,101,114,109,105,110,97,116,105,110,103,32,110,101,119,108,105,110,101,32,40,117,110,108,101,115,115,32,111,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,105,115,32,115,112,101,99,105,102,105,101,100,41,46,10,32,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,10,10,32,32,87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,97,110,100,32,34,101,110,100,32,111,102,32,108,105,110,101,34,10,32,32,99,111,110,115,116,114,117,99,116,115,32,109,97,116,99,104,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,10,32,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,97,115,32,119,101,108,108,32,97,115,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,46,10,32,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,109,96,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,10,32,32,97,32,96,40,63,109,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,110,101,119,108,105,110,101,115,32,105,110,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,110,111,10,32,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,96,94,96,32,111,114,32,96,36,96,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,115,101,116,116,105,110,103,32,96,109,117,108,116,105,108,105,110,101,96,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,10,10,45,32,42,42,96,110,111,95,97,117,116,111,95,99,97,112,116,117,114,101,96,42,42,32,45,32,68,105,115,97,98,108,101,115,32,116,104,101,32,117,115,101,32,111,102,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,10,32,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,96,63,96,32,98,101,104,97,118,101,115,32,97,115,32,105,102,10,32,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,96,63,58,96,46,32,78,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,97,112,116,117,114,105,110,103,32,40,97,110,100,10,32,32,116,104,101,121,32,97,99,113,117,105,114,101,32,110,117,109,98,101,114,115,32,105,110,32,116,104,101,32,117,115,117,97,108,32,119,97,121,41,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,46,10,10,45,32,42,42,96,100,117,112,110,97,109,101,115,96,42,42,32,45,32,78,97,109,101,115,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,110,101,101,100,32,110,111,116,32,98,101,10,32,32,117,110,105,113,117,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,102,111,114,32,99,101,114,116,97,105,110,32,116,121,112,101,115,32,111,102,32,112,97,116,116,101,114,110,32,119,104,101,110,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,10,32,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,101,118,101,114,32,98,101,32,109,97,116,99,104,101,100,46,32,77,111,114,101,32,100,101,116,97,105,108,115,32,111,102,10,32,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46,10,10,45,32,42,42,96,117,110,103,114,101,101,100,121,96,42,42,32,45,32,73,110,118,101,114,116,115,32,116,104,101,32,34,103,114,101,101,100,105,110,101,115,115,34,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,115,111,32,116,104,97,116,32,116,104,101,121,32,97,114,101,10,32,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,98,101,99,111,109,101,32,103,114,101,101,100,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,34,63,34,46,32,73,116,32,105,115,32,110,111,116,10,32,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,97,32,96,40,63,85,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,119,105,116,104,105,110,32,116,104,101,10,32,32,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,42,42,32,45,32,79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,10,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46,10,10,32,32,45,32,42,42,96,99,114,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,96,99,114,96,32,40,65,83,67,73,73,32,49,51,41,46,10,10,32,32,45,32,42,42,96,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,10,32,32,32,32,100,101,102,97,117,108,116,46,10,10,32,32,45,32,42,42,96,99,114,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,10,32,32,32,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46,10,10,32,32,45,32,42,42,96,97,110,121,99,114,108,102,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,32,32,45,32,42,42,96,97,110,121,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,10,32,32,32,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,10,32,32,32,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,10,10,45,32,42,42,96,98,115,114,95,97,110,121,99,114,108,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,44,10,32,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,10,10,45,32,42,42,96,98,115,114,95,117,110,105,99,111,100,101,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,10,32,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,10,10,45,32,42,42,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,42,42,32,45,32,68,105,115,97,98,108,101,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,99,97,110,32,109,97,108,102,117,110,99,116,105,111,110,32,105,102,10,32,32,34,83,112,101,99,105,97,108,32,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,65,10,32,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,119,111,117,108,100,32,98,101,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,68,69,70,65,66,67,34,32,97,103,97,105,110,115,116,32,34,40,42,67,79,77,77,73,84,41,65,66,67,34,44,32,119,104,101,114,101,10,32,32,116,104,101,32,115,116,97,114,116,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,80,67,82,69,32,119,111,117,108,100,32,115,107,105,112,32,116,104,101,32,115,117,98,106,101,99,116,32,117,112,32,116,111,32,34,65,34,32,97,110,100,32,110,101,118,101,114,10,32,32,114,101,97,108,105,122,101,32,116,104,97,116,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,115,116,114,117,99,116,105,111,110,32,105,115,32,116,111,32,104,97,118,101,32,109,97,100,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,97,105,108,46,32,84,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,114,101,108,101,118,97,110,116,32,105,102,32,121,111,117,32,117,115,101,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,44,32,97,115,32,100,105,115,99,117,115,115,101,100,32,105,110,10,32,32,115,101,99,116,105,111,110,32,91,80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,99,114,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,100,101,116,97,105,108,115,96,41,46,10,10,45,32,42,42,96,117,99,112,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,116,111,32,98,101,32,117,115,101,100,32,119,104,101,110,10,32,32,114,101,115,111,108,118,105,110,103,32,92,92,66,44,32,92,92,98,44,32,92,92,68,44,32,92,92,100,44,32,92,92,83,44,32,92,92,115,44,32,92,92,87,32,97,110,100,32,92,92,119,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,102,108,97,103,44,32,111,110,108,121,10,32,32,73,83,79,32,76,97,116,105,110,45,49,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,85,115,105,110,103,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,104,117,114,116,115,32,112,101,114,102,111,114,109,97,110,99,101,44,10,32,32,98,117,116,32,105,115,32,115,101,109,97,110,116,105,99,97,108,108,121,32,99,111,114,114,101,99,116,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,98,101,121,111,110,100,32,116,104,101,10,32,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,46,10,10,45,32,42,42,96,110,101,118,101,114,95,117,116,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,40,42,85,84,70,41,32,97,110,100,47,111,114,32,40,42,85,84,70,56,41,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,10,32,32,105,116,101,109,115,34,32,97,114,101,32,102,111,114,98,105,100,100,101,110,46,32,84,104,105,115,32,102,108,97,103,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,46,10,32,32,85,115,101,102,117,108,32,105,102,32,73,83,79,32,76,97,116,105,110,45,49,32,112,97,116,116,101,114,110,115,32,102,114,111,109,32,97,110,32,101,120,116,101,114,110,97,108,32,115,111,117,114,99,101,32,97,114,101,32,116,111,32,98,101,32,99,111,109,112,105,108,101,100,46>>},#{specification => [{attribute,{229,2},spec,{{compile,2},[{type,{229,14},bounded_fun,[{type,{229,14},'fun',[{type,{229,14},product,[{var,{229,15},'Regexp'},{var,{229,23},'Options'}]},{type,{229,35},union,[{type,{229,35},tuple,[{atom,{229,36},ok},{var,{229,40},'MP'}]},{type,{229,46},tuple,[{atom,{229,47},error},{var,{229,54},'ErrSpec'}]}]}]},[{type,{230,7},constraint,[{atom,{230,7},is_subtype},[{var,{230,7},'Regexp'},{type,{230,17},union,[{type,{230,17},iodata,[]},{remote_type,{230,28},[{atom,{230,28},unicode},{atom,{230,36},charlist},[]]}]}]]},{type,{231,7},constraint,[{atom,{231,7},is_subtype},[{var,{231,7},'Options'},{type,{231,18},list,[{var,{231,19},'Option'}]}]]},{type,{232,7},constraint,[{atom,{232,7},is_subtype},[{var,{232,7},'Option'},{user_type,{232,17},compile_option,[]}]]},{type,{233,7},constraint,[{atom,{233,7},is_subtype},[{var,{233,7},'MP'},{user_type,{233,13},mp,[]}]]},{type,{234,7},constraint,[{atom,{234,7},is_subtype},[{var,{234,7},'ErrSpec'},{type,{234,18},tuple,[{ann_type,{234,19},[{var,{234,19},'ErrString'},{type,{234,32},string,[]}]},{ann_type,{234,42},[{var,{234,42},'Position'},{type,{234,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,compile,1},{80,2},[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,41>>],#{<<101,110>> => <<84,104,101,32,115,97,109,101,32,97,115,32,91,96,99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,91,93,41,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41>>},#{specification => [{attribute,{81,2},spec,{{compile,1},[{type,{81,14},bounded_fun,[{type,{81,14},'fun',[{type,{81,14},product,[{var,{81,15},'Regexp'}]},{type,{81,26},union,[{type,{81,26},tuple,[{atom,{81,27},ok},{var,{81,31},'MP'}]},{type,{81,37},tuple,[{atom,{81,38},error},{var,{81,45},'ErrSpec'}]}]}]},[{type,{82,7},constraint,[{atom,{82,7},is_subtype},[{var,{82,7},'Regexp'},{type,{82,17},iodata,[]}]]},{type,{83,7},constraint,[{atom,{83,7},is_subtype},[{var,{83,7},'MP'},{user_type,{83,13},mp,[]}]]},{type,{84,7},constraint,[{atom,{84,7},is_subtype},[{var,{84,7},'ErrSpec'},{type,{84,18},tuple,[{ann_type,{84,19},[{var,{84,19},'ErrString'},{type,{84,32},string,[]}]},{ann_type,{84,42},[{var,{84,42},'Position'},{type,{84,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,version,0},{66,2},[<<118,101,114,115,105,111,110,40,41>>],#{<<101,110>> => <<84,104,101,32,114,101,116,117,114,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,121,115,116,101,109,32,116,104,97,116,10,119,97,115,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,99,111,109,112,105,108,97,116,105,111,110,46>>},#{specification => [{attribute,{71,2},spec,{{version,0},[{type,{71,14},'fun',[{type,{71,14},product,[]},{type,{71,20},binary,[]}]}]}}],since => <<79,84,80,32,50,48,46,48>>}}]}. \ No newline at end of file +{docs_v1,[{file,[46,46,47,100,111,99,47,115,114,99,47,114,101,46,109,100]},{location,{1,1}}],erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,#{<<101,110>> => <<84,104,105,115,32,109,111,100,117,108,101,32,99,111,110,116,97,105,110,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,102,111,114,32,115,116,114,105,110,103,115,32,97,110,100,10,98,105,110,97,114,105,101,115,46,10,10,84,104,101,32,91,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,101,114,108,45,108,105,107,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,115,121,110,116,97,120,96,41,32,115,121,110,116,97,120,32,97,110,100,10,115,101,109,97,110,116,105,99,115,32,114,101,115,101,109,98,108,101,32,116,104,97,116,32,111,102,32,80,101,114,108,46,10,10,84,104,101,32,109,97,116,99,104,105,110,103,32,97,108,103,111,114,105,116,104,109,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,97,114,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,44,32,98,117,116,32,110,111,116,10,97,108,108,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,115,32,105,110,116,101,114,102,97,99,101,100,32,97,110,100,32,115,111,109,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,103,111,32,98,101,121,111,110,100,10,119,104,97,116,32,80,67,82,69,32,111,102,102,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,80,67,82,69,32,118,101,114,115,105,111,110,32,56,46,52,48,32,40,114,101,108,101,97,115,101,32,100,97,116,101,32,50,48,49,55,45,48,49,45,49,49,41,32,105,115,32,117,115,101,100,46,10,84,104,101,32,115,101,99,116,105,111,110,115,32,111,102,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,97,114,101,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,10,105,110,99,108,117,100,101,100,32,104,101,114,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,69,114,108,97,110,103,32,108,105,116,101,114,97,108,32,115,121,110,116,97,120,32,102,111,114,32,115,116,114,105,110,103,115,32,117,115,101,115,32,116,104,101,32,96,92,92,96,32,40,98,97,99,107,115,108,97,115,104,41,32,99,104,97,114,97,99,116,101,114,32,97,115,10,62,32,97,110,32,101,115,99,97,112,101,32,99,111,100,101,46,32,89,111,117,32,110,101,101,100,32,116,111,32,101,115,99,97,112,101,32,98,97,99,107,115,108,97,115,104,101,115,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,98,111,116,104,32,105,110,10,62,32,121,111,117,114,32,99,111,100,101,32,97,110,100,32,105,110,32,116,104,101,32,115,104,101,108,108,44,32,119,105,116,104,32,97,110,32,101,120,116,114,97,32,98,97,99,107,115,108,97,115,104,44,32,116,104,97,116,32,105,115,44,32,96,34,92,92,92,92,34,96,32,111,114,10,62,32,96,60,60,34,92,92,92,92,34,62,62,96,46,10,62,10,62,32,83,105,110,99,101,32,69,114,108,97,110,103,47,79,84,80,32,50,55,32,121,111,117,32,99,97,110,32,117,115,101,32,91,118,101,114,98,97,116,105,109,32,115,105,103,105,108,115,93,40,96,101,58,115,121,115,116,101,109,58,100,97,116,97,95,116,121,112,101,115,46,109,100,35,115,105,103,105,108,96,41,10,62,32,116,111,32,119,114,105,116,101,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,46,32,84,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,32,119,111,117,108,100,32,98,101,32,119,114,105,116,116,101,110,32,97,115,32,96,126,83,34,92,34,96,32,111,114,32,96,126,66,34,92,34,96,46,10,10,35,35,32,80,101,114,108,45,76,105,107,101,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,83,121,110,116,97,120,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,99,111,110,116,97,105,110,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,102,111,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,10,117,115,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,119,105,116,104,10,99,104,97,110,103,101,115,32,119,104,101,114,101,32,116,104,105,115,32,109,111,100,117,108,101,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,46,10,10,35,35,32,80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,10,10,84,104,101,32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,32,97,114,101,10,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,46,32,80,101,114,108,39,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,10,100,101,115,99,114,105,98,101,100,32,105,110,32,105,116,115,32,111,119,110,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,101,110,101,114,97,108,32,97,114,101,10,99,111,118,101,114,101,100,32,105,110,32,109,97,110,121,32,98,111,111,107,115,44,32,115,111,109,101,32,119,105,116,104,32,99,111,112,105,111,117,115,32,101,120,97,109,112,108,101,115,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,34,77,97,115,116,101,114,105,110,103,10,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,115,34,44,32,112,117,98,108,105,115,104,101,100,32,98,121,32,79,39,82,101,105,108,108,121,44,32,99,111,118,101,114,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,114,101,97,116,10,100,101,116,97,105,108,46,32,84,104,105,115,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,80,67,82,69,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,105,110,116,101,110,100,101,100,32,97,115,10,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,46,10,10,84,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,58,10,10,45,32,91,83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115,93,40,96,109,58,114,101,35,115,101,99,116,49,96,41,10,45,32,91,67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,50,96,41,10,45,32,91,66,97,99,107,115,108,97,115,104,93,40,96,109,58,114,101,35,115,101,99,116,51,96,41,10,45,32,91,67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114,93,40,96,109,58,114,101,35,115,101,99,116,52,96,41,10,45,32,91,70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,92,78,93,40,96,109,58,114,101,35,115,101,99,116,53,96,41,10,45,32,91,77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116,93,40,96,109,58,114,101,35,115,101,99,116,54,96,41,10,45,32,91,83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,93,40,96,109,58,114,101,35,115,101,99,116,55,96,41,10,45,32,91,80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,93,40,96,109,58,114,101,35,115,101,99,116,56,96,41,10,45,32,91,86,101,114,116,105,99,97,108,32,66,97,114,93,40,96,109,58,114,101,35,115,101,99,116,57,96,41,10,45,32,91,73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103,93,40,96,109,58,114,101,35,115,101,99,116,49,48,96,41,10,45,32,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,10,45,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,10,45,32,91,78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,51,96,41,10,45,32,91,82,101,112,101,116,105,116,105,111,110,93,40,96,109,58,114,101,35,115,101,99,116,49,52,96,41,10,45,32,91,65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,53,96,41,10,45,32,91,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,93,40,96,109,58,114,101,35,115,101,99,116,49,54,96,41,10,45,32,91,65,115,115,101,114,116,105,111,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,55,96,41,10,45,32,91,67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,56,96,41,10,45,32,91,67,111,109,109,101,110,116,115,93,40,96,109,58,114,101,35,115,101,99,116,49,57,96,41,10,45,32,91,82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,50,48,96,41,10,45,32,91,83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,93,40,96,109,58,114,101,35,115,101,99,116,50,49,96,41,10,45,32,91,79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120,93,40,96,109,58,114,101,35,115,101,99,116,50,50,96,41,10,45,32,91,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,93,40,96,109,58,114,101,35,115,101,99,116,50,51,96,41,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,32,125,10,10,35,35,32,83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115,10,10,83,111,109,101,32,111,112,116,105,111,110,115,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,96,99,111,109,112,105,108,101,47,50,96,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,115,112,101,99,105,97,108,32,105,116,101,109,115,10,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,98,117,116,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,10,109,97,107,101,32,116,104,101,115,101,32,111,112,116,105,111,110,115,32,97,99,99,101,115,115,105,98,108,101,32,116,111,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,115,32,119,104,111,32,97,114,101,32,110,111,116,32,97,98,108,101,32,116,111,32,99,104,97,110,103,101,32,116,104,101,10,112,114,111,103,114,97,109,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,99,97,110,32,97,112,112,101,97,114,44,32,98,117,116,10,116,104,101,121,32,109,117,115,116,32,97,108,108,32,98,101,32,116,111,103,101,116,104,101,114,32,114,105,103,104,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,10,108,101,116,116,101,114,115,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46,10,10,95,85,84,70,32,83,117,112,112,111,114,116,95,10,10,85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,115,32,98,97,115,105,99,97,108,108,121,32,85,84,70,45,56,32,98,97,115,101,100,46,32,84,111,32,117,115,101,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,44,32,121,111,117,32,101,105,116,104,101,114,10,99,97,108,108,32,96,99,111,109,112,105,108,101,47,50,96,32,111,114,32,96,114,117,110,47,51,96,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,44,32,111,114,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,115,116,97,114,116,10,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,58,10,10,96,96,96,116,101,120,116,10,40,42,85,84,70,56,41,10,40,42,85,84,70,41,10,96,96,96,10,10,66,111,116,104,32,111,112,116,105,111,110,115,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,44,32,116,104,101,32,105,110,112,117,116,32,115,116,114,105,110,103,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,85,84,70,45,56,46,10,78,111,116,105,99,101,32,116,104,97,116,32,119,105,116,104,32,116,104,101,115,101,32,105,110,115,116,114,117,99,116,105,111,110,115,44,32,116,104,101,32,97,117,116,111,109,97,116,105,99,32,99,111,110,118,101,114,115,105,111,110,32,111,102,32,108,105,115,116,115,32,116,111,32,85,84,70,45,56,10,105,115,32,110,111,116,32,112,101,114,102,111,114,109,101,100,32,98,121,32,116,104,101,32,96,114,101,96,32,102,117,110,99,116,105,111,110,115,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,10,114,101,99,111,109,109,101,110,100,101,100,46,32,65,100,100,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,119,104,101,110,32,114,117,110,110,105,110,103,32,96,99,111,109,112,105,108,101,47,50,96,32,105,110,115,116,101,97,100,46,10,10,83,111,109,101,32,97,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,108,108,111,119,32,116,104,101,105,114,32,117,115,101,114,115,32,116,111,32,115,117,112,112,108,121,32,112,97,116,116,101,114,110,115,32,99,97,110,32,119,105,115,104,32,116,111,32,114,101,115,116,114,105,99,116,10,116,104,101,109,32,116,111,32,110,111,110,45,85,84,70,32,100,97,116,97,32,102,111,114,32,115,101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,46,32,73,102,32,111,112,116,105,111,110,32,96,110,101,118,101,114,95,117,116,102,96,32,105,115,32,115,101,116,32,97,116,10,99,111,109,112,105,108,101,32,116,105,109,101,44,32,40,92,42,85,84,70,41,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,44,32,97,110,100,32,116,104,101,105,114,32,97,112,112,101,97,114,97,110,99,101,32,99,97,117,115,101,115,10,97,110,32,101,114,114,111,114,46,10,10,95,85,110,105,99,111,100,101,32,80,114,111,112,101,114,116,121,32,83,117,112,112,111,114,116,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,97,110,111,116,104,101,114,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,116,104,97,116,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,10,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,42,85,67,80,41,10,96,96,96,10,10,84,104,105,115,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,58,32,105,116,32,99,97,117,115,101,115,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,10,96,92,100,96,32,97,110,100,32,96,92,119,96,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,105,110,115,116,101,97,100,32,111,102,10,114,101,99,111,103,110,105,122,105,110,103,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,115,32,60,32,50,53,54,32,116,104,114,111,117,103,104,32,97,32,108,111,111,107,117,112,32,116,97,98,108,101,46,10,10,95,68,105,115,97,98,108,105,110,103,32,83,116,97,114,116,117,112,32,79,112,116,105,109,105,122,97,116,105,111,110,115,95,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,96,40,42,78,79,95,83,84,65,82,84,95,79,80,84,41,96,44,32,105,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,10,111,112,116,105,111,110,32,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,10,10,95,78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115,95,10,10,91,93,40,41,123,58,32,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115,32,125,10,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,105,118,101,32,99,111,110,118,101,110,116,105,111,110,115,32,102,111,114,32,105,110,100,105,99,97,116,105,110,103,32,108,105,110,101,32,98,114,101,97,107,115,32,105,110,32,115,116,114,105,110,103,115,58,32,97,32,115,105,110,103,108,101,10,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,41,32,99,104,97,114,97,99,116,101,114,44,32,97,32,115,105,110,103,108,101,32,76,70,32,40,108,105,110,101,32,102,101,101,100,41,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,10,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,97,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,44,32,97,110,100,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,10,115,101,113,117,101,110,99,101,46,10,10,65,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,10,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,118,101,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,40,92,42,67,82,41,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,10,10,45,32,42,42,40,92,42,76,70,41,42,42,32,45,32,76,105,110,101,32,102,101,101,100,10,10,45,32,42,42,40,92,42,67,82,76,70,41,42,42,32,45,32,62,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,102,111,108,108,111,119,101,100,32,98,121,32,108,105,110,101,32,102,101,101,100,10,10,45,32,42,42,40,92,42,65,78,89,67,82,76,70,41,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,97,98,111,118,101,10,10,45,32,42,42,40,92,42,65,78,89,41,42,42,32,45,32,65,108,108,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,10,10,84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,96,99,111,109,112,105,108,101,47,50,96,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,99,104,97,110,103,101,115,32,116,104,101,32,99,111,110,118,101,110,116,105,111,110,32,116,111,32,67,82,58,10,10,96,96,96,116,101,120,116,10,40,42,67,82,41,97,46,98,10,96,96,96,10,10,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,96,97,92,110,98,96,44,32,97,115,32,76,70,32,105,115,32,110,111,32,108,111,110,103,101,114,32,97,32,110,101,119,108,105,110,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,10,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,10,10,84,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,97,102,102,101,99,116,115,32,119,104,101,114,101,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,10,116,114,117,101,46,32,73,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,116,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32,96,100,111,116,97,108,108,96,10,105,115,32,110,111,116,32,115,101,116,44,32,97,110,100,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,96,92,78,96,46,32,72,111,119,101,118,101,114,44,32,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,119,104,97,116,32,116,104,101,32,96,92,82,96,10,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,109,97,116,99,104,101,115,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,105,115,32,105,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,102,111,114,10,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,59,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,96,92,82,96,32,105,110,10,115,101,99,116,105,111,110,32,91,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,96,41,46,32,65,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,96,92,82,96,10,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,46,10,10,95,83,101,116,116,105,110,103,32,77,97,116,99,104,32,97,110,100,32,82,101,99,117,114,115,105,111,110,32,76,105,109,105,116,115,95,10,10,84,104,101,32,99,97,108,108,101,114,32,111,102,32,96,114,117,110,47,51,96,32,99,97,110,32,115,101,116,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,10,109,97,116,99,104,40,41,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,110,100,32,111,110,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,46,32,84,104,101,115,101,10,102,97,99,105,108,105,116,105,101,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,99,97,116,99,104,32,114,117,110,97,119,97,121,32,109,97,116,99,104,101,115,32,116,104,97,116,32,97,114,101,32,112,114,111,118,111,107,101,100,32,98,121,32,112,97,116,116,101,114,110,115,10,119,105,116,104,32,104,117,103,101,32,109,97,116,99,104,105,110,103,32,116,114,101,101,115,32,40,97,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,10,114,101,112,101,97,116,115,41,32,97,110,100,32,116,111,32,97,118,111,105,100,32,114,117,110,110,105,110,103,32,111,117,116,32,111,102,32,115,121,115,116,101,109,32,115,116,97,99,107,32,98,121,32,116,111,111,32,109,117,99,104,32,114,101,99,117,114,115,105,111,110,46,32,87,104,101,110,10,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,32,105,115,32,114,101,97,99,104,101,100,44,32,96,112,99,114,101,95,101,120,101,99,40,41,96,32,103,105,118,101,115,32,97,110,32,101,114,114,111,114,32,114,101,116,117,114,110,46,32,84,104,101,32,108,105,109,105,116,115,10,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58,10,10,96,96,96,116,101,120,116,10,40,42,76,73,77,73,84,95,77,65,84,67,72,61,100,41,10,40,42,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,61,100,41,10,96,96,96,10,10,72,101,114,101,32,100,32,105,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,109,117,115,116,10,98,101,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,102,111,114,32,105,116,32,116,111,32,104,97,118,101,10,97,110,121,32,101,102,102,101,99,116,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,32,99,97,110,32,108,111,119,101,114,32,116,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,116,104,101,10,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,110,111,116,32,114,97,105,115,101,32,105,116,46,32,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,101,116,116,105,110,103,32,111,102,32,111,110,101,32,111,102,32,116,104,101,115,101,10,108,105,109,105,116,115,44,32,116,104,101,32,108,111,119,101,114,32,118,97,108,117,101,32,105,115,32,117,115,101,100,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,98,111,116,104,32,116,104,101,32,108,105,109,105,116,115,32,105,115,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,32,78,111,116,105,99,101,10,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,108,105,109,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,115,116,97,99,107,32,100,101,112,116,104,32,111,102,32,116,104,101,32,86,77,44,32,97,115,32,80,67,82,69,32,102,111,114,10,69,114,108,97,110,103,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,32,115,117,99,104,32,97,32,119,97,121,32,116,104,97,116,32,116,104,101,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,100,111,101,115,32,114,101,99,117,114,115,105,111,110,32,111,110,10,116,104,101,32,67,32,115,116,97,99,107,46,10,10,78,111,116,101,32,116,104,97,116,32,96,76,73,77,73,84,95,77,65,84,67,72,96,32,97,110,100,32,96,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,96,32,99,97,110,32,111,110,108,121,32,114,101,100,117,99,101,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,10,108,105,109,105,116,115,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,44,32,110,111,116,32,105,110,99,114,101,97,115,101,32,116,104,101,109,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,32,125,10,10,35,35,32,67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115,10,10,65,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,102,114,111,109,10,108,101,102,116,32,116,111,32,114,105,103,104,116,46,32,77,111,115,116,32,99,104,97,114,97,99,116,101,114,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,32,97,110,100,32,109,97,116,99,104,32,116,104,101,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,115,32,97,32,116,114,105,118,105,97,108,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,99,97,108,32,116,111,32,105,116,115,101,108,102,58,10,10,96,96,96,116,101,120,116,10,84,104,101,32,113,117,105,99,107,32,98,114,111,119,110,32,102,111,120,10,96,96,96,10,10,87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,40,111,112,116,105,111,110,32,96,99,97,115,101,108,101,115,115,96,41,44,32,108,101,116,116,101,114,115,32,97,114,101,32,109,97,116,99,104,101,100,10,105,110,100,101,112,101,110,100,101,110,116,108,121,32,111,102,32,99,97,115,101,46,10,10,84,104,101,32,112,111,119,101,114,32,111,102,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,97,98,105,108,105,116,121,32,116,111,32,105,110,99,108,117,100,101,32,97,108,116,101,114,110,97,116,105,118,101,115,10,97,110,100,32,114,101,112,101,116,105,116,105,111,110,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,116,104,101,32,117,115,101,32,111,102,10,95,109,101,116,97,99,104,97,114,97,99,116,101,114,115,95,44,32,119,104,105,99,104,32,100,111,32,110,111,116,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,98,117,116,32,105,110,115,116,101,97,100,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,10,105,110,32,115,111,109,101,32,115,112,101,99,105,97,108,32,119,97,121,46,10,10,84,119,111,32,115,101,116,115,32,111,102,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,101,120,105,115,116,58,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,97,110,121,119,104,101,114,101,32,105,110,32,116,104,101,10,112,97,116,116,101,114,110,32,101,120,99,101,112,116,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,119,105,116,104,105,110,10,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,79,117,116,115,105,100,101,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,116,104,101,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,92,96,42,42,32,45,32,71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,109,97,110,121,32,117,115,101,115,10,10,45,32,42,42,96,94,96,42,42,32,45,32,65,115,115,101,114,116,32,115,116,97,114,116,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,10,10,45,32,42,42,96,36,96,42,42,32,45,32,65,115,115,101,114,116,32,101,110,100,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,10,10,45,32,42,42,96,46,96,42,42,32,45,32,77,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,110,101,119,108,105,110,101,32,40,98,121,32,100,101,102,97,117,108,116,41,10,10,45,32,42,42,96,91,96,42,42,32,45,32,83,116,97,114,116,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,10,10,45,32,42,42,96,124,96,42,42,32,45,32,83,116,97,114,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,10,10,45,32,42,42,96,40,96,42,42,32,45,32,83,116,97,114,116,32,115,117,98,112,97,116,116,101,114,110,10,10,45,32,42,42,96,41,96,42,42,32,45,32,69,110,100,32,115,117,98,112,97,116,116,101,114,110,10,10,45,32,42,42,96,63,96,42,42,32,45,32,69,120,116,101,110,100,115,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,40,44,32,97,108,115,111,32,48,32,111,114,32,49,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,113,117,97,110,116,105,102,105,101,114,10,32,32,109,105,110,105,109,105,122,101,114,10,10,45,32,42,42,96,42,96,42,42,32,45,32,48,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,115,10,10,45,32,42,42,96,43,96,42,42,32,45,32,49,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34,10,10,45,32,42,42,96,123,96,42,42,32,45,32,83,116,97,114,116,32,109,105,110,47,109,97,120,32,113,117,97,110,116,105,102,105,101,114,10,10,80,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,32,105,115,32,99,97,108,108,101,100,32,97,32,34,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,34,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,111,110,108,121,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,58,10,10,45,32,42,42,96,92,96,42,42,32,45,32,71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,94,96,42,42,32,45,32,78,101,103,97,116,101,32,116,104,101,32,99,108,97,115,115,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,45,96,42,42,32,45,32,73,110,100,105,99,97,116,101,115,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101,10,10,45,32,42,42,96,91,96,42,42,32,45,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,111,110,108,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,80,111,115,105,120,32,115,121,110,116,97,120,41,10,10,45,32,42,42,96,93,96,42,42,32,45,32,84,101,114,109,105,110,97,116,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,117,115,101,32,111,102,32,101,97,99,104,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,51,32,125,10,10,35,35,32,66,97,99,107,115,108,97,115,104,10,10,84,104,101,32,98,97,99,107,115,108,97,115,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,109,97,110,121,32,117,115,101,115,46,32,70,105,114,115,116,44,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,99,104,97,114,97,99,116,101,114,10,116,104,97,116,32,105,115,32,110,111,116,32,97,32,110,117,109,98,101,114,32,111,114,32,97,32,108,101,116,116,101,114,44,32,105,116,32,116,97,107,101,115,32,97,119,97,121,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,10,99,104,97,114,97,99,116,101,114,32,99,97,110,32,104,97,118,101,46,32,84,104,105,115,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,108,105,101,115,32,98,111,116,104,10,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,34,92,95,34,32,99,104,97,114,97,99,116,101,114,44,32,121,111,117,32,119,114,105,116,101,32,96,92,95,96,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,10,84,104,105,115,32,101,115,99,97,112,105,110,103,32,97,99,116,105,111,110,32,97,112,112,108,105,101,115,32,105,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,32,98,101,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,109,101,116,97,99,104,97,114,97,99,116,101,114,44,32,115,111,32,105,116,32,105,115,32,97,108,119,97,121,115,32,115,97,102,101,32,116,111,32,112,114,101,99,101,100,101,32,97,10,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,119,105,116,104,32,98,97,99,107,115,108,97,115,104,32,116,111,32,115,112,101,99,105,102,121,32,116,104,97,116,32,105,116,32,115,116,97,110,100,115,32,102,111,114,32,105,116,115,101,108,102,46,32,73,110,10,112,97,114,116,105,99,117,108,97,114,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,119,114,105,116,101,32,96,92,92,96,46,10,10,73,110,32,96,117,110,105,99,111,100,101,96,32,109,111,100,101,44,32,111,110,108,121,32,65,83,67,73,73,32,110,117,109,98,101,114,115,32,97,110,100,32,108,101,116,116,101,114,115,32,104,97,118,101,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,97,102,116,101,114,10,97,32,98,97,99,107,115,108,97,115,104,46,32,65,108,108,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,111,115,101,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,10,97,114,101,32,62,32,49,50,55,41,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,108,105,116,101,114,97,108,115,46,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,44,32,119,104,105,116,101,115,112,97,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,40,111,116,104,101,114,32,116,104,97,110,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,41,32,97,110,100,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,10,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,97,114,101,32,105,103,110,111,114,101,100,46,32,65,110,32,101,115,99,97,112,105,110,103,32,98,97,99,107,115,108,97,115,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,10,105,110,99,108,117,100,101,32,97,32,119,104,105,116,101,115,112,97,99,101,32,111,114,32,35,32,99,104,97,114,97,99,116,101,114,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,10,10,84,111,32,114,101,109,111,118,101,32,116,104,101,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,102,114,111,109,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,112,117,116,32,116,104,101,109,32,98,101,116,119,101,101,110,10,96,92,81,96,32,97,110,100,32,96,92,69,96,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,104,97,116,32,96,36,96,32,97,110,100,32,96,64,96,32,97,114,101,32,104,97,110,100,108,101,100,32,97,115,32,108,105,116,101,114,97,108,115,10,105,110,32,96,92,81,96,46,46,46,96,92,69,96,32,115,101,113,117,101,110,99,101,115,32,105,110,32,80,67,82,69,44,32,119,104,105,108,101,32,96,36,96,32,97,110,100,32,96,64,96,32,99,97,117,115,101,32,118,97,114,105,97,98,108,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,105,110,10,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58,10,10,96,96,96,116,101,120,116,10,80,97,116,116,101,114,110,32,32,32,32,32,32,32,32,32,32,32,32,80,67,82,69,32,109,97,116,99,104,101,115,32,32,32,80,101,114,108,32,109,97,116,99,104,101,115,10,10,92,81,97,98,99,36,120,121,122,92,69,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,36,120,121,122,10,92,81,97,98,99,92,36,120,121,122,92,69,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,10,92,81,97,98,99,92,69,92,36,92,81,120,121,122,92,69,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,10,96,96,96,10,10,84,104,101,32,96,92,81,96,46,46,46,96,92,69,96,32,115,101,113,117,101,110,99,101,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,10,65,110,32,105,115,111,108,97,116,101,100,32,96,92,69,96,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,96,92,81,96,32,105,115,32,105,103,110,111,114,101,100,46,32,73,102,32,96,92,81,96,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,10,98,121,32,96,92,69,96,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,116,104,101,32,108,105,116,101,114,97,108,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,99,111,110,116,105,110,117,101,115,32,116,111,32,116,104,101,32,101,110,100,32,111,102,10,116,104,101,32,112,97,116,116,101,114,110,32,40,116,104,97,116,32,105,115,44,32,96,92,69,96,32,105,115,32,97,115,115,117,109,101,100,32,97,116,32,116,104,101,32,101,110,100,41,46,32,73,102,32,116,104,101,32,105,115,111,108,97,116,101,100,32,96,92,81,96,32,105,115,32,105,110,115,105,100,101,10,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,105,115,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,44,32,97,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,110,111,116,10,116,101,114,109,105,110,97,116,101,100,46,10,10,95,78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115,95,10,10,91,93,40,41,123,58,32,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115,32,125,10,10,65,32,115,101,99,111,110,100,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,112,114,111,118,105,100,101,115,32,97,32,119,97,121,32,111,102,32,101,110,99,111,100,105,110,103,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,10,112,97,116,116,101,114,110,115,32,105,110,32,97,32,118,105,115,105,98,108,101,32,109,97,110,110,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,114,101,115,116,114,105,99,116,105,111,110,32,111,110,32,116,104,101,32,97,112,112,101,97,114,97,110,99,101,32,111,102,10,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,97,112,97,114,116,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,32,122,101,114,111,32,116,104,97,116,32,116,101,114,109,105,110,97,116,101,115,32,97,32,112,97,116,116,101,114,110,46,10,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,112,97,114,101,100,32,98,121,32,116,101,120,116,32,101,100,105,116,105,110,103,44,32,105,116,32,105,115,32,111,102,116,101,110,32,101,97,115,105,101,114,32,116,111,32,117,115,101,32,111,110,101,32,111,102,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,110,32,116,104,101,32,98,105,110,97,114,121,32,99,104,97,114,97,99,116,101,114,32,105,116,32,114,101,112,114,101,115,101,110,116,115,58,10,10,45,32,42,42,96,92,97,96,42,42,32,45,32,65,108,97,114,109,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,66,69,76,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,55,41,10,10,45,32,42,42,96,92,99,120,96,42,42,32,45,32,34,67,111,110,116,114,111,108,45,120,34,44,32,119,104,101,114,101,32,120,32,105,115,32,97,110,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,101,96,42,42,32,45,32,69,115,99,97,112,101,32,40,104,101,120,32,49,66,41,10,10,45,32,42,42,96,92,102,96,42,42,32,45,32,70,111,114,109,32,102,101,101,100,32,40,104,101,120,32,48,67,41,10,10,45,32,42,42,96,92,110,96,42,42,32,45,32,76,105,110,101,32,102,101,101,100,32,40,104,101,120,32,48,65,41,10,10,45,32,42,42,96,92,114,96,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,104,101,120,32,48,68,41,10,10,45,32,42,42,96,92,116,96,42,42,32,45,32,84,97,98,32,40,104,101,120,32,48,57,41,10,10,45,32,42,42,96,92,48,100,100,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,48,100,100,10,10,45,32,42,42,96,92,100,100,100,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,44,32,111,114,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,10,45,32,42,42,96,92,111,123,100,100,100,46,46,125,96,42,42,32,45,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,46,46,10,10,45,32,42,42,96,92,120,104,104,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,10,10,45,32,42,42,96,92,120,123,104,104,104,46,46,125,96,42,42,32,45,32,67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,104,46,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,116,101,32,116,104,97,116,32,96,92,48,100,100,96,32,105,115,32,97,108,119,97,121,115,32,97,110,32,111,99,116,97,108,32,99,111,100,101,44,32,97,110,100,32,116,104,97,116,32,96,92,56,96,32,97,110,100,32,96,92,57,96,32,97,114,101,32,116,104,101,32,108,105,116,101,114,97,108,10,62,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,46,10,10,84,104,101,32,112,114,101,99,105,115,101,32,101,102,102,101,99,116,32,111,102,32,96,92,99,120,96,32,111,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,32,105,115,32,97,10,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,44,32,105,116,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,117,112,112,101,114,32,99,97,115,101,46,32,84,104,101,110,32,98,105,116,32,54,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,40,104,101,120,32,52,48,41,32,105,115,32,105,110,118,101,114,116,101,100,46,32,84,104,117,115,32,96,92,99,65,96,32,116,111,32,96,92,99,90,96,32,98,101,99,111,109,101,32,104,101,120,32,48,49,32,116,111,32,104,101,120,32,49,65,32,40,65,32,105,115,32,52,49,44,32,90,32,105,115,10,53,65,41,44,32,98,117,116,32,96,92,99,123,96,32,98,101,99,111,109,101,115,32,104,101,120,32,51,66,32,40,96,123,96,32,105,115,32,55,66,41,44,32,97,110,100,32,96,92,99,96,59,32,98,101,99,111,109,101,115,32,104,101,120,32,55,66,32,40,59,32,105,115,32,51,66,41,46,32,73,102,10,116,104,101,32,100,97,116,97,32,105,116,101,109,32,40,98,121,116,101,32,111,114,32,49,54,45,98,105,116,32,118,97,108,117,101,41,32,102,111,108,108,111,119,105,110,103,32,96,92,99,96,32,104,97,115,32,97,32,118,97,108,117,101,32,62,32,49,50,55,44,32,97,10,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,84,104,105,115,32,108,111,99,107,115,32,111,117,116,32,110,111,110,45,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,108,108,32,109,111,100,101,115,46,10,10,84,104,101,32,96,92,99,96,32,102,97,99,105,108,105,116,121,32,119,97,115,32,100,101,115,105,103,110,101,100,32,102,111,114,32,117,115,101,32,119,105,116,104,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,44,32,98,117,116,32,119,105,116,104,32,116,104,101,10,101,120,116,101,110,115,105,111,110,32,116,111,32,85,110,105,99,111,100,101,32,105,116,32,105,115,32,101,118,101,110,32,108,101,115,115,32,117,115,101,102,117,108,32,116,104,97,110,32,105,116,32,111,110,99,101,32,119,97,115,46,10,10,65,102,116,101,114,32,96,92,48,96,32,117,112,32,116,111,32,116,119,111,32,102,117,114,116,104,101,114,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,102,101,119,101,114,32,116,104,97,110,32,116,119,111,10,100,105,103,105,116,115,44,32,106,117,115,116,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,112,114,101,115,101,110,116,32,97,114,101,32,117,115,101,100,46,32,84,104,117,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,96,92,48,92,120,92,48,49,53,96,10,115,112,101,99,105,102,105,101,115,32,116,119,111,32,98,105,110,97,114,121,32,122,101,114,111,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,67,82,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,118,97,108,117,101,32,49,51,41,46,32,77,97,107,101,32,115,117,114,101,10,121,111,117,32,115,117,112,112,108,121,32,116,119,111,32,100,105,103,105,116,115,32,97,102,116,101,114,32,116,104,101,32,105,110,105,116,105,97,108,32,122,101,114,111,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,10,102,111,108,108,111,119,115,32,105,115,32,105,116,115,101,108,102,32,97,110,32,111,99,116,97,108,32,100,105,103,105,116,46,10,10,84,104,101,32,101,115,99,97,112,101,32,96,92,111,96,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,111,99,116,97,108,32,100,105,103,105,116,115,44,32,101,110,99,108,111,115,101,100,32,105,110,10,98,114,97,99,101,115,46,32,65,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,105,115,32,97,32,114,101,99,101,110,116,10,97,100,100,105,116,105,111,110,32,116,111,32,80,101,114,108,59,32,105,116,32,112,114,111,118,105,100,101,115,32,119,97,121,32,111,102,32,115,112,101,99,105,102,121,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,111,100,101,32,112,111,105,110,116,115,32,97,115,32,111,99,116,97,108,10,110,117,109,98,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,55,55,55,44,32,97,110,100,32,105,116,32,97,108,115,111,32,97,108,108,111,119,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,97,110,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,10,116,111,32,98,101,32,117,110,97,109,98,105,103,117,111,117,115,108,121,32,115,112,101,99,105,102,105,101,100,46,10,10,70,111,114,32,103,114,101,97,116,101,114,32,99,108,97,114,105,116,121,32,97,110,100,32,117,110,97,109,98,105,103,117,105,116,121,44,32,105,116,32,105,115,32,98,101,115,116,32,116,111,32,97,118,111,105,100,32,102,111,108,108,111,119,105,110,103,32,96,92,96,32,98,121,32,97,32,100,105,103,105,116,10,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,96,92,111,123,125,96,32,111,114,32,96,92,120,123,125,96,32,116,111,32,115,112,101,99,105,102,121,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,115,44,10,97,110,100,32,96,92,103,123,125,96,32,116,111,32,115,112,101,99,105,102,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,114,97,103,114,97,112,104,115,32,100,101,115,99,114,105,98,101,32,116,104,101,10,111,108,100,44,32,97,109,98,105,103,117,111,117,115,32,115,121,110,116,97,120,46,10,10,84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,111,116,104,101,114,32,116,104,97,110,32,48,32,105,115,32,99,111,109,112,108,105,99,97,116,101,100,44,32,97,110,100,10,80,101,114,108,32,104,97,115,32,99,104,97,110,103,101,100,32,105,110,32,114,101,99,101,110,116,32,114,101,108,101,97,115,101,115,44,32,99,97,117,115,105,110,103,32,80,67,82,69,32,97,108,115,111,32,116,111,32,99,104,97,110,103,101,46,32,79,117,116,115,105,100,101,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,80,67,82,69,32,114,101,97,100,115,32,116,104,101,32,100,105,103,105,116,32,97,110,100,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,100,105,103,105,116,115,32,97,115,32,97,32,100,101,99,105,109,97,108,10,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,60,32,56,44,32,111,114,32,105,102,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,97,116,32,108,101,97,115,116,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,105,115,32,116,97,107,101,110,32,97,115,32,97,10,95,98,97,99,107,32,114,101,102,101,114,101,110,99,101,95,46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,104,111,119,32,116,104,105,115,32,119,111,114,107,115,32,105,115,32,112,114,111,118,105,100,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,10,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,10,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,96,92,96,32,105,115,32,62,32,55,32,97,110,100,32,116,104,101,114,101,10,104,97,118,101,32,110,111,116,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,80,67,82,69,32,104,97,110,100,108,101,115,32,96,92,56,96,32,97,110,100,32,96,92,57,96,32,97,115,32,116,104,101,10,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,44,32,97,110,100,32,111,116,104,101,114,119,105,115,101,32,114,101,45,114,101,97,100,115,32,117,112,32,116,111,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,10,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,44,32,97,110,100,32,117,115,105,110,103,32,116,104,101,109,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,46,32,65,110,121,10,115,117,98,115,101,113,117,101,110,116,32,100,105,103,105,116,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,45,32,42,42,96,92,48,52,48,96,42,42,32,45,32,65,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,110,32,65,83,67,73,73,32,115,112,97,99,101,10,10,45,32,42,42,96,92,52,48,96,42,42,32,45,32,84,104,101,32,115,97,109,101,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,97,114,101,32,60,32,52,48,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,10,10,45,32,42,42,96,92,55,96,42,42,32,45,32,65,108,119,97,121,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,10,45,32,42,42,96,92,49,49,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,32,116,97,98,10,10,45,32,42,42,96,92,48,49,49,96,42,42,32,45,32,65,108,119,97,121,115,32,97,32,116,97,98,10,10,45,32,42,42,96,92,48,49,49,51,96,42,42,32,45,32,65,32,116,97,98,32,102,111,108,108,111,119,101,100,32,98,121,32,99,104,97,114,97,99,116,101,114,32,34,51,34,10,10,45,32,42,42,96,92,49,49,51,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,10,32,32,49,49,51,10,10,45,32,42,42,96,92,51,55,55,96,42,42,32,45,32,67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,118,97,108,117,101,32,50,53,53,32,40,100,101,99,105,109,97,108,41,10,10,45,32,42,42,96,92,56,49,96,42,42,32,45,32,69,105,116,104,101,114,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,116,104,101,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,49,34,10,10,78,111,116,105,99,101,32,116,104,97,116,32,111,99,116,97,108,32,118,97,108,117,101,115,32,62,61,32,49,48,48,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,32,109,117,115,116,32,110,111,116,32,98,101,10,105,110,116,114,111,100,117,99,101,100,32,98,121,32,97,32,108,101,97,100,105,110,103,32,122,101,114,111,44,32,97,115,32,110,111,32,109,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,101,118,101,114,32,114,101,97,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,102,116,101,114,32,96,92,120,96,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,96,123,96,44,32,102,114,111,109,32,122,101,114,111,32,116,111,32,116,119,111,32,104,101,120,97,100,101,99,105,109,97,108,10,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,32,40,108,101,116,116,101,114,115,32,99,97,110,32,98,101,32,105,110,32,117,112,112,101,114,32,111,114,32,108,111,119,101,114,32,99,97,115,101,41,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,10,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,109,97,121,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,96,92,120,123,96,32,97,110,100,32,96,125,96,46,32,73,102,32,97,32,99,104,97,114,97,99,116,101,114,32,111,116,104,101,114,32,116,104,97,110,32,97,10,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,32,97,112,112,101,97,114,115,32,98,101,116,119,101,101,110,32,96,92,120,123,96,32,97,110,100,32,96,125,96,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,116,101,114,109,105,110,97,116,105,110,103,10,96,125,96,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46,10,10,67,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,50,53,54,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,121,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,10,115,121,110,116,97,120,101,115,32,102,111,114,32,96,92,120,96,46,32,84,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,119,97,121,32,116,104,101,121,32,97,114,101,32,104,97,110,100,108,101,100,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,120,100,99,96,32,105,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,96,92,120,123,100,99,125,96,46,10,10,95,67,111,110,115,116,114,97,105,110,116,115,32,111,110,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,95,10,10,67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,110,117,109,98,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,10,99,101,114,116,97,105,110,32,118,97,108,117,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,56,45,98,105,116,32,110,111,110,45,85,84,70,32,109,111,100,101,42,42,32,45,32,60,32,48,120,49,48,48,10,10,45,32,42,42,56,45,98,105,116,32,85,84,70,45,56,32,109,111,100,101,42,42,32,45,32,60,32,48,120,49,48,102,102,102,102,32,97,110,100,32,97,32,118,97,108,105,100,32,99,111,100,101,112,111,105,110,116,10,10,73,110,118,97,108,105,100,32,85,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,115,32,97,114,101,32,116,104,101,32,114,97,110,103,101,32,48,120,100,56,48,48,32,116,111,32,48,120,100,102,102,102,32,40,116,104,101,32,115,111,45,99,97,108,108,101,100,10,34,115,117,114,114,111,103,97,116,101,34,32,99,111,100,101,112,111,105,110,116,115,41,44,32,97,110,100,32,48,120,102,102,101,102,46,10,10,95,69,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,95,10,10,65,108,108,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,100,101,102,105,110,101,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,32,99,97,110,32,98,101,32,117,115,101,100,32,98,111,116,104,32,105,110,115,105,100,101,10,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,108,115,111,44,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,98,96,32,105,115,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,56,41,46,10,10,96,92,78,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,96,92,66,96,44,32,96,92,82,96,44,32,97,110,100,32,96,92,88,96,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,10,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,10,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,10,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,115,46,10,10,95,85,110,115,117,112,112,111,114,116,101,100,32,69,115,99,97,112,101,32,83,101,113,117,101,110,99,101,115,95,10,10,73,110,32,80,101,114,108,44,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,108,96,44,32,96,92,76,96,44,32,96,92,117,96,44,32,97,110,100,32,96,92,85,96,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,105,116,115,32,115,116,114,105,110,103,10,104,97,110,100,108,101,114,32,97,110,100,32,117,115,101,100,32,116,111,32,109,111,100,105,102,121,32,116,104,101,32,99,97,115,101,32,111,102,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,80,67,82,69,32,100,111,101,115,32,110,111,116,10,115,117,112,112,111,114,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,10,10,95,65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,95,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,10,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,44,32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,97,109,101,100,32,98,97,99,107,10,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,99,111,100,101,100,32,97,115,32,96,92,103,123,110,97,109,101,125,96,46,32,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,44,10,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,10,95,65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,83,117,98,114,111,117,116,105,110,101,32,67,97,108,108,115,95,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,10,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,10,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,34,115,117,98,114,111,117,116,105,110,101,34,46,32,68,101,116,97,105,108,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,10,108,97,116,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,103,123,46,46,46,125,96,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,96,92,103,60,46,46,46,62,96,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,10,95,110,111,116,95,32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,97,110,100,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,10,99,97,108,108,46,10,10,95,71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115,95,10,10,91,93,40,41,123,58,32,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115,32,125,10,10,65,110,111,116,104,101,114,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,103,101,110,101,114,105,99,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,58,10,10,45,32,42,42,96,92,100,96,42,42,32,45,32,65,110,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,10,10,45,32,42,42,96,92,68,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,100,101,99,105,109,97,108,32,100,105,103,105,116,10,10,45,32,42,42,96,92,104,96,42,42,32,45,32,65,110,121,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,72,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,115,96,42,42,32,45,32,65,110,121,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,83,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,118,96,42,42,32,45,32,65,110,121,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,86,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,119,96,42,42,32,45,32,65,110,121,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,10,10,45,32,42,42,96,92,87,96,42,42,32,45,32,65,110,121,32,34,110,111,110,45,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,10,10,84,104,101,114,101,32,105,115,32,97,108,115,111,32,116,104,101,32,115,105,110,103,108,101,32,115,101,113,117,101,110,99,101,32,96,92,78,96,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,110,111,110,45,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,10,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,34,46,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32,96,100,111,116,97,108,108,96,32,105,115,32,110,111,116,32,115,101,116,46,32,80,101,114,108,32,97,108,115,111,10,117,115,101,115,32,96,92,78,96,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,10,10,69,97,99,104,32,112,97,105,114,32,111,102,32,108,111,119,101,114,99,97,115,101,32,97,110,100,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,112,97,114,116,105,116,105,111,110,115,32,116,104,101,32,99,111,109,112,108,101,116,101,10,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,116,119,111,32,100,105,115,106,111,105,110,116,32,115,101,116,115,46,32,65,110,121,32,103,105,118,101,110,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,111,110,101,44,32,97,110,100,10,111,110,108,121,32,111,110,101,44,32,111,102,32,101,97,99,104,32,112,97,105,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,97,112,112,101,97,114,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,101,121,32,101,97,99,104,32,109,97,116,99,104,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,101,46,32,73,102,32,116,104,101,10,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,108,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,10,105,115,32,110,111,32,99,104,97,114,97,99,116,101,114,32,116,111,32,109,97,116,99,104,46,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,96,92,115,96,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,10,49,49,41,44,32,119,104,105,99,104,32,109,97,100,101,32,105,116,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,116,104,101,32,80,79,83,73,88,32,34,115,112,97,99,101,34,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,10,97,100,100,101,100,32,86,84,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,115,117,105,116,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,84,104,101,32,100,101,102,97,117,108,116,10,96,92,115,96,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,119,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,10,40,51,50,41,44,32,119,104,105,99,104,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,32,105,110,32,116,104,101,32,34,67,34,32,108,111,99,97,108,101,46,32,84,104,105,115,32,108,105,115,116,32,109,97,121,32,118,97,114,121,32,105,102,10,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,115,111,109,101,32,108,111,99,97,108,101,115,32,116,104,101,10,34,110,111,110,45,98,114,101,97,107,105,110,103,32,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,32,40,96,92,120,65,48,96,41,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,44,32,97,110,100,32,105,110,10,111,116,104,101,114,115,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,46,10,10,65,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,117,110,100,101,114,115,99,111,114,101,32,111,114,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,97,32,108,101,116,116,101,114,32,111,114,32,97,10,100,105,103,105,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,108,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,10,80,67,82,69,32,108,111,119,45,118,97,108,117,101,100,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,44,32,105,110,32,69,114,108,97,110,103,39,115,32,99,97,115,101,32,40,97,110,100,32,119,105,116,104,111,117,116,32,111,112,116,105,111,110,10,96,117,110,105,99,111,100,101,96,41,44,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,105,110,32,96,117,110,105,99,111,100,101,96,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,44,32,116,104,97,116,32,105,115,44,32,97,108,108,10,99,104,97,114,97,99,116,101,114,115,32,111,117,116,115,105,100,101,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,44,32,110,101,118,101,114,32,109,97,116,99,104,32,96,92,100,96,44,32,96,92,115,96,44,32,111,114,32,96,92,119,96,44,10,97,110,100,32,97,108,119,97,121,115,32,109,97,116,99,104,32,96,92,68,96,44,32,96,92,83,96,44,32,97,110,100,32,96,92,87,96,46,32,84,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,114,101,116,97,105,110,32,116,104,101,105,114,32,111,114,105,103,105,110,97,108,10,109,101,97,110,105,110,103,115,32,102,114,111,109,32,98,101,102,111,114,101,32,85,84,70,32,115,117,112,112,111,114,116,32,119,97,115,32,97,118,97,105,108,97,98,108,101,44,32,109,97,105,110,108,121,32,102,111,114,32,101,102,102,105,99,105,101,110,99,121,32,114,101,97,115,111,110,115,46,10,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,117,99,112,96,32,105,115,32,115,101,116,44,32,116,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,10,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,92,100,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,96,92,112,123,78,100,125,96,32,109,97,116,99,104,101,115,32,40,100,101,99,105,109,97,108,32,100,105,103,105,116,41,10,10,45,32,42,42,96,92,115,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,96,92,112,123,90,125,96,32,111,114,32,96,92,104,96,32,111,114,32,96,92,118,96,10,10,45,32,42,42,96,92,119,96,42,42,32,45,32,65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,109,97,116,99,104,101,115,32,96,92,112,123,76,125,96,32,111,114,32,96,92,112,123,78,125,96,32,109,97,116,99,104,101,115,44,32,112,108,117,115,10,32,32,117,110,100,101,114,115,99,111,114,101,10,10,84,104,101,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,115,32,109,97,116,99,104,32,116,104,101,32,105,110,118,101,114,115,101,32,115,101,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,100,96,10,109,97,116,99,104,101,115,32,111,110,108,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,44,32,119,104,105,108,101,32,96,92,119,96,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,100,105,103,105,116,44,32,97,110,121,32,85,110,105,99,111,100,101,10,108,101,116,116,101,114,44,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,46,32,78,111,116,105,99,101,32,97,108,115,111,32,116,104,97,116,32,96,117,99,112,96,32,97,102,102,101,99,116,115,32,96,92,98,96,32,97,110,100,32,96,92,66,96,44,32,97,115,32,116,104,101,121,32,97,114,101,10,100,101,102,105,110,101,100,32,105,110,32,116,101,114,109,115,32,111,102,32,96,92,119,96,32,97,110,100,32,96,92,87,96,46,32,77,97,116,99,104,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,105,99,101,97,98,108,121,32,115,108,111,119,101,114,10,119,104,101,110,32,96,117,99,112,96,32,105,115,32,115,101,116,46,10,10,84,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,104,96,44,32,96,92,72,96,44,32,96,92,118,96,44,32,97,110,100,32,96,92,86,96,32,97,114,101,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,119,101,114,101,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,105,110,10,114,101,108,101,97,115,101,32,53,46,49,48,46,32,73,110,32,99,111,110,116,114,97,115,116,32,116,111,32,116,104,101,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,119,104,105,99,104,32,109,97,116,99,104,32,111,110,108,121,32,65,83,67,73,73,10,99,104,97,114,97,99,116,101,114,115,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,115,101,32,97,108,119,97,121,115,32,109,97,116,99,104,32,99,101,114,116,97,105,110,32,104,105,103,104,45,118,97,108,117,101,100,32,99,111,100,101,32,112,111,105,110,116,115,44,10,114,101,103,97,114,100,108,101,115,115,32,105,102,32,96,117,99,112,96,32,105,115,32,115,101,116,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,104,111,114,105,122,111,110,116,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58,10,10,45,32,42,42,85,43,48,48,48,57,42,42,32,45,32,72,111,114,105,122,111,110,116,97,108,32,116,97,98,32,40,72,84,41,10,10,45,32,42,42,85,43,48,48,50,48,42,42,32,45,32,83,112,97,99,101,10,10,45,32,42,42,85,43,48,48,65,48,42,42,32,45,32,78,111,110,45,98,114,101,97,107,32,115,112,97,99,101,10,10,45,32,42,42,85,43,49,54,56,48,42,42,32,45,32,79,103,104,97,109,32,115,112,97,99,101,32,109,97,114,107,10,10,45,32,42,42,85,43,49,56,48,69,42,42,32,45,32,77,111,110,103,111,108,105,97,110,32,118,111,119,101,108,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,85,43,50,48,48,48,42,42,32,45,32,69,110,32,113,117,97,100,10,10,45,32,42,42,85,43,50,48,48,49,42,42,32,45,32,69,109,32,113,117,97,100,10,10,45,32,42,42,85,43,50,48,48,50,42,42,32,45,32,69,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,51,42,42,32,45,32,69,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,52,42,42,32,45,32,84,104,114,101,101,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,53,42,42,32,45,32,70,111,117,114,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,54,42,42,32,45,32,83,105,120,45,112,101,114,45,101,109,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,55,42,42,32,45,32,70,105,103,117,114,101,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,56,42,42,32,45,32,80,117,110,99,116,117,97,116,105,111,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,57,42,42,32,45,32,84,104,105,110,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,48,65,42,42,32,45,32,72,97,105,114,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,50,70,42,42,32,45,32,78,97,114,114,111,119,32,110,111,45,98,114,101,97,107,32,115,112,97,99,101,10,10,45,32,42,42,85,43,50,48,53,70,42,42,32,45,32,77,101,100,105,117,109,32,109,97,116,104,101,109,97,116,105,99,97,108,32,115,112,97,99,101,10,10,45,32,42,42,85,43,51,48,48,48,42,42,32,45,32,73,100,101,111,103,114,97,112,104,105,99,32,115,112,97,99,101,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,101,114,116,105,99,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58,10,10,45,32,42,42,85,43,48,48,48,65,42,42,32,45,32,76,105,110,101,32,102,101,101,100,32,40,76,70,41,10,10,45,32,42,42,85,43,48,48,48,66,42,42,32,45,32,86,101,114,116,105,99,97,108,32,116,97,98,32,40,86,84,41,10,10,45,32,42,42,85,43,48,48,48,67,42,42,32,45,32,70,111,114,109,32,102,101,101,100,32,40,70,70,41,10,10,45,32,42,42,85,43,48,48,48,68,42,42,32,45,32,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,41,10,10,45,32,42,42,85,43,48,48,56,53,42,42,32,45,32,78,101,120,116,32,108,105,110,101,32,40,78,69,76,41,10,10,45,32,42,42,85,43,50,48,50,56,42,42,32,45,32,76,105,110,101,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,85,43,50,48,50,57,42,42,32,45,32,80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,10,10,73,110,32,56,45,98,105,116,44,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,111,110,108,121,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,60,32,50,53,54,32,97,114,101,10,114,101,108,101,118,97,110,116,46,10,10,95,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,95,10,10,91,93,40,41,123,58,32,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,32,125,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,82,96,32,109,97,116,99,104,101,115,32,97,110,121,10,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46,32,73,110,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,96,92,82,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,96,96,96,116,101,120,116,10,40,63,62,92,114,92,110,124,92,110,124,92,120,48,98,124,92,102,124,92,114,124,92,120,56,53,41,10,96,96,96,10,10,84,104,105,115,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,97,110,32,34,97,116,111,109,105,99,32,103,114,111,117,112,34,44,32,100,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46,10,10,84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,103,114,111,117,112,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,32,102,111,108,108,111,119,101,100,32,98,121,10,76,70,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,115,32,76,70,32,40,108,105,110,101,32,102,101,101,100,44,32,85,43,48,48,48,65,41,44,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,10,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,32,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,85,43,48,48,48,68,41,44,32,111,114,32,78,69,76,32,40,110,101,120,116,10,108,105,110,101,44,32,85,43,48,48,56,53,41,46,32,84,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,117,110,105,116,32,116,104,97,116,10,99,97,110,110,111,116,32,98,101,32,115,112,108,105,116,46,10,10,73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,116,119,111,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,50,53,53,32,97,114,101,32,97,100,100,101,100,58,32,76,83,10,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,10,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,102,111,114,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,96,92,82,96,32,99,97,110,32,98,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,40,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,10,111,102,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,41,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,98,115,114,95,97,110,121,99,114,108,102,96,32,101,105,116,104,101,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,10,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,46,32,40,66,83,82,32,105,115,32,97,110,32,97,99,114,111,110,121,109,32,102,111,114,32,34,98,97,99,107,115,108,97,115,104,32,82,34,46,41,32,84,104,105,115,32,99,97,110,10,98,101,32,109,97,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,119,104,101,110,32,80,67,82,69,32,105,115,32,98,117,105,108,116,59,32,105,102,32,115,111,44,32,116,104,101,32,111,116,104,101,114,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,10,114,101,113,117,101,115,116,101,100,32,116,104,114,111,117,103,104,32,111,112,116,105,111,110,32,96,98,115,114,95,117,110,105,99,111,100,101,96,46,32,84,104,101,115,101,32,115,101,116,116,105,110,103,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,10,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,40,92,42,66,83,82,95,65,78,89,67,82,76,70,41,42,42,32,45,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,111,110,108,121,10,10,45,32,42,42,40,92,42,66,83,82,95,85,78,73,67,79,68,69,41,42,42,32,45,32,65,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,10,10,84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,44,10,98,117,116,32,116,104,101,121,32,99,97,110,32,116,104,101,109,115,101,108,118,101,115,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,98,121,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,97,32,109,97,116,99,104,105,110,103,10,102,117,110,99,116,105,111,110,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,116,116,105,110,103,115,44,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,97,114,101,10,114,101,99,111,103,110,105,122,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,97,116,32,116,104,101,121,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,10,99,97,115,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,99,97,110,32,98,101,10,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,59,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,99,97,110,32,115,116,97,114,116,10,119,105,116,104,58,10,10,96,96,96,116,101,120,116,10,40,42,65,78,89,41,40,42,66,83,82,95,65,78,89,67,82,76,70,41,10,96,96,96,10,10,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,40,42,85,84,70,56,41,44,32,40,42,85,84,70,41,44,32,111,114,32,40,92,42,85,67,80,41,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,115,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,82,96,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,44,32,97,110,100,32,115,111,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,34,82,34,32,98,121,32,100,101,102,97,117,108,116,46,10,10,95,85,110,105,99,111,100,101,32,67,104,97,114,97,99,116,101,114,32,80,114,111,112,101,114,116,105,101,115,95,10,10,84,104,114,101,101,32,109,111,114,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,115,112,101,99,105,102,105,99,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,10,97,118,97,105,108,97,98,108,101,46,32,87,104,101,110,32,105,110,32,56,45,98,105,116,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,101,115,116,105,110,103,10,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,60,32,50,53,54,44,32,98,117,116,32,116,104,101,121,32,100,111,32,119,111,114,107,32,105,110,32,116,104,105,115,32,109,111,100,101,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,101,120,116,114,97,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,58,10,10,45,32,42,42,96,92,112,123,95,120,120,95,125,96,42,42,32,45,32,65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,112,114,111,112,101,114,116,121,32,95,120,120,95,10,10,45,32,42,42,96,92,80,123,95,120,120,95,125,96,42,42,32,45,32,65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,112,114,111,112,101,114,116,121,32,95,120,120,95,10,10,45,32,42,42,96,92,88,96,42,42,32,45,32,65,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,10,10,84,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,95,120,120,95,32,97,98,111,118,101,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,115,99,114,105,112,116,10,110,97,109,101,115,44,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,44,32,34,65,110,121,34,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,10,40,105,110,99,108,117,100,105,110,103,32,110,101,119,108,105,110,101,41,44,32,97,110,100,32,115,111,109,101,32,115,112,101,99,105,97,108,32,80,67,82,69,32,112,114,111,112,101,114,116,105,101,115,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,10,115,101,99,116,105,111,110,41,46,32,79,116,104,101,114,32,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,34,73,110,77,117,115,105,99,97,108,83,121,109,98,111,108,115,34,44,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,10,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,78,111,116,105,99,101,32,116,104,97,116,32,96,92,80,123,65,110,121,125,96,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,10,97,108,119,97,121,115,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46,10,10,83,101,116,115,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,98,101,108,111,110,103,105,110,103,32,116,111,32,99,101,114,116,97,105,110,32,115,99,114,105,112,116,115,46,32,65,10,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,101,116,115,32,99,97,110,32,98,101,32,109,97,116,99,104,101,100,32,117,115,105,110,103,32,97,32,115,99,114,105,112,116,32,110,97,109,101,44,32,102,111,114,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,92,112,123,71,114,101,101,107,125,32,92,80,123,72,97,110,125,10,96,96,96,10,10,84,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,97,110,32,105,100,101,110,116,105,102,105,101,100,32,115,99,114,105,112,116,32,97,114,101,32,108,117,109,112,101,100,32,116,111,103,101,116,104,101,114,32,97,115,32,34,67,111,109,109,111,110,34,46,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,105,115,116,32,111,102,32,115,99,114,105,112,116,115,58,10,10,45,32,65,114,97,98,105,99,10,45,32,65,114,109,101,110,105,97,110,10,45,32,65,118,101,115,116,97,110,10,45,32,66,97,108,105,110,101,115,101,10,45,32,66,97,109,117,109,10,45,32,66,97,115,115,97,95,86,97,104,10,45,32,66,97,116,97,107,10,45,32,66,101,110,103,97,108,105,10,45,32,66,111,112,111,109,111,102,111,10,45,32,66,114,97,105,108,108,101,10,45,32,66,117,103,105,110,101,115,101,10,45,32,66,117,104,105,100,10,45,32,67,97,110,97,100,105,97,110,95,65,98,111,114,105,103,105,110,97,108,10,45,32,67,97,114,105,97,110,10,45,32,67,97,117,99,97,115,105,97,110,95,65,108,98,97,110,105,97,110,10,45,32,67,104,97,107,109,97,10,45,32,67,104,97,109,10,45,32,67,104,101,114,111,107,101,101,10,45,32,67,111,109,109,111,110,10,45,32,67,111,112,116,105,99,10,45,32,67,117,110,101,105,102,111,114,109,10,45,32,67,121,112,114,105,111,116,10,45,32,67,121,114,105,108,108,105,99,10,45,32,68,101,115,101,114,101,116,10,45,32,68,101,118,97,110,97,103,97,114,105,10,45,32,68,117,112,108,111,121,97,110,10,45,32,69,103,121,112,116,105,97,110,95,72,105,101,114,111,103,108,121,112,104,115,10,45,32,69,108,98,97,115,97,110,10,45,32,69,116,104,105,111,112,105,99,10,45,32,71,101,111,114,103,105,97,110,10,45,32,71,108,97,103,111,108,105,116,105,99,10,45,32,71,111,116,104,105,99,10,45,32,71,114,97,110,116,104,97,10,45,32,71,114,101,101,107,10,45,32,71,117,106,97,114,97,116,105,10,45,32,71,117,114,109,117,107,104,105,10,45,32,72,97,110,10,45,32,72,97,110,103,117,108,10,45,32,72,97,110,117,110,111,111,10,45,32,72,101,98,114,101,119,10,45,32,72,105,114,97,103,97,110,97,10,45,32,73,109,112,101,114,105,97,108,95,65,114,97,109,97,105,99,10,45,32,73,110,104,101,114,105,116,101,100,10,45,32,73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,104,108,97,118,105,10,45,32,73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,114,116,104,105,97,110,10,45,32,74,97,118,97,110,101,115,101,10,45,32,75,97,105,116,104,105,10,45,32,75,97,110,110,97,100,97,10,45,32,75,97,116,97,107,97,110,97,10,45,32,75,97,121,97,104,95,76,105,10,45,32,75,104,97,114,111,115,104,116,104,105,10,45,32,75,104,109,101,114,10,45,32,75,104,111,106,107,105,10,45,32,75,104,117,100,97,119,97,100,105,10,45,32,76,97,111,10,45,32,76,97,116,105,110,10,45,32,76,101,112,99,104,97,10,45,32,76,105,109,98,117,10,45,32,76,105,110,101,97,114,95,65,10,45,32,76,105,110,101,97,114,95,66,10,45,32,76,105,115,117,10,45,32,76,121,99,105,97,110,10,45,32,76,121,100,105,97,110,10,45,32,77,97,104,97,106,97,110,105,10,45,32,77,97,108,97,121,97,108,97,109,10,45,32,77,97,110,100,97,105,99,10,45,32,77,97,110,105,99,104,97,101,97,110,10,45,32,77,101,101,116,101,105,95,77,97,121,101,107,10,45,32,77,101,110,100,101,95,75,105,107,97,107,117,105,10,45,32,77,101,114,111,105,116,105,99,95,67,117,114,115,105,118,101,10,45,32,77,101,114,111,105,116,105,99,95,72,105,101,114,111,103,108,121,112,104,115,10,45,32,77,105,97,111,10,45,32,77,111,100,105,10,45,32,77,111,110,103,111,108,105,97,110,10,45,32,77,114,111,10,45,32,77,121,97,110,109,97,114,10,45,32,78,97,98,97,116,97,101,97,110,10,45,32,78,101,119,95,84,97,105,95,76,117,101,10,45,32,78,107,111,10,45,32,79,103,104,97,109,10,45,32,79,108,95,67,104,105,107,105,10,45,32,79,108,100,95,73,116,97,108,105,99,10,45,32,79,108,100,95,78,111,114,116,104,95,65,114,97,98,105,97,110,10,45,32,79,108,100,95,80,101,114,109,105,99,10,45,32,79,108,100,95,80,101,114,115,105,97,110,10,45,32,79,114,105,121,97,10,45,32,79,108,100,95,83,111,117,116,104,95,65,114,97,98,105,97,110,10,45,32,79,108,100,95,84,117,114,107,105,99,10,45,32,79,115,109,97,110,121,97,10,45,32,80,97,104,97,119,104,95,72,109,111,110,103,10,45,32,80,97,108,109,121,114,101,110,101,10,45,32,80,97,117,95,67,105,110,95,72,97,117,10,45,32,80,104,97,103,115,95,80,97,10,45,32,80,104,111,101,110,105,99,105,97,110,10,45,32,80,115,97,108,116,101,114,95,80,97,104,108,97,118,105,10,45,32,82,101,106,97,110,103,10,45,32,82,117,110,105,99,10,45,32,83,97,109,97,114,105,116,97,110,10,45,32,83,97,117,114,97,115,104,116,114,97,10,45,32,83,104,97,114,97,100,97,10,45,32,83,104,97,118,105,97,110,10,45,32,83,105,100,100,104,97,109,10,45,32,83,105,110,104,97,108,97,10,45,32,83,111,114,97,95,83,111,109,112,101,110,103,10,45,32,83,117,110,100,97,110,101,115,101,10,45,32,83,121,108,111,116,105,95,78,97,103,114,105,10,45,32,83,121,114,105,97,99,10,45,32,84,97,103,97,108,111,103,10,45,32,84,97,103,98,97,110,119,97,10,45,32,84,97,105,95,76,101,10,45,32,84,97,105,95,84,104,97,109,10,45,32,84,97,105,95,86,105,101,116,10,45,32,84,97,107,114,105,10,45,32,84,97,109,105,108,10,45,32,84,101,108,117,103,117,10,45,32,84,104,97,97,110,97,10,45,32,84,104,97,105,10,45,32,84,105,98,101,116,97,110,10,45,32,84,105,102,105,110,97,103,104,10,45,32,84,105,114,104,117,116,97,10,45,32,85,103,97,114,105,116,105,99,10,45,32,86,97,105,10,45,32,87,97,114,97,110,103,95,67,105,116,105,10,45,32,89,105,10,10,69,97,99,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,101,120,97,99,116,108,121,32,111,110,101,32,85,110,105,99,111,100,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,44,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,10,116,119,111,45,108,101,116,116,101,114,32,97,99,114,111,110,121,109,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,110,101,103,97,116,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,10,105,110,99,108,117,100,105,110,103,32,97,32,99,105,114,99,117,109,102,108,101,120,32,98,101,116,119,101,101,110,32,116,104,101,32,111,112,101,110,105,110,103,32,98,114,97,99,101,32,97,110,100,32,116,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,112,123,94,76,117,125,96,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,96,92,80,123,76,117,125,96,46,10,10,73,102,32,111,110,108,121,32,111,110,101,32,108,101,116,116,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,32,96,92,112,96,32,111,114,32,96,92,80,96,44,32,105,116,32,105,110,99,108,117,100,101,115,32,97,108,108,32,116,104,101,32,103,101,110,101,114,97,108,10,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,32,116,104,97,116,32,115,116,97,114,116,32,119,105,116,104,32,116,104,97,116,32,108,101,116,116,101,114,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,10,110,101,103,97,116,105,111,110,44,32,116,104,101,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,105,110,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,97,114,101,32,111,112,116,105,111,110,97,108,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,10,116,119,111,32,101,120,97,109,112,108,101,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,58,10,10,96,96,96,116,101,120,116,10,92,112,123,76,125,10,92,112,76,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,32,99,111,100,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,58,10,10,45,32,42,42,67,42,42,32,45,32,79,116,104,101,114,10,10,45,32,42,42,67,99,42,42,32,45,32,67,111,110,116,114,111,108,10,10,45,32,42,42,67,102,42,42,32,45,32,70,111,114,109,97,116,10,10,45,32,42,42,67,110,42,42,32,45,32,85,110,97,115,115,105,103,110,101,100,10,10,45,32,42,42,67,111,42,42,32,45,32,80,114,105,118,97,116,101,32,117,115,101,10,10,45,32,42,42,67,115,42,42,32,45,32,83,117,114,114,111,103,97,116,101,10,10,45,32,42,42,76,42,42,32,45,32,76,101,116,116,101,114,10,10,45,32,42,42,76,108,42,42,32,45,32,76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,76,109,42,42,32,45,32,77,111,100,105,102,105,101,114,32,108,101,116,116,101,114,10,10,45,32,42,42,76,111,42,42,32,45,32,79,116,104,101,114,32,108,101,116,116,101,114,10,10,45,32,42,42,76,116,42,42,32,45,32,84,105,116,108,101,32,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,76,117,42,42,32,45,32,85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,10,10,45,32,42,42,77,42,42,32,45,32,77,97,114,107,10,10,45,32,42,42,77,99,42,42,32,45,32,83,112,97,99,105,110,103,32,109,97,114,107,10,10,45,32,42,42,77,101,42,42,32,45,32,69,110,99,108,111,115,105,110,103,32,109,97,114,107,10,10,45,32,42,42,77,110,42,42,32,45,32,78,111,110,45,115,112,97,99,105,110,103,32,109,97,114,107,10,10,45,32,42,42,78,42,42,32,45,32,78,117,109,98,101,114,10,10,45,32,42,42,78,100,42,42,32,45,32,68,101,99,105,109,97,108,32,110,117,109,98,101,114,10,10,45,32,42,42,78,108,42,42,32,45,32,76,101,116,116,101,114,32,110,117,109,98,101,114,10,10,45,32,42,42,78,111,42,42,32,45,32,79,116,104,101,114,32,110,117,109,98,101,114,10,10,45,32,42,42,80,42,42,32,45,32,80,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,99,42,42,32,45,32,67,111,110,110,101,99,116,111,114,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,100,42,42,32,45,32,68,97,115,104,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,101,42,42,32,45,32,67,108,111,115,101,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,102,42,42,32,45,32,70,105,110,97,108,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,105,42,42,32,45,32,73,110,105,116,105,97,108,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,111,42,42,32,45,32,79,116,104,101,114,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,80,115,42,42,32,45,32,79,112,101,110,32,112,117,110,99,116,117,97,116,105,111,110,10,10,45,32,42,42,83,42,42,32,45,32,83,121,109,98,111,108,10,10,45,32,42,42,83,99,42,42,32,45,32,67,117,114,114,101,110,99,121,32,115,121,109,98,111,108,10,10,45,32,42,42,83,107,42,42,32,45,32,77,111,100,105,102,105,101,114,32,115,121,109,98,111,108,10,10,45,32,42,42,83,109,42,42,32,45,32,77,97,116,104,101,109,97,116,105,99,97,108,32,115,121,109,98,111,108,10,10,45,32,42,42,83,111,42,42,32,45,32,79,116,104,101,114,32,115,121,109,98,111,108,10,10,45,32,42,42,90,42,42,32,45,32,83,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,108,42,42,32,45,32,76,105,110,101,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,112,42,42,32,45,32,80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,10,10,45,32,42,42,90,115,42,42,32,45,32,83,112,97,99,101,32,115,101,112,97,114,97,116,111,114,10,10,84,104,101,32,115,112,101,99,105,97,108,32,112,114,111,112,101,114,116,121,32,76,38,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,73,116,32,109,97,116,99,104,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,10,76,117,44,32,76,108,44,32,111,114,32,76,116,32,112,114,111,112,101,114,116,121,44,32,116,104,97,116,32,105,115,44,32,97,32,108,101,116,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,99,108,97,115,115,105,102,105,101,100,32,97,115,32,97,32,109,111,100,105,102,105,101,114,10,111,114,32,34,111,116,104,101,114,34,46,10,10,84,104,101,32,67,115,32,40,83,117,114,114,111,103,97,116,101,41,32,112,114,111,112,101,114,116,121,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,85,43,68,56,48,48,32,116,111,10,85,43,68,70,70,70,46,32,83,117,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,118,97,108,105,100,32,105,110,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,115,32,97,110,100,32,115,111,32,99,97,110,110,111,116,32,98,101,32,116,101,115,116,101,100,10,98,121,32,80,67,82,69,46,32,80,101,114,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,67,115,32,112,114,111,112,101,114,116,121,46,10,10,84,104,101,32,108,111,110,103,32,115,121,110,111,110,121,109,115,32,102,111,114,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,101,114,108,32,40,115,117,99,104,32,97,115,32,96,92,112,123,76,101,116,116,101,114,125,96,41,10,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,73,116,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,116,111,32,112,114,101,102,105,120,32,97,110,121,32,111,102,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,10,119,105,116,104,32,34,73,115,34,46,10,10,78,111,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,32,104,97,115,32,116,104,101,32,67,110,32,40,117,110,97,115,115,105,103,110,101,100,41,32,112,114,111,112,101,114,116,121,46,32,84,104,105,115,10,112,114,111,112,101,114,116,121,32,105,115,32,105,110,115,116,101,97,100,32,97,115,115,117,109,101,100,32,102,111,114,32,97,110,121,32,99,111,100,101,32,112,111,105,110,116,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,46,10,10,83,112,101,99,105,102,121,105,110,103,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,96,92,112,123,76,117,125,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,108,121,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,10,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,99,117,114,114,101,110,116,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,46,10,10,77,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,105,115,32,110,111,116,32,102,97,115,116,44,32,97,115,32,80,67,82,69,32,109,117,115,116,32,100,111,32,97,10,109,117,108,116,105,115,116,97,103,101,32,116,97,98,108,101,32,108,111,111,107,117,112,32,116,111,32,102,105,110,100,32,97,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,46,32,84,104,97,116,32,105,115,32,119,104,121,32,116,104,101,10,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,96,92,100,96,32,97,110,100,32,96,92,119,96,32,100,111,32,110,111,116,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,10,105,110,32,80,67,82,69,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,109,97,107,101,32,116,104,101,109,32,100,111,32,115,111,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,32,111,114,10,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,96,40,42,85,67,80,41,96,46,10,10,95,69,120,116,101,110,100,101,100,32,71,114,97,112,104,101,109,101,32,67,108,117,115,116,101,114,115,95,10,10,84,104,101,32,96,92,88,96,32,101,115,99,97,112,101,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,102,111,114,109,32,97,110,32,34,101,120,116,101,110,100,101,100,10,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,34,44,32,97,110,100,32,116,114,101,97,116,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,40,115,101,101,32,98,101,108,111,119,41,46,32,85,112,32,116,111,10,97,110,100,32,105,110,99,108,117,100,105,110,103,32,114,101,108,101,97,115,101,32,56,46,51,49,44,32,80,67,82,69,32,109,97,116,99,104,101,100,32,97,110,32,101,97,114,108,105,101,114,44,32,115,105,109,112,108,101,114,32,100,101,102,105,110,105,116,105,111,110,32,116,104,97,116,32,119,97,115,10,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,40,63,62,92,80,77,92,112,77,42,41,96,46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,100,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,116,104,101,32,34,109,97,114,107,34,10,112,114,111,112,101,114,116,121,44,32,102,111,108,108,111,119,101,100,32,98,121,32,122,101,114,111,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,46,10,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,110,111,110,45,115,112,97,99,105,110,103,32,97,99,99,101,110,116,115,32,116,104,97,116,10,97,102,102,101,99,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,99,104,97,114,97,99,116,101,114,46,10,10,84,104,105,115,32,115,105,109,112,108,101,32,100,101,102,105,110,105,116,105,111,110,32,119,97,115,32,101,120,116,101,110,100,101,100,32,105,110,32,85,110,105,99,111,100,101,32,116,111,32,105,110,99,108,117,100,101,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,107,105,110,100,115,10,111,102,32,99,111,109,112,111,115,105,116,101,32,99,104,97,114,97,99,116,101,114,32,98,121,32,103,105,118,105,110,103,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,97,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,44,10,97,110,100,32,99,114,101,97,116,105,110,103,32,114,117,108,101,115,32,116,104,97,116,32,117,115,101,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,98,111,117,110,100,97,114,105,101,115,32,111,102,10,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,46,32,73,110,32,80,67,82,69,32,114,101,108,101,97,115,101,115,32,108,97,116,101,114,32,116,104,97,110,32,56,46,51,49,44,32,96,92,88,96,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,10,116,104,101,115,101,32,99,108,117,115,116,101,114,115,46,10,10,96,92,88,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,110,32,105,116,32,100,101,99,105,100,101,115,32,119,104,101,116,104,101,114,32,116,111,32,97,100,100,32,109,111,114,101,10,99,104,97,114,97,99,116,101,114,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,117,108,101,115,32,102,111,114,32,101,110,100,105,110,103,32,97,32,99,108,117,115,116,101,114,58,10,10,49,46,32,69,110,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,98,101,116,119,101,101,110,32,67,82,32,97,110,100,32,76,70,59,32,111,116,104,101,114,119,105,115,101,32,101,110,100,32,97,102,116,101,114,32,97,110,121,32,99,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,46,10,49,46,32,68,111,32,110,111,116,32,98,114,101,97,107,32,72,97,110,103,117,108,32,40,97,32,75,111,114,101,97,110,32,115,99,114,105,112,116,41,32,115,121,108,108,97,98,108,101,32,115,101,113,117,101,110,99,101,115,46,32,72,97,110,103,117,108,32,99,104,97,114,97,99,116,101,114,115,10,32,32,32,97,114,101,32,111,102,32,102,105,118,101,32,116,121,112,101,115,58,32,76,44,32,86,44,32,84,44,32,76,86,44,32,97,110,100,32,76,86,84,46,32,65,110,32,76,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,10,32,32,32,76,44,32,86,44,32,76,86,44,32,111,114,32,76,86,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,32,111,114,32,86,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,86,32,111,114,32,84,10,32,32,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,84,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,111,110,108,121,32,98,121,32,97,32,84,32,99,104,97,114,97,99,116,101,114,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,98,101,102,111,114,101,32,101,120,116,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,115,112,97,99,105,110,103,32,109,97,114,107,115,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,10,32,32,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,108,119,97,121,115,32,104,97,118,101,32,116,104,101,32,34,101,120,116,101,110,100,34,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,46,10,49,46,32,68,111,32,110,111,116,32,101,110,100,32,97,102,116,101,114,32,112,114,101,112,101,110,100,32,99,104,97,114,97,99,116,101,114,115,46,10,49,46,32,79,116,104,101,114,119,105,115,101,44,32,101,110,100,32,116,104,101,32,99,108,117,115,116,101,114,46,10,10,95,80,67,82,69,32,65,100,100,105,116,105,111,110,97,108,32,80,114,111,112,101,114,116,105,101,115,95,10,10,73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,115,116,97,110,100,97,114,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,10,102,111,117,114,32,109,111,114,101,32,116,104,97,116,32,109,97,107,101,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,99,111,110,118,101,114,116,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,10,96,92,119,96,32,97,110,100,32,96,92,115,96,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,46,32,80,67,82,69,32,117,115,101,115,32,116,104,101,115,101,32,110,111,110,45,115,116,97,110,100,97,114,100,44,32,110,111,110,45,80,101,114,108,10,112,114,111,112,101,114,116,105,101,115,32,105,110,116,101,114,110,97,108,108,121,32,119,104,101,110,32,116,104,101,32,96,117,99,112,96,32,111,112,116,105,111,110,32,105,115,32,112,97,115,115,101,100,46,32,72,111,119,101,118,101,114,44,32,116,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,10,117,115,101,100,32,101,120,112,108,105,99,105,116,108,121,46,32,84,104,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,88,97,110,42,42,32,45,32,65,110,121,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,10,32,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,88,112,115,42,42,32,45,32,65,110,121,32,80,111,115,105,120,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,32,102,101,101,100,44,10,32,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,10,32,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,88,115,112,42,42,32,45,32,65,110,121,32,80,101,114,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,44,32,101,120,99,101,112,116,32,116,104,97,116,10,32,32,118,101,114,116,105,99,97,108,32,116,97,98,32,105,115,32,101,120,99,108,117,100,101,100,46,10,10,45,32,42,42,88,119,100,42,42,32,45,32,65,110,121,32,80,101,114,108,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,10,32,32,117,110,100,101,114,115,99,111,114,101,46,10,10,80,101,114,108,32,97,110,100,32,80,79,83,73,88,32,115,112,97,99,101,32,97,114,101,32,110,111,119,32,116,104,101,32,115,97,109,101,46,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,116,111,32,105,116,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,115,101,116,10,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,32,97,110,100,32,80,67,82,69,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,10,10,88,97,110,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,10,112,114,111,112,101,114,116,121,46,32,88,112,115,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,111,114,10,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,10,88,115,112,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,59,32,105,116,32,117,115,101,100,32,116,111,32,101,120,99,108,117,100,101,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,10,98,117,116,32,80,101,114,108,32,99,104,97,110,103,101,100,44,32,97,110,100,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,88,119,100,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,10,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46,10,10,84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,110,111,110,45,115,116,97,110,100,97,114,100,32,112,114,111,112,101,114,116,121,44,32,88,117,99,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,10,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,32,105,110,32,67,43,43,32,97,110,100,32,111,116,104,101,114,32,112,114,111,103,114,97,109,109,105,110,103,10,108,97,110,103,117,97,103,101,115,46,32,84,104,101,115,101,32,97,114,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,96,36,96,44,32,96,64,96,44,32,96,96,32,96,32,96,96,32,40,103,114,97,118,101,32,97,99,99,101,110,116,41,44,32,97,110,100,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,10,119,105,116,104,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,62,61,32,85,43,48,48,65,48,44,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,115,117,114,114,111,103,97,116,101,115,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,10,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,98,97,115,101,32,40,65,83,67,73,73,41,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,120,99,108,117,100,101,100,46,32,40,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,10,78,97,109,101,115,32,97,114,101,32,111,102,32,116,104,101,32,102,111,114,109,32,96,92,117,72,72,72,72,96,32,111,114,32,96,92,85,72,72,72,72,72,72,72,72,96,44,32,119,104,101,114,101,32,72,32,105,115,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,88,117,99,32,112,114,111,112,101,114,116,121,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,98,117,116,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,10,116,104,97,116,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,41,10,10,95,82,101,115,101,116,116,105,110,103,32,116,104,101,32,77,97,116,99,104,32,83,116,97,114,116,95,10,10,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,75,96,32,99,97,117,115,101,115,32,97,110,121,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,116,111,32,98,101,10,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,102,105,110,97,108,32,109,97,116,99,104,101,100,32,115,101,113,117,101,110,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,10,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,98,117,116,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,34,98,97,114,34,58,10,10,96,96,96,116,101,120,116,10,102,111,111,92,75,98,97,114,10,96,96,96,10,10,84,104,105,115,32,102,101,97,116,117,114,101,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,72,111,119,101,118,101,114,44,32,105,110,10,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,98,101,102,111,114,101,32,116,104,101,32,114,101,97,108,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,111,102,10,102,105,120,101,100,32,108,101,110,103,116,104,44,32,97,115,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,100,111,46,32,84,104,101,32,117,115,101,32,111,102,32,96,92,75,96,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,102,101,114,101,10,119,105,116,104,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,10,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,116,104,101,32,102,105,114,115,116,32,115,117,98,115,116,114,105,110,103,32,105,115,32,115,116,105,108,108,32,115,101,116,32,116,111,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,102,111,111,41,92,75,98,97,114,10,96,96,96,10,10,80,101,114,108,32,100,111,99,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,117,115,101,32,111,102,32,96,92,75,96,32,119,105,116,104,105,110,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,34,110,111,116,32,119,101,108,108,32,100,101,102,105,110,101,100,34,46,32,73,110,10,80,67,82,69,44,32,96,92,75,96,32,105,115,32,97,99,116,101,100,32,117,112,111,110,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,44,32,98,117,116,32,105,115,10,105,103,110,111,114,101,100,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,78,111,116,101,32,116,104,97,116,32,119,104,101,110,32,97,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,96,40,63,61,97,98,92,75,41,96,10,109,97,116,99,104,101,115,44,32,116,104,101,32,114,101,112,111,114,116,101,100,32,115,116,97,114,116,32,111,102,32,116,104,101,32,109,97,116,99,104,32,99,97,110,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,109,97,116,99,104,46,10,10,95,83,105,109,112,108,101,32,65,115,115,101,114,116,105,111,110,115,95,10,10,84,104,101,32,102,105,110,97,108,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,46,32,65,110,32,97,115,115,101,114,116,105,111,110,10,115,112,101,99,105,102,105,101,115,32,97,32,99,111,110,100,105,116,105,111,110,32,116,104,97,116,32,109,117,115,116,32,98,101,32,109,101,116,32,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,112,111,105,110,116,32,105,110,32,97,32,109,97,116,99,104,44,32,119,105,116,104,111,117,116,10,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,117,115,101,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,32,102,111,114,10,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,10,98,97,99,107,115,108,97,115,104,101,100,32,97,115,115,101,114,116,105,111,110,115,58,10,10,45,32,42,42,96,92,98,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46,10,10,45,32,42,42,96,92,66,96,42,42,32,45,32,77,97,116,99,104,101,115,32,119,104,101,110,32,110,111,116,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46,10,10,45,32,42,42,96,92,65,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,90,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,10,32,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,122,96,42,42,32,45,32,77,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,45,32,42,42,96,92,71,96,42,42,32,45,32,77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,10,10,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,92,98,96,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,10,99,104,97,114,97,99,116,101,114,46,32,73,102,32,97,110,121,32,111,116,104,101,114,32,111,102,32,116,104,101,115,101,32,97,115,115,101,114,116,105,111,110,115,32,97,112,112,101,97,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,10,100,101,102,97,117,108,116,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,96,92,66,96,32,109,97,116,99,104,101,115,10,116,104,101,32,108,101,116,116,101,114,32,66,41,46,10,10,65,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,104,101,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,104,97,114,97,99,116,101,114,10,97,110,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,97,114,97,99,116,101,114,32,100,111,32,110,111,116,32,98,111,116,104,32,109,97,116,99,104,32,96,92,119,96,32,111,114,32,96,92,87,96,32,40,116,104,97,116,32,105,115,44,32,111,110,101,32,109,97,116,99,104,101,115,10,96,92,119,96,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,109,97,116,99,104,101,115,32,96,92,87,96,41,44,32,111,114,32,116,104,101,32,115,116,97,114,116,32,111,114,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,102,32,116,104,101,32,102,105,114,115,116,10,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,96,92,119,96,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,73,110,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,96,92,119,96,10,97,110,100,32,96,92,87,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,117,99,112,96,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,100,111,110,101,44,32,105,116,32,97,108,115,111,10,97,102,102,101,99,116,115,32,96,92,98,96,32,97,110,100,32,96,92,66,96,46,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,111,32,110,111,116,32,104,97,118,101,32,97,32,115,101,112,97,114,97,116,101,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,111,114,10,34,101,110,100,32,111,102,32,119,111,114,100,34,32,109,101,116,97,115,101,113,117,101,110,99,101,46,32,72,111,119,101,118,101,114,44,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,96,92,98,96,32,110,111,114,109,97,108,108,121,32,100,101,116,101,114,109,105,110,101,115,10,119,104,105,99,104,32,105,116,32,105,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,114,97,103,109,101,110,116,32,96,92,98,97,96,32,109,97,116,99,104,101,115,32,34,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,119,111,114,100,46,10,10,84,104,101,32,96,92,65,96,44,32,96,92,90,96,44,32,97,110,100,32,96,92,122,96,32,97,115,115,101,114,116,105,111,110,115,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,10,100,111,108,108,97,114,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,32,105,110,32,116,104,97,116,32,116,104,101,121,32,111,110,108,121,32,101,118,101,114,32,109,97,116,99,104,32,97,116,32,116,104,101,32,118,101,114,121,10,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,97,116,101,118,101,114,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,46,32,84,104,117,115,44,32,116,104,101,121,32,97,114,101,10,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,46,32,84,104,101,115,101,32,116,104,114,101,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,10,111,112,116,105,111,110,115,32,96,110,111,116,98,111,108,96,32,111,114,32,96,110,111,116,101,111,108,96,44,32,119,104,105,99,104,32,97,102,102,101,99,116,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,10,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,32,96,114,117,110,47,51,96,32,105,115,10,110,111,110,45,122,101,114,111,44,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,109,97,116,99,104,105,110,103,32,105,115,32,116,111,32,115,116,97,114,116,32,97,116,32,97,32,112,111,105,110,116,32,111,116,104,101,114,32,116,104,97,110,32,116,104,101,10,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,96,92,65,96,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,46,32,84,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,96,92,90,96,32,97,110,100,10,96,92,122,96,32,105,115,32,116,104,97,116,32,96,92,90,96,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,97,110,100,32,97,116,32,116,104,101,10,118,101,114,121,32,101,110,100,44,32,119,104,105,108,101,32,96,92,122,96,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,46,10,10,84,104,101,32,96,92,71,96,32,97,115,115,101,114,116,105,111,110,32,105,115,32,116,114,117,101,32,111,110,108,121,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,116,104,101,10,115,116,97,114,116,32,112,111,105,110,116,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,10,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,32,73,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,96,92,65,96,32,119,104,101,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,105,115,10,110,111,110,45,122,101,114,111,46,32,66,121,32,99,97,108,108,105,110,103,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,97,112,112,114,111,112,114,105,97,116,101,10,97,114,103,117,109,101,110,116,115,44,32,121,111,117,32,99,97,110,32,109,105,109,105,99,32,116,104,101,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,103,96,44,32,97,110,100,32,105,116,32,105,115,32,105,110,32,116,104,105,115,32,107,105,110,100,32,111,102,10,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,119,104,101,114,101,32,96,92,71,96,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,10,10,78,111,116,105,99,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,32,116,104,101,32,80,67,82,69,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,96,92,71,96,44,32,97,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,10,99,117,114,114,101,110,116,32,109,97,116,99,104,44,32,105,115,32,115,117,98,116,108,121,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,44,32,119,104,105,99,104,32,100,101,102,105,110,101,115,32,105,116,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,112,114,101,118,105,111,117,115,32,109,97,116,99,104,46,32,73,110,32,80,101,114,108,44,32,116,104,101,115,101,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,116,104,101,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,10,115,116,114,105,110,103,32,119,97,115,32,101,109,112,116,121,46,32,65,115,32,80,67,82,69,32,100,111,101,115,32,111,110,108,121,32,111,110,101,32,109,97,116,99,104,32,97,116,32,97,32,116,105,109,101,44,32,105,116,32,99,97,110,110,111,116,32,114,101,112,114,111,100,117,99,101,10,116,104,105,115,32,98,101,104,97,118,105,111,114,46,10,10,73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,98,101,103,105,110,32,119,105,116,104,32,96,92,71,96,44,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,110,99,104,111,114,101,100,10,116,111,32,116,104,101,32,115,116,97,114,116,105,110,103,32,109,97,116,99,104,32,112,111,115,105,116,105,111,110,44,32,97,110,100,32,116,104,101,32,34,97,110,99,104,111,114,101,100,34,32,102,108,97,103,32,105,115,32,115,101,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,10,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,52,32,125,10,10,35,35,32,67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114,10,10,84,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,122,101,114,111,45,119,105,100,116,104,32,97,115,115,101,114,116,105,111,110,115,46,32,84,104,97,116,32,105,115,44,10,116,104,101,121,32,116,101,115,116,32,102,111,114,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,111,110,100,105,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,10,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,105,110,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,116,99,104,105,110,103,32,109,111,100,101,44,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,10,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,10,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,102,32,97,114,103,117,109,101,110,116,32,96,115,116,97,114,116,111,102,102,115,101,116,96,32,111,102,32,96,114,117,110,47,51,96,32,105,115,10,110,111,110,45,122,101,114,111,44,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,32,105,102,32,111,112,116,105,111,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,117,110,115,101,116,46,32,73,110,115,105,100,101,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,99,105,114,99,117,109,102,108,101,120,32,104,97,115,32,97,110,32,101,110,116,105,114,101,108,121,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,67,105,114,99,117,109,102,108,101,120,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,10,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,101,118,101,114,32,116,111,32,109,97,116,99,104,32,116,104,97,116,32,98,114,97,110,99,104,46,32,73,102,32,97,108,108,32,112,111,115,115,105,98,108,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,10,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,105,116,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,97,110,32,34,97,110,99,104,111,114,101,100,34,32,112,97,116,116,101,114,110,46,10,40,84,104,101,114,101,32,97,114,101,32,97,108,115,111,32,111,116,104,101,114,32,99,111,110,115,116,114,117,99,116,115,32,116,104,97,116,32,99,97,110,32,99,97,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,46,41,10,10,84,104,101,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,10,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,10,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,121,32,100,101,102,97,117,108,116,41,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,10,110,101,119,108,105,110,101,46,32,68,111,108,108,97,114,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,105,110,32,97,110,121,32,98,114,97,110,99,104,32,105,110,32,119,104,105,99,104,10,105,116,32,97,112,112,101,97,114,115,46,32,68,111,108,108,97,114,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,10,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,100,111,108,108,97,114,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,32,111,102,10,116,104,101,32,115,116,114,105,110,103,44,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,10,97,102,102,101,99,116,32,116,104,101,32,96,92,90,96,32,97,115,115,101,114,116,105,111,110,46,10,10,84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,99,104,97,110,103,101,100,32,105,102,32,111,112,116,105,111,110,10,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,97,32,99,105,114,99,117,109,102,108,101,120,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,10,97,102,116,101,114,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,97,110,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,116,32,100,111,101,115,32,110,111,116,10,109,97,116,99,104,32,97,102,116,101,114,32,97,32,110,101,119,108,105,110,101,32,116,104,97,116,32,101,110,100,115,32,116,104,101,32,115,116,114,105,110,103,46,32,65,32,100,111,108,108,97,114,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,110,121,32,110,101,119,108,105,110,101,115,10,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,101,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,32,87,104,101,110,32,110,101,119,108,105,110,101,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,105,115,111,108,97,116,101,100,32,67,82,32,97,110,100,32,76,70,32,99,104,97,114,97,99,116,101,114,115,32,100,111,10,110,111,116,32,105,110,100,105,99,97,116,101,32,110,101,119,108,105,110,101,115,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,96,47,94,97,98,99,36,47,96,32,109,97,116,99,104,101,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,100,101,102,92,92,110,97,98,99,34,32,40,119,104,101,114,101,10,92,92,110,32,114,101,112,114,101,115,101,110,116,115,32,97,32,110,101,119,108,105,110,101,41,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,98,117,116,32,110,111,116,32,111,116,104,101,114,119,105,115,101,46,32,83,111,44,32,112,97,116,116,101,114,110,115,10,116,104,97,116,32,97,114,101,32,97,110,99,104,111,114,101,100,32,105,110,32,115,105,110,103,108,101,45,108,105,110,101,32,109,111,100,101,32,98,101,99,97,117,115,101,32,97,108,108,32,98,114,97,110,99,104,101,115,32,115,116,97,114,116,32,119,105,116,104,32,94,32,97,114,101,32,110,111,116,10,97,110,99,104,111,114,101,100,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,97,110,100,32,97,32,109,97,116,99,104,32,102,111,114,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,112,111,115,115,105,98,108,101,32,119,104,101,110,32,97,114,103,117,109,101,110,116,10,95,115,116,97,114,116,111,102,102,115,101,116,95,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,105,115,32,110,111,110,45,122,101,114,111,46,32,79,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,105,115,10,105,103,110,111,114,101,100,32,105,102,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,65,96,44,32,96,92,90,96,44,32,97,110,100,32,96,92,122,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,116,97,114,116,32,97,110,100,10,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,110,32,98,111,116,104,32,109,111,100,101,115,46,32,73,102,32,97,108,108,32,98,114,97,110,99,104,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,32,119,105,116,104,32,96,92,65,96,44,10,105,116,32,105,115,32,97,108,119,97,121,115,32,97,110,99,104,111,114,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,101,116,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,53,32,125,10,10,35,35,32,70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,92,78,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,10,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,101,120,99,101,112,116,32,40,98,121,32,100,101,102,97,117,108,116,41,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,10,10,87,104,101,110,32,97,32,108,105,110,101,32,101,110,100,105,110,103,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,100,111,116,32,110,101,118,101,114,32,109,97,116,99,104,101,115,32,116,104,97,116,10,99,104,97,114,97,99,116,101,114,46,32,87,104,101,110,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,117,115,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,10,105,102,32,105,116,32,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,10,40,105,110,99,108,117,100,105,110,103,32,105,115,111,108,97,116,101,100,32,67,82,115,32,97,110,100,32,76,70,115,41,46,32,87,104,101,110,32,97,110,121,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,44,10,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,44,32,76,70,44,32,111,114,32,97,110,121,32,111,102,32,116,104,101,32,111,116,104,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,100,111,116,32,114,101,103,97,114,100,105,110,103,32,110,101,119,108,105,110,101,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,46,32,73,102,32,111,112,116,105,111,110,32,96,100,111,116,97,108,108,96,32,105,115,10,115,101,116,44,32,97,32,100,111,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,44,32,119,105,116,104,111,117,116,32,101,120,99,101,112,116,105,111,110,46,32,73,102,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,10,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,116,97,107,101,115,32,116,119,111,32,100,111,116,115,32,116,111,32,109,97,116,99,104,32,105,116,46,10,10,84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,111,116,32,105,115,32,101,110,116,105,114,101,108,121,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,10,100,111,108,108,97,114,44,32,116,104,101,32,111,110,108,121,32,114,101,108,97,116,105,111,110,115,104,105,112,32,105,115,32,116,104,97,116,32,98,111,116,104,32,105,110,118,111,108,118,101,32,110,101,119,108,105,110,101,115,46,32,68,111,116,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,10,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,10,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,78,96,32,98,101,104,97,118,101,115,32,108,105,107,101,32,97,32,100,111,116,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,10,111,112,116,105,111,110,32,96,80,67,82,69,95,68,79,84,65,76,76,96,46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,111,110,101,32,116,104,97,116,10,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,96,92,78,96,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,32,98,117,116,10,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,54,32,125,10,10,35,35,32,77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,67,96,32,109,97,116,99,104,101,115,32,97,110,121,32,100,97,116,97,32,117,110,105,116,44,10,114,101,103,97,114,100,108,101,115,115,32,105,102,32,97,32,85,84,70,32,109,111,100,101,32,105,115,32,115,101,116,46,32,79,110,101,32,100,97,116,97,32,117,110,105,116,32,105,115,32,111,110,101,32,98,121,116,101,46,32,85,110,108,105,107,101,32,97,32,100,111,116,44,32,96,92,67,96,10,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,102,101,97,116,117,114,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,80,101,114,108,32,116,111,32,109,97,116,99,104,10,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,105,110,32,85,84,70,45,56,32,109,111,100,101,44,32,98,117,116,32,105,116,32,105,115,32,117,110,99,108,101,97,114,32,104,111,119,32,105,116,32,99,97,110,32,117,115,101,102,117,108,108,121,32,98,101,32,117,115,101,100,46,10,65,115,32,96,92,67,96,32,98,114,101,97,107,115,32,117,112,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,44,32,109,97,116,99,104,105,110,103,32,111,110,101,32,117,110,105,116,32,119,105,116,104,10,96,92,67,96,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,32,97,32,109,97,108,102,111,114,109,101,100,32,85,84,70,10,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,114,101,115,117,108,116,115,44,32,97,115,32,80,67,82,69,32,97,115,115,117,109,101,115,32,116,104,97,116,32,105,116,32,100,101,97,108,115,32,119,105,116,104,32,118,97,108,105,100,10,85,84,70,32,115,116,114,105,110,103,115,46,10,10,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,96,92,67,96,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,32,105,110,10,97,32,85,84,70,32,109,111,100,101,44,32,97,115,32,116,104,105,115,32,119,111,117,108,100,32,109,97,107,101,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,10,108,111,111,107,98,101,104,105,110,100,46,10,10,84,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,105,115,32,98,101,115,116,32,97,118,111,105,100,101,100,46,32,72,111,119,101,118,101,114,44,32,111,110,101,32,119,97,121,32,111,102,32,117,115,105,110,103,32,105,116,32,116,104,97,116,10,97,118,111,105,100,115,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,116,111,32,117,115,101,32,97,32,108,111,111,107,97,104,101,97,100,32,116,111,32,99,104,101,99,107,10,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,10,119,105,116,104,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58,10,10,96,96,96,116,101,120,116,10,40,63,124,32,40,63,61,91,92,120,48,48,45,92,120,55,102,93,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,56,48,45,92,120,123,55,102,102,125,93,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,56,48,48,125,45,92,120,123,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,49,48,48,48,48,125,45,92,120,123,49,102,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,40,92,67,41,41,10,96,96,96,10,10,65,32,103,114,111,117,112,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,40,63,124,32,114,101,115,101,116,115,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,110,117,109,98,101,114,115,32,105,110,32,101,97,99,104,10,97,108,116,101,114,110,97,116,105,118,101,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,41,46,32,84,104,101,10,97,115,115,101,114,116,105,111,110,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,32,99,104,101,99,107,32,116,104,101,32,110,101,120,116,32,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,32,102,111,114,32,118,97,108,117,101,115,10,119,104,111,115,101,32,101,110,99,111,100,105,110,103,32,117,115,101,115,32,49,44,32,50,44,32,51,44,32,111,114,32,52,32,98,121,116,101,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,111,102,10,116,104,101,32,99,104,97,114,97,99,116,101,114,32,97,114,101,32,116,104,101,110,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,110,117,109,98,101,114,32,111,102,32,103,114,111,117,112,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,55,32,125,10,10,35,35,32,83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,10,10,65,110,32,111,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,99,108,111,115,105,110,103,10,115,113,117,97,114,101,32,98,114,97,99,107,101,116,46,32,65,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,115,112,101,99,105,97,108,32,98,121,32,100,101,102,97,117,108,116,46,10,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,80,67,82,69,95,74,65,86,65,83,67,82,73,80,84,95,67,79,77,80,65,84,96,32,105,115,32,115,101,116,44,32,97,32,108,111,110,101,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,10,98,114,97,99,107,101,116,32,99,97,117,115,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,32,73,102,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,10,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,40,97,102,116,101,114,10,97,110,32,105,110,105,116,105,97,108,32,99,105,114,99,117,109,102,108,101,120,44,32,105,102,32,112,114,101,115,101,110,116,41,32,111,114,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46,10,10,65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,116,104,101,10,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,100,97,116,97,32,117,110,105,116,32,108,111,110,103,46,32,65,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,105,110,10,116,104,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,44,32,117,110,108,101,115,115,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,10,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,32,105,115,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,115,117,98,106,101,99,116,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,110,111,116,10,98,101,32,105,110,32,116,104,101,32,115,101,116,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,46,32,73,102,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,10,116,104,101,32,99,108,97,115,115,44,32,101,110,115,117,114,101,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,101,115,99,97,112,101,32,105,116,32,119,105,116,104,32,97,10,98,97,99,107,115,108,97,115,104,46,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,96,91,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,44,32,119,104,105,108,101,10,96,91,94,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,10,99,105,114,99,117,109,102,108,101,120,32,105,115,32,106,117,115,116,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,10,105,110,32,116,104,101,32,99,108,97,115,115,32,98,121,32,101,110,117,109,101,114,97,116,105,110,103,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,46,32,65,32,99,108,97,115,115,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,97,10,99,105,114,99,117,109,102,108,101,120,32,105,115,32,110,111,116,32,97,110,32,97,115,115,101,114,116,105,111,110,59,32,105,116,32,115,116,105,108,108,32,99,111,110,115,117,109,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,10,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,105,116,32,102,97,105,108,115,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,101,114,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,10,115,116,114,105,110,103,46,10,10,73,110,32,85,84,70,45,56,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,40,48,120,102,102,102,102,41,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,99,108,97,115,115,10,97,115,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,111,114,32,98,121,32,117,115,105,110,103,32,116,104,101,32,96,92,120,123,96,32,101,115,99,97,112,105,110,103,32,109,101,99,104,97,110,105,115,109,46,10,10,87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,97,110,121,32,108,101,116,116,101,114,115,32,105,110,32,97,32,99,108,97,115,115,32,114,101,112,114,101,115,101,110,116,32,98,111,116,104,32,116,104,101,105,114,10,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,118,101,114,115,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,99,97,115,101,108,101,115,115,32,96,91,97,101,105,111,117,93,96,32,109,97,116,99,104,101,115,32,34,65,34,10,97,110,100,32,34,97,34,44,32,97,110,100,32,97,32,99,97,115,101,108,101,115,115,32,96,91,94,97,101,105,111,117,93,96,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,65,34,44,32,98,117,116,32,97,32,99,97,115,101,102,117,108,32,118,101,114,115,105,111,110,10,119,111,117,108,100,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,97,108,119,97,121,115,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,10,119,104,111,115,101,32,118,97,108,117,101,115,32,97,114,101,32,60,32,50,53,54,44,32,115,111,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,46,32,70,111,114,32,99,104,97,114,97,99,116,101,114,115,10,119,105,116,104,32,104,105,103,104,101,114,32,118,97,108,117,101,115,44,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,105,115,32,115,117,112,112,111,114,116,101,100,32,111,110,108,121,32,105,102,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,10,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,110,32,97,32,85,84,70,10,109,111,100,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,62,61,44,32,101,110,115,117,114,101,32,116,104,97,116,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,10,115,117,112,112,111,114,116,32,97,110,100,32,119,105,116,104,32,85,84,70,32,115,117,112,112,111,114,116,46,10,10,67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,99,97,110,32,105,110,100,105,99,97,116,101,32,108,105,110,101,32,98,114,101,97,107,115,32,97,114,101,32,110,101,118,101,114,32,116,114,101,97,116,101,100,32,105,110,32,97,110,121,32,115,112,101,99,105,97,108,32,119,97,121,10,119,104,101,110,32,109,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,44,32,119,104,97,116,101,118,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,115,101,113,117,101,110,99,101,32,105,115,32,105,110,32,117,115,101,44,32,97,110,100,10,119,104,97,116,101,118,101,114,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,115,32,96,80,67,82,69,95,68,79,84,65,76,76,96,32,97,110,100,32,96,80,67,82,69,95,77,85,76,84,73,76,73,78,69,96,32,105,115,32,117,115,101,100,46,32,65,32,99,108,97,115,115,10,115,117,99,104,32,97,115,32,96,91,94,97,93,96,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,109,105,110,117,115,32,40,104,121,112,104,101,110,41,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,112,101,99,105,102,121,32,97,32,114,97,110,103,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,10,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,100,45,109,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,98,101,116,119,101,101,110,32,100,32,97,110,100,32,109,44,10,105,110,99,108,117,115,105,118,101,46,32,73,102,32,97,32,109,105,110,117,115,32,99,104,97,114,97,99,116,101,114,32,105,115,32,114,101,113,117,105,114,101,100,32,105,110,32,97,32,99,108,97,115,115,44,32,105,116,32,109,117,115,116,32,98,101,32,101,115,99,97,112,101,100,32,119,105,116,104,10,97,32,98,97,99,107,115,108,97,115,104,32,111,114,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,105,116,32,99,97,110,110,111,116,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,100,105,99,97,116,105,110,103,10,97,32,114,97,110,103,101,44,32,116,121,112,105,99,97,108,108,121,32,97,115,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,10,97,102,116,101,114,32,97,32,114,97,110,103,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,98,45,100,45,122,93,96,32,109,97,116,99,104,101,115,32,108,101,116,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,98,32,116,111,32,100,44,32,97,10,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,122,46,10,10,84,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,34,93,34,32,99,97,110,110,111,116,32,98,101,32,116,104,101,32,101,110,100,32,99,104,97,114,97,99,116,101,114,32,111,102,32,97,32,114,97,110,103,101,46,32,65,32,112,97,116,116,101,114,110,32,115,117,99,104,10,97,115,32,96,91,87,45,93,52,54,93,96,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,111,102,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,40,34,87,34,32,97,110,100,32,34,45,34,41,32,102,111,108,108,111,119,101,100,10,98,121,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,34,52,54,93,34,44,32,115,111,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,87,52,54,93,34,32,111,114,32,34,45,52,54,93,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,34,93,34,10,105,115,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,114,97,110,103,101,44,32,115,111,10,96,91,87,45,92,93,52,54,93,96,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,99,111,110,116,97,105,110,105,110,103,32,97,32,114,97,110,103,101,32,102,111,108,108,111,119,101,100,32,98,121,32,116,119,111,32,111,116,104,101,114,10,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,34,93,34,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,116,111,10,101,110,100,32,97,32,114,97,110,103,101,46,10,10,65,110,32,101,114,114,111,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,32,80,79,83,73,88,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,115,101,101,32,98,101,108,111,119,41,32,111,114,32,97,110,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,32,111,116,104,101,114,32,116,104,97,110,32,111,110,101,32,116,104,97,116,32,100,101,102,105,110,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,101,97,114,115,32,97,116,32,97,32,112,111,105,110,116,32,119,104,101,114,101,10,97,32,114,97,110,103,101,32,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,32,105,115,32,101,120,112,101,99,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,122,45,92,120,102,102,93,96,32,105,115,32,118,97,108,105,100,44,32,98,117,116,10,96,91,65,45,92,100,93,96,32,97,110,100,32,96,91,65,45,91,58,100,105,103,105,116,58,93,93,96,32,97,114,101,32,110,111,116,46,10,10,82,97,110,103,101,115,32,111,112,101,114,97,116,101,32,105,110,32,116,104,101,32,99,111,108,108,97,116,105,110,103,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,46,32,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,10,117,115,101,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,110,117,109,101,114,105,99,97,108,108,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,96,91,92,48,48,48,45,92,48,51,55,93,96,46,32,82,97,110,103,101,115,10,99,97,110,32,105,110,99,108,117,100,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,118,97,108,105,100,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,46,10,10,73,102,32,97,32,114,97,110,103,101,32,116,104,97,116,32,105,110,99,108,117,100,101,115,32,108,101,116,116,101,114,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,105,116,10,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,115,32,105,110,32,101,105,116,104,101,114,32,99,97,115,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,87,45,99,93,96,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,10,96,96,32,91,93,91,92,92,94,95,96,119,120,121,122,97,98,99,93,32,96,96,44,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,46,32,73,110,32,97,32,110,111,110,45,85,84,70,32,109,111,100,101,44,32,105,102,32,99,104,97,114,97,99,116,101,114,10,116,97,98,108,101,115,32,102,111,114,32,97,32,70,114,101,110,99,104,32,108,111,99,97,108,101,32,97,114,101,32,105,110,32,117,115,101,44,32,96,91,92,120,99,56,45,92,120,99,98,93,96,32,109,97,116,99,104,101,115,32,97,99,99,101,110,116,101,100,32,69,10,99,104,97,114,97,99,116,101,114,115,32,105,110,32,98,111,116,104,32,99,97,115,101,115,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,10,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,111,110,108,121,32,119,104,101,110,32,105,116,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,10,115,117,112,112,111,114,116,46,10,10,84,104,101,32,99,104,97,114,97,99,116,101,114,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,96,92,100,96,44,32,96,92,68,96,44,32,96,92,104,96,44,32,96,92,72,96,44,32,96,92,112,96,44,32,96,92,80,96,44,32,96,92,115,96,44,32,96,92,83,96,44,32,96,92,118,96,44,32,96,92,86,96,44,10,96,92,119,96,44,32,97,110,100,32,96,92,87,96,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,110,100,32,97,100,100,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,10,109,97,116,99,104,32,116,111,32,116,104,101,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,96,91,92,100,65,66,67,68,69,70,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,73,110,10,85,84,70,32,109,111,100,101,115,44,32,111,112,116,105,111,110,32,96,117,99,112,96,32,97,102,102,101,99,116,115,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,96,92,100,96,44,32,96,92,115,96,44,32,96,92,119,96,32,97,110,100,32,116,104,101,105,114,10,117,112,112,101,114,99,97,115,101,32,112,97,114,116,110,101,114,115,44,32,106,117,115,116,32,97,115,32,105,116,32,100,111,101,115,32,119,104,101,110,32,116,104,101,121,32,97,112,112,101,97,114,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115,93,40,96,109,58,114,101,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115,96,41,32,101,97,114,108,105,101,114,46,32,84,104,101,32,101,115,99,97,112,101,10,115,101,113,117,101,110,99,101,32,96,92,98,96,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,10,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,96,92,66,96,44,32,96,92,78,96,44,32,96,92,82,96,44,32,97,110,100,32,96,92,88,96,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,10,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,97,110,121,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,10,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,78,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,10,10,65,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,99,111,110,118,101,110,105,101,110,116,108,121,32,98,101,32,117,115,101,100,32,119,105,116,104,32,116,104,101,32,117,112,112,101,114,99,97,115,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,32,116,111,10,115,112,101,99,105,102,121,32,97,32,109,111,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,108,111,119,101,114,99,97,115,101,32,116,121,112,101,46,10,70,111,114,32,101,120,97,109,112,108,101,44,32,99,108,97,115,115,32,96,91,94,92,87,95,93,96,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,111,114,32,100,105,103,105,116,44,32,98,117,116,32,110,111,116,32,117,110,100,101,114,115,99,111,114,101,44,10,119,104,105,108,101,32,96,91,92,119,93,96,32,105,110,99,108,117,100,101,115,32,117,110,100,101,114,115,99,111,114,101,46,32,65,32,112,111,115,105,116,105,118,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,116,111,32,98,101,32,114,101,97,100,32,97,115,10,34,115,111,109,101,116,104,105,110,103,32,79,82,32,115,111,109,101,116,104,105,110,103,32,79,82,32,46,46,46,34,32,97,110,100,32,97,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,32,97,115,32,34,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,10,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,46,46,46,34,46,10,10,79,110,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,58,10,10,45,32,66,97,99,107,115,108,97,115,104,10,45,32,72,121,112,104,101,110,32,40,111,110,108,121,32,119,104,101,114,101,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,97,32,114,97,110,103,101,41,10,45,32,67,105,114,99,117,109,102,108,101,120,32,40,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,41,10,45,32,79,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,40,111,110,108,121,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,116,114,111,100,117,99,105,110,103,32,97,32,80,111,115,105,120,10,32,32,99,108,97,115,115,32,110,97,109,101,44,32,111,114,32,102,111,114,32,97,32,115,112,101,99,105,97,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,102,101,97,116,117,114,101,59,32,115,101,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,115,101,99,116,105,111,110,115,41,10,45,32,84,101,114,109,105,110,97,116,105,110,103,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,10,10,72,111,119,101,118,101,114,44,32,101,115,99,97,112,105,110,103,32,111,116,104,101,114,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,100,111,101,115,32,110,111,32,104,97,114,109,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,56,32,125,10,10,35,35,32,80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115,10,10,80,101,114,108,32,115,117,112,112,111,114,116,115,32,116,104,101,32,80,111,115,105,120,32,110,111,116,97,116,105,111,110,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,105,115,32,117,115,101,115,32,110,97,109,101,115,32,101,110,99,108,111,115,101,100,10,98,121,32,96,91,58,96,32,97,110,100,32,96,58,93,96,32,119,105,116,104,105,110,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,80,67,82,69,32,97,108,115,111,32,115,117,112,112,111,114,116,115,32,116,104,105,115,10,110,111,116,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,48,34,44,32,34,49,34,44,32,97,110,121,32,97,108,112,104,97,98,101,116,105,99,32,99,104,97,114,97,99,116,101,114,44,10,111,114,32,34,37,34,58,10,10,96,96,96,116,101,120,116,10,91,48,49,91,58,97,108,112,104,97,58,93,37,93,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,115,117,112,112,111,114,116,101,100,32,99,108,97,115,115,32,110,97,109,101,115,58,10,10,45,32,42,42,97,108,110,117,109,42,42,32,45,32,76,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,10,10,45,32,42,42,97,108,112,104,97,42,42,32,45,32,76,101,116,116,101,114,115,10,10,45,32,42,42,98,108,97,110,107,42,42,32,45,32,83,112,97,99,101,32,111,114,32,116,97,98,32,111,110,108,121,10,10,45,32,42,42,99,110,116,114,108,42,42,32,45,32,67,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,115,10,10,45,32,42,42,100,105,103,105,116,42,42,32,45,32,68,101,99,105,109,97,108,32,100,105,103,105,116,115,32,40,115,97,109,101,32,97,115,32,96,92,100,96,41,10,10,45,32,42,42,103,114,97,112,104,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,115,112,97,99,101,10,10,45,32,42,42,108,111,119,101,114,42,42,32,45,32,76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,10,10,45,32,42,42,112,114,105,110,116,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,115,112,97,99,101,10,10,45,32,42,42,112,117,110,99,116,42,42,32,45,32,80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,108,101,116,116,101,114,115,44,32,100,105,103,105,116,115,44,32,97,110,100,32,115,112,97,99,101,10,10,45,32,42,42,115,112,97,99,101,42,42,32,45,32,87,104,105,116,101,115,112,97,99,101,32,40,116,104,101,32,115,97,109,101,32,97,115,32,96,92,115,96,32,102,114,111,109,32,80,67,82,69,32,56,46,51,52,41,10,10,45,32,42,42,117,112,112,101,114,42,42,32,45,32,85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,10,10,45,32,42,42,119,111,114,100,42,42,32,45,32,34,87,111,114,100,34,32,99,104,97,114,97,99,116,101,114,115,32,40,115,97,109,101,32,97,115,32,96,92,119,96,41,10,10,45,32,42,42,120,100,105,103,105,116,42,42,32,45,32,72,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,10,10,84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,96,97,115,99,105,105,96,44,32,116,104,97,116,32,101,114,114,111,110,101,111,117,115,108,121,32,109,97,116,99,104,101,115,32,76,97,116,105,110,45,49,10,99,104,97,114,97,99,116,101,114,115,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,48,45,49,50,55,32,114,97,110,103,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,80,79,83,73,88,46,32,84,104,105,115,32,99,97,110,110,111,116,32,98,101,32,102,105,120,101,100,10,119,105,116,104,111,117,116,32,97,108,116,101,114,105,110,103,32,116,104,101,32,98,101,104,97,118,105,111,117,114,32,111,102,32,111,116,104,101,114,32,99,108,97,115,115,101,115,44,32,115,111,32,119,101,32,114,101,99,111,109,109,101,110,100,32,109,97,116,99,104,105,110,103,32,116,104,101,10,114,97,110,103,101,32,119,105,116,104,32,96,91,92,92,48,45,92,120,55,102,93,96,32,105,110,115,116,101,97,100,46,10,10,84,104,101,32,100,101,102,97,117,108,116,32,34,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,10,97,110,100,32,115,112,97,99,101,32,40,51,50,41,46,32,73,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,44,32,116,104,101,32,108,105,115,116,32,111,102,32,115,112,97,99,101,10,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,100,105,102,102,101,114,101,110,116,59,32,116,104,101,114,101,32,109,97,121,32,98,101,32,102,101,119,101,114,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,109,46,32,34,83,112,97,99,101,34,32,117,115,101,100,32,116,111,10,98,101,32,100,105,102,102,101,114,101,110,116,32,116,111,32,96,92,115,96,44,32,119,104,105,99,104,32,100,105,100,32,110,111,116,32,105,110,99,108,117,100,101,32,86,84,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,10,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,34,83,112,97,99,101,34,32,97,110,100,32,96,92,115,96,10,110,111,119,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,10,10,84,104,101,32,110,97,109,101,32,34,119,111,114,100,34,32,105,115,32,97,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,44,32,97,110,100,32,34,98,108,97,110,107,34,32,105,115,32,97,32,71,78,85,32,101,120,116,101,110,115,105,111,110,32,102,114,111,109,32,80,101,114,108,10,53,46,56,46,32,65,110,111,116,104,101,114,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,32,105,115,32,110,101,103,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,94,32,99,104,97,114,97,99,116,101,114,10,97,102,116,101,114,32,116,104,101,32,99,111,108,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,49,34,44,32,34,50,34,44,32,111,114,32,97,110,121,32,110,111,110,45,100,105,103,105,116,58,10,10,96,96,96,116,101,120,116,10,91,49,50,91,58,94,100,105,103,105,116,58,93,93,10,96,96,96,10,10,80,67,82,69,32,40,97,110,100,32,80,101,114,108,41,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,32,116,104,101,32,80,111,115,105,120,32,115,121,110,116,97,120,32,96,91,46,99,104,46,93,96,32,97,110,100,32,96,91,61,99,104,61,93,96,32,119,104,101,114,101,32,34,99,104,34,10,105,115,32,97,32,34,99,111,108,108,97,116,105,110,103,32,101,108,101,109,101,110,116,34,44,32,98,117,116,32,116,104,101,115,101,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,97,110,100,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,10,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,100,111,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,111,102,32,116,104,101,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,10,99,108,97,115,115,101,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32,96,80,67,82,69,95,85,67,80,96,32,105,115,32,112,97,115,115,101,100,32,116,111,32,96,112,99,114,101,95,99,111,109,112,105,108,101,40,41,96,44,32,115,111,109,101,32,111,102,10,116,104,101,32,99,108,97,115,115,101,115,32,97,114,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,84,104,105,115,32,105,115,10,97,99,104,105,101,118,101,100,32,98,121,32,114,101,112,108,97,99,105,110,103,32,99,101,114,116,97,105,110,32,80,111,115,105,120,32,99,108,97,115,115,101,115,32,98,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,91,58,97,108,110,117,109,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,97,110,125,96,95,10,10,45,32,42,42,96,91,58,97,108,112,104,97,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,125,96,95,10,10,45,32,42,42,96,91,58,98,108,97,110,107,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,104,96,95,10,10,45,32,42,42,96,91,58,100,105,103,105,116,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,78,100,125,96,95,10,10,45,32,42,42,96,91,58,108,111,119,101,114,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,108,125,96,95,10,10,45,32,42,42,96,91,58,115,112,97,99,101,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,112,115,125,96,95,10,10,45,32,42,42,96,91,58,117,112,112,101,114,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,76,117,125,96,95,10,10,45,32,42,42,96,91,58,119,111,114,100,58,93,96,42,42,32,45,32,66,101,99,111,109,101,115,32,95,96,92,112,123,88,119,100,125,96,95,10,10,78,101,103,97,116,101,100,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,97,115,32,96,91,58,94,97,108,112,104,97,58,93,96,44,32,117,115,101,32,96,92,80,96,32,105,110,115,116,101,97,100,32,111,102,32,96,92,112,96,46,32,84,104,114,101,101,32,111,116,104,101,114,32,80,79,83,73,88,10,99,108,97,115,115,101,115,32,97,114,101,32,104,97,110,100,108,101,100,32,115,112,101,99,105,97,108,108,121,32,105,110,32,85,67,80,32,109,111,100,101,58,10,10,45,32,42,42,96,91,58,103,114,97,112,104,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,103,108,121,112,104,115,32,116,104,97,116,32,109,97,114,107,32,116,104,101,32,112,97,103,101,10,32,32,119,104,101,110,32,112,114,105,110,116,101,100,46,32,73,110,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,116,101,114,109,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,76,44,10,32,32,77,44,32,78,44,32,80,44,32,83,44,32,111,114,32,67,102,32,112,114,111,112,101,114,116,105,101,115,44,32,101,120,99,101,112,116,32,102,111,114,58,10,10,32,32,45,32,42,42,85,43,48,54,49,67,42,42,32,45,32,65,114,97,98,105,99,32,76,101,116,116,101,114,32,77,97,114,107,10,10,32,32,45,32,42,42,85,43,49,56,48,69,42,42,32,45,32,77,111,110,103,111,108,105,97,110,32,86,111,119,101,108,32,83,101,112,97,114,97,116,111,114,10,10,32,32,45,32,42,42,85,43,50,48,54,54,32,45,32,85,43,50,48,54,57,42,42,32,45,32,86,97,114,105,111,117,115,32,34,105,115,111,108,97,116,101,34,115,10,10,45,32,42,42,96,91,58,112,114,105,110,116,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,96,91,58,103,114,97,112,104,58,93,96,32,112,108,117,115,32,115,112,97,99,101,10,32,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,99,111,110,116,114,111,108,115,44,32,116,104,97,116,32,105,115,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,90,115,32,112,114,111,112,101,114,116,121,46,10,10,45,32,42,42,96,91,58,112,117,110,99,116,58,93,96,42,42,32,45,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,85,110,105,99,111,100,101,32,80,10,32,32,40,112,117,110,99,116,117,97,116,105,111,110,41,32,112,114,111,112,101,114,116,121,44,32,112,108,117,115,32,116,104,111,115,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,108,101,115,115,32,116,104,97,110,10,32,32,49,50,56,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,83,32,40,83,121,109,98,111,108,41,32,112,114,111,112,101,114,116,121,46,10,10,84,104,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,117,110,99,104,97,110,103,101,100,44,32,97,110,100,32,109,97,116,99,104,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,10,112,111,105,110,116,115,32,108,101,115,115,32,116,104,97,110,32,49,50,56,46,10,10,95,67,111,109,112,97,116,105,98,105,108,105,116,121,32,70,101,97,116,117,114,101,32,102,111,114,32,87,111,114,100,32,66,111,117,110,100,97,114,105,101,115,95,10,10,73,110,32,116,104,101,32,80,79,83,73,88,46,50,32,99,111,109,112,108,105,97,110,116,32,108,105,98,114,97,114,121,32,116,104,97,116,32,119,97,115,32,105,110,99,108,117,100,101,100,32,105,110,32,52,46,52,66,83,68,32,85,110,105,120,44,32,116,104,101,32,117,103,108,121,10,115,121,110,116,97,120,32,96,91,91,58,60,58,93,93,96,32,97,110,100,32,96,91,91,58,62,58,93,93,96,32,105,115,32,117,115,101,100,32,102,111,114,32,109,97,116,99,104,105,110,103,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,97,110,100,32,34,101,110,100,32,111,102,10,119,111,114,100,34,46,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,115,101,32,105,116,101,109,115,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,96,91,91,58,60,58,93,93,96,42,42,32,45,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,92,98,40,63,61,92,119,41,96,10,10,45,32,42,42,96,91,91,58,62,58,93,93,96,42,42,32,45,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,96,92,98,40,63,60,61,92,119,41,96,10,10,79,110,108,121,32,116,104,101,115,101,32,101,120,97,99,116,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,46,32,65,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,10,96,91,97,91,58,60,58,93,98,93,96,32,112,114,111,118,111,107,101,115,32,101,114,114,111,114,32,102,111,114,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,80,79,83,73,88,32,99,108,97,115,115,32,110,97,109,101,46,32,84,104,105,115,32,115,117,112,112,111,114,116,32,105,115,10,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,105,115,32,112,114,111,118,105,100,101,100,32,116,111,32,104,101,108,112,32,109,105,103,114,97,116,105,111,110,115,32,102,114,111,109,32,111,116,104,101,114,10,101,110,118,105,114,111,110,109,101,110,116,115,44,32,97,110,100,32,105,115,32,98,101,115,116,32,110,111,116,32,117,115,101,100,32,105,110,32,97,110,121,32,110,101,119,32,112,97,116,116,101,114,110,115,46,32,78,111,116,101,32,116,104,97,116,32,96,92,98,96,32,109,97,116,99,104,101,115,32,97,116,10,116,104,101,32,115,116,97,114,116,32,97,110,100,32,116,104,101,32,101,110,100,32,111,102,32,97,32,119,111,114,100,32,40,115,101,101,32,34,83,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,34,32,97,98,111,118,101,41,44,32,97,110,100,32,105,110,32,97,10,80,101,114,108,45,115,116,121,108,101,32,112,97,116,116,101,114,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,111,114,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,110,111,114,109,97,108,108,121,32,115,104,111,119,115,32,119,104,105,99,104,32,105,115,10,119,97,110,116,101,100,44,32,119,105,116,104,111,117,116,32,116,104,101,32,110,101,101,100,32,102,111,114,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,97,98,111,118,101,32,105,110,32,111,114,100,101,114,32,116,111,32,103,105,118,101,10,101,120,97,99,116,108,121,32,116,104,101,32,80,79,83,73,88,32,98,101,104,97,118,105,111,117,114,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,57,32,125,10,10,35,35,32,86,101,114,116,105,99,97,108,32,66,97,114,10,10,86,101,114,116,105,99,97,108,32,98,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,97,108,116,101,114,110,97,116,105,118,101,32,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,34,103,105,108,98,101,114,116,34,32,111,114,32,34,115,117,108,108,105,118,97,110,34,58,10,10,96,96,96,116,101,120,116,10,103,105,108,98,101,114,116,124,115,117,108,108,105,118,97,110,10,96,96,96,10,10,65,110,121,32,110,117,109,98,101,114,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,97,112,112,101,97,114,44,32,97,110,100,32,97,110,32,101,109,112,116,121,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,112,101,114,109,105,116,116,101,100,10,40,109,97,116,99,104,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,41,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,10,116,117,114,110,44,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,105,115,32,117,115,101,100,46,32,73,102,32,116,104,101,10,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,100,101,102,105,110,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,41,44,32,34,115,117,99,99,101,101,100,115,34,32,109,101,97,110,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,109,97,105,110,10,112,97,116,116,101,114,110,32,97,110,100,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,48,32,125,10,10,35,35,32,73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103,10,10,84,104,101,32,115,101,116,116,105,110,103,115,32,111,102,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,96,99,97,115,101,108,101,115,115,96,44,32,96,109,117,108,116,105,108,105,110,101,96,44,32,96,100,111,116,97,108,108,96,44,10,97,110,100,32,96,101,120,116,101,110,100,101,100,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,114,111,109,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,80,101,114,108,10,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,101,110,99,108,111,115,101,100,32,98,101,116,119,101,101,110,32,34,40,63,34,32,97,110,100,32,34,41,34,46,32,84,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,45,32,42,42,105,42,42,32,45,32,70,111,114,32,96,99,97,115,101,108,101,115,115,96,10,10,45,32,42,42,109,42,42,32,45,32,70,111,114,32,96,109,117,108,116,105,108,105,110,101,96,10,10,45,32,42,42,115,42,42,32,45,32,70,111,114,32,96,100,111,116,97,108,108,96,10,10,45,32,42,42,120,42,42,32,45,32,70,111,114,32,96,101,120,116,101,110,100,101,100,96,10,10,70,111,114,32,101,120,97,109,112,108,101,44,32,96,40,63,105,109,41,96,32,115,101,116,115,32,99,97,115,101,108,101,115,115,44,32,109,117,108,116,105,108,105,110,101,32,109,97,116,99,104,105,110,103,46,32,84,104,101,115,101,32,111,112,116,105,111,110,115,32,99,97,110,32,97,108,115,111,10,98,101,32,117,110,115,101,116,32,98,121,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,108,101,116,116,101,114,32,119,105,116,104,32,97,32,104,121,112,104,101,110,46,32,65,32,99,111,109,98,105,110,101,100,32,115,101,116,116,105,110,103,32,97,110,100,32,117,110,115,101,116,116,105,110,103,10,115,117,99,104,32,97,115,32,96,40,63,105,109,45,115,120,41,96,44,32,119,104,105,99,104,32,115,101,116,115,32,96,99,97,115,101,108,101,115,115,96,32,97,110,100,32,96,109,117,108,116,105,108,105,110,101,96,44,32,119,104,105,108,101,32,117,110,115,101,116,116,105,110,103,10,96,100,111,116,97,108,108,96,32,97,110,100,32,96,101,120,116,101,110,100,101,100,96,44,32,105,115,32,97,108,115,111,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,97,32,108,101,116,116,101,114,32,97,112,112,101,97,114,115,32,98,111,116,104,32,98,101,102,111,114,101,32,97,110,100,10,97,102,116,101,114,32,116,104,101,32,104,121,112,104,101,110,44,32,116,104,101,32,111,112,116,105,111,110,32,105,115,32,117,110,115,101,116,46,10,10,84,104,101,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,96,100,117,112,110,97,109,101,115,96,44,32,96,117,110,103,114,101,101,100,121,96,44,32,97,110,100,32,96,101,120,116,114,97,96,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,105,110,10,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,98,121,32,117,115,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,74,44,32,85,44,32,97,110,100,32,88,10,114,101,115,112,101,99,116,105,118,101,108,121,46,10,10,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,111,110,32,99,104,97,110,103,101,115,32,111,99,99,117,114,115,32,97,116,32,116,111,112,45,108,101,118,101,108,32,40,116,104,97,116,32,105,115,44,32,110,111,116,32,105,110,115,105,100,101,10,115,117,98,112,97,116,116,101,114,110,32,112,97,114,101,110,116,104,101,115,101,115,41,44,32,116,104,101,32,99,104,97,110,103,101,32,97,112,112,108,105,101,115,32,116,111,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,116,104,97,116,10,102,111,108,108,111,119,115,46,10,10,65,110,32,111,112,116,105,111,110,32,99,104,97,110,103,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,83,117,98,112,97,116,116,101,114,110,115,93,40,96,109,58,114,101,35,115,101,99,116,49,49,96,41,41,10,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,97,116,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,116,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,109,97,116,99,104,101,115,32,97,98,99,32,97,110,100,32,97,66,99,32,97,110,100,32,110,111,32,111,116,104,101,114,32,115,116,114,105,110,103,115,32,40,97,115,115,117,109,105,110,103,32,96,99,97,115,101,108,101,115,115,96,32,105,115,32,110,111,116,32,117,115,101,100,41,58,10,10,96,96,96,116,101,120,116,10,40,97,40,63,105,41,98,41,99,10,96,96,96,10,10,66,121,32,116,104,105,115,32,109,101,97,110,115,44,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,115,101,116,116,105,110,103,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,112,97,114,116,115,10,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,99,104,97,110,103,101,115,32,109,97,100,101,32,105,110,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,100,111,32,99,97,114,114,121,32,111,110,32,105,110,116,111,32,115,117,98,115,101,113,117,101,110,116,10,98,114,97,110,99,104,101,115,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,40,63,105,41,98,124,99,41,10,96,96,96,10,10,109,97,116,99,104,101,115,32,34,97,98,34,44,32,34,97,66,34,44,32,34,99,34,44,32,97,110,100,32,34,67,34,44,32,97,108,116,104,111,117,103,104,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,67,34,32,116,104,101,32,102,105,114,115,116,32,98,114,97,110,99,104,32,105,115,10,97,98,97,110,100,111,110,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,102,102,101,99,116,115,32,111,102,32,111,112,116,105,111,110,10,115,101,116,116,105,110,103,115,32,111,99,99,117,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,101,114,101,32,119,111,117,108,100,32,98,101,32,115,111,109,101,32,119,101,105,114,100,32,98,101,104,97,118,105,111,114,32,111,116,104,101,114,119,105,115,101,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,79,116,104,101,114,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,119,104,101,110,32,116,104,101,32,99,111,109,112,105,108,105,110,103,10,62,32,111,114,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,115,112,101,99,105,97,108,10,62,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,40,92,42,67,82,76,70,41,44,32,116,111,32,111,118,101,114,114,105,100,101,32,119,104,97,116,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,104,97,115,32,115,101,116,10,62,32,111,114,32,119,104,97,116,32,104,97,115,32,98,101,101,110,32,100,101,102,97,117,108,116,101,100,46,32,68,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,105,110,32,115,101,99,116,105,111,110,10,62,32,91,78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115,96,41,32,101,97,114,108,105,101,114,46,10,62,10,62,32,84,104,101,32,40,42,85,84,70,56,41,32,97,110,100,32,40,42,85,67,80,41,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,116,32,85,84,70,32,97,110,100,32,85,110,105,99,111,100,101,10,62,32,112,114,111,112,101,114,116,121,32,109,111,100,101,115,46,32,84,104,101,121,32,97,114,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,115,32,96,117,110,105,99,111,100,101,96,32,97,110,100,32,96,117,99,112,96,44,10,62,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,32,105,115,32,97,32,103,101,110,101,114,105,99,32,118,101,114,115,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,10,62,32,97,110,121,32,111,102,32,116,104,101,32,108,105,98,114,97,114,105,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,99,97,110,32,115,101,116,32,111,112,116,105,111,110,32,96,110,101,118,101,114,95,117,116,102,96,44,10,62,32,119,104,105,99,104,32,108,111,99,107,115,32,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,49,32,125,10,10,35,35,32,83,117,98,112,97,116,116,101,114,110,115,10,10,83,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,112,97,114,101,110,116,104,101,115,101,115,32,40,114,111,117,110,100,32,98,114,97,99,107,101,116,115,41,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,10,84,117,114,110,105,110,103,32,112,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,116,119,111,32,116,104,105,110,103,115,58,10,10,45,32,42,42,49,46,42,42,32,45,32,73,116,32,108,111,99,97,108,105,122,101,115,32,97,32,115,101,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,32,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,99,97,116,97,114,97,99,116,34,44,32,34,99,97,116,101,114,112,105,108,108,97,114,34,44,32,111,114,32,34,99,97,116,34,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,99,97,116,40,97,114,97,99,116,124,101,114,112,105,108,108,97,114,124,41,10,32,32,96,96,96,10,10,32,32,87,105,116,104,111,117,116,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,44,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,99,97,116,97,114,97,99,116,34,44,32,34,101,114,112,105,108,108,97,114,34,44,32,111,114,32,97,110,32,101,109,112,116,121,10,32,32,115,116,114,105,110,103,46,10,10,45,32,42,42,50,46,42,42,32,45,32,73,116,32,115,101,116,115,32,117,112,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,10,32,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,116,104,97,116,32,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,116,104,114,111,117,103,104,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,10,32,32,96,114,117,110,47,51,96,46,10,10,79,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,40,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,41,32,116,111,32,111,98,116,97,105,110,10,110,117,109,98,101,114,115,32,102,111,114,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,114,101,100,32,107,105,110,103,34,10,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,114,101,100,10,107,105,110,103,34,44,32,34,114,101,100,34,44,32,97,110,100,32,34,107,105,110,103,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,44,32,50,44,32,97,110,100,32,51,44,32,114,101,115,112,101,99,116,105,118,101,108,121,58,10,10,96,96,96,116,101,120,116,10,116,104,101,32,40,40,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41,10,96,96,96,10,10,73,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,104,101,108,112,102,117,108,32,116,104,97,116,32,112,108,97,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,102,117,108,102,105,108,108,32,116,119,111,32,102,117,110,99,116,105,111,110,115,46,32,79,102,116,101,110,32,97,10,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,111,117,116,32,97,32,99,97,112,116,117,114,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,46,32,73,102,32,97,110,32,111,112,101,110,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,97,110,100,32,97,32,99,111,108,111,110,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,10,100,111,32,97,110,121,32,99,97,112,116,117,114,105,110,103,44,32,97,110,100,32,105,115,32,110,111,116,32,99,111,117,110,116,101,100,32,119,104,101,110,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,110,121,32,115,117,98,115,101,113,117,101,110,116,10,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,119,104,105,116,101,32,113,117,101,101,110,34,32,105,115,32,109,97,116,99,104,101,100,10,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,119,104,105,116,101,32,113,117,101,101,110,34,32,97,110,100,10,34,113,117,101,101,110,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,32,97,110,100,32,50,58,10,10,96,96,96,116,101,120,116,10,116,104,101,32,40,40,63,58,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41,10,96,96,96,10,10,84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,54,53,53,51,53,46,10,10,65,115,32,97,32,99,111,110,118,101,110,105,101,110,116,32,115,104,111,114,116,104,97,110,100,44,32,105,102,32,97,110,121,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,97,114,101,32,114,101,113,117,105,114,101,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,10,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,34,63,34,32,97,110,100,32,34,58,34,46,10,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,115,116,114,105,110,103,115,58,10,10,96,96,96,116,101,120,116,10,40,63,105,58,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,40,63,58,40,63,105,41,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,96,96,96,10,10,65,115,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,97,114,101,32,116,114,105,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,111,112,116,105,111,110,115,32,97,114,101,32,110,111,116,32,114,101,115,101,116,10,117,110,116,105,108,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,97,99,104,101,100,44,32,97,110,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,105,110,32,111,110,101,32,98,114,97,110,99,104,32,100,111,101,115,10,97,102,102,101,99,116,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,44,32,115,111,32,116,104,101,32,97,98,111,118,101,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,98,111,116,104,32,34,83,85,78,68,65,89,34,32,97,110,100,10,34,83,97,116,117,114,100,97,121,34,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,50,32,125,10,10,35,35,32,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,10,10,80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,97,32,102,101,97,116,117,114,101,32,119,104,101,114,101,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,10,115,97,109,101,32,110,117,109,98,101,114,115,32,102,111,114,32,105,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46,32,83,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,96,40,63,124,96,10,97,110,100,32,105,115,32,105,116,115,101,108,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,124,40,83,97,116,41,117,114,124,40,83,117,110,41,41,100,97,121,10,96,96,96,10,10,65,115,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,115,105,100,101,32,97,32,96,40,63,124,96,32,103,114,111,117,112,44,32,98,111,116,104,32,115,101,116,115,32,111,102,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,111,110,101,46,32,84,104,117,115,44,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,121,111,117,32,99,97,110,32,108,111,111,107,32,97,116,10,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,110,117,109,98,101,114,32,111,110,101,44,32,119,104,105,99,104,101,118,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,99,111,110,115,116,114,117,99,116,32,105,115,10,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,99,97,112,116,117,114,101,32,97,32,112,97,114,116,44,32,98,117,116,32,110,111,116,32,97,108,108,44,32,111,102,32,111,110,101,32,111,102,32,109,97,110,121,10,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,110,115,105,100,101,32,97,32,96,40,63,124,96,32,103,114,111,117,112,44,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,116,104,101,10,110,117,109,98,101,114,32,105,115,32,114,101,115,101,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,46,32,84,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,110,121,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,102,111,108,108,111,119,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,32,97,102,116,101,114,32,116,104,101,32,104,105,103,104,101,115,116,32,110,117,109,98,101,114,32,117,115,101,100,32,105,110,10,97,110,121,32,98,114,97,110,99,104,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,105,115,32,102,114,111,109,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,59,32,116,104,101,32,110,117,109,98,101,114,115,10,117,110,100,101,114,110,101,97,116,104,32,115,104,111,119,32,105,110,32,119,104,105,99,104,32,98,117,102,102,101,114,32,116,104,101,32,99,97,112,116,117,114,101,100,32,99,111,110,116,101,110,116,32,105,115,32,115,116,111,114,101,100,58,10,10,96,96,96,116,101,120,116,10,35,32,98,101,102,111,114,101,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,98,114,97,110,99,104,45,114,101,115,101,116,45,45,45,45,45,45,45,45,45,45,45,32,97,102,116,101,114,10,47,32,40,32,97,32,41,32,32,40,63,124,32,120,32,40,32,121,32,41,32,122,32,124,32,40,112,32,40,113,41,32,114,41,32,124,32,40,116,41,32,117,32,40,118,41,32,41,32,40,32,122,32,41,32,47,120,10,35,32,49,32,32,32,32,32,32,32,32,32,32,32,32,50,32,32,32,32,32,32,32,32,32,50,32,32,51,32,32,32,32,32,32,32,32,50,32,32,32,32,32,51,32,32,32,32,32,52,10,96,96,96,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,118,97,108,117,101,32,116,104,97,116,32,105,115,32,115,101,116,10,102,111,114,32,116,104,97,116,32,110,117,109,98,101,114,32,98,121,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,10,34,100,101,102,100,101,102,34,58,10,10,96,96,96,116,101,120,116,10,47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,92,49,47,10,96,96,96,10,10,73,110,32,99,111,110,116,114,97,115,116,44,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,114,101,102,101,114,115,32,116,111,32,116,104,101,10,102,105,114,115,116,32,111,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,10,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,97,98,99,34,58,10,10,96,96,96,116,101,120,116,10,47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,40,63,49,41,47,10,96,96,96,10,10,73,102,32,97,32,99,111,110,100,105,116,105,111,110,32,116,101,115,116,32,102,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,118,105,110,103,32,109,97,116,99,104,101,100,32,114,101,102,101,114,115,32,116,111,32,97,32,110,111,110,45,117,110,105,113,117,101,10,110,117,109,98,101,114,44,32,116,104,101,32,116,101,115,116,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,118,101,32,109,97,116,99,104,101,100,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,117,115,105,110,103,32,116,104,105,115,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,102,101,97,116,117,114,101,32,105,115,32,116,111,32,117,115,101,32,100,117,112,108,105,99,97,116,101,10,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,51,32,125,10,10,35,35,32,78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115,10,10,73,100,101,110,116,105,102,121,105,110,103,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,98,121,32,110,117,109,98,101,114,32,105,115,32,115,105,109,112,108,101,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,104,97,114,100,32,116,111,10,107,101,101,112,32,116,114,97,99,107,32,111,102,32,116,104,101,32,110,117,109,98,101,114,115,32,105,110,32,99,111,109,112,108,105,99,97,116,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,46,32,65,108,115,111,44,32,105,102,32,97,110,10,101,120,112,114,101,115,115,105,111,110,32,105,115,32,109,111,100,105,102,105,101,100,44,32,116,104,101,32,110,117,109,98,101,114,115,32,99,97,110,32,99,104,97,110,103,101,46,32,84,111,32,104,101,108,112,32,119,105,116,104,32,116,104,105,115,32,100,105,102,102,105,99,117,108,116,121,44,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,110,97,109,105,110,103,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,110,111,116,32,97,100,100,101,100,32,116,111,32,80,101,114,108,10,117,110,116,105,108,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,80,121,116,104,111,110,32,104,97,100,32,116,104,101,32,102,101,97,116,117,114,101,32,101,97,114,108,105,101,114,44,32,97,110,100,32,80,67,82,69,32,105,110,116,114,111,100,117,99,101,100,32,105,116,32,97,116,10,114,101,108,101,97,115,101,32,52,46,48,44,32,117,115,105,110,103,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,67,82,69,32,110,111,119,32,115,117,112,112,111,114,116,115,32,98,111,116,104,32,116,104,101,32,80,101,114,108,32,97,110,100,32,116,104,101,10,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,101,114,108,32,97,108,108,111,119,115,32,105,100,101,110,116,105,99,97,108,108,121,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,10,110,97,109,101,115,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,46,10,10,73,110,32,80,67,82,69,44,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,110,97,109,101,100,32,105,110,32,111,110,101,32,111,102,32,116,104,114,101,101,32,119,97,121,115,58,32,96,40,63,60,110,97,109,101,62,46,46,46,41,96,32,111,114,10,96,40,63,39,110,97,109,101,39,46,46,46,41,96,32,97,115,32,105,110,32,80,101,114,108,44,32,111,114,32,96,40,63,80,60,110,97,109,101,62,46,46,46,41,96,32,97,115,32,105,110,32,80,121,116,104,111,110,46,32,82,101,102,101,114,101,110,99,101,115,32,116,111,10,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,102,114,111,109,32,111,116,104,101,114,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,115,117,99,104,32,97,115,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,44,10,114,101,99,117,114,115,105,111,110,44,32,97,110,100,32,99,111,110,100,105,116,105,111,110,115,44,32,99,97,110,32,98,101,32,109,97,100,101,32,98,121,32,110,97,109,101,32,97,110,100,32,98,121,32,110,117,109,98,101,114,46,10,10,78,97,109,101,115,32,99,111,110,115,105,115,116,32,111,102,32,117,112,32,116,111,32,51,50,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,115,44,32,98,117,116,32,109,117,115,116,10,115,116,97,114,116,32,119,105,116,104,32,97,32,110,111,110,45,100,105,103,105,116,46,32,78,97,109,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,115,116,105,108,108,32,97,108,108,111,99,97,116,101,100,32,110,117,109,98,101,114,115,10,97,115,32,119,101,108,108,32,97,115,32,110,97,109,101,115,44,32,101,120,97,99,116,108,121,32,97,115,32,105,102,32,116,104,101,32,110,97,109,101,115,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,101,32,96,99,97,112,116,117,114,101,96,10,115,112,101,99,105,102,105,99,97,116,105,111,110,32,116,111,32,96,114,117,110,47,51,96,32,99,97,110,32,117,115,101,32,110,97,109,101,100,32,118,97,108,117,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,32,110,97,109,101,32,109,117,115,116,32,98,101,32,117,110,105,113,117,101,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,44,32,98,117,116,32,116,104,105,115,32,99,111,110,115,116,114,97,105,110,116,32,99,97,110,32,98,101,10,114,101,108,97,120,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,100,117,112,110,97,109,101,115,96,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,40,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,10,97,108,119,97,121,115,32,112,101,114,109,105,116,116,101,100,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,115,101,116,32,117,112,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,10,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,32,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,116,116,101,114,110,115,32,119,104,101,114,101,32,111,110,108,121,32,111,110,101,10,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,109,97,116,99,104,46,32,83,117,112,112,111,115,101,32,116,104,97,116,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,104,101,10,110,97,109,101,32,111,102,32,97,32,119,101,101,107,100,97,121,44,32,101,105,116,104,101,114,32,97,115,32,97,32,51,45,108,101,116,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,32,111,114,32,97,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,44,32,97,110,100,32,105,110,10,98,111,116,104,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,101,120,116,114,97,99,116,32,116,104,101,32,97,98,98,114,101,118,105,97,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,40,105,103,110,111,114,105,110,103,10,116,104,101,32,108,105,110,101,32,98,114,101,97,107,115,41,32,100,111,101,115,32,116,104,101,32,106,111,98,58,10,10,96,96,96,116,101,120,116,10,40,63,60,68,78,62,77,111,110,124,70,114,105,124,83,117,110,41,40,63,58,100,97,121,41,63,124,10,40,63,60,68,78,62,84,117,101,41,40,63,58,115,100,97,121,41,63,124,10,40,63,60,68,78,62,87,101,100,41,40,63,58,110,101,115,100,97,121,41,63,124,10,40,63,60,68,78,62,84,104,117,41,40,63,58,114,115,100,97,121,41,63,124,10,40,63,60,68,78,62,83,97,116,41,40,63,58,117,114,100,97,121,41,63,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,102,105,118,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,115,116,114,105,110,103,115,44,32,98,117,116,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,115,101,116,32,97,102,116,101,114,32,97,32,109,97,116,99,104,46,32,40,65,110,10,97,108,116,101,114,110,97,116,105,118,101,32,119,97,121,32,111,102,32,115,111,108,118,105,110,103,32,116,104,105,115,32,112,114,111,98,108,101,109,32,105,115,32,116,111,32,117,115,101,32,97,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,115,117,98,112,97,116,116,101,114,110,44,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,10,10,70,111,114,32,99,97,112,116,117,114,105,110,103,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,119,104,105,99,104,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,117,110,105,113,117,101,44,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,10,111,99,99,117,114,114,101,110,99,101,32,40,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,41,32,105,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,96,114,117,110,47,51,96,44,10,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,96,118,97,108,117,101,115,96,32,112,97,114,116,32,111,102,32,116,104,101,32,96,99,97,112,116,117,114,101,96,32,115,116,97,116,101,109,101,110,116,46,32,84,104,101,10,96,97,108,108,95,110,97,109,101,115,96,32,99,97,112,116,117,114,105,110,103,32,118,97,108,117,101,32,109,97,116,99,104,101,115,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,116,119,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,10,62,32,115,97,109,101,32,110,117,109,98,101,114,44,32,97,115,32,80,67,82,69,32,117,115,101,115,32,111,110,108,121,32,116,104,101,32,110,117,109,98,101,114,115,32,119,104,101,110,32,109,97,116,99,104,105,110,103,46,32,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,32,97,110,10,62,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,105,102,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,10,62,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,115,112,101,99,105,102,121,32,116,104,101,32,115,97,109,101,32,110,97,109,101,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,10,62,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,101,118,101,110,32,119,104,101,110,32,96,100,117,112,110,97,109,101,115,96,32,105,115,32,110,111,116,32,115,101,116,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,52,32,125,10,10,35,35,32,82,101,112,101,116,105,116,105,111,110,10,10,82,101,112,101,116,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,113,117,97,110,116,105,102,105,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,102,111,108,108,111,119,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,105,116,101,109,115,58,10,10,45,32,65,32,108,105,116,101,114,97,108,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,10,45,32,84,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,10,45,32,84,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,84,104,101,32,96,92,88,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,84,104,101,32,96,92,82,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,10,45,32,65,110,32,101,115,99,97,112,101,32,115,117,99,104,32,97,115,32,96,92,100,96,32,111,114,32,96,92,112,76,96,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,10,45,32,65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,45,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,10,45,32,65,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,40,105,110,99,108,117,100,105,110,103,32,97,115,115,101,114,116,105,111,110,115,41,10,45,32,65,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,114,101,99,117,114,115,105,118,101,32,111,114,32,111,116,104,101,114,119,105,115,101,41,10,10,84,104,101,32,103,101,110,101,114,97,108,32,114,101,112,101,116,105,116,105,111,110,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,32,109,105,110,105,109,117,109,32,97,110,100,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,10,112,101,114,109,105,116,116,101,100,32,109,97,116,99,104,101,115,44,32,98,121,32,103,105,118,105,110,103,32,116,104,101,32,116,119,111,32,110,117,109,98,101,114,115,32,105,110,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,40,98,114,97,99,101,115,41,44,10,115,101,112,97,114,97,116,101,100,32,98,121,32,97,32,99,111,109,109,97,46,32,84,104,101,32,110,117,109,98,101,114,115,32,109,117,115,116,32,98,101,32,60,32,54,53,53,51,54,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,109,117,115,116,32,98,101,32,108,101,115,115,10,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,115,101,99,111,110,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,122,122,34,44,32,34,122,122,122,34,44,32,111,114,10,34,122,122,122,122,34,58,10,10,96,96,96,116,101,120,116,10,122,123,50,44,52,125,10,96,96,96,10,10,65,32,99,108,111,115,105,110,103,32,98,114,97,99,101,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,97,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,105,115,10,111,109,105,116,116,101,100,44,32,98,117,116,32,116,104,101,32,99,111,109,109,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,114,101,32,105,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,10,97,110,100,32,116,104,101,32,99,111,109,109,97,32,97,114,101,32,98,111,116,104,32,111,109,105,116,116,101,100,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,101,120,97,99,116,32,110,117,109,98,101,114,32,111,102,10,114,101,113,117,105,114,101,100,32,109,97,116,99,104,101,115,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,116,104,114,101,101,32,115,117,99,99,101,115,115,105,118,101,32,118,111,119,101,108,115,44,10,98,117,116,32,99,97,110,32,109,97,116,99,104,32,109,97,110,121,32,109,111,114,101,58,10,10,96,96,96,116,101,120,116,10,91,97,101,105,111,117,93,123,51,44,125,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,101,120,97,99,116,108,121,32,101,105,103,104,116,32,100,105,103,105,116,115,58,10,10,96,96,96,116,101,120,116,10,92,100,123,56,125,10,96,96,96,10,10,65,110,32,111,112,101,110,105,110,103,32,99,117,114,108,121,32,98,114,97,99,107,101,116,32,116,104,97,116,32,97,112,112,101,97,114,115,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,10,97,108,108,111,119,101,100,44,32,111,114,32,111,110,101,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,121,110,116,97,120,32,111,102,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,105,115,32,116,97,107,101,110,32,97,115,32,97,10,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,123,44,54,92,125,32,105,115,32,110,111,116,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,10,111,102,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46,10,10,73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,113,117,97,110,116,105,102,105,101,114,115,32,97,112,112,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,10,117,110,105,116,115,46,32,84,104,117,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,96,92,120,123,49,48,48,125,123,50,125,96,32,109,97,116,99,104,101,115,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,10,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,50,45,98,121,116,101,32,115,101,113,117,101,110,99,101,32,105,110,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,46,32,83,105,109,105,108,97,114,108,121,44,32,96,92,88,123,51,125,96,10,109,97,116,99,104,101,115,32,116,104,114,101,101,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,99,97,110,32,98,101,32,109,97,110,121,32,100,97,116,97,10,117,110,105,116,115,32,108,111,110,103,32,40,97,110,100,32,116,104,101,121,32,99,97,110,32,98,101,32,111,102,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,41,46,10,10,84,104,101,32,113,117,97,110,116,105,102,105,101,114,32,92,123,48,92,125,32,105,115,32,112,101,114,109,105,116,116,101,100,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,116,111,32,98,101,104,97,118,101,32,97,115,32,105,102,32,116,104,101,10,112,114,101,118,105,111,117,115,32,105,116,101,109,32,97,110,100,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,10,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,40,98,117,116,32,115,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,10,91,68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,98,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121,93,40,96,109,58,114,101,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115,96,41,41,46,10,73,116,101,109,115,32,111,116,104,101,114,32,116,104,97,110,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,104,97,118,101,32,97,32,92,123,48,92,125,32,113,117,97,110,116,105,102,105,101,114,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,10,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,46,10,10,70,111,114,32,99,111,110,118,101,110,105,101,110,99,101,44,32,116,104,101,32,116,104,114,101,101,32,109,111,115,116,32,99,111,109,109,111,110,32,113,117,97,110,116,105,102,105,101,114,115,32,104,97,118,101,32,115,105,110,103,108,101,45,99,104,97,114,97,99,116,101,114,10,97,98,98,114,101,118,105,97,116,105,111,110,115,58,10,10,45,32,42,42,92,42,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,48,44,92,125,10,10,45,32,42,42,43,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,49,44,92,125,10,10,45,32,42,42,63,42,42,32,45,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,92,123,48,44,49,92,125,10,10,73,110,102,105,110,105,116,101,32,108,111,111,112,115,32,99,97,110,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,102,111,108,108,111,119,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,109,97,116,99,104,32,110,111,10,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,97,32,113,117,97,110,116,105,102,105,101,114,32,116,104,97,116,32,104,97,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,63,41,42,10,96,96,96,10,10,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,32,97,110,100,32,80,67,82,69,32,117,115,101,100,32,116,111,32,103,105,118,101,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,102,111,114,32,115,117,99,104,10,112,97,116,116,101,114,110,115,46,32,72,111,119,101,118,101,114,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,44,32,115,117,99,104,32,112,97,116,116,101,114,110,115,10,97,114,101,32,110,111,119,32,97,99,99,101,112,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,110,121,32,114,101,112,101,116,105,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,10,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,108,111,111,112,32,105,115,32,102,111,114,99,105,98,108,121,32,98,114,111,107,101,110,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,34,103,114,101,101,100,121,34,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,109,97,116,99,104,32,97,115,32,109,117,99,104,32,97,115,10,112,111,115,115,105,98,108,101,32,40,117,112,32,116,111,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,116,105,109,101,115,41,44,32,119,105,116,104,111,117,116,32,99,97,117,115,105,110,103,32,116,104,101,10,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,114,101,32,116,104,105,115,32,103,105,118,101,115,32,112,114,111,98,108,101,109,115,32,105,115,10,105,110,32,116,114,121,105,110,103,32,116,111,32,109,97,116,99,104,32,99,111,109,109,101,110,116,115,32,105,110,32,67,32,112,114,111,103,114,97,109,115,46,32,84,104,101,115,101,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,47,95,32,97,110,100,32,95,47,46,10,87,105,116,104,105,110,32,116,104,101,32,99,111,109,109,101,110,116,44,32,105,110,100,105,118,105,100,117,97,108,32,92,42,32,97,110,100,32,47,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,46,32,65,110,32,97,116,116,101,109,112,116,32,116,111,10,109,97,116,99,104,32,67,32,99,111,109,109,101,110,116,115,32,98,121,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,47,92,42,46,42,92,42,47,10,96,96,96,10,10,116,111,32,116,104,101,32,115,116,114,105,110,103,10,10,96,96,96,116,101,120,116,10,47,42,32,102,105,114,115,116,32,99,111,109,109,101,110,116,32,42,47,32,32,110,111,116,32,99,111,109,109,101,110,116,32,32,47,42,32,115,101,99,111,110,100,32,99,111,109,109,101,110,116,32,42,47,10,96,96,96,10,10,102,97,105,108,115,44,32,97,115,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,111,119,105,110,103,32,116,111,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,46,92,42,32,105,116,101,109,46,10,10,72,111,119,101,118,101,114,44,32,105,102,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,44,32,105,116,32,99,101,97,115,101,115,32,116,111,32,98,101,32,103,114,101,101,100,121,44,10,97,110,100,32,105,110,115,116,101,97,100,32,109,97,116,99,104,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,112,111,115,115,105,98,108,101,44,32,115,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,112,97,116,116,101,114,110,32,100,111,101,115,32,116,104,101,32,114,105,103,104,116,32,116,104,105,110,103,32,119,105,116,104,32,116,104,101,32,67,32,99,111,109,109,101,110,116,115,58,10,10,96,96,96,116,101,120,116,10,47,92,42,46,42,63,92,42,47,10,96,96,96,10,10,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,118,97,114,105,111,117,115,32,113,117,97,110,116,105,102,105,101,114,115,32,105,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32,99,104,97,110,103,101,100,44,32,111,110,108,121,32,116,104,101,10,112,114,101,102,101,114,114,101,100,32,110,117,109,98,101,114,32,111,102,32,109,97,116,99,104,101,115,46,32,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,116,104,105,115,32,117,115,101,32,111,102,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,119,105,116,104,32,105,116,115,10,117,115,101,32,97,115,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,110,32,105,116,115,32,111,119,110,32,114,105,103,104,116,46,32,65,115,32,105,116,32,104,97,115,32,116,119,111,32,117,115,101,115,44,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,10,97,112,112,101,97,114,32,100,111,117,98,108,101,100,44,32,97,115,32,105,110,10,10,96,96,96,116,101,120,116,10,92,100,63,63,92,100,10,96,96,96,10,10,119,104,105,99,104,32,109,97,116,99,104,101,115,32,111,110,101,32,100,105,103,105,116,32,98,121,32,112,114,101,102,101,114,101,110,99,101,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,105,102,32,116,104,97,116,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,10,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,46,10,10,73,102,32,111,112,116,105,111,110,32,96,117,110,103,114,101,101,100,121,96,32,105,115,32,115,101,116,32,40,97,110,32,111,112,116,105,111,110,32,116,104,97,116,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,80,101,114,108,41,44,32,116,104,101,10,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,105,110,100,105,118,105,100,117,97,108,32,111,110,101,115,32,99,97,110,32,98,101,32,109,97,100,101,32,103,114,101,101,100,121,32,98,121,10,102,111,108,108,111,119,105,110,103,32,116,104,101,109,32,119,105,116,104,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,110,118,101,114,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,46,10,10,87,104,101,110,32,97,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,113,117,97,110,116,105,102,105,101,100,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,114,101,112,101,97,116,32,99,111,117,110,116,32,116,104,97,116,10,105,115,32,62,32,49,32,111,114,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,109,97,120,105,109,117,109,44,32,109,111,114,101,32,109,101,109,111,114,121,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,116,104,101,32,99,111,109,112,105,108,101,100,10,112,97,116,116,101,114,110,44,32,105,110,32,112,114,111,112,111,114,116,105,111,110,32,116,111,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,105,110,105,109,117,109,32,111,114,32,109,97,120,105,109,117,109,46,10,10,73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,46,92,42,32,111,114,32,46,92,123,48,44,92,125,32,97,110,100,32,111,112,116,105,111,110,32,96,100,111,116,97,108,108,96,32,40,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,10,111,112,116,105,111,110,32,96,47,115,96,41,32,105,115,32,115,101,116,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,100,111,116,32,116,111,32,109,97,116,99,104,32,110,101,119,108,105,110,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,44,32,98,101,99,97,117,115,101,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,105,115,32,116,114,105,101,100,32,97,103,97,105,110,115,116,32,101,118,101,114,121,32,99,104,97,114,97,99,116,101,114,10,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,83,111,44,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,114,101,116,114,121,105,110,103,32,116,104,101,32,111,118,101,114,97,108,108,10,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,115,105,116,105,111,110,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,46,32,80,67,82,69,32,110,111,114,109,97,108,108,121,32,116,114,101,97,116,115,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,97,115,32,105,102,10,105,116,32,119,97,115,32,112,114,101,99,101,100,101,100,32,98,121,32,96,92,65,96,46,10,10,73,110,32,99,97,115,101,115,32,119,104,101,114,101,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,111,32,110,101,119,108,105,110,101,115,44,32,105,116,32,105,115,10,119,111,114,116,104,32,115,101,116,116,105,110,103,32,96,100,111,116,97,108,108,96,32,116,111,32,111,98,116,97,105,110,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,44,32,111,114,32,97,108,116,101,114,110,97,116,105,118,101,108,121,32,117,115,105,110,103,32,94,32,116,111,10,105,110,100,105,99,97,116,101,32,97,110,99,104,111,114,105,110,103,32,101,120,112,108,105,99,105,116,108,121,46,10,10,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,87,104,101,110,32,46,92,42,32,105,115,10,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,115,117,98,106,101,99,116,32,111,102,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,101,108,115,101,119,104,101,114,101,10,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,10,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,46,42,41,97,98,99,92,49,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,120,121,122,49,50,51,97,98,99,49,50,51,34,44,32,116,104,101,32,109,97,116,99,104,32,112,111,105,110,116,32,105,115,32,116,104,101,32,102,111,117,114,116,104,32,99,104,97,114,97,99,116,101,114,46,10,84,104,101,114,101,102,111,114,101,44,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,46,10,10,65,110,111,116,104,101,114,32,99,97,115,101,32,119,104,101,114,101,32,105,109,112,108,105,99,105,116,32,97,110,99,104,111,114,105,110,103,32,105,115,32,110,111,116,32,97,112,112,108,105,101,100,32,105,115,32,119,104,101,110,32,116,104,101,32,108,101,97,100,105,110,103,32,46,92,42,32,105,115,10,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,97,103,97,105,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,10,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,62,46,42,63,97,41,98,10,96,96,96,10,10,73,116,32,109,97,116,99,104,101,115,32,34,97,98,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,34,97,97,98,34,46,32,84,104,101,32,117,115,101,32,111,102,32,116,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,115,10,40,42,80,82,85,78,69,41,32,97,110,100,32,40,42,83,75,73,80,41,32,97,108,115,111,32,100,105,115,97,98,108,101,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,46,10,10,87,104,101,110,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,112,101,97,116,101,100,44,32,116,104,101,32,118,97,108,117,101,32,99,97,112,116,117,114,101,100,32,105,115,32,116,104,101,32,115,117,98,115,116,114,105,110,103,10,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,102,105,110,97,108,32,105,116,101,114,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114,10,10,96,96,96,116,101,120,116,10,40,116,119,101,101,100,108,101,91,100,117,109,101,93,123,51,125,92,115,42,41,43,10,96,96,96,10,10,104,97,115,32,109,97,116,99,104,101,100,32,34,116,119,101,101,100,108,101,100,117,109,32,116,119,101,101,100,108,101,100,101,101,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,10,34,116,119,101,101,100,108,101,100,101,101,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,101,115,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,116,104,101,10,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,115,101,116,32,105,110,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,115,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,97,102,116,101,114,10,10,96,96,96,116,101,120,116,10,47,40,97,124,40,98,41,41,43,47,10,96,96,96,10,10,109,97,116,99,104,101,115,32,34,97,98,97,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,98,34,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,53,32,125,10,10,35,35,32,65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115,10,10,87,105,116,104,32,98,111,116,104,32,109,97,120,105,109,105,122,105,110,103,32,40,34,103,114,101,101,100,121,34,41,32,97,110,100,32,109,105,110,105,109,105,122,105,110,103,32,40,34,117,110,103,114,101,101,100,121,34,32,111,114,32,34,108,97,122,121,34,41,10,114,101,112,101,116,105,116,105,111,110,44,32,102,97,105,108,117,114,101,32,111,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,110,111,114,109,97,108,108,121,32,99,97,117,115,101,115,32,116,104,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,32,116,111,32,98,101,10,114,101,45,101,118,97,108,117,97,116,101,100,32,116,111,32,115,101,101,32,105,102,32,97,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,32,111,102,32,114,101,112,101,97,116,115,32,97,108,108,111,119,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,10,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,46,32,83,111,109,101,116,105,109,101,115,32,105,116,32,105,115,32,117,115,101,102,117,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,105,115,44,32,101,105,116,104,101,114,32,116,111,32,99,104,97,110,103,101,32,116,104,101,10,110,97,116,117,114,101,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,111,114,32,116,111,32,99,97,117,115,101,32,105,116,32,116,111,32,102,97,105,108,32,101,97,114,108,105,101,114,32,116,104,97,110,32,105,116,32,111,116,104,101,114,119,105,115,101,32,109,105,103,104,116,44,10,119,104,101,110,32,116,104,101,32,97,117,116,104,111,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,107,110,111,119,115,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,99,97,114,114,121,105,110,103,32,111,110,46,10,10,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,96,92,100,43,102,111,111,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,106,101,99,116,10,108,105,110,101,58,10,10,96,96,96,116,101,120,116,10,49,50,51,52,53,54,98,97,114,10,96,96,96,10,10,65,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,108,108,32,115,105,120,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,44,32,116,104,101,32,110,111,114,109,97,108,32,97,99,116,105,111,110,10,111,102,32,116,104,101,32,109,97,116,99,104,101,114,32,105,115,32,116,111,32,116,114,121,32,97,103,97,105,110,32,119,105,116,104,32,111,110,108,121,32,102,105,118,101,32,100,105,103,105,116,115,32,109,97,116,99,104,105,110,103,32,105,116,101,109,32,96,92,100,43,96,44,32,97,110,100,10,116,104,101,110,32,119,105,116,104,32,102,111,117,114,44,32,97,110,100,32,115,111,32,111,110,44,32,98,101,102,111,114,101,32,117,108,116,105,109,97,116,101,108,121,32,102,97,105,108,105,110,103,46,32,34,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,34,32,40,97,32,116,101,114,109,10,116,97,107,101,110,32,102,114,111,109,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,98,111,111,107,41,32,112,114,111,118,105,100,101,115,32,116,104,101,32,109,101,97,110,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,97,116,32,111,110,99,101,32,97,10,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,109,97,116,99,104,101,100,44,32,105,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,105,110,32,116,104,105,115,32,119,97,121,46,10,10,73,102,32,97,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,105,115,32,117,115,101,100,32,102,111,114,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,103,105,118,101,115,32,117,112,10,105,109,109,101,100,105,97,116,101,108,121,32,111,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,105,115,32,97,32,107,105,110,100,32,111,102,10,115,112,101,99,105,97,108,32,112,97,114,101,110,116,104,101,115,105,115,44,32,115,116,97,114,116,105,110,103,32,119,105,116,104,32,96,40,63,62,96,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,63,62,92,100,43,41,102,111,111,10,96,96,96,10,10,84,104,105,115,32,107,105,110,100,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,34,108,111,99,107,115,32,117,112,34,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,32,99,111,110,116,97,105,110,115,32,111,110,99,101,32,105,116,10,104,97,115,32,109,97,116,99,104,101,100,44,32,97,110,100,32,97,32,102,97,105,108,117,114,101,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,118,101,110,116,101,100,32,102,114,111,109,10,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,112,97,115,116,32,105,116,32,116,111,32,112,114,101,118,105,111,117,115,32,105,116,101,109,115,44,32,104,111,119,101,118,101,114,44,32,119,111,114,107,115,32,97,115,10,110,111,114,109,97,108,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,101,115,99,114,105,112,116,105,111,110,32,105,115,32,116,104,97,116,32,97,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,105,115,32,116,121,112,101,32,109,97,116,99,104,101,115,32,116,104,101,32,115,116,114,105,110,103,10,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,110,32,105,100,101,110,116,105,99,97,108,32,115,116,97,110,100,97,108,111,110,101,32,112,97,116,116,101,114,110,32,119,111,117,108,100,32,109,97,116,99,104,44,32,105,102,32,97,110,99,104,111,114,101,100,32,97,116,10,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,83,105,109,112,108,101,32,99,97,115,101,115,32,115,117,99,104,32,97,115,10,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,109,97,120,105,109,105,122,105,110,103,32,114,101,112,101,97,116,32,116,104,97,116,32,109,117,115,116,32,115,119,97,108,108,111,119,10,101,118,101,114,121,116,104,105,110,103,32,105,116,32,99,97,110,46,32,83,111,44,32,119,104,105,108,101,32,98,111,116,104,32,96,92,100,43,96,32,97,110,100,32,96,92,100,43,63,96,32,97,114,101,32,112,114,101,112,97,114,101,100,32,116,111,32,97,100,106,117,115,116,32,116,104,101,10,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,109,97,107,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,44,32,96,40,63,62,92,100,43,41,96,32,99,97,110,10,111,110,108,121,32,109,97,116,99,104,32,97,110,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,46,10,10,65,116,111,109,105,99,32,103,114,111,117,112,115,32,105,110,32,103,101,110,101,114,97,108,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,99,111,109,112,108,105,99,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,110,100,32,99,97,110,32,98,101,10,110,101,115,116,101,100,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,102,111,114,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,106,117,115,116,32,97,32,115,105,110,103,108,101,10,114,101,112,101,97,116,101,100,32,105,116,101,109,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,97,32,115,105,109,112,108,101,114,32,110,111,116,97,116,105,111,110,44,32,99,97,108,108,101,100,32,97,32,34,112,111,115,115,101,115,115,105,118,101,10,113,117,97,110,116,105,102,105,101,114,34,32,99,97,110,32,98,101,32,117,115,101,100,46,32,84,104,105,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,110,32,101,120,116,114,97,32,43,32,99,104,97,114,97,99,116,101,114,32,102,111,108,108,111,119,105,110,103,32,97,10,113,117,97,110,116,105,102,105,101,114,46,32,85,115,105,110,103,32,116,104,105,115,32,110,111,116,97,116,105,111,110,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,97,115,10,10,96,96,96,116,101,120,116,10,92,100,43,43,102,111,111,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,32,101,110,116,105,114,101,32,103,114,111,117,112,44,32,102,111,114,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,124,120,121,122,41,123,50,44,51,125,43,10,96,96,96,10,10,80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,97,108,119,97,121,115,32,103,114,101,101,100,121,59,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,32,96,117,110,103,114,101,101,100,121,96,32,105,115,10,105,103,110,111,114,101,100,46,32,84,104,101,121,32,97,114,101,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,105,109,112,108,101,114,32,102,111,114,109,115,32,111,102,32,97,110,32,97,116,111,109,105,99,10,103,114,111,117,112,46,32,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,10,97,110,100,32,116,104,101,32,101,113,117,105,118,97,108,101,110,116,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,98,117,116,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,100,105,102,102,101,114,101,110,99,101,59,10,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,112,114,111,98,97,98,108,121,32,115,108,105,103,104,116,108,121,32,102,97,115,116,101,114,46,10,10,84,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,115,121,110,116,97,120,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,116,104,101,32,80,101,114,108,32,53,46,56,32,115,121,110,116,97,120,46,32,74,101,102,102,114,101,121,10,70,114,105,101,100,108,32,111,114,105,103,105,110,97,116,101,100,32,116,104,101,32,105,100,101,97,32,40,97,110,100,32,116,104,101,32,110,97,109,101,41,32,105,110,32,116,104,101,32,102,105,114,115,116,32,101,100,105,116,105,111,110,32,111,102,32,104,105,115,32,98,111,111,107,46,32,77,105,107,101,10,77,99,67,108,111,115,107,101,121,32,108,105,107,101,100,32,105,116,44,32,115,111,32,105,109,112,108,101,109,101,110,116,101,100,32,105,116,32,119,104,101,110,32,104,101,32,98,117,105,108,116,32,116,104,101,32,83,117,110,32,74,97,118,97,32,112,97,99,107,97,103,101,44,32,97,110,100,10,80,67,82,69,32,99,111,112,105,101,100,32,105,116,32,102,114,111,109,32,116,104,101,114,101,46,32,73,116,32,117,108,116,105,109,97,116,101,108,121,32,102,111,117,110,100,32,105,116,115,32,119,97,121,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,10,53,46,49,48,46,10,10,80,67,82,69,32,104,97,115,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,34,112,111,115,115,101,115,115,105,102,105,101,115,34,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,10,112,97,116,116,101,114,110,32,99,111,110,115,116,114,117,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,115,101,113,117,101,110,99,101,32,65,43,66,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,65,43,43,66,44,32,97,115,32,116,104,101,114,101,10,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,65,58,115,32,119,104,101,110,32,66,32,109,117,115,116,32,102,111,108,108,111,119,46,10,10,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,105,116,115,101,108,102,10,98,101,32,114,101,112,101,97,116,101,100,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,116,104,101,32,111,110,108,121,10,119,97,121,32,116,111,32,97,118,111,105,100,32,115,111,109,101,32,102,97,105,108,105,110,103,32,109,97,116,99,104,101,115,32,116,97,107,105,110,103,32,97,32,108,111,110,103,32,116,105,109,101,46,32,84,104,101,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,40,92,68,43,124,60,92,100,43,62,41,42,91,33,63,93,10,96,96,96,10,10,109,97,116,99,104,101,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,32,116,104,97,116,32,101,105,116,104,101,114,32,99,111,110,115,105,115,116,32,111,102,32,110,111,110,45,100,105,103,105,116,115,44,32,111,114,10,100,105,103,105,116,115,32,101,110,99,108,111,115,101,100,32,105,110,32,96,60,62,96,44,32,102,111,108,108,111,119,101,100,32,98,121,32,96,33,96,32,111,114,32,96,63,96,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,44,32,105,116,32,114,117,110,115,32,113,117,105,99,107,108,121,46,10,72,111,119,101,118,101,114,44,32,105,102,32,105,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,10,10,96,96,96,116,101,120,116,10,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,10,96,96,96,10,10,105,116,32,116,97,107,101,115,32,97,32,108,111,110,103,32,116,105,109,101,32,98,101,102,111,114,101,32,114,101,112,111,114,116,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,115,116,114,105,110,103,32,99,97,110,32,98,101,10,100,105,118,105,100,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,96,92,68,43,96,32,114,101,112,101,97,116,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,92,42,32,114,101,112,101,97,116,32,105,110,32,109,97,110,121,10,119,97,121,115,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,114,105,101,100,46,32,40,84,104,101,32,101,120,97,109,112,108,101,32,117,115,101,115,32,96,91,33,63,93,96,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,115,105,110,103,108,101,10,99,104,97,114,97,99,116,101,114,32,97,116,32,116,104,101,32,101,110,100,44,32,97,115,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,104,97,118,101,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,108,108,111,119,115,32,102,111,114,10,102,97,115,116,32,102,97,105,108,117,114,101,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,114,101,109,101,109,98,101,114,32,116,104,101,32,108,97,115,116,32,115,105,110,103,108,101,10,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,32,109,97,116,99,104,44,32,97,110,100,32,102,97,105,108,32,101,97,114,108,121,32,105,102,32,105,116,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,10,116,104,101,32,115,116,114,105,110,103,46,41,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,117,115,101,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,108,105,107,101,32,116,104,101,10,102,111,108,108,111,119,105,110,103,44,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,100,105,103,105,116,115,32,99,97,110,110,111,116,32,98,101,32,98,114,111,107,101,110,44,32,97,110,100,32,102,97,105,108,117,114,101,32,104,97,112,112,101,110,115,10,113,117,105,99,107,108,121,58,10,10,96,96,96,116,101,120,116,10,40,40,63,62,92,68,43,41,124,60,92,100,43,62,41,42,91,33,63,93,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,54,32,125,10,10,35,35,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,10,10,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,62,32,48,32,40,97,110,100,32,112,111,115,115,105,98,108,121,10,102,117,114,116,104,101,114,32,100,105,103,105,116,115,41,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,101,97,114,108,105,101,114,32,40,116,104,97,116,32,105,115,44,10,116,111,32,105,116,115,32,108,101,102,116,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,105,115,32,60,32,49,48,44,32,105,116,32,105,115,32,97,108,119,97,121,115,10,116,97,107,101,110,32,97,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,97,110,100,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,116,32,116,104,97,116,32,109,97,110,121,10,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,10,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,100,111,32,110,101,101,100,32,110,111,116,32,98,101,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,110,117,109,98,101,114,115,32,60,32,49,48,46,32,65,10,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,110,32,109,97,107,101,32,115,101,110,115,101,32,119,104,101,110,32,97,32,114,101,112,101,116,105,116,105,111,110,32,105,115,10,105,110,118,111,108,118,101,100,32,97,110,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,114,105,103,104,116,32,104,97,115,32,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,97,110,32,101,97,114,108,105,101,114,10,105,116,101,114,97,116,105,111,110,46,10,10,73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,118,101,32,97,32,110,117,109,101,114,105,99,97,108,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,10,119,104,111,115,101,32,110,117,109,98,101,114,32,105,115,32,49,48,32,111,114,32,109,111,114,101,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,44,32,97,115,32,97,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,96,92,53,48,96,32,105,115,10,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,104,97,114,97,99,116,101,114,32,100,101,102,105,110,101,100,32,105,110,32,111,99,116,97,108,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,10,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,44,32,115,101,101,32,115,101,99,116,105,111,110,10,91,78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115,93,40,96,109,58,114,101,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115,96,41,32,101,97,114,108,105,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,10,115,117,99,104,32,112,114,111,98,108,101,109,32,119,104,101,110,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,46,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,10,105,115,32,112,111,115,115,105,98,108,101,32,117,115,105,110,103,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,40,115,101,101,32,98,101,108,111,119,41,46,10,10,65,110,111,116,104,101,114,32,119,97,121,32,116,111,32,97,118,111,105,100,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,105,110,104,101,114,101,110,116,32,105,110,32,116,104,101,32,117,115,101,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,10,98,97,99,107,115,108,97,115,104,32,105,115,32,116,111,32,117,115,101,32,116,104,101,32,96,92,103,96,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,10,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,32,97,114,101,32,105,100,101,110,116,105,99,97,108,58,10,10,96,96,96,116,101,120,116,10,40,114,105,110,103,41,44,32,92,49,10,40,114,105,110,103,41,44,32,92,103,49,10,40,114,105,110,103,41,44,32,92,103,123,49,125,10,96,96,96,10,10,65,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,97,98,115,111,108,117,116,101,32,114,101,102,101,114,101,110,99,101,32,119,105,116,104,111,117,116,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,116,104,97,116,32,105,115,10,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,111,108,100,101,114,32,115,121,110,116,97,120,46,32,73,116,32,105,115,32,97,108,115,111,32,117,115,101,102,117,108,32,119,104,101,110,32,108,105,116,101,114,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,32,116,104,101,10,114,101,102,101,114,101,110,99,101,46,32,65,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,105,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,40,100,101,102,41,103,104,105,41,92,103,123,45,49,125,10,96,96,96,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,103,123,45,49,125,96,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,115,116,97,114,116,101,100,32,99,97,112,116,117,114,105,110,103,10,115,117,98,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,96,92,103,96,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,92,50,96,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,46,10,83,105,109,105,108,97,114,108,121,44,32,96,92,103,123,45,50,125,96,32,119,111,117,108,100,32,98,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,96,92,49,96,46,32,84,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,10,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,105,110,32,108,111,110,103,32,112,97,116,116,101,114,110,115,44,32,97,110,100,32,97,108,115,111,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,99,114,101,97,116,101,100,32,98,121,10,106,111,105,110,105,110,103,32,102,114,97,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,119,105,116,104,105,110,32,116,104,101,109,115,101,108,118,101,115,46,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,119,104,97,116,101,118,101,114,32,109,97,116,99,104,101,100,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,10,99,117,114,114,101,110,116,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,97,116,104,101,114,32,116,104,97,110,32,97,110,121,116,104,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,116,115,101,108,102,10,40,115,101,99,116,105,111,110,32,91,83,117,98,112,97,116,116,101,114,110,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,93,40,96,109,58,114,101,35,115,101,99,116,50,49,96,41,32,100,101,115,99,114,105,98,101,115,32,97,32,119,97,121,32,111,102,32,100,111,105,110,103,10,116,104,97,116,41,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,10,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121,10,96,96,96,10,10,73,102,32,99,97,115,101,102,117,108,32,109,97,116,99,104,105,110,103,32,105,115,32,105,110,32,102,111,114,99,101,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,116,104,101,32,99,97,115,101,32,111,102,10,108,101,116,116,101,114,115,32,105,115,32,114,101,108,101,118,97,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,114,97,104,32,114,97,104,34,32,97,110,100,32,34,82,65,72,32,82,65,72,34,44,10,98,117,116,32,110,111,116,32,34,82,65,72,32,114,97,104,34,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,111,114,105,103,105,110,97,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,10,99,97,115,101,108,101,115,115,108,121,58,10,10,96,96,96,116,101,120,116,10,40,40,63,105,41,114,97,104,41,92,115,43,92,49,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,111,102,32,119,114,105,116,105,110,103,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,10,84,104,101,32,46,78,69,84,32,115,121,110,116,97,120,32,96,92,107,123,110,97,109,101,125,96,32,97,110,100,32,116,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,96,92,107,60,110,97,109,101,62,96,32,111,114,32,96,92,107,39,110,97,109,101,39,96,32,97,114,101,10,115,117,112,112,111,114,116,101,100,44,32,97,115,32,105,115,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,32,96,40,63,80,61,110,97,109,101,41,96,46,32,84,104,101,32,117,110,105,102,105,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,10,115,121,110,116,97,120,32,105,110,32,80,101,114,108,32,53,46,49,48,44,32,105,110,32,119,104,105,99,104,32,96,92,103,96,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,98,111,116,104,32,110,117,109,101,114,105,99,32,97,110,100,32,110,97,109,101,100,10,114,101,102,101,114,101,110,99,101,115,44,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,84,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,107,60,112,49,62,10,40,63,39,112,49,39,40,63,105,41,114,97,104,41,92,115,43,92,107,123,112,49,125,10,40,63,80,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,40,63,80,61,112,49,41,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,103,123,112,49,125,10,96,96,96,10,10,65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,110,97,109,101,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,111,114,10,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,10,10,84,104,101,114,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,97,10,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,110,111,116,32,98,101,101,110,32,117,115,101,100,32,105,110,32,97,32,112,97,114,116,105,99,117,108,97,114,32,109,97,116,99,104,44,32,97,110,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,105,116,10,97,108,119,97,121,115,32,102,97,105,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,102,97,105,108,115,32,105,102,32,105,116,32,115,116,97,114,116,115,32,116,111,10,109,97,116,99,104,32,34,97,34,32,114,97,116,104,101,114,32,116,104,97,110,32,34,98,99,34,58,10,10,96,96,96,116,101,120,116,10,40,97,124,40,98,99,41,41,92,50,10,96,96,96,10,10,65,115,32,116,104,101,114,101,32,99,97,110,32,98,101,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,108,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,10,116,104,101,32,98,97,99,107,115,108,97,115,104,32,97,114,101,32,116,97,107,101,110,32,97,115,32,112,97,114,116,32,111,102,32,97,32,112,111,116,101,110,116,105,97,108,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,10,112,97,116,116,101,114,110,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,97,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,44,32,115,111,109,101,32,100,101,108,105,109,105,116,101,114,32,109,117,115,116,32,98,101,32,117,115,101,100,32,116,111,10,116,101,114,109,105,110,97,116,101,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,73,102,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,44,32,116,104,105,115,32,99,97,110,32,98,101,10,119,104,105,116,101,115,112,97,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,110,32,101,109,112,116,121,32,99,111,109,109,101,110,116,32,40,115,101,101,32,115,101,99,116,105,111,110,32,91,67,111,109,109,101,110,116,115,93,40,96,109,58,114,101,35,115,101,99,116,49,57,96,41,41,10,99,97,110,32,98,101,32,117,115,101,100,46,10,10,95,82,101,99,117,114,115,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115,95,10,10,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,32,102,97,105,108,115,10,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,102,105,114,115,116,32,117,115,101,100,44,32,115,111,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,40,96,97,92,49,96,41,32,110,101,118,101,114,32,109,97,116,99,104,101,115,46,10,72,111,119,101,118,101,114,44,32,115,117,99,104,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,115,105,100,101,32,114,101,112,101,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,34,97,34,115,32,97,110,100,32,97,108,115,111,32,34,97,98,97,34,44,32,34,97,98,97,98,98,97,97,34,44,32,97,110,100,10,115,111,32,111,110,58,10,10,96,96,96,116,101,120,116,10,40,97,124,98,92,49,41,43,10,96,96,96,10,10,65,116,32,101,97,99,104,32,105,116,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,46,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,44,32,116,104,101,10,112,97,116,116,101,114,110,32,109,117,115,116,32,98,101,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,105,116,101,114,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,98,97,99,107,10,114,101,102,101,114,101,110,99,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,100,111,110,101,32,117,115,105,110,103,32,97,108,116,101,114,110,97,116,105,111,110,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,111,114,32,98,121,32,97,10,113,117,97,110,116,105,102,105,101,114,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,111,102,32,122,101,114,111,46,10,10,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,117,115,101,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,121,32,114,101,102,101,114,101,110,99,101,32,116,111,32,98,101,32,116,114,101,97,116,101,100,10,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,116,104,101,32,119,104,111,108,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,10,102,97,105,108,117,114,101,32,99,97,110,110,111,116,32,99,97,117,115,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,116,104,101,32,103,114,111,117,112,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,55,32,125,10,10,35,35,32,65,115,115,101,114,116,105,111,110,115,10,10,65,110,32,97,115,115,101,114,116,105,111,110,32,105,115,32,97,32,116,101,115,116,32,111,110,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,102,111,108,108,111,119,105,110,103,32,111,114,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,99,117,114,114,101,110,116,10,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,115,117,109,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,32,99,111,100,101,100,10,97,115,32,96,92,98,96,44,32,96,92,66,96,44,32,96,92,65,96,44,32,96,92,71,96,44,32,96,92,90,96,44,32,96,92,122,96,44,32,96,94,96,44,32,97,110,100,32,96,36,96,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,10,115,101,99,116,105,111,110,115,46,10,10,77,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,99,111,100,101,100,32,97,115,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,114,101,32,97,114,101,32,116,119,111,32,107,105,110,100,115,58,32,116,104,111,115,101,10,116,104,97,116,32,108,111,111,107,32,97,104,101,97,100,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,10,108,111,111,107,32,98,101,104,105,110,100,32,105,116,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,105,110,32,116,104,101,32,110,111,114,109,97,108,32,119,97,121,44,32,101,120,99,101,112,116,10,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,116,111,32,98,101,32,99,104,97,110,103,101,100,46,10,10,65,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,73,102,32,115,117,99,104,32,97,110,32,97,115,115,101,114,116,105,111,110,10,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,105,110,32,105,116,44,32,116,104,101,115,101,32,97,114,101,32,99,111,117,110,116,101,100,32,102,111,114,32,116,104,101,32,112,117,114,112,111,115,101,115,32,111,102,10,110,117,109,98,101,114,105,110,103,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,115,117,98,115,116,114,105,110,103,10,99,97,112,116,117,114,105,110,103,32,105,115,32,100,111,110,101,32,111,110,108,121,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,40,80,101,114,108,32,115,111,109,101,116,105,109,101,115,44,32,98,117,116,32,110,111,116,32,97,108,119,97,121,115,44,10,112,101,114,102,111,114,109,115,32,99,97,112,116,117,114,105,110,103,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,41,10,10,62,32,35,35,35,35,32,87,97,114,110,105,110,103,32,123,58,32,46,119,97,114,110,105,110,103,32,125,10,62,10,62,32,73,102,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,111,110,101,32,111,114,32,109,111,114,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,115,117,99,99,101,101,100,115,44,10,62,32,98,117,116,32,102,97,105,108,117,114,101,32,116,111,32,109,97,116,99,104,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,118,101,114,32,116,104,105,115,10,62,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,99,97,112,116,117,114,101,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,101,116,32,111,110,108,121,32,105,102,32,110,111,32,104,105,103,104,101,114,10,62,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,101,115,32,97,114,101,32,97,108,114,101,97,100,121,32,115,101,116,46,32,84,104,105,115,32,105,115,44,32,117,110,102,111,114,116,117,110,97,116,101,108,121,44,32,97,32,102,117,110,100,97,109,101,110,116,97,108,10,62,32,108,105,109,105,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,97,115,32,80,67,82,69,49,32,105,115,32,110,111,119,32,105,110,10,62,32,109,97,105,110,116,101,110,97,110,99,101,45,111,110,108,121,32,115,116,97,116,117,115,44,32,105,116,32,105,115,32,117,110,108,105,107,101,108,121,32,101,118,101,114,32,116,111,32,99,104,97,110,103,101,46,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,114,101,112,101,97,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,116,10,109,97,107,101,115,32,110,111,32,115,101,110,115,101,32,116,111,32,97,115,115,101,114,116,32,116,104,101,32,115,97,109,101,32,116,104,105,110,103,32,109,97,110,121,32,116,105,109,101,115,44,32,116,104,101,32,115,105,100,101,32,101,102,102,101,99,116,32,111,102,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,111,99,99,97,115,105,111,110,97,108,108,121,32,98,101,32,117,115,101,102,117,108,46,32,73,110,32,112,114,97,99,116,105,99,101,44,32,116,104,101,114,101,32,97,114,101,32,111,110,108,121,32,116,104,114,101,101,32,99,97,115,101,115,58,10,10,45,32,73,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,92,123,48,92,125,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,118,101,114,32,111,98,101,121,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,10,32,32,72,111,119,101,118,101,114,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,103,114,111,117,112,115,32,116,104,97,116,32,97,114,101,10,32,32,99,97,108,108,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,116,104,114,111,117,103,104,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,101,99,104,97,110,105,115,109,46,10,45,32,73,102,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,92,123,48,44,110,92,125,44,32,119,104,101,114,101,32,110,32,62,32,48,44,32,105,116,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,105,102,32,105,116,32,119,97,115,32,92,123,48,44,49,92,125,46,32,65,116,10,32,32,114,117,110,116,105,109,101,44,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,105,115,32,116,114,105,101,100,32,119,105,116,104,32,97,110,100,32,119,105,116,104,111,117,116,32,116,104,101,32,97,115,115,101,114,116,105,111,110,44,10,32,32,116,104,101,32,111,114,100,101,114,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,46,10,45,32,73,102,32,116,104,101,32,109,105,110,105,109,117,109,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,62,32,48,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,10,32,32,111,98,101,121,101,100,32,111,110,108,121,32,111,110,99,101,32,119,104,101,110,32,101,110,99,111,117,110,116,101,114,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,10,10,95,76,111,111,107,97,104,101,97,100,32,65,115,115,101,114,116,105,111,110,115,95,10,10,76,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,92,33,32,102,111,114,10,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,32,119,111,114,100,32,102,111,108,108,111,119,101,100,32,98,121,32,97,10,115,101,109,105,99,111,108,111,110,44,32,98,117,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,115,101,109,105,99,111,108,111,110,32,105,110,32,116,104,101,32,109,97,116,99,104,58,10,10,96,96,96,116,101,120,116,10,92,119,43,40,63,61,59,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,102,111,111,34,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,97,114,34,58,10,10,96,96,96,116,101,120,116,10,102,111,111,40,63,33,98,97,114,41,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,112,112,97,114,101,110,116,108,121,32,115,105,109,105,108,97,114,32,112,97,116,116,101,114,110,10,10,96,96,96,116,101,120,116,10,40,63,33,102,111,111,41,98,97,114,10,96,96,96,10,10,100,111,101,115,32,110,111,116,32,102,105,110,100,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,10,34,102,111,111,34,46,32,73,116,32,102,105,110,100,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,119,104,97,116,115,111,101,118,101,114,44,32,97,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,63,92,33,102,111,111,41,32,105,115,10,97,108,119,97,121,115,32,116,114,117,101,32,119,104,101,110,32,116,104,101,32,110,101,120,116,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,34,98,97,114,34,46,32,65,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,105,115,10,110,101,101,100,101,100,32,116,111,32,97,99,104,105,101,118,101,32,116,104,101,32,111,116,104,101,114,32,101,102,102,101,99,116,46,10,10,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,102,111,114,99,101,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,97,116,32,115,111,109,101,32,112,111,105,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,109,111,115,116,10,99,111,110,118,101,110,105,101,110,116,32,119,97,121,32,116,111,32,100,111,32,105,116,32,105,115,32,119,105,116,104,32,40,63,92,33,41,44,32,97,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,46,32,83,111,44,32,97,110,10,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,114,101,113,117,105,114,101,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,117,115,116,32,97,108,119,97,121,115,32,102,97,105,108,46,32,84,104,101,10,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,32,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,32,105,115,32,97,32,115,121,110,111,110,121,109,32,102,111,114,32,40,63,92,33,41,46,10,10,95,76,111,111,107,98,101,104,105,110,100,32,65,115,115,101,114,116,105,111,110,115,95,10,10,76,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,60,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,60,92,33,32,102,111,114,10,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,110,100,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,10,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,33,102,111,111,41,98,97,114,10,96,96,96,10,10,84,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,117,99,104,32,116,104,97,116,32,97,108,108,32,116,104,101,32,115,116,114,105,110,103,115,10,105,116,32,109,97,116,99,104,101,115,32,109,117,115,116,32,104,97,118,101,32,97,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,110,121,32,116,111,112,45,108,101,118,101,108,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,116,104,101,121,32,100,111,32,110,111,116,32,97,108,108,32,104,97,118,101,32,116,111,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,84,104,117,115,44,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,105,115,32,112,101,114,109,105,116,116,101,100,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,98,117,108,108,111,99,107,124,100,111,110,107,101,121,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,58,10,10,96,96,96,116,101,120,116,10,40,63,60,33,100,111,103,115,63,124,99,97,116,115,63,41,10,96,96,96,10,10,66,114,97,110,99,104,101,115,32,116,104,97,116,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,10,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,80,101,114,108,44,32,119,104,105,99,104,10,114,101,113,117,105,114,101,115,32,97,108,108,32,98,114,97,110,99,104,101,115,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,108,101,110,103,116,104,32,111,102,32,115,116,114,105,110,103,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,99,104,32,97,115,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,44,32,97,115,32,105,116,115,32,115,105,110,103,108,101,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,32,99,97,110,32,109,97,116,99,104,32,116,119,111,10,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,97,98,40,99,124,100,101,41,41,10,96,96,96,10,10,72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,116,111,32,80,67,82,69,32,105,102,32,114,101,119,114,105,116,116,101,110,32,116,111,32,117,115,101,32,116,119,111,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,101,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,97,98,99,124,97,98,100,101,41,10,96,96,96,10,10,83,111,109,101,116,105,109,101,115,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,96,92,75,96,32,40,115,101,101,32,97,98,111,118,101,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,10,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,116,111,32,103,101,116,32,114,111,117,110,100,32,116,104,101,32,102,105,120,101,100,45,108,101,110,103,116,104,32,114,101,115,116,114,105,99,116,105,111,110,46,10,10,84,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,44,32,102,111,114,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,111,32,109,111,118,101,10,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,98,97,99,107,32,116,101,109,112,111,114,97,114,105,108,121,32,98,121,32,116,104,101,32,102,105,120,101,100,32,108,101,110,103,116,104,32,97,110,100,32,116,104,101,110,32,116,114,121,32,116,111,32,109,97,116,99,104,46,10,73,102,32,116,104,101,114,101,32,97,114,101,32,105,110,115,117,102,102,105,99,105,101,110,116,32,99,104,97,114,97,99,116,101,114,115,32,98,101,102,111,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,102,97,105,108,115,46,10,10,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,116,104,101,32,96,92,67,96,32,101,115,99,97,112,101,32,40,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,100,97,116,97,10,117,110,105,116,32,101,118,101,110,32,105,110,32,97,32,85,84,70,32,109,111,100,101,41,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,10,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46,32,84,104,101,32,96,92,88,96,32,97,110,100,32,96,92,82,96,32,101,115,99,97,112,101,115,44,10,119,104,105,99,104,32,99,97,110,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,115,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,101,105,116,104,101,114,46,10,10,34,83,117,98,114,111,117,116,105,110,101,34,32,99,97,108,108,115,32,40,115,101,101,32,98,101,108,111,119,41,44,32,115,117,99,104,32,97,115,32,40,63,50,41,32,111,114,32,40,63,38,88,41,44,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,10,108,111,111,107,98,101,104,105,110,100,115,44,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,46,32,82,101,99,117,114,115,105,111,110,44,10,104,111,119,101,118,101,114,44,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,10,10,80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,116,111,32,115,112,101,99,105,102,121,10,101,102,102,105,99,105,101,110,116,32,109,97,116,99,104,105,110,103,32,111,102,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,115,46,10,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,97,32,108,111,110,103,32,115,116,114,105,110,103,32,116,104,97,116,32,100,111,101,115,10,110,111,116,32,109,97,116,99,104,58,10,10,96,96,96,116,101,120,116,10,97,98,99,100,36,10,96,96,96,10,10,65,115,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,101,100,115,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,80,67,82,69,32,108,111,111,107,115,32,102,111,114,32,101,97,99,104,32,34,97,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,10,97,110,100,32,116,104,101,110,32,115,101,101,115,32,105,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,109,97,116,99,104,101,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,10,10,96,96,96,116,101,120,116,10,94,46,42,97,98,99,100,36,10,96,96,96,10,10,116,104,101,32,105,110,105,116,105,97,108,32,46,92,42,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,97,116,32,102,105,114,115,116,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,105,115,32,102,97,105,108,115,32,40,97,115,10,116,104,101,114,101,32,105,115,32,110,111,32,102,111,108,108,111,119,105,110,103,32,34,97,34,41,44,32,105,116,32,98,97,99,107,116,114,97,99,107,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,44,10,116,104,101,110,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,97,110,100,32,115,111,32,111,110,46,32,79,110,99,101,32,97,103,97,105,110,32,116,104,101,32,115,101,97,114,99,104,32,102,111,114,32,34,97,34,10,99,111,118,101,114,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,44,32,102,114,111,109,32,114,105,103,104,116,32,116,111,32,108,101,102,116,44,32,115,111,32,119,101,32,97,114,101,32,110,111,32,98,101,116,116,101,114,32,111,102,102,46,32,72,111,119,101,118,101,114,44,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,97,115,10,10,96,96,96,116,101,120,116,10,94,46,42,43,40,63,60,61,97,98,99,100,41,10,96,96,96,10,10,116,104,101,114,101,32,99,97,110,32,98,101,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,102,111,114,32,116,104,101,32,46,92,42,43,32,105,116,101,109,59,32,105,116,32,99,97,110,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,101,110,116,105,114,101,10,115,116,114,105,110,103,46,32,84,104,101,32,115,117,98,115,101,113,117,101,110,116,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,97,32,115,105,110,103,108,101,32,116,101,115,116,32,111,110,32,116,104,101,32,108,97,115,116,32,102,111,117,114,10,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,105,116,32,102,97,105,108,115,44,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,105,109,109,101,100,105,97,116,101,108,121,46,32,70,111,114,32,108,111,110,103,32,115,116,114,105,110,103,115,44,32,116,104,105,115,10,97,112,112,114,111,97,99,104,32,109,97,107,101,115,32,97,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,105,110,103,32,116,105,109,101,46,10,10,95,85,115,105,110,103,32,77,117,108,116,105,112,108,101,32,65,115,115,101,114,116,105,111,110,115,95,10,10,77,97,110,121,32,97,115,115,101,114,116,105,111,110,115,32,40,111,102,32,97,110,121,32,115,111,114,116,41,32,99,97,110,32,111,99,99,117,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,41,40,63,60,33,57,57,57,41,102,111,111,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,101,97,99,104,32,111,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,97,112,112,108,105,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,105,110,116,32,105,110,10,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,70,105,114,115,116,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,112,114,101,118,105,111,117,115,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,10,97,114,101,32,97,108,108,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,10,34,57,57,57,34,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,95,110,111,116,95,32,109,97,116,99,104,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,102,105,114,115,116,10,111,102,32,119,104,105,99,104,32,97,114,101,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,32,108,97,115,116,32,116,104,114,101,101,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,10,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,49,50,51,97,98,99,102,111,111,34,46,32,65,32,112,97,116,116,101,114,110,32,116,111,32,100,111,32,116,104,97,116,32,105,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,46,46,46,41,40,63,60,33,57,57,57,41,102,111,111,10,96,96,96,10,10,84,104,105,115,32,116,105,109,101,32,116,104,101,32,102,105,114,115,116,32,97,115,115,101,114,116,105,111,110,32,108,111,111,107,115,32,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,99,104,101,99,107,115,32,116,104,97,116,10,116,104,101,32,102,105,114,115,116,32,116,104,114,101,101,32,97,114,101,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,32,115,101,99,111,110,100,32,97,115,115,101,114,116,105,111,110,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,10,112,114,101,99,101,100,105,110,103,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,10,10,65,115,115,101,114,116,105,111,110,115,32,99,97,110,32,98,101,32,110,101,115,116,101,100,32,105,110,32,97,110,121,32,99,111,109,98,105,110,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,10,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,122,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,34,98,97,114,34,44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,10,98,121,32,34,102,111,111,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,40,63,60,33,102,111,111,41,98,97,114,41,98,97,122,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,97,110,100,32,97,110,121,32,116,104,114,101,101,10,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58,10,10,96,96,96,116,101,120,116,10,40,63,60,61,92,100,123,51,125,40,63,33,57,57,57,41,46,46,46,41,102,111,111,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,56,32,125,10,10,35,35,32,67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115,10,10,73,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,99,97,117,115,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,111,32,111,98,101,121,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,100,105,116,105,111,110,97,108,108,121,10,111,114,32,116,111,32,99,104,111,111,115,101,32,98,101,116,119,101,101,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,32,115,117,98,112,97,116,116,101,114,110,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,110,10,97,115,115,101,114,116,105,111,110,44,32,111,114,32,119,104,101,116,104,101,114,32,97,32,115,112,101,99,105,102,105,99,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,109,97,116,99,104,101,100,46,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,116,119,111,32,112,111,115,115,105,98,108,101,32,102,111,114,109,115,32,111,102,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,41,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,124,110,111,45,112,97,116,116,101,114,110,41,10,96,96,96,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,115,97,116,105,115,102,105,101,100,44,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,110,111,45,112,97,116,116,101,114,110,10,40,105,102,32,112,114,101,115,101,110,116,41,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,101,120,105,115,116,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,97,10,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,69,97,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,105,116,115,101,108,102,32,99,111,110,116,97,105,110,10,110,101,115,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,97,110,121,32,102,111,114,109,44,32,105,110,99,108,117,100,105,110,103,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,115,59,32,116,104,101,10,114,101,115,116,114,105,99,116,105,111,110,32,116,111,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,108,101,118,101,108,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,10,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,99,111,109,112,108,101,120,58,10,10,96,96,96,116,101,120,116,10,40,63,40,49,41,32,40,65,124,66,124,67,41,32,124,32,40,68,32,124,32,40,63,40,50,41,69,124,70,41,32,124,32,69,41,32,41,10,96,96,96,10,10,84,104,101,114,101,32,97,114,101,32,102,111,117,114,32,107,105,110,100,115,32,111,102,32,99,111,110,100,105,116,105,111,110,58,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,44,32,114,101,102,101,114,101,110,99,101,115,32,116,111,10,114,101,99,117,114,115,105,111,110,44,32,97,32,112,115,101,117,100,111,45,99,111,110,100,105,116,105,111,110,32,99,97,108,108,101,100,32,68,69,70,73,78,69,44,32,97,110,100,32,97,115,115,101,114,116,105,111,110,115,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,117,109,98,101,114,95,10,10,73,102,32,116,104,101,32,116,101,120,116,32,98,101,116,119,101,101,110,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,44,32,116,104,101,10,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,115,32,112,114,101,118,105,111,117,115,108,121,10,109,97,116,99,104,101,100,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,101,120,105,115,116,115,32,40,115,101,101,10,115,101,99,116,105,111,110,32,91,68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115,93,40,96,109,58,114,101,35,115,101,99,116,49,50,96,41,32,101,97,114,108,105,101,114,41,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,10,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,109,32,104,97,118,101,32,109,97,116,99,104,101,100,46,32,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,110,111,116,97,116,105,111,110,32,105,115,32,116,111,32,112,114,101,99,101,100,101,32,116,104,101,10,100,105,103,105,116,115,32,119,105,116,104,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,110,117,109,98,101,114,32,105,115,10,114,101,108,97,116,105,118,101,32,114,97,116,104,101,114,32,116,104,97,110,32,97,98,115,111,108,117,116,101,46,32,84,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,98,101,10,114,101,102,101,114,101,110,99,101,100,32,98,121,32,40,63,40,45,49,41,44,32,116,104,101,32,110,101,120,116,32,109,111,115,116,32,114,101,99,101,110,116,32,98,121,32,40,63,40,45,50,41,44,32,97,110,100,32,115,111,32,111,110,46,32,73,110,115,105,100,101,32,108,111,111,112,115,44,10,105,116,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,115,101,110,115,101,32,116,111,32,114,101,102,101,114,32,116,111,32,115,117,98,115,101,113,117,101,110,116,32,103,114,111,117,112,115,46,32,84,104,101,32,110,101,120,116,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,98,101,10,111,112,101,110,101,100,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,40,63,40,43,49,41,44,32,97,110,100,32,115,111,32,111,110,46,32,40,84,104,101,32,118,97,108,117,101,32,122,101,114,111,32,105,110,32,97,110,121,32,111,102,32,116,104,101,115,101,10,102,111,114,109,115,32,105,115,32,110,111,116,32,117,115,101,100,59,32,105,116,32,112,114,111,118,111,107,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,41,10,10,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,111,110,116,97,105,110,115,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,32,116,111,10,109,97,107,101,32,105,116,32,109,111,114,101,32,114,101,97,100,97,98,108,101,32,40,97,115,115,117,109,101,32,111,112,116,105,111,110,32,96,101,120,116,101,110,100,101,100,96,41,32,97,110,100,32,116,111,32,100,105,118,105,100,101,32,105,116,32,105,110,116,111,32,116,104,114,101,101,10,112,97,114,116,115,32,102,111,114,32,101,97,115,101,32,111,102,32,100,105,115,99,117,115,115,105,111,110,58,10,10,96,96,96,116,101,120,116,10,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,49,41,32,92,41,32,41,10,96,96,96,10,10,84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,97,110,100,32,105,102,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,32,105,115,10,112,114,101,115,101,110,116,44,32,115,101,116,115,32,105,116,32,97,115,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,112,97,114,116,32,109,97,116,99,104,101,115,32,111,110,101,32,111,114,10,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,101,110,116,104,101,115,101,115,46,32,84,104,101,32,116,104,105,114,100,32,112,97,114,116,32,105,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,10,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,101,100,32,111,114,32,110,111,116,46,32,73,102,10,116,104,101,121,32,100,105,100,44,32,116,104,97,116,32,105,115,44,32,105,102,32,115,117,98,106,101,99,116,32,115,116,97,114,116,101,100,32,119,105,116,104,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,10,105,115,32,116,114,117,101,44,32,97,110,100,32,115,111,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,101,120,101,99,117,116,101,100,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,10,114,101,113,117,105,114,101,100,46,32,79,116,104,101,114,119,105,115,101,44,32,97,115,32,110,111,45,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,10,110,111,116,104,105,110,103,46,32,84,104,97,116,32,105,115,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,44,32,111,112,116,105,111,110,97,108,108,121,10,101,110,99,108,111,115,101,100,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,101,109,98,101,100,100,101,100,32,105,110,32,97,32,108,97,114,103,101,114,32,111,110,101,44,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,58,10,10,96,96,96,116,101,120,116,10,46,46,46,111,116,104,101,114,32,115,116,117,102,102,46,46,46,32,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,45,49,41,32,92,41,32,41,32,46,46,46,10,96,96,96,10,10,84,104,105,115,32,109,97,107,101,115,32,116,104,101,32,102,114,97,103,109,101,110,116,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,97,109,101,95,10,10,80,101,114,108,32,117,115,101,115,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,60,110,97,109,101,62,41,46,46,46,41,32,111,114,32,40,63,40,39,110,97,109,101,39,41,46,46,46,41,32,116,111,32,116,101,115,116,32,102,111,114,32,97,32,117,115,101,100,10,115,117,98,112,97,116,116,101,114,110,32,98,121,32,110,97,109,101,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,67,82,69,44,32,119,104,105,99,104,32,104,97,100,10,116,104,105,115,32,102,97,99,105,108,105,116,121,32,98,101,102,111,114,101,32,80,101,114,108,44,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,110,97,109,101,41,46,46,46,41,32,105,115,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,100,46,10,10,82,101,119,114,105,116,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,116,111,32,117,115,101,32,97,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,103,105,118,101,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,79,80,69,78,62,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,60,79,80,69,78,62,41,32,92,41,32,41,10,96,96,96,10,10,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,10,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,104,97,115,32,109,97,116,99,104,101,100,46,10,10,95,67,104,101,99,107,105,110,103,32,102,111,114,32,80,97,116,116,101,114,110,32,82,101,99,117,114,115,105,111,110,95,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,82,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,82,44,10,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,32,111,114,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,10,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,73,102,32,100,105,103,105,116,115,32,111,114,32,97,32,110,97,109,101,32,112,114,101,99,101,100,101,100,32,98,121,32,97,109,112,101,114,115,97,110,100,32,102,111,108,108,111,119,32,116,104,101,32,108,101,116,116,101,114,32,82,44,10,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,63,40,82,51,41,46,46,46,41,32,111,114,32,40,63,40,82,38,110,97,109,101,41,46,46,46,41,10,96,96,96,10,10,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,32,105,115,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,10,110,117,109,98,101,114,32,111,114,32,110,97,109,101,32,105,115,32,103,105,118,101,110,46,32,84,104,105,115,32,99,111,110,100,105,116,105,111,110,32,100,111,101,115,32,110,111,116,32,99,104,101,99,107,32,116,104,101,32,101,110,116,105,114,101,32,114,101,99,117,114,115,105,111,110,10,115,116,97,99,107,46,32,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,10,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,10,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,46,10,10,65,116,32,34,116,111,112,45,108,101,118,101,108,34,44,32,97,108,108,32,116,104,101,115,101,32,114,101,99,117,114,115,105,111,110,32,116,101,115,116,32,99,111,110,100,105,116,105,111,110,115,32,97,114,101,32,102,97,108,115,101,46,32,84,104,101,32,115,121,110,116,97,120,32,102,111,114,10,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,95,68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,66,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121,95,10,10,91,93,40,41,123,58,32,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115,32,125,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,68,69,70,73,78,69,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,10,110,97,109,101,32,68,69,70,73,78,69,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,102,97,108,115,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,111,110,108,121,32,111,110,101,10,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,116,32,105,115,32,97,108,119,97,121,115,32,115,107,105,112,112,101,100,32,105,102,32,99,111,110,116,114,111,108,32,114,101,97,99,104,101,115,32,116,104,105,115,10,112,111,105,110,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,105,100,101,97,32,111,102,32,68,69,70,73,78,69,32,105,115,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,102,105,110,101,10,34,115,117,98,114,111,117,116,105,110,101,115,34,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,46,32,40,84,104,101,32,117,115,101,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,115,10,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,41,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,115,117,99,104,32,97,115,10,34,49,57,50,46,49,54,56,46,50,51,46,50,52,53,34,44,32,99,97,110,32,98,101,32,119,114,105,116,116,101,110,32,108,105,107,101,32,116,104,105,115,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58,10,10,96,96,96,116,101,120,116,10,40,63,40,68,69,70,73,78,69,41,32,40,63,60,98,121,116,101,62,32,50,91,48,45,52,93,92,100,32,124,32,50,53,91,48,45,53,93,32,124,32,49,92,100,92,100,32,124,32,91,49,45,57,93,63,92,100,41,32,41,32,92,98,32,40,63,38,98,121,116,101,41,32,40,92,46,40,63,38,98,121,116,101,41,41,123,51,125,32,92,98,10,96,96,96,10,10,84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,32,68,69,70,73,78,69,32,103,114,111,117,112,32,105,110,115,105,100,101,32,119,104,105,99,104,32,105,115,32,97,32,97,110,111,116,104,101,114,32,103,114,111,117,112,10,110,97,109,101,100,32,34,98,121,116,101,34,32,105,115,32,100,101,102,105,110,101,100,46,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,110,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,110,101,110,116,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,10,40,97,32,110,117,109,98,101,114,32,60,32,50,53,54,41,46,32,87,104,101,110,32,109,97,116,99,104,105,110,103,32,116,97,107,101,115,32,112,108,97,99,101,44,32,116,104,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,115,107,105,112,112,101,100,44,32,97,115,32,68,69,70,73,78,69,32,97,99,116,115,32,108,105,107,101,32,97,32,102,97,108,115,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,117,115,101,115,10,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,110,97,109,101,100,32,103,114,111,117,112,32,116,111,32,109,97,116,99,104,32,116,104,101,32,102,111,117,114,32,100,111,116,45,115,101,112,97,114,97,116,101,100,32,99,111,109,112,111,110,101,110,116,115,32,111,102,32,97,110,10,73,80,118,52,32,97,100,100,114,101,115,115,44,32,105,110,115,105,115,116,105,110,103,32,111,110,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,97,116,32,101,97,99,104,32,101,110,100,46,10,10,95,65,115,115,101,114,116,105,111,110,32,67,111,110,100,105,116,105,111,110,115,95,10,10,73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,110,111,116,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,102,111,114,109,97,116,115,44,32,105,116,32,109,117,115,116,32,98,101,32,97,110,32,97,115,115,101,114,116,105,111,110,46,10,84,104,105,115,32,99,97,110,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,111,114,32,110,101,103,97,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,111,114,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,67,111,110,115,105,100,101,114,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,99,111,110,116,97,105,110,105,110,103,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,44,32,97,110,100,32,119,105,116,104,32,116,104,101,32,116,119,111,10,97,108,116,101,114,110,97,116,105,118,101,115,32,111,110,32,116,104,101,32,115,101,99,111,110,100,32,108,105,110,101,58,10,10,96,96,96,116,101,120,116,10,40,63,40,63,61,91,94,97,45,122,93,42,91,97,45,122,93,41,10,92,100,123,50,125,45,91,97,45,122,93,123,51,125,45,92,100,123,50,125,32,32,124,32,32,92,100,123,50,125,45,92,100,123,50,125,45,92,100,123,50,125,32,41,10,96,96,96,10,10,84,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,10,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,108,101,116,116,101,114,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,101,116,116,101,114,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,101,115,116,115,32,102,111,114,32,116,104,101,32,112,114,101,115,101,110,99,101,10,111,102,32,97,116,32,108,101,97,115,116,32,111,110,101,32,108,101,116,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,102,32,97,32,108,101,116,116,101,114,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,10,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,10,115,101,99,111,110,100,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,115,116,114,105,110,103,115,32,105,110,32,111,110,101,32,111,102,32,116,104,101,32,116,119,111,32,102,111,114,109,115,32,100,100,45,97,97,97,45,100,100,32,111,114,10,100,100,45,100,100,45,100,100,44,32,119,104,101,114,101,32,97,97,97,32,97,114,101,32,108,101,116,116,101,114,115,32,97,110,100,32,100,100,32,97,114,101,32,100,105,103,105,116,115,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,49,57,32,125,10,10,35,35,32,67,111,109,109,101,110,116,115,10,10,84,104,101,114,101,32,97,114,101,32,116,119,111,32,119,97,121,115,32,116,111,32,105,110,99,108,117,100,101,32,99,111,109,109,101,110,116,115,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,112,114,111,99,101,115,115,101,100,32,98,121,32,80,67,82,69,46,10,73,110,32,98,111,116,104,32,99,97,115,101,115,44,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,111,109,109,101,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,110,10,116,104,101,32,109,105,100,100,108,101,32,111,102,32,97,110,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,32,111,102,32,114,101,108,97,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,115,117,99,104,32,97,115,32,40,63,58,32,111,114,32,97,10,115,117,98,112,97,116,116,101,114,110,32,110,97,109,101,32,111,114,32,110,117,109,98,101,114,46,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,109,97,107,101,32,117,112,32,97,32,99,111,109,109,101,110,116,32,112,108,97,121,32,110,111,32,112,97,114,116,32,105,110,10,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,105,110,103,46,10,10,84,104,101,32,115,101,113,117,101,110,99,101,32,40,63,35,32,109,97,114,107,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,109,109,101,110,116,32,116,104,97,116,32,99,111,110,116,105,110,117,101,115,32,117,112,32,116,111,32,116,104,101,32,110,101,120,116,10,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,111,112,116,105,111,110,10,80,67,82,69,95,69,88,84,69,78,68,69,68,32,105,115,32,115,101,116,44,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,99,104,97,114,97,99,116,101,114,32,97,108,115,111,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,109,109,101,110,116,44,32,119,104,105,99,104,10,105,110,32,116,104,105,115,32,99,97,115,101,32,99,111,110,116,105,110,117,101,115,32,116,111,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,32,111,114,10,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,87,104,105,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,110,101,119,108,105,110,101,115,10,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,111,112,116,105,111,110,115,32,112,97,115,115,101,100,32,116,111,32,97,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,32,111,114,32,98,121,32,97,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,10,91,78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115,93,40,96,109,58,114,101,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115,96,41,32,101,97,114,108,105,101,114,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,105,115,32,116,121,112,101,32,111,102,32,99,111,109,109,101,110,116,32,105,115,32,97,32,108,105,116,101,114,97,108,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,10,112,97,116,116,101,114,110,59,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,104,97,112,112,101,110,32,116,111,32,114,101,112,114,101,115,101,110,116,32,97,32,110,101,119,108,105,110,101,32,100,111,32,110,111,116,32,99,111,117,110,116,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,119,104,101,110,32,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,10,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,105,110,32,102,111,114,99,101,58,10,10,96,96,96,116,101,120,116,10,97,98,99,32,35,99,111,109,109,101,110,116,32,92,110,32,115,116,105,108,108,32,99,111,109,109,101,110,116,10,96,96,96,10,10,79,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,99,104,97,114,97,99,116,101,114,32,35,44,32,96,112,99,114,101,95,99,111,109,112,105,108,101,40,41,96,32,115,107,105,112,115,32,97,108,111,110,103,44,32,108,111,111,107,105,110,103,32,102,111,114,32,97,32,110,101,119,108,105,110,101,10,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,115,101,113,117,101,110,99,101,32,96,92,110,96,32,105,115,32,115,116,105,108,108,32,108,105,116,101,114,97,108,32,97,116,32,116,104,105,115,32,115,116,97,103,101,44,32,115,111,32,105,116,32,100,111,101,115,32,110,111,116,10,116,101,114,109,105,110,97,116,101,32,116,104,101,32,99,111,109,109,101,110,116,46,32,79,110,108,121,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,99,111,100,101,32,118,97,108,117,101,32,48,120,48,97,32,40,116,104,101,32,100,101,102,97,117,108,116,10,110,101,119,108,105,110,101,41,32,100,111,101,115,32,115,111,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,48,32,125,10,10,35,35,32,82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115,10,10,67,111,110,115,105,100,101,114,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,116,99,104,105,110,103,32,97,32,115,116,114,105,110,103,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,117,110,108,105,109,105,116,101,100,10,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,46,32,87,105,116,104,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,114,101,99,117,114,115,105,111,110,44,32,116,104,101,32,98,101,115,116,32,116,104,97,116,32,99,97,110,32,98,101,32,100,111,110,101,32,105,115,10,116,111,32,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,117,112,32,116,111,32,115,111,109,101,32,102,105,120,101,100,32,100,101,112,116,104,32,111,102,32,110,101,115,116,105,110,103,46,32,73,116,32,105,115,32,110,111,116,10,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,97,110,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,32,100,101,112,116,104,46,10,10,70,111,114,32,115,111,109,101,32,116,105,109,101,44,32,80,101,114,108,32,104,97,115,32,112,114,111,118,105,100,101,100,32,97,32,102,97,99,105,108,105,116,121,32,116,104,97,116,32,97,108,108,111,119,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,116,111,10,114,101,99,117,114,115,101,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,46,32,73,116,32,100,111,101,115,32,116,104,105,115,32,98,121,32,105,110,116,101,114,112,111,108,97,116,105,110,103,32,80,101,114,108,32,99,111,100,101,32,105,110,32,116,104,101,10,101,120,112,114,101,115,115,105,111,110,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,116,104,101,32,99,111,100,101,32,99,97,110,32,114,101,102,101,114,32,116,111,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,116,115,101,108,102,46,32,65,32,80,101,114,108,10,112,97,116,116,101,114,110,32,117,115,105,110,103,32,99,111,100,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,99,97,110,32,98,101,32,99,114,101,97,116,101,100,10,108,105,107,101,32,116,104,105,115,58,10,10,96,96,96,116,101,120,116,10,36,114,101,32,61,32,113,114,123,92,40,32,40,63,58,32,40,63,62,91,94,40,41,93,43,41,32,124,32,40,63,112,123,36,114,101,125,41,32,41,42,32,92,41,125,120,59,10,96,96,96,10,10,73,116,101,109,32,40,63,112,92,123,46,46,46,92,125,41,32,105,110,116,101,114,112,111,108,97,116,101,115,32,80,101,114,108,32,99,111,100,101,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,114,101,102,101,114,115,10,114,101,99,117,114,115,105,118,101,108,121,32,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46,10,10,79,98,118,105,111,117,115,108,121,44,32,80,67,82,69,32,99,97,110,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,111,102,32,80,101,114,108,32,99,111,100,101,46,32,73,110,115,116,101,97,100,44,32,105,116,10,115,117,112,112,111,114,116,115,32,115,112,101,99,105,97,108,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,111,110,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,10,115,117,98,112,97,116,116,101,114,110,32,114,101,99,117,114,115,105,111,110,46,32,65,102,116,101,114,32,105,116,115,32,105,110,116,114,111,100,117,99,116,105,111,110,32,105,110,32,80,67,82,69,32,97,110,100,32,80,121,116,104,111,110,44,32,116,104,105,115,32,107,105,110,100,32,111,102,10,114,101,99,117,114,115,105,111,110,32,119,97,115,32,108,97,116,101,114,32,105,110,116,114,111,100,117,99,101,100,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46,10,10,65,32,115,112,101,99,105,97,108,32,105,116,101,109,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,40,63,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,117,109,98,101,114,32,62,32,48,32,97,110,100,32,97,32,99,108,111,115,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,103,105,118,101,110,10,110,117,109,98,101,114,44,32,105,102,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,46,32,40,73,102,32,110,111,116,44,32,105,116,32,105,115,32,97,32,110,111,110,45,114,101,99,117,114,115,105,118,101,10,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,44,32,119,104,105,99,104,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,41,32,84,104,101,32,115,112,101,99,105,97,108,32,105,116,101,109,32,40,63,82,41,10,111,114,32,40,63,48,41,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,84,104,105,115,32,80,67,82,69,32,112,97,116,116,101,114,110,32,115,111,108,118,101,115,32,116,104,101,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,40,97,115,115,117,109,101,32,116,104,97,116,32,111,112,116,105,111,110,10,96,101,120,116,101,110,100,101,100,96,32,105,115,32,115,101,116,32,115,111,32,116,104,97,116,32,119,104,105,116,101,115,112,97,99,101,32,105,115,32,105,103,110,111,114,101,100,41,58,10,10,96,96,96,116,101,120,116,10,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,82,41,32,41,42,32,92,41,10,96,96,96,10,10,70,105,114,115,116,32,105,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,10,115,117,98,115,116,114,105,110,103,115,44,32,119,104,105,99,104,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,111,114,32,97,32,114,101,99,117,114,115,105,118,101,10,109,97,116,99,104,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,116,104,97,116,32,105,115,44,32,97,32,99,111,114,114,101,99,116,108,121,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,115,116,114,105,110,103,41,46,10,70,105,110,97,108,108,121,32,116,104,101,114,101,32,105,115,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,10,113,117,97,110,116,105,102,105,101,114,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,116,104,105,115,32,119,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,121,111,117,32,119,111,117,108,100,32,110,111,116,32,119,97,110,116,32,116,111,32,114,101,99,117,114,115,101,32,116,104,101,32,101,110,116,105,114,101,10,112,97,116,116,101,114,110,44,32,115,111,32,105,110,115,116,101,97,100,32,121,111,117,32,99,97,110,32,117,115,101,58,10,10,96,96,96,116,101,120,116,10,40,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,49,41,32,41,42,32,92,41,32,41,10,96,96,96,10,10,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,104,101,114,101,32,119,105,116,104,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,115,111,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,114,101,102,101,114,115,32,116,111,32,116,104,101,109,10,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,10,10,73,110,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,107,101,101,112,105,110,103,32,116,114,97,99,107,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,110,117,109,98,101,114,115,32,99,97,110,32,98,101,32,116,114,105,99,107,121,46,32,84,104,105,115,32,105,115,10,109,97,100,101,32,101,97,115,105,101,114,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,46,32,73,110,115,116,101,97,100,32,111,102,32,40,63,49,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,10,97,98,111,118,101,44,32,121,111,117,32,99,97,110,32,119,114,105,116,101,32,40,63,45,50,41,32,116,111,32,114,101,102,101,114,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,10,112,97,114,101,110,116,104,101,115,101,115,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,99,111,117,110,116,115,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,32,108,101,102,116,119,97,114,100,115,32,102,114,111,109,32,116,104,101,32,112,111,105,110,116,32,97,116,32,119,104,105,99,104,32,105,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,73,116,32,105,115,32,97,108,115,111,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,102,101,114,32,116,111,32,108,97,116,101,114,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,44,32,98,121,32,119,114,105,116,105,110,103,32,114,101,102,101,114,101,110,99,101,115,10,115,117,99,104,32,97,115,32,40,63,43,50,41,46,32,72,111,119,101,118,101,114,44,32,116,104,101,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,99,117,114,115,105,118,101,44,32,97,115,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,110,111,116,10,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,46,32,84,104,101,121,32,97,114,101,32,97,108,119,97,121,115,32,110,111,110,45,114,101,99,117,114,115,105,118,101,10,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,10,10,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,105,115,32,116,111,32,117,115,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,115,116,101,97,100,46,32,84,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,102,111,114,10,116,104,105,115,32,105,115,32,40,63,38,110,97,109,101,41,46,32,84,104,101,32,101,97,114,108,105,101,114,32,80,67,82,69,32,115,121,110,116,97,120,32,40,63,80,62,110,97,109,101,41,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,87,101,32,99,97,110,10,114,101,119,114,105,116,101,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,110,62,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,38,112,110,41,32,41,42,32,92,41,32,41,10,96,96,96,10,10,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,116,104,101,32,101,97,114,108,105,101,115,116,32,111,110,101,32,105,115,10,117,115,101,100,46,10,10,84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,101,120,97,109,112,108,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,119,101,32,104,97,118,101,32,115,116,117,100,105,101,100,32,99,111,110,116,97,105,110,115,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,10,114,101,112,101,97,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,102,111,114,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,115,32,111,102,10,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,105,115,32,105,109,112,111,114,116,97,110,116,32,119,104,101,110,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,115,116,114,105,110,103,115,32,116,104,97,116,32,100,111,32,110,111,116,10,109,97,116,99,104,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,10,10,96,96,96,116,101,120,116,10,40,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,40,41,10,96,96,96,10,10,105,116,32,103,105,118,101,115,32,34,110,111,32,109,97,116,99,104,34,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,117,115,101,100,44,10,116,104,101,32,109,97,116,99,104,32,114,117,110,115,32,102,111,114,32,97,32,108,111,110,103,32,116,105,109,101,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,115,111,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,116,104,101,32,43,32,97,110,100,32,92,42,10,114,101,112,101,97,116,115,32,99,97,110,32,99,97,114,118,101,32,117,112,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,101,115,116,101,100,32,98,101,102,111,114,101,32,102,97,105,108,117,114,101,32,99,97,110,32,98,101,10,114,101,112,111,114,116,101,100,46,10,10,65,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,109,97,116,99,104,44,32,116,104,101,32,118,97,108,117,101,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,116,104,111,115,101,32,102,114,111,109,32,116,104,101,10,111,117,116,101,114,109,111,115,116,32,108,101,118,101,108,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,10,10,96,96,96,116,101,120,116,10,40,97,98,40,99,100,41,101,102,41,10,96,96,96,10,10,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,105,110,110,101,114,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,40,110,117,109,98,101,114,101,100,32,50,41,32,105,115,32,34,101,102,34,44,32,119,104,105,99,104,32,105,115,32,116,104,101,10,108,97,115,116,32,118,97,108,117,101,32,116,97,107,101,110,32,111,110,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,46,32,73,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,109,97,116,99,104,101,100,10,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,105,116,115,32,102,105,110,97,108,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,32,105,115,32,117,110,115,101,116,44,32,101,118,101,110,32,105,102,32,105,116,32,119,97,115,10,40,116,101,109,112,111,114,97,114,105,108,121,41,32,115,101,116,32,97,116,32,97,32,100,101,101,112,101,114,32,108,101,118,101,108,32,100,117,114,105,110,103,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,46,10,10,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,105,116,101,109,32,40,63,82,41,32,119,105,116,104,32,99,111,110,100,105,116,105,111,110,32,40,82,41,44,32,119,104,105,99,104,32,116,101,115,116,115,32,102,111,114,32,114,101,99,117,114,115,105,111,110,46,32,67,111,110,115,105,100,101,114,10,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,116,101,120,116,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,10,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,46,32,79,110,108,121,32,100,105,103,105,116,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,110,101,115,116,101,100,32,98,114,97,99,107,101,116,115,32,40,116,104,97,116,32,105,115,44,32,119,104,101,110,10,114,101,99,117,114,115,105,110,103,41,44,32,119,104,105,108,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46,10,10,96,96,96,116,101,120,116,10,60,32,40,63,58,32,40,63,40,82,41,32,92,100,43,43,32,32,124,32,91,94,60,62,93,42,43,41,32,124,32,40,63,82,41,41,32,42,32,62,10,96,96,96,10,10,72,101,114,101,32,40,63,40,82,41,32,105,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,44,32,119,105,116,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,10,97,108,116,101,114,110,97,116,105,118,101,115,32,102,111,114,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,97,110,100,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,99,97,115,101,115,46,32,73,116,101,109,32,40,63,82,41,32,105,115,32,116,104,101,32,97,99,116,117,97,108,10,114,101,99,117,114,115,105,118,101,32,99,97,108,108,46,10,10,95,68,105,102,102,101,114,101,110,99,101,115,32,105,110,32,82,101,99,117,114,115,105,111,110,32,80,114,111,99,101,115,115,105,110,103,32,98,101,116,119,101,101,110,32,80,67,82,69,32,97,110,100,32,80,101,114,108,95,10,10,82,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,110,32,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,119,111,32,105,109,112,111,114,116,97,110,116,32,119,97,121,115,46,32,73,110,32,80,67,82,69,10,40,108,105,107,101,32,80,121,116,104,111,110,44,32,98,117,116,32,117,110,108,105,107,101,32,80,101,114,108,41,44,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,105,115,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,10,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,10,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,10,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,105,108,108,117,115,116,114,97,116,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,10,119,104,105,99,104,32,109,101,97,110,115,32,116,111,32,109,97,116,99,104,32,97,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,10,40,102,111,114,32,101,120,97,109,112,108,101,44,32,34,97,34,44,32,34,97,98,97,34,44,32,34,97,98,99,98,97,34,44,32,34,97,98,99,100,99,98,97,34,41,58,10,10,96,96,96,116,101,120,116,10,94,40,46,124,40,46,41,40,63,49,41,92,50,41,36,10,96,96,96,10,10,84,104,101,32,105,100,101,97,32,105,115,32,116,104,97,116,32,105,116,32,101,105,116,104,101,114,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,116,119,111,32,105,100,101,110,116,105,99,97,108,10,99,104,97,114,97,99,116,101,114,115,32,115,117,114,114,111,117,110,100,105,110,103,32,97,32,115,117,98,112,97,108,105,110,100,114,111,109,101,46,32,73,110,32,80,101,114,108,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,119,111,114,107,115,59,32,105,110,32,80,67,82,69,32,105,116,10,100,111,101,115,32,110,111,116,32,119,111,114,107,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,10,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,97,98,99,98,97,34,46,10,10,65,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,101,110,100,32,111,102,10,116,104,101,32,115,116,114,105,110,103,44,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,102,97,105,108,115,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,97,107,101,110,44,32,97,110,100,10,116,104,101,32,114,101,99,117,114,115,105,111,110,32,107,105,99,107,115,32,105,110,46,32,84,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,115,117,98,112,97,116,116,101,114,110,32,49,32,115,117,99,99,101,115,115,102,117,108,108,121,32,109,97,116,99,104,101,115,10,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,98,34,41,46,32,40,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,97,110,100,32,101,110,100,32,111,102,32,108,105,110,101,32,116,101,115,116,115,32,97,114,101,10,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,41,10,10,66,97,99,107,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,99,34,41,32,105,115,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,119,104,97,116,32,115,117,98,112,97,116,116,101,114,110,10,50,32,109,97,116,99,104,101,100,44,32,119,104,105,99,104,32,119,97,115,32,34,97,34,46,32,84,104,105,115,32,102,97,105,108,115,46,32,65,115,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,10,103,114,111,117,112,44,32,116,104,101,114,101,32,97,114,101,32,110,111,119,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,112,111,105,110,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,40,80,101,114,108,32,99,97,110,32,110,111,119,32,114,101,45,101,110,116,101,114,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,97,110,100,32,116,114,121,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,46,41,32,72,111,119,101,118,101,114,44,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,119,105,116,104,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,111,116,104,101,114,32,111,114,100,101,114,44,32,116,104,105,110,103,115,32,97,114,101,10,100,105,102,102,101,114,101,110,116,58,10,10,96,96,96,116,101,120,116,10,94,40,40,46,41,40,63,49,41,92,50,124,46,41,36,10,96,96,96,10,10,84,104,105,115,32,116,105,109,101,44,32,116,104,101,32,114,101,99,117,114,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,114,105,101,100,32,102,105,114,115,116,44,32,97,110,100,32,99,111,110,116,105,110,117,101,115,32,116,111,32,114,101,99,117,114,115,101,10,117,110,116,105,108,32,105,116,32,114,117,110,115,32,111,117,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,97,116,32,119,104,105,99,104,32,112,111,105,110,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,115,46,32,66,117,116,32,116,104,105,115,10,116,105,109,101,32,119,101,32,104,97,118,101,32,97,110,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,116,114,121,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,46,32,84,104,97,116,32,105,115,32,116,104,101,10,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,58,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,97,115,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,97,116,32,97,10,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,108,101,118,101,108,44,32,119,104,105,99,104,32,80,67,82,69,32,99,97,110,110,111,116,32,117,115,101,46,10,10,84,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,115,44,32,110,111,116,32,111,110,108,121,32,116,104,111,115,101,10,119,105,116,104,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,105,116,32,105,115,32,116,101,109,112,116,105,110,103,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,105,115,58,10,10,96,96,96,116,101,120,116,10,94,40,40,46,41,40,63,49,41,92,50,124,46,63,41,36,10,96,96,96,10,10,65,103,97,105,110,44,32,116,104,105,115,32,119,111,114,107,115,32,105,110,32,80,101,114,108,44,32,98,117,116,32,110,111,116,32,105,110,32,80,67,82,69,44,32,97,110,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,114,101,97,115,111,110,46,32,87,104,101,110,32,97,10,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,104,97,115,32,109,97,116,99,104,101,100,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,101,110,116,101,114,101,100,32,97,103,97,105,110,32,116,111,10,109,97,116,99,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46,32,84,104,101,32,115,111,108,117,116,105,111,110,32,105,115,32,116,111,32,115,101,112,97,114,97,116,101,32,116,104,101,32,116,119,111,32,99,97,115,101,115,44,32,97,110,100,32,119,114,105,116,101,32,111,117,116,10,116,104,101,32,111,100,100,32,97,110,100,32,101,118,101,110,32,99,97,115,101,115,32,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,58,10,10,96,96,96,116,101,120,116,10,94,40,63,58,40,40,46,41,40,63,49,41,92,50,124,41,124,40,40,46,41,40,63,51,41,92,52,124,46,41,41,10,96,96,96,10,10,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,97,108,105,110,100,114,111,109,105,99,32,112,104,114,97,115,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,105,103,110,111,114,101,32,97,108,108,10,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,100,111,110,101,32,97,115,32,102,111,108,108,111,119,115,58,10,10,96,96,96,116,101,120,116,10,94,92,87,42,43,40,63,58,40,40,46,41,92,87,42,43,40,63,49,41,92,87,42,43,92,50,124,41,124,40,40,46,41,92,87,42,43,40,63,51,41,92,87,42,43,92,52,124,92,87,42,43,46,92,87,42,43,41,41,92,87,42,43,36,10,96,96,96,10,10,73,102,32,114,117,110,32,119,105,116,104,32,111,112,116,105,111,110,32,96,99,97,115,101,108,101,115,115,96,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,112,104,114,97,115,101,115,32,115,117,99,104,32,97,115,32,34,65,32,109,97,110,44,32,97,10,112,108,97,110,44,32,97,32,99,97,110,97,108,58,32,80,97,110,97,109,97,92,33,34,32,97,110,100,32,105,116,32,119,111,114,107,115,32,119,101,108,108,32,105,110,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,10,111,102,32,116,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,92,42,43,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,10,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,46,32,87,105,116,104,111,117,116,32,116,104,105,115,44,32,80,67,82,69,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,40,49,48,32,116,105,109,101,115,32,111,114,32,109,111,114,101,41,32,116,111,10,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,104,114,97,115,101,115,44,32,97,110,100,32,80,101,114,108,32,116,97,107,101,115,32,115,111,32,108,111,110,103,32,116,104,97,116,32,121,111,117,32,116,104,105,110,107,32,105,116,32,104,97,115,32,103,111,110,101,32,105,110,116,111,32,97,10,108,111,111,112,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,112,97,108,105,110,100,114,111,109,101,45,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,115,32,97,98,111,118,101,32,119,111,114,107,32,111,110,108,121,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,100,111,101,115,10,62,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,112,97,108,105,110,100,114,111,109,101,32,116,104,97,116,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,70,111,114,10,62,32,101,120,97,109,112,108,101,44,32,97,108,116,104,111,117,103,104,32,34,97,98,99,98,97,34,32,105,115,32,99,111,114,114,101,99,116,108,121,32,109,97,116,99,104,101,100,44,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,98,97,34,44,10,62,32,80,67,82,69,32,102,105,110,100,115,32,112,97,108,105,110,100,114,111,109,101,32,34,97,98,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,44,32,97,110,100,32,116,104,101,110,32,102,97,105,108,115,32,97,116,32,116,111,112,32,108,101,118,101,108,44,32,97,115,32,116,104,101,10,62,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,102,111,108,108,111,119,46,32,79,110,99,101,32,97,103,97,105,110,44,32,105,116,32,99,97,110,110,111,116,32,106,117,109,112,32,98,97,99,107,32,105,110,116,111,32,116,104,101,10,62,32,114,101,99,117,114,115,105,111,110,32,116,111,32,116,114,121,32,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,10,84,104,101,32,115,101,99,111,110,100,32,119,97,121,32,105,110,32,119,104,105,99,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,105,102,102,101,114,32,105,110,32,116,104,101,105,114,32,114,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,115,32,105,110,10,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,46,32,73,110,32,80,101,114,108,44,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,10,114,101,99,117,114,115,105,118,101,108,121,32,111,114,32,97,115,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,44,32,105,116,32,104,97,115,32,110,111,32,97,99,99,101,115,115,32,116,111,32,97,110,121,10,118,97,108,117,101,115,32,116,104,97,116,32,119,101,114,101,32,99,97,112,116,117,114,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,73,110,32,80,67,82,69,32,116,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,10,114,101,102,101,114,101,110,99,101,100,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,94,40,46,41,40,92,49,124,97,40,63,50,41,41,10,96,96,96,10,10,73,110,32,80,67,82,69,44,32,105,116,32,109,97,116,99,104,101,115,32,34,98,97,98,34,46,32,84,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,110,32,105,110,10,116,104,101,32,115,101,99,111,110,100,32,103,114,111,117,112,44,32,119,104,101,110,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,96,92,49,96,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,115,101,99,111,110,100,10,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,115,32,34,97,34,44,32,97,110,100,32,116,104,101,110,32,114,101,99,117,114,115,101,115,46,32,73,110,32,116,104,101,32,114,101,99,117,114,115,105,111,110,44,32,96,92,49,96,32,100,111,101,115,32,110,111,119,32,109,97,116,99,104,10,34,98,34,32,97,110,100,32,115,111,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,46,32,73,110,32,80,101,114,108,44,32,116,104,101,32,112,97,116,116,101,114,110,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,98,101,99,97,117,115,101,10,105,110,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,96,92,49,96,32,99,97,110,110,111,116,32,97,99,99,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,108,121,32,115,101,116,32,118,97,108,117,101,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,49,32,125,10,10,35,35,32,83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115,10,10,73,102,32,116,104,101,32,115,121,110,116,97,120,32,102,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,40,101,105,116,104,101,114,32,98,121,32,110,117,109,98,101,114,32,111,114,32,98,121,32,110,97,109,101,41,32,105,115,10,117,115,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,44,32,105,116,32,111,112,101,114,97,116,101,115,32,108,105,107,101,32,97,32,115,117,98,114,111,117,116,105,110,101,10,105,110,32,97,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,46,32,84,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,10,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,117,109,98,101,114,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,44,32,97,115,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58,10,10,96,96,96,116,101,120,116,10,40,46,46,46,40,97,98,115,111,108,117,116,101,41,46,46,46,41,46,46,46,40,63,50,41,46,46,46,10,40,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,41,46,46,46,40,63,45,49,41,46,46,46,10,40,46,46,46,40,63,43,49,41,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,10,96,96,96,10,10,65,110,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,32,112,111,105,110,116,101,100,32,111,117,116,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,10,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,10,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121,10,96,96,96,10,10,73,102,32,105,110,115,116,101,97,100,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,105,116,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,10,97,110,100,32,116,104,101,32,111,116,104,101,114,32,116,119,111,32,115,116,114,105,110,103,115,58,10,10,96,96,96,116,101,120,116,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,40,63,49,41,105,98,105,108,105,116,121,10,96,96,96,10,10,65,110,111,116,104,101,114,32,101,120,97,109,112,108,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,68,69,70,73,78,69,32,101,97,114,108,105,101,114,46,10,10,65,108,108,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,114,101,99,117,114,115,105,118,101,32,111,114,32,110,111,116,44,32,97,114,101,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,116,111,109,105,99,32,103,114,111,117,112,115,46,10,84,104,97,116,32,105,115,44,32,111,110,99,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,10,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,10,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,65,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,100,117,114,105,110,103,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,10,99,97,108,108,32,114,101,118,101,114,116,32,116,111,32,116,104,101,105,114,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,115,32,97,102,116,101,114,119,97,114,100,115,46,10,10,80,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,115,32,115,117,99,104,32,97,115,32,99,97,115,101,45,105,110,100,101,112,101,110,100,101,110,99,101,32,97,114,101,32,102,105,120,101,100,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,10,100,101,102,105,110,101,100,44,32,115,111,32,105,102,32,105,116,32,105,115,32,117,115,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,115,117,99,104,32,111,112,116,105,111,110,115,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,10,100,105,102,102,101,114,101,110,116,32,99,97,108,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,98,117,116,32,110,111,116,10,34,97,98,99,65,66,67,34,44,32,97,115,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,112,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,99,97,108,108,101,100,10,115,117,98,112,97,116,116,101,114,110,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,41,40,63,105,58,40,63,45,49,41,41,10,96,96,96,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,50,32,125,10,10,35,35,32,79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120,10,10,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,96,92,103,96,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,10,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,10,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,112,111,115,115,105,98,108,121,32,114,101,99,117,114,115,105,118,101,108,121,46,32,72,101,114,101,10,102,111,108,108,111,119,115,32,116,119,111,32,111,102,32,116,104,101,32,101,120,97,109,112,108,101,115,32,117,115,101,100,32,97,98,111,118,101,44,32,114,101,119,114,105,116,116,101,110,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,58,10,10,96,96,96,116,101,120,116,10,40,63,60,112,110,62,32,92,40,32,40,32,40,63,62,91,94,40,41,93,43,41,32,124,32,92,103,60,112,110,62,32,41,42,32,92,41,32,41,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,103,39,49,39,105,98,105,108,105,116,121,10,96,96,96,10,10,80,67,82,69,32,115,117,112,112,111,114,116,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,79,110,105,103,117,114,117,109,97,58,32,105,102,32,97,32,110,117,109,98,101,114,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,97,32,112,108,117,115,32,111,114,10,109,105,110,117,115,32,115,105,103,110,44,32,105,116,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,40,97,98,99,41,40,63,105,58,92,103,60,45,49,62,41,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,96,92,103,123,46,46,46,125,96,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,96,92,103,60,46,46,46,62,96,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32,95,110,111,116,95,10,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,59,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46,10,10,91,93,40,41,123,58,32,35,115,101,99,116,50,51,32,125,10,10,35,35,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,10,10,80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,115,111,109,101,32,34,83,112,101,99,105,97,108,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,32,86,101,114,98,115,34,44,32,119,104,105,99,104,32,97,114,101,32,115,116,105,108,108,10,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,115,32,34,101,120,112,101,114,105,109,101,110,116,97,108,32,97,110,100,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,111,114,10,114,101,109,111,118,97,108,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,80,101,114,108,34,46,32,73,116,32,103,111,101,115,32,111,110,32,116,111,32,115,97,121,58,32,34,84,104,101,105,114,32,117,115,97,103,101,32,105,110,10,112,114,111,100,117,99,116,105,111,110,32,99,111,100,101,32,115,104,111,117,108,100,32,98,101,32,110,111,116,101,100,32,116,111,32,97,118,111,105,100,32,112,114,111,98,108,101,109,115,32,100,117,114,105,110,103,32,117,112,103,114,97,100,101,115,46,34,32,84,104,101,32,115,97,109,101,10,114,101,109,97,114,107,115,32,97,112,112,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,102,101,97,116,117,114,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,105,115,32,115,101,99,116,105,111,110,46,10,10,84,104,101,32,110,101,119,32,118,101,114,98,115,32,109,97,107,101,32,117,115,101,32,111,102,32,119,104,97,116,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,105,110,118,97,108,105,100,32,115,121,110,116,97,120,58,32,97,110,32,111,112,101,110,105,110,103,10,112,97,114,101,110,116,104,101,115,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,97,115,116,101,114,105,115,107,46,32,84,104,101,121,32,97,114,101,32,103,101,110,101,114,97,108,108,121,32,111,102,32,116,104,101,32,102,111,114,109,32,40,42,86,69,82,66,41,32,111,114,10,40,42,86,69,82,66,58,78,65,77,69,41,46,32,83,111,109,101,32,99,97,110,32,116,97,107,101,32,101,105,116,104,101,114,32,102,111,114,109,44,32,112,111,115,115,105,98,108,121,32,98,101,104,97,118,105,110,103,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,10,111,110,32,119,104,101,116,104,101,114,32,97,32,110,97,109,101,32,105,115,32,112,114,101,115,101,110,116,46,32,65,32,110,97,109,101,32,105,115,32,97,110,121,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,10,105,110,99,108,117,100,101,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,32,109,97,120,105,109,117,109,32,110,97,109,101,32,108,101,110,103,116,104,32,105,115,32,50,53,53,32,105,110,32,116,104,101,32,56,45,98,105,116,10,108,105,98,114,97,114,121,32,97,110,100,32,54,53,53,51,53,32,105,110,32,116,104,101,32,49,54,45,98,105,116,32,97,110,100,32,51,50,45,98,105,116,32,108,105,98,114,97,114,105,101,115,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,101,109,112,116,121,44,32,116,104,97,116,10,105,115,44,32,105,102,32,116,104,101,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,115,32,116,104,101,32,99,111,108,111,110,44,32,116,104,101,32,101,102,102,101,99,116,32,105,115,32,97,115,10,105,102,32,116,104,101,32,99,111,108,111,110,32,119,97,115,32,110,111,116,32,116,104,101,114,101,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,99,97,110,32,111,99,99,117,114,32,105,110,32,97,32,112,97,116,116,101,114,110,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,44,32,97,115,115,101,114,116,105,111,110,115,44,32,97,110,100,32,105,110,32,115,117,98,112,97,116,116,101,114,110,115,10,99,97,108,108,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,40,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,114,101,99,117,114,115,105,118,101,108,121,41,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,10,10,95,79,112,116,105,109,105,122,97,116,105,111,110,115,32,84,104,97,116,32,65,102,102,101,99,116,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,95,10,10,80,67,82,69,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,116,111,32,115,112,101,101,100,32,117,112,32,109,97,116,99,104,105,110,103,32,98,121,32,114,117,110,110,105,110,103,10,115,111,109,101,32,99,104,101,99,107,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,109,97,116,99,104,32,97,116,116,101,109,112,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,99,97,110,32,107,110,111,119,32,116,104,101,10,109,105,110,105,109,117,109,32,108,101,110,103,116,104,32,111,102,32,109,97,116,99,104,105,110,103,32,115,117,98,106,101,99,116,44,32,111,114,32,116,104,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,10,112,114,101,115,101,110,116,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,112,97,115,115,101,115,32,116,104,101,32,114,117,110,110,105,110,103,32,111,102,32,97,32,109,97,116,99,104,44,32,97,110,121,10,105,110,99,108,117,100,101,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,112,114,111,99,101,115,115,101,100,46,32,112,114,111,99,101,115,115,101,100,46,32,89,111,117,32,99,97,110,32,115,117,112,112,114,101,115,115,32,116,104,101,10,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,119,104,101,110,32,99,97,108,108,105,110,103,10,96,99,111,109,112,105,108,101,47,50,96,32,111,114,32,96,114,117,110,47,51,96,44,32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,92,42,78,79,95,83,84,65,82,84,95,79,80,84,41,46,10,10,69,120,112,101,114,105,109,101,110,116,115,32,119,105,116,104,32,80,101,114,108,32,115,117,103,103,101,115,116,32,116,104,97,116,32,105,116,32,116,111,111,32,104,97,115,32,115,105,109,105,108,97,114,32,111,112,116,105,109,105,122,97,116,105,111,110,115,44,32,115,111,109,101,116,105,109,101,115,10,108,101,97,100,105,110,103,32,116,111,32,97,110,111,109,97,108,111,117,115,32,114,101,115,117,108,116,115,46,10,10,95,86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,73,109,109,101,100,105,97,116,101,108,121,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,97,99,116,32,97,115,32,115,111,111,110,32,97,115,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,101,121,32,109,117,115,116,32,110,111,116,32,98,101,10,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,46,10,10,96,96,96,116,101,120,116,10,40,42,65,67,67,69,80,84,41,10,96,96,96,10,10,84,104,105,115,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,101,110,100,32,115,117,99,99,101,115,115,102,117,108,108,121,44,32,115,107,105,112,112,105,110,103,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,10,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,105,116,32,105,115,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,10,111,110,108,121,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,101,110,100,101,100,32,115,117,99,99,101,115,115,102,117,108,108,121,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,116,32,116,104,101,32,111,117,116,101,114,10,108,101,118,101,108,46,32,73,102,32,40,92,42,65,67,67,69,80,84,41,32,105,115,32,116,114,105,103,103,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,115,117,99,99,101,101,100,115,59,32,105,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46,10,10,73,102,32,40,92,42,65,67,67,69,80,84,41,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,44,32,116,104,101,32,100,97,116,97,32,115,111,32,102,97,114,32,105,115,32,99,97,112,116,117,114,101,100,46,32,70,111,114,10,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,65,65,68,34,44,32,111,114,32,34,65,67,68,34,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,66,34,10,105,115,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,111,117,116,101,114,32,112,97,114,101,110,116,104,101,115,101,115,46,10,10,96,96,96,116,101,120,116,10,65,40,40,63,58,65,124,66,40,42,65,67,67,69,80,84,41,124,67,41,68,41,10,96,96,96,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,44,32,102,111,114,99,105,110,103,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,111,99,99,117,114,46,32,73,116,10,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,40,63,92,33,41,32,98,117,116,32,101,97,115,105,101,114,32,116,111,32,114,101,97,100,46,10,10,96,96,96,116,101,120,116,10,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,10,96,96,96,10,10,84,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,116,97,116,101,115,32,116,104,97,116,32,105,116,32,105,115,32,112,114,111,98,97,98,108,121,32,117,115,101,102,117,108,32,111,110,108,121,32,119,104,101,110,32,99,111,109,98,105,110,101,100,32,119,105,116,104,10,40,63,92,123,92,125,41,32,111,114,32,40,63,63,92,123,92,125,41,46,32,84,104,111,115,101,32,97,114,101,32,80,101,114,108,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,80,67,82,69,46,10,10,65,32,109,97,116,99,104,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,34,97,97,97,97,34,32,97,108,119,97,121,115,32,102,97,105,108,115,44,32,98,117,116,32,116,104,101,32,99,97,108,108,111,117,116,32,105,115,32,116,97,107,101,110,32,98,101,102,111,114,101,10,101,97,99,104,32,98,97,99,107,116,114,97,99,107,32,111,99,99,117,114,115,32,40,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,44,32,49,48,32,116,105,109,101,115,41,46,10,10,95,82,101,99,111,114,100,105,110,103,32,87,104,105,99,104,32,80,97,116,104,32,87,97,115,32,84,97,107,101,110,95,10,10,84,104,101,32,109,97,105,110,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,118,101,114,98,32,105,115,32,116,111,32,116,114,97,99,107,32,104,111,119,32,97,32,109,97,116,99,104,32,119,97,115,32,97,114,114,105,118,101,100,32,97,116,44,32,97,108,116,104,111,117,103,104,10,105,116,32,97,108,115,111,32,104,97,115,32,97,32,115,101,99,111,110,100,97,114,121,32,117,115,101,32,105,110,32,119,105,116,104,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,40,115,101,101,10,40,92,42,83,75,73,80,41,32,98,101,108,111,119,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,73,110,32,69,114,108,97,110,103,44,32,116,104,101,114,101,32,105,115,32,110,111,32,105,110,116,101,114,102,97,99,101,32,116,111,32,114,101,116,114,105,101,118,101,32,97,32,109,97,114,107,32,119,105,116,104,32,91,96,114,117,110,47,50,44,51,96,93,40,96,114,117,110,47,50,96,41,44,10,62,32,115,111,32,111,110,108,121,32,116,104,101,32,115,101,99,111,110,100,97,114,121,32,112,117,114,112,111,115,101,32,105,115,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,46,10,62,10,62,32,84,104,101,32,114,101,115,116,32,111,102,32,116,104,105,115,32,115,101,99,116,105,111,110,32,105,115,32,116,104,101,114,101,102,111,114,101,32,100,101,108,105,98,101,114,97,116,101,108,121,32,110,111,116,32,97,100,97,112,116,101,100,32,102,111,114,32,114,101,97,100,105,110,103,32,98,121,10,62,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,116,104,101,32,101,120,97,109,112,108,101,115,32,99,97,110,32,104,101,108,112,32,105,110,32,117,110,100,101,114,115,116,97,110,100,105,110,103,32,78,65,77,69,83,32,97,115,10,62,32,116,104,101,121,32,99,97,110,32,98,101,32,117,115,101,100,32,98,121,32,40,92,42,83,75,73,80,41,46,10,10,96,96,96,116,101,120,116,10,40,42,77,65,82,75,58,78,65,77,69,41,32,111,114,32,40,42,58,78,65,77,69,41,10,96,96,96,10,10,65,32,110,97,109,101,32,105,115,32,97,108,119,97,121,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,32,116,104,105,115,32,118,101,114,98,46,32,84,104,101,114,101,32,99,97,110,32,98,101,32,97,115,32,109,97,110,121,32,105,110,115,116,97,110,99,101,115,32,111,102,10,40,92,42,77,65,82,75,41,32,97,115,32,121,111,117,32,108,105,107,101,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,101,105,114,32,110,97,109,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,117,110,105,113,117,101,46,10,10,87,104,101,110,32,97,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,40,42,77,65,82,75,58,78,65,77,69,41,44,10,40,42,80,82,85,78,69,58,78,65,77,69,41,44,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,32,111,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,10,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,114,97,32,100,97,116,97,32,102,111,114,32,96,112,99,114,101,95,101,120,101,99,40,41,96,34,32,105,110,32,116,104,101,32,96,112,99,114,101,97,112,105,96,10,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,73,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,111,102,32,96,112,99,114,101,116,101,115,116,96,32,111,117,116,112,117,116,44,32,116,104,101,32,47,75,32,109,111,100,105,102,105,101,114,10,114,101,113,117,101,115,116,115,32,116,104,101,32,114,101,116,114,105,101,118,97,108,32,97,110,100,32,111,117,116,112,117,116,116,105,110,103,32,111,102,32,40,42,77,65,82,75,41,32,100,97,116,97,58,10,10,96,96,96,116,101,120,116,10,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,89,10,32,48,58,32,88,89,10,77,75,58,32,65,10,88,90,10,32,48,58,32,88,90,10,77,75,58,32,66,10,96,96,96,10,10,84,104,101,32,40,92,42,77,65,82,75,41,32,110,97,109,101,32,105,115,32,116,97,103,103,101,100,32,119,105,116,104,32,34,77,75,58,34,32,105,110,32,116,104,105,115,32,111,117,116,112,117,116,44,32,97,110,100,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,105,116,10,105,110,100,105,99,97,116,101,115,32,119,104,105,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,105,115,32,97,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,119,97,121,32,111,102,10,111,98,116,97,105,110,105,110,103,32,116,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,110,32,112,117,116,116,105,110,103,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,105,116,115,32,111,119,110,32,99,97,112,116,117,114,105,110,103,10,112,97,114,101,110,116,104,101,115,101,115,46,10,10,73,102,32,97,32,118,101,114,98,32,119,105,116,104,32,97,32,110,97,109,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,116,104,101,10,110,97,109,101,32,105,115,32,114,101,99,111,114,100,101,100,32,97,110,100,32,112,97,115,115,101,100,32,98,97,99,107,32,105,102,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,10,111,99,99,117,114,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,111,114,32,102,97,105,108,105,110,103,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,10,10,65,102,116,101,114,32,97,32,112,97,114,116,105,97,108,32,109,97,116,99,104,32,111,114,32,97,32,102,97,105,108,101,100,32,109,97,116,99,104,44,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,110,97,109,101,32,105,110,32,116,104,101,32,101,110,116,105,114,101,10,109,97,116,99,104,32,112,114,111,99,101,115,115,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,80,10,78,111,32,109,97,116,99,104,44,32,109,97,114,107,32,61,32,66,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,105,110,32,116,104,105,115,32,117,110,97,110,99,104,111,114,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,114,107,32,105,115,32,114,101,116,97,105,110,101,100,32,102,114,111,109,32,116,104,101,32,109,97,116,99,104,10,97,116,116,101,109,112,116,32,116,104,97,116,32,115,116,97,114,116,101,100,32,97,116,32,108,101,116,116,101,114,32,34,88,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,83,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,115,10,115,116,97,114,116,105,110,103,32,97,116,32,34,80,34,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,100,111,32,110,111,116,32,103,101,116,32,97,115,32,102,97,114,32,97,115,32,116,104,101,32,40,92,42,77,65,82,75,41,10,105,116,101,109,44,32,110,101,118,101,114,116,104,101,108,101,115,115,32,100,111,32,110,111,116,32,114,101,115,101,116,32,105,116,46,10,10,95,86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,97,102,116,101,114,32,66,97,99,107,116,114,97,99,107,105,110,103,95,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,100,111,32,110,111,116,104,105,110,103,32,119,104,101,110,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,77,97,116,99,104,105,110,103,32,99,111,110,116,105,110,117,101,115,10,119,105,116,104,32,119,104,97,116,32,102,111,108,108,111,119,115,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,44,32,99,97,117,115,105,110,103,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,10,116,104,101,32,118,101,114,98,44,32,97,32,102,97,105,108,117,114,101,32,105,115,32,102,111,114,99,101,100,46,32,84,104,97,116,32,105,115,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,112,97,115,115,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,10,116,104,101,32,118,101,114,98,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,97,112,112,101,97,114,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,110,10,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,105,116,115,32,101,102,102,101,99,116,32,105,115,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,97,116,32,103,114,111,117,112,44,32,97,115,32,111,110,99,101,32,116,104,101,32,103,114,111,117,112,10,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,116,104,101,114,101,32,105,115,32,110,101,118,101,114,32,97,110,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,73,110,32,116,104,105,115,32,115,105,116,117,97,116,105,111,110,44,10,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,34,106,117,109,112,32,98,97,99,107,34,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,10,97,115,115,101,114,116,105,111,110,46,32,40,82,101,109,101,109,98,101,114,32,97,108,115,111,44,32,97,115,32,115,116,97,116,101,100,32,97,98,111,118,101,44,32,116,104,97,116,32,116,104,105,115,32,108,111,99,97,108,105,122,97,116,105,111,110,32,97,108,115,111,32,97,112,112,108,105,101,115,10,105,110,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,46,41,10,10,84,104,101,115,101,32,118,101,114,98,115,32,100,105,102,102,101,114,32,105,110,32,101,120,97,99,116,108,121,32,119,104,97,116,32,107,105,110,100,32,111,102,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,10,114,101,97,99,104,101,115,32,116,104,101,109,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,32,105,115,32,119,104,97,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,118,101,114,98,32,105,115,32,110,111,116,10,105,110,32,97,32,115,117,98,114,111,117,116,105,110,101,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,83,117,98,115,101,113,117,101,110,116,32,115,101,99,116,105,111,110,115,32,99,111,118,101,114,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,99,97,115,101,115,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,105,99,104,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,44,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,10,116,111,32,102,97,105,108,32,111,117,116,114,105,103,104,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,10,116,111,32,114,101,97,99,104,32,105,116,46,32,69,118,101,110,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,110,111,32,102,117,114,116,104,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,102,105,110,100,32,97,10,109,97,116,99,104,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,116,97,107,101,32,112,108,97,99,101,46,10,10,96,96,96,116,101,120,116,10,40,42,67,79,77,77,73,84,41,10,96,96,96,10,10,73,102,32,40,92,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,111,110,108,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,116,104,97,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,44,32,111,110,99,101,32,105,116,32,104,97,115,10,98,101,101,110,32,112,97,115,115,101,100,44,32,91,96,114,117,110,47,50,44,51,96,93,40,96,114,117,110,47,50,96,41,32,105,115,32,99,111,109,109,105,116,116,101,100,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,10,115,116,97,114,116,105,110,103,32,112,111,105,110,116,44,32,111,114,32,110,111,116,32,97,116,32,97,108,108,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,97,43,40,42,67,79,77,77,73,84,41,98,10,96,96,96,10,10,84,104,105,115,32,109,97,116,99,104,101,115,32,34,120,120,97,97,98,34,32,98,117,116,32,110,111,116,32,34,97,97,99,97,97,98,34,46,32,73,116,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,107,105,110,100,32,111,102,32,100,121,110,97,109,105,99,10,97,110,99,104,111,114,44,32,111,114,32,34,73,39,118,101,32,115,116,97,114,116,101,100,44,32,115,111,32,73,32,109,117,115,116,32,102,105,110,105,115,104,34,46,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,10,112,97,115,115,101,100,32,40,42,77,65,82,75,41,32,105,110,32,116,104,101,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,119,104,101,110,32,40,42,67,79,77,77,73,84,41,32,102,111,114,99,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46,10,10,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,101,120,105,115,116,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,32,100,105,102,102,101,114,101,110,116,32,111,110,101,32,116,104,97,116,10,102,111,108,108,111,119,115,32,40,42,67,79,77,77,73,84,41,32,99,97,110,32,98,101,32,116,114,105,103,103,101,114,101,100,32,102,105,114,115,116,44,32,115,111,32,109,101,114,101,108,121,32,112,97,115,115,105,110,103,32,40,42,67,79,77,77,73,84,41,32,100,117,114,105,110,103,32,97,10,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,97,108,119,97,121,115,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,32,109,97,116,99,104,32,109,117,115,116,32,98,101,32,97,116,32,116,104,105,115,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,40,92,42,67,79,77,77,73,84,41,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,97,110,32,97,110,99,104,111,114,44,10,117,110,108,101,115,115,32,116,104,101,32,80,67,82,69,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,97,114,101,32,116,117,114,110,101,100,32,111,102,102,44,32,97,115,32,115,104,111,119,110,32,105,110,32,116,104,101,10,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,93,41,46,10,123,109,97,116,99,104,44,91,34,97,98,99,34,93,125,10,50,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,44,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,93,41,46,10,110,111,109,97,116,99,104,10,96,96,96,10,10,70,111,114,32,116,104,105,115,32,112,97,116,116,101,114,110,44,32,80,67,82,69,32,107,110,111,119,115,32,116,104,97,116,32,97,110,121,32,109,97,116,99,104,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,34,97,34,44,32,115,111,32,116,104,101,10,111,112,116,105,109,105,122,97,116,105,111,110,32,115,107,105,112,115,32,97,108,111,110,103,32,116,104,101,32,115,117,98,106,101,99,116,32,116,111,32,34,97,34,32,98,101,102,111,114,101,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,101,10,102,105,114,115,116,32,115,101,116,32,111,102,32,100,97,116,97,46,32,84,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,101,110,32,115,117,99,99,101,101,100,115,46,32,73,110,32,116,104,101,32,115,101,99,111,110,100,32,99,97,108,108,32,116,104,101,10,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,32,100,105,115,97,98,108,101,115,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,115,107,105,112,115,32,97,108,111,110,103,32,116,111,32,116,104,101,32,102,105,114,115,116,10,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,110,111,119,32,97,112,112,108,105,101,100,32,115,116,97,114,116,105,110,103,32,97,116,32,34,120,34,44,32,97,110,100,32,115,111,32,116,104,101,32,40,92,42,67,79,77,77,73,84,41,10,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,116,114,121,105,110,103,32,97,110,121,32,111,116,104,101,114,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,115,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,10,116,104,101,32,115,117,98,106,101,99,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,10,114,101,97,99,104,32,105,116,58,10,10,96,96,96,116,101,120,116,10,40,42,80,82,85,78,69,41,32,111,114,32,40,42,80,82,85,78,69,58,78,65,77,69,41,10,96,96,96,10,10,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,110,111,114,109,97,108,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,10,115,116,97,114,116,105,110,103,32,99,104,97,114,97,99,116,101,114,32,116,104,101,110,32,111,99,99,117,114,115,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,111,99,99,117,114,32,97,115,32,117,115,117,97,108,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,10,40,42,80,82,85,78,69,41,44,32,98,101,102,111,114,101,32,105,116,32,105,115,32,114,101,97,99,104,101,100,44,32,111,114,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,116,111,32,116,104,101,32,114,105,103,104,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,117,116,10,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,99,114,111,115,115,32,40,42,80,82,85,78,69,41,46,32,73,110,32,115,105,109,112,108,101,10,99,97,115,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,40,42,80,82,85,78,69,41,32,105,115,32,106,117,115,116,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,10,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,117,115,101,115,32,111,102,32,40,42,80,82,85,78,69,41,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,10,101,120,112,114,101,115,115,101,100,32,105,110,32,97,110,121,32,111,116,104,101,114,32,119,97,121,46,32,73,110,32,97,110,32,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,44,32,40,42,80,82,85,78,69,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,10,97,115,32,40,92,42,67,79,77,77,73,84,41,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,80,82,85,78,69,41,46,32,73,116,32,105,115,10,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,10,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,92,42,80,82,85,78,69,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,62,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,101,110,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,111,117,116,32,97,32,110,97,109,101,44,32,105,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,44,32,101,120,99,101,112,116,32,116,104,97,116,10,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,110,111,116,32,116,111,32,116,104,101,32,110,101,120,116,10,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,116,111,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,10,10,96,96,96,116,101,120,116,10,40,42,83,75,73,80,41,10,96,96,96,10,10,40,92,42,83,75,73,80,41,32,115,105,103,110,105,102,105,101,115,32,116,104,97,116,32,119,104,97,116,101,118,101,114,32,116,101,120,116,32,119,97,115,32,109,97,116,99,104,101,100,32,108,101,97,100,105,110,103,32,117,112,32,116,111,32,105,116,32,99,97,110,110,111,116,32,98,101,10,112,97,114,116,32,111,102,32,97,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,46,32,67,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,97,43,40,42,83,75,73,80,41,98,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,97,97,97,99,46,46,46,34,44,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,102,97,105,108,115,32,40,115,116,97,114,116,105,110,103,32,97,116,10,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,116,114,105,110,103,41,44,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,115,107,105,112,115,32,111,110,32,116,111,32,115,116,97,114,116,32,116,104,101,10,110,101,120,116,32,97,116,116,101,109,112,116,32,97,116,32,34,99,34,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,104,101,32,115,97,109,101,10,101,102,102,101,99,116,32,97,115,32,116,104,105,115,32,101,120,97,109,112,108,101,59,32,97,108,116,104,111,117,103,104,32,105,116,32,119,111,117,108,100,32,115,117,112,112,114,101,115,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,100,117,114,105,110,103,32,116,104,101,32,102,105,114,115,116,10,109,97,116,99,104,32,97,116,116,101,109,112,116,44,32,116,104,101,32,115,101,99,111,110,100,32,97,116,116,101,109,112,116,32,119,111,117,108,100,32,115,116,97,114,116,32,97,116,32,116,104,101,32,115,101,99,111,110,100,32,99,104,97,114,97,99,116,101,114,32,105,110,115,116,101,97,100,32,111,102,10,115,107,105,112,112,105,110,103,32,111,110,32,116,111,32,34,99,34,46,10,10,87,104,101,110,32,40,92,42,83,75,73,80,41,32,104,97,115,32,97,110,32,97,115,115,111,99,105,97,116,101,100,32,110,97,109,101,44,32,105,116,115,32,98,101,104,97,118,105,111,114,32,105,115,32,109,111,100,105,102,105,101,100,58,10,10,96,96,96,116,101,120,116,10,40,42,83,75,73,80,58,78,65,77,69,41,10,96,96,96,10,10,87,104,101,110,32,116,104,105,115,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,112,97,116,104,32,116,104,114,111,117,103,104,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,101,97,114,99,104,101,100,32,102,111,114,10,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,40,42,77,65,82,75,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,110,97,109,101,46,32,73,102,32,111,110,101,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,10,97,100,118,97,110,99,101,32,105,115,32,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,112,111,115,105,116,105,111,110,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,97,116,32,40,42,77,65,82,75,41,32,105,110,115,116,101,97,100,32,111,102,10,116,111,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,32,73,102,32,110,111,32,40,42,77,65,82,75,41,32,119,105,116,104,32,97,32,109,97,116,99,104,105,110,103,32,110,97,109,101,32,105,115,32,102,111,117,110,100,44,10,40,92,42,83,75,73,80,41,32,105,115,32,105,103,110,111,114,101,100,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,98,121,32,40,42,77,65,82,75,58,78,65,77,69,41,46,32,73,116,32,105,103,110,111,114,101,115,10,110,97,109,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,98,121,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,105,110,110,101,114,109,111,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,119,104,101,110,10,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,99,101,108,115,32,97,110,121,32,102,117,114,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,119,105,116,104,105,110,32,116,104,101,10,99,117,114,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,46,10,10,96,96,96,116,101,120,116,10,40,42,84,72,69,78,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,10,96,96,96,10,10,84,104,101,32,118,101,114,98,32,110,97,109,101,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,111,98,115,101,114,118,97,116,105,111,110,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,97,32,112,97,116,116,101,114,110,45,98,97,115,101,100,10,105,102,45,116,104,101,110,45,101,108,115,101,32,98,108,111,99,107,58,10,10,96,96,96,116,101,120,116,10,40,32,67,79,78,68,49,32,40,42,84,72,69,78,41,32,70,79,79,32,124,32,67,79,78,68,50,32,40,42,84,72,69,78,41,32,66,65,82,32,124,32,67,79,78,68,51,32,40,42,84,72,69,78,41,32,66,65,90,32,41,32,46,46,46,10,96,96,96,10,10,73,102,32,116,104,101,32,67,79,78,68,49,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,70,79,79,32,105,115,32,116,114,105,101,100,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,105,116,101,109,115,32,97,102,116,101,114,32,116,104,101,10,101,110,100,32,111,102,32,116,104,101,32,103,114,111,117,112,32,105,102,32,70,79,79,32,115,117,99,99,101,101,100,115,41,46,32,79,110,32,102,97,105,108,117,114,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,115,107,105,112,115,32,116,111,32,116,104,101,32,115,101,99,111,110,100,10,97,108,116,101,114,110,97,116,105,118,101,32,97,110,100,32,116,114,105,101,115,32,67,79,78,68,50,44,32,119,105,116,104,111,117,116,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,67,79,78,68,49,46,32,73,102,32,116,104,97,116,32,115,117,99,99,101,101,100,115,10,97,110,100,32,66,65,82,32,102,97,105,108,115,44,32,67,79,78,68,51,32,105,115,32,116,114,105,101,100,46,32,73,102,32,66,65,90,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,114,101,32,105,115,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,119,104,97,116,101,118,101,114,32,99,97,109,101,32,98,101,102,111,114,101,32,116,104,101,32,101,110,116,105,114,101,32,103,114,111,117,112,46,10,73,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,97,110,32,97,108,116,101,114,110,97,116,105,111,110,44,32,105,116,32,97,99,116,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46,10,10,84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,84,72,69,78,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,84,72,69,78,41,46,32,73,116,32,105,115,10,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,10,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,92,42,84,72,69,78,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,10,62,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46,10,10,65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,124,32,99,104,97,114,97,99,116,101,114,32,105,115,32,106,117,115,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,101,110,99,108,111,115,105,110,103,10,97,108,116,101,114,110,97,116,105,118,101,59,32,105,116,32,105,115,32,110,111,116,32,97,32,110,101,115,116,101,100,32,97,108,116,101,114,110,97,116,105,111,110,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,46,32,84,104,101,10,101,102,102,101,99,116,32,111,102,32,40,92,42,84,72,69,78,41,32,101,120,116,101,110,100,115,32,98,101,121,111,110,100,32,115,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,101,110,99,108,111,115,105,110,103,10,97,108,116,101,114,110,97,116,105,118,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,10,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,111,110,116,97,105,110,32,97,110,121,32,124,32,99,104,97,114,97,99,116,101,114,115,32,97,116,32,116,104,105,115,32,108,101,118,101,108,58,10,10,96,96,96,116,101,120,116,10,65,32,40,66,40,42,84,72,69,78,41,67,41,32,124,32,68,10,96,96,96,10,10,73,102,32,65,32,97,110,100,32,66,32,97,114,101,32,109,97,116,99,104,101,100,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,10,105,110,116,111,32,65,59,32,105,110,115,116,101,97,100,32,105,116,32,109,111,118,101,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,104,97,116,32,105,115,44,32,68,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,10,115,117,98,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,105,110,103,32,40,92,42,84,72,69,78,41,32,105,115,32,103,105,118,101,110,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,105,116,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,58,10,10,96,96,96,116,101,120,116,10,65,32,40,66,40,42,84,72,69,78,41,67,32,124,32,40,42,70,65,73,76,41,41,32,124,32,68,10,96,96,96,10,10,84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,119,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,101,32,105,110,110,101,114,32,115,117,98,112,97,116,116,101,114,110,46,32,65,102,116,101,114,32,97,32,102,97,105,108,117,114,101,10,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,109,111,118,101,115,32,116,111,32,40,42,70,65,73,76,41,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,44,32,97,115,10,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,116,111,32,116,114,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,119,32,98,97,99,107,116,114,97,99,107,10,105,110,116,111,32,65,46,10,10,78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,104,97,118,105,110,103,32,116,119,111,10,97,108,116,101,114,110,97,116,105,118,101,115,44,32,97,115,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,117,115,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,32,105,110,32,97,10,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,46,32,73,103,110,111,114,105,110,103,32,119,104,105,116,101,115,112,97,99,101,44,32,99,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,94,46,42,63,32,40,63,40,63,61,97,41,32,97,32,124,32,98,40,42,84,72,69,78,41,99,32,41,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,98,97,34,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,46,32,65,115,32,46,95,63,32,105,115,32,117,110,103,114,101,101,100,121,44,32,105,116,10,105,110,105,116,105,97,108,108,121,32,109,97,116,99,104,101,115,32,122,101,114,111,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,32,40,63,61,97,41,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,10,34,98,34,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,34,99,34,32,105,115,32,110,111,116,46,32,65,116,32,116,104,105,115,32,112,111,105,110,116,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,116,111,10,46,95,63,32,97,115,32,99,97,110,32,112,101,114,104,97,112,115,32,98,101,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,10,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,97,108,116,101,114,110,97,116,105,118,101,32,116,104,97,116,32,99,111,109,112,114,105,115,101,115,32,116,104,101,10,119,104,111,108,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,115,111,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,73,102,32,116,104,101,114,101,32,119,97,115,32,97,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,46,92,42,63,44,10,97,108,108,111,119,105,110,103,32,105,116,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,109,97,116,99,104,32,119,111,117,108,100,32,115,117,99,99,101,101,100,46,41,10,10,84,104,101,32,118,101,114,98,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,112,114,111,118,105,100,101,32,102,111,117,114,32,100,105,102,102,101,114,101,110,116,32,34,115,116,114,101,110,103,116,104,115,34,32,111,102,32,99,111,110,116,114,111,108,32,119,104,101,110,10,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,115,58,10,10,45,32,40,92,42,84,72,69,78,41,32,105,115,32,116,104,101,32,119,101,97,107,101,115,116,44,32,99,97,114,114,121,105,110,103,32,111,110,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,46,10,45,32,40,92,42,80,82,85,78,69,41,32,99,111,109,101,115,32,110,101,120,116,44,32,102,97,105,108,115,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,44,32,98,117,116,10,32,32,97,108,108,111,119,115,32,97,110,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,97,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,41,46,10,45,32,40,92,42,83,75,73,80,41,32,105,115,32,115,105,109,105,108,97,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,97,100,118,97,110,99,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,10,45,32,40,92,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,115,116,114,111,110,103,101,115,116,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,10,10,95,77,111,114,101,32,116,104,97,110,32,79,110,101,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,95,10,10,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,111,110,101,32,116,104,97,116,32,105,115,10,98,97,99,107,116,114,97,99,107,101,100,32,111,110,116,111,32,102,105,114,115,116,32,97,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,10,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,58,10,10,96,96,96,116,101,120,116,10,40,65,40,42,67,79,77,77,73,84,41,66,40,42,84,72,69,78,41,67,124,65,66,68,41,10,96,96,96,10,10,73,102,32,65,32,109,97,116,99,104,101,115,32,98,117,116,32,66,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,10,102,97,105,108,46,32,72,111,119,101,118,101,114,44,32,105,102,32,65,32,97,110,100,32,66,32,109,97,116,99,104,44,32,98,117,116,32,67,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,10,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,40,65,66,68,41,32,116,111,32,98,101,32,116,114,105,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,44,32,98,117,116,32,105,115,32,110,111,116,10,97,108,119,97,121,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,32,73,116,32,109,101,97,110,115,32,116,104,97,116,32,105,102,32,116,119,111,32,111,114,32,109,111,114,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,10,97,112,112,101,97,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,44,32,116,104,101,32,108,97,115,116,32,111,102,32,116,104,101,109,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,101,120,97,109,112,108,101,58,10,10,96,96,96,116,101,120,116,10,46,46,46,40,42,67,79,77,77,73,84,41,40,42,80,82,85,78,69,41,46,46,46,10,96,96,96,10,10,73,102,32,116,104,101,114,101,32,105,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,110,116,111,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,10,105,116,32,116,111,32,98,101,32,116,114,105,103,103,101,114,101,100,44,32,97,110,100,32,105,116,115,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,84,104,101,114,101,32,99,97,110,32,110,101,118,101,114,32,98,101,32,97,32,98,97,99,107,116,114,97,99,107,32,111,110,116,111,10,40,42,67,79,77,77,73,84,41,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,82,101,112,101,97,116,101,100,32,71,114,111,117,112,115,95,10,10,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,105,116,115,32,104,97,110,100,108,105,110,103,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,46,10,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,58,10,10,96,96,96,116,101,120,116,10,47,40,97,40,42,67,79,77,77,73,84,41,98,41,43,97,99,47,10,96,96,96,10,10,73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,99,34,44,32,80,101,114,108,32,109,97,116,99,104,101,115,44,32,98,117,116,32,80,67,82,69,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,116,104,101,32,40,92,42,67,79,77,77,73,84,41,32,105,110,10,116,104,101,32,115,101,99,111,110,100,32,114,101,112,101,97,116,32,111,102,32,116,104,101,32,103,114,111,117,112,32,97,99,116,115,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,65,115,115,101,114,116,105,111,110,115,95,10,10,40,92,42,70,65,73,76,41,32,105,110,32,97,110,32,97,115,115,101,114,116,105,111,110,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,10,98,97,99,107,116,114,97,99,107,46,10,10,40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,10,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,73,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,40,42,65,67,67,69,80,84,41,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,10,102,97,105,108,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,10,10,84,104,101,32,111,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,116,114,101,97,116,101,100,32,115,112,101,99,105,97,108,108,121,32,105,102,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,97,10,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,40,92,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,10,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,111,110,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,105,115,32,105,115,32,119,105,116,104,105,110,10,116,104,101,32,97,115,115,101,114,116,105,111,110,46,10,10,78,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,44,32,104,111,119,101,118,101,114,44,32,100,105,102,102,101,114,101,110,116,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,99,104,97,110,103,105,110,103,32,97,32,112,111,115,105,116,105,118,101,10,97,115,115,101,114,116,105,111,110,32,105,110,116,111,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,104,97,110,103,101,115,32,105,116,115,32,114,101,115,117,108,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,10,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,111,114,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,44,32,119,105,116,104,111,117,116,10,99,111,110,115,105,100,101,114,105,110,103,32,97,110,121,32,102,117,114,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,10,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,10,40,116,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,41,44,32,98,117,116,32,105,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,115,117,99,104,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,10,40,42,84,72,69,78,41,32,98,101,104,97,118,101,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46,10,10,95,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,83,117,98,114,111,117,116,105,110,101,115,95,10,10,84,104,101,115,101,32,98,101,104,97,118,105,111,114,115,32,111,99,99,117,114,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,46,32,84,104,101,10,116,114,101,97,116,109,101,110,116,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,110,32,80,101,114,108,32,105,115,32,100,105,102,102,101,114,101,110,116,32,105,110,32,115,111,109,101,32,99,97,115,101,115,46,10,10,45,32,40,92,42,70,65,73,76,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,10,32,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46,10,45,32,40,92,42,65,67,67,69,80,84,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,10,32,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,102,116,101,114,32,116,104,101,10,32,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46,10,45,32,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,97,110,100,32,40,92,42,80,82,85,78,69,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,10,32,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,10,45,32,40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,119,105,116,104,105,110,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,10,32,32,115,117,98,112,97,116,116,101,114,110,44,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>},#{otp_doc_vsn => {1,0,0}},[{{type,replace_fun,0},{58,2},[<<114,101,112,108,97,99,101,95,102,117,110,40,41>>],none,#{exported => false}},{{type,capture,0},{55,2},[<<99,97,112,116,117,114,101,40,41>>],none,#{exported => false}},{{type,option,0},{46,2},[<<111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,options,0},{45,2},[<<111,112,116,105,111,110,115,40,41>>],none,#{exported => true}},{{type,compile_option,0},{38,2},[<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,40,41>>],none,#{exported => false}},{{type,compile_options,0},{37,2},[<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,40,41>>],none,#{exported => true}},{{type,nl_spec,0},{35,2},[<<110,108,95,115,112,101,99,40,41>>],none,#{exported => false}},{{type,mp,0},{26,2},[<<109,112,40,41>>],#{<<101,110>> => <<79,112,97,113,117,101,32,100,97,116,97,32,116,121,112,101,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,96,116,58,109,112,47,48,96,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,97,32,116,117,112,108,101,40,41,32,104,97,118,105,110,103,32,116,104,101,32,97,116,111,109,32,96,114,101,95,112,97,116,116,101,114,110,96,32,97,115,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,116,111,10,97,108,108,111,119,32,102,111,114,32,109,97,116,99,104,105,110,103,32,105,110,32,103,117,97,114,100,115,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,116,117,112,108,101,32,111,114,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,111,116,104,101,114,10,102,105,101,108,100,115,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,115,46>>},#{exported => true,specification => [{attribute,{33,2},type,{mp,{type,{33,15},tuple,[{atom,{33,16},re_pattern},{var,{33,28},'_'},{var,{33,31},'_'},{var,{33,34},'_'},{var,{33,37},'_'}]},[]}}]}},{{function,grun,3},{1770,2},[<<103,114,117,110,47,51>>],hidden,#{}},{{function,urun,3},{1729,2},[<<117,114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],hidden,#{}},{{function,ucompile,2},{1716,2},[<<117,99,111,109,112,105,108,101,40,82,69,44,32,79,112,116,105,111,110,115,41>>],hidden,#{}},{{function,replace,4},{1261,2},[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<82,101,112,108,97,99,101,115,32,116,104,101,32,109,97,116,99,104,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,96,83,117,98,106,101,99,116,96,32,115,116,114,105,110,103,32,119,105,116,104,32,96,82,101,112,108,97,99,101,109,101,110,116,96,46,10,10,84,104,101,32,112,101,114,109,105,115,115,105,98,108,101,32,111,112,116,105,111,110,115,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32,96,114,117,110,47,51,96,44,32,101,120,99,101,112,116,32,116,104,97,116,10,111,112,116,105,111,110,96,32,99,97,112,116,117,114,101,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,32,73,110,115,116,101,97,100,32,97,32,96,123,114,101,116,117,114,110,44,32,82,101,116,117,114,110,84,121,112,101,125,96,32,105,115,32,112,114,101,115,101,110,116,46,10,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,96,105,111,100,97,116,97,96,44,32,99,111,110,115,116,114,117,99,116,101,100,32,105,110,32,97,32,119,97,121,32,116,111,32,109,105,110,105,109,105,122,101,32,99,111,112,121,105,110,103,46,10,84,104,101,32,96,105,111,100,97,116,97,96,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,117,115,101,100,32,100,105,114,101,99,116,108,121,32,105,110,32,109,97,110,121,32,73,47,79,32,111,112,101,114,97,116,105,111,110,115,46,32,73,102,32,97,32,102,108,97,116,10,96,116,58,108,105,115,116,47,48,96,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32,96,123,114,101,116,117,114,110,44,32,108,105,115,116,125,96,46,32,73,102,32,97,32,98,105,110,97,114,121,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,10,96,123,114,101,116,117,114,110,44,32,98,105,110,97,114,121,125,96,46,10,10,65,115,32,105,110,32,102,117,110,99,116,105,111,110,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,44,32,97,110,32,96,116,58,109,112,47,48,96,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,10,114,101,113,117,105,114,101,115,32,96,83,117,98,106,101,99,116,96,32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,10,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32,96,117,110,105,99,111,100,101,96,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,10,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,96,83,117,98,106,101,99,116,96,32,97,114,101,32,116,111,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,10,96,99,104,97,114,108,105,115,116,40,41,96,115,46,10,10,73,102,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,115,116,114,105,110,103,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,10,96,38,96,44,32,119,104,105,99,104,32,105,110,115,101,114,116,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,10,115,101,113,117,101,110,99,101,32,96,92,96,78,32,40,119,104,101,114,101,32,78,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,62,32,48,41,44,32,96,92,103,96,78,44,32,111,114,32,96,92,103,123,96,78,96,125,96,44,32,114,101,115,117,108,116,105,110,103,32,105,110,32,116,104,101,10,115,117,98,101,120,112,114,101,115,115,105,111,110,32,110,117,109,98,101,114,32,78,44,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,73,102,32,110,111,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,105,116,104,32,116,104,97,116,10,110,117,109,98,101,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,46,10,10,84,111,32,105,110,115,101,114,116,32,97,110,32,38,32,111,114,32,97,32,92,92,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,112,114,101,99,101,100,101,32,105,116,32,119,105,116,104,32,97,32,92,92,46,32,78,111,116,105,99,101,32,116,104,97,116,32,69,114,108,97,110,103,10,97,108,114,101,97,100,121,32,103,105,118,101,115,32,97,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,111,32,92,92,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,115,111,32,97,32,115,105,110,103,108,101,32,92,92,32,109,117,115,116,32,98,101,10,119,114,105,116,116,101,110,32,97,115,32,96,34,92,92,34,96,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,97,32,100,111,117,98,108,101,32,92,92,32,97,115,32,96,34,92,92,92,92,34,96,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,34,97,98,91,99,93,100,34,10,96,96,96,10,10,119,104,105,108,101,10,10,96,96,96,101,114,108,97,110,103,10,50,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,92,92,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,34,97,98,91,38,93,100,34,10,96,96,96,10,10,73,102,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,102,117,110,44,32,105,116,32,119,105,108,108,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,10,101,120,112,114,101,115,115,105,111,110,32,97,115,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,97,110,100,32,97,32,108,105,115,116,32,111,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,10,111,114,100,101,114,32,105,110,32,119,104,105,99,104,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,105,108,108,32,98,101,10,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,10,10,95,69,120,97,109,112,108,101,58,95,10,10,96,96,96,101,114,108,97,110,103,10,51,62,32,114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,32,34,46,40,46,41,34,44,10,32,32,32,32,102,117,110,40,87,104,111,108,101,44,32,91,60,60,67,62,62,93,41,32,45,62,10,32,32,32,32,32,32,32,32,32,60,60,36,35,44,32,87,104,111,108,101,47,98,105,110,97,114,121,44,32,36,45,44,32,40,67,32,45,32,36,97,32,43,32,36,65,41,44,32,36,35,62,62,10,32,32,32,32,101,110,100,44,10,32,32,32,32,91,123,114,101,116,117,114,110,44,32,108,105,115,116,125,93,41,46,10,34,35,97,98,45,66,35,99,100,34,10,96,96,96,10,10,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,62,10,62,32,78,111,110,45,109,97,116,99,104,105,110,103,32,111,112,116,105,111,110,97,108,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,105,108,108,32,110,111,116,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,111,102,10,62,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,116,104,101,32,108,97,115,116,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,62,32,101,120,112,114,101,115,115,105,111,110,46,10,62,10,62,32,95,69,120,97,109,112,108,101,58,95,10,62,10,62,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,34,40,97,41,40,98,41,63,40,99,41,63,34,96,32,40,34,97,34,44,32,111,112,116,105,111,110,97,108,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,34,44,10,62,32,111,112,116,105,111,110,97,108,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,34,99,34,41,32,119,105,108,108,32,99,114,101,97,116,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,108,105,115,116,115,58,10,62,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,34,98,34,62,62,44,32,60,60,34,99,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,98,99,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,62,62,44,32,60,60,34,99,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,99,120,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,44,32,60,60,34,98,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,98,120,34,96,10,62,32,45,32,96,91,60,60,34,97,34,62,62,93,96,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,115,116,114,105,110,103,32,96,34,97,120,120,34,96,10,10,65,115,32,119,105,116,104,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,114,97,105,115,101,32,116,104,101,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,46,10,96,99,111,109,112,105,108,101,47,50,96,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,114,114,111,114,46>>},#{specification => [{attribute,{1336,2},spec,{{replace,4},[{type,{1336,14},bounded_fun,[{type,{1336,14},'fun',[{type,{1336,14},product,[{var,{1336,15},'Subject'},{var,{1336,24},'RE'},{var,{1336,28},'Replacement'},{var,{1336,41},'Options'}]},{type,{1336,53},union,[{type,{1336,53},iodata,[]},{remote_type,{1336,64},[{atom,{1336,64},unicode},{atom,{1336,72},charlist},[]]}]}]},[{type,{1337,7},constraint,[{atom,{1337,7},is_subtype},[{var,{1337,7},'Subject'},{type,{1337,18},union,[{type,{1337,18},iodata,[]},{remote_type,{1337,29},[{atom,{1337,29},unicode},{atom,{1337,37},charlist},[]]}]}]]},{type,{1338,7},constraint,[{atom,{1338,7},is_subtype},[{var,{1338,7},'RE'},{type,{1338,13},union,[{user_type,{1338,13},mp,[]},{type,{1338,20},iodata,[]},{remote_type,{1338,31},[{atom,{1338,31},unicode},{atom,{1338,39},charlist},[]]}]}]]},{type,{1339,7},constraint,[{atom,{1339,7},is_subtype},[{var,{1339,7},'Replacement'},{type,{1339,22},union,[{type,{1339,22},iodata,[]},{remote_type,{1339,33},[{atom,{1339,33},unicode},{atom,{1339,41},charlist},[]]},{user_type,{1339,54},replace_fun,[]}]}]]},{type,{1340,7},constraint,[{atom,{1340,7},is_subtype},[{var,{1340,7},'Options'},{type,{1340,18},list,[{var,{1340,19},'Option'}]}]]},{type,{1341,7},constraint,[{atom,{1341,7},is_subtype},[{var,{1341,7},'Option'},{type,{1341,17},union,[{atom,{1341,17},anchored},{atom,{1341,28},global},{atom,{1341,37},notbol},{atom,{1341,46},noteol},{atom,{1341,55},notempty},{atom,{1342,10},notempty_atstart},{type,{1343,17},tuple,[{atom,{1343,18},offset},{type,{1343,26},non_neg_integer,[]}]},{type,{1343,47},tuple,[{atom,{1343,48},newline},{var,{1343,57},'NLSpec'}]},{atom,{1343,67},bsr_anycrlf},{type,{1344,17},tuple,[{atom,{1344,18},match_limit},{type,{1344,31},non_neg_integer,[]}]},{type,{1345,17},tuple,[{atom,{1345,18},match_limit_recursion},{type,{1345,41},non_neg_integer,[]}]},{atom,{1346,17},bsr_unicode},{type,{1346,31},tuple,[{atom,{1346,32},return},{var,{1346,40},'ReturnType'}]},{var,{1346,54},'CompileOpt'}]}]]},{type,{1347,7},constraint,[{atom,{1347,7},is_subtype},[{var,{1347,7},'ReturnType'},{type,{1347,21},union,[{atom,{1347,21},iodata},{atom,{1347,30},list},{atom,{1347,37},binary}]}]]},{type,{1348,7},constraint,[{atom,{1348,7},is_subtype},[{var,{1348,7},'CompileOpt'},{user_type,{1348,21},compile_option,[]}]]},{type,{1349,7},constraint,[{atom,{1349,7},is_subtype},[{var,{1349,7},'NLSpec'},{type,{1349,17},union,[{atom,{1349,17},cr},{atom,{1349,22},crlf},{atom,{1349,29},lf},{atom,{1349,34},anycrlf},{atom,{1349,44},any}]}]]}]]}]}}]}},{{function,replace,3},{1253,1},[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,41>>],none,#{equiv => <<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,91,93,41>>}},{{function,split,3},{889,2},[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<83,112,108,105,116,115,32,116,104,101,32,105,110,112,117,116,32,105,110,116,111,32,112,97,114,116,115,32,98,121,32,102,105,110,100,105,110,103,32,116,111,107,101,110,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,32,115,117,112,112,108,105,101,100,46,10,10,84,104,101,32,115,112,108,105,116,116,105,110,103,32,105,115,32,98,97,115,105,99,97,108,108,121,32,100,111,110,101,32,98,121,32,114,117,110,110,105,110,103,32,97,32,103,108,111,98,97,108,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,97,110,100,32,100,105,118,105,100,105,110,103,32,116,104,101,32,105,110,105,116,105,97,108,32,115,116,114,105,110,103,32,119,104,101,114,101,118,101,114,32,97,32,109,97,116,99,104,32,111,99,99,117,114,115,46,32,84,104,101,10,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,111,117,116,112,117,116,46,10,10,65,115,32,105,110,32,96,114,117,110,47,51,96,44,32,97,110,32,96,116,58,109,112,47,48,96,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,114,101,113,117,105,114,101,115,32,96,83,117,98,106,101,99,116,96,32,116,111,10,98,101,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32,96,117,110,105,99,111,100,101,96,10,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,10,97,110,100,32,96,83,117,98,106,101,99,116,96,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,115,46,10,10,84,104,101,32,114,101,115,117,108,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,108,105,115,116,32,111,102,32,34,115,116,114,105,110,103,115,34,44,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,100,97,116,97,32,116,121,112,101,32,115,112,101,99,105,102,105,101,100,32,105,110,10,111,112,116,105,111,110,32,96,114,101,116,117,114,110,96,32,40,100,101,102,97,117,108,116,32,96,105,111,100,97,116,97,96,41,46,10,10,73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,109,97,116,99,104,105,110,103,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,97,115,32,119,101,108,108,46,32,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,110,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,34,44,34,103,34,93,10,96,96,96,10,10,119,104,105,108,101,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,108,34,44,34,97,34,44,34,110,34,44,34,103,34,93,10,96,96,96,10,10,84,104,101,32,116,101,120,116,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,101,120,112,114,101,115,115,105,111,110,41,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,119,104,101,114,101,32,105,116,32,119,97,115,32,102,111,117,110,100,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,10,99,111,110,99,97,116,101,110,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,32,115,112,108,105,116,32,119,104,101,114,101,32,116,104,101,32,119,104,111,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,10,115,105,110,103,108,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,97,115,32,105,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,41,32,97,108,119,97,121,115,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,111,114,105,103,105,110,97,108,10,115,116,114,105,110,103,46,10,10,65,115,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,102,111,114,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,40,116,104,101,10,34,103,34,41,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,84,111,32,109,97,107,101,32,116,104,101,32,103,114,111,117,112,32,111,102,32,115,116,114,105,110,103,115,32,97,110,100,32,116,104,101,32,112,97,114,116,115,10,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,111,114,101,32,111,98,118,105,111,117,115,44,32,111,110,101,32,99,97,110,32,117,115,101,32,111,112,116,105,111,110,32,96,103,114,111,117,112,96,44,32,119,104,105,99,104,10,103,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,104,101,110,32,116,104,101,32,115,116,114,105,110,103,32,119,97,115,32,115,112,108,105,116,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,103,114,111,117,112,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,91,34,69,114,34,44,34,108,34,93,44,91,34,97,34,44,34,110,34,93,44,91,34,103,34,93,93,10,96,96,96,10,10,72,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,102,105,114,115,116,32,109,97,116,99,104,101,100,32,116,104,101,32,34,108,34,44,32,99,97,117,115,105,110,103,32,34,69,114,34,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,10,112,97,114,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,87,104,101,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,100,44,32,116,104,101,32,40,111,110,108,121,41,10,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,98,111,117,110,100,32,116,111,32,116,104,101,32,34,108,34,44,32,115,111,32,116,104,101,32,34,108,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,103,114,111,117,112,32,116,111,103,101,116,104,101,114,10,119,105,116,104,32,34,69,114,34,46,32,84,104,101,32,110,101,120,116,32,109,97,116,99,104,32,105,115,32,111,102,32,116,104,101,32,34,110,34,44,32,109,97,107,105,110,103,32,34,97,34,32,116,104,101,32,110,101,120,116,32,112,97,114,116,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,46,32,65,115,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,105,115,32,98,111,117,110,100,32,116,111,32,115,117,98,115,116,114,105,110,103,32,34,110,34,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,34,110,34,10,105,115,32,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,105,115,32,103,114,111,117,112,46,32,84,104,101,32,108,97,115,116,32,103,114,111,117,112,32,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,44,32,97,115,10,110,111,32,109,111,114,101,32,109,97,116,99,104,101,115,32,97,114,101,32,102,111,117,110,100,46,10,10,66,121,32,100,101,102,97,117,108,116,44,32,97,108,108,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,44,32,97,114,101,32,114,101,116,117,114,110,101,100,10,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,34,44,91,93,93,10,96,96,96,10,10,97,115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,111,102,32,116,104,101,32,34,103,34,32,105,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,108,101,97,118,101,115,32,97,110,32,101,109,112,116,121,32,114,101,115,116,44,32,119,104,105,99,104,10,105,115,32,97,108,115,111,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,115,112,108,105,116,10,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,44,32,119,104,101,114,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,98,121,32,100,101,102,97,117,108,116,32,114,101,109,111,118,101,100,46,32,84,111,32,103,101,116,10,116,104,101,32,34,116,114,105,109,109,105,110,103,34,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,80,101,114,108,44,32,115,112,101,99,105,102,121,32,96,116,114,105,109,96,32,97,115,32,97,110,32,111,112,116,105,111,110,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,116,114,105,109,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,34,93,10,96,96,96,10,10,84,104,101,32,34,116,114,105,109,34,32,111,112,116,105,111,110,32,115,97,121,115,59,32,34,103,105,118,101,32,109,101,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,101,120,99,101,112,116,32,116,104,101,32,101,109,112,116,121,10,111,110,101,115,34,44,32,119,104,105,99,104,32,115,111,109,101,116,105,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,32,89,111,117,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,104,111,119,32,109,97,110,121,32,112,97,114,116,115,32,121,111,117,10,119,97,110,116,44,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,96,78,96,125,96,58,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,50,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,10,10,96,96,96,101,114,108,97,110,103,10,91,34,69,114,34,44,34,97,110,103,34,93,10,96,96,96,10,10,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,115,32,34,97,110,103,34,44,32,110,111,116,32,34,97,110,34,44,32,97,115,32,115,112,108,105,116,116,105,110,103,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,105,110,116,111,10,116,119,111,32,112,97,114,116,115,44,32,97,110,100,32,116,104,101,32,115,112,108,105,116,116,105,110,103,32,115,116,111,112,115,32,119,104,101,110,32,101,110,111,117,103,104,32,112,97,114,116,115,32,97,114,101,32,103,105,118,101,110,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,116,104,101,10,114,101,115,117,108,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,97,116,32,111,102,32,96,116,114,105,109,96,46,10,10,77,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,112,97,114,116,115,32,97,114,101,32,110,111,116,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,116,104,105,115,32,105,110,100,97,116,97,44,32,115,111,10,10,96,96,96,101,114,108,97,110,103,10,114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,52,125,93,41,46,10,96,96,96,10,10,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,118,105,101,119,101,100,32,97,115,32,34,97,110,32,105,110,102,105,110,105,116,101,10,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,34,46,10,10,83,112,101,99,105,102,121,105,110,103,32,96,48,96,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,111,112,116,105,111,110,32,96,116,114,105,109,96,46,32,73,102,10,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,99,97,112,116,117,114,101,100,44,32,101,109,112,116,121,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,97,108,115,111,10,115,116,114,105,112,112,101,100,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,105,102,32,96,116,114,105,109,96,32,111,114,32,96,123,112,97,114,116,115,44,48,125,96,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,10,84,104,101,32,96,116,114,105,109,96,32,98,101,104,97,118,105,111,114,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,100,101,102,97,117,108,116,46,32,96,123,112,97,114,116,115,44,78,125,96,44,32,119,104,101,114,101,10,78,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,105,116,104,32,97,10,112,111,115,105,116,105,118,101,32,110,117,109,101,114,105,99,97,108,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,46,32,84,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,10,91,96,115,112,108,105,116,47,51,96,93,40,96,115,112,108,105,116,47,51,96,41,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,10,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,32,102,111,114,32,116,104,101,32,80,101,114,108,32,114,111,117,116,105,110,101,46,10,10,83,117,109,109,97,114,121,32,111,102,32,111,112,116,105,111,110,115,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,100,101,115,99,114,105,98,101,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,58,10,10,45,32,42,42,96,123,114,101,116,117,114,110,44,82,101,116,117,114,110,84,121,112,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,104,111,119,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,32,97,114,101,10,32,32,112,114,101,115,101,110,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,46,32,86,97,108,105,100,32,116,121,112,101,115,58,10,10,32,32,45,32,42,42,96,105,111,100,97,116,97,96,42,42,32,45,32,84,104,101,32,118,97,114,105,97,110,116,32,111,102,32,96,116,58,105,111,100,97,116,97,47,48,96,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,108,101,97,115,116,32,99,111,112,121,105,110,103,32,111,102,10,32,32,32,32,100,97,116,97,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,40,111,102,116,101,110,32,97,32,98,105,110,97,114,121,44,32,98,117,116,32,100,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,10,32,32,32,32,105,116,41,46,10,10,32,32,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,98,105,110,97,114,105,101,115,46,10,10,32,32,45,32,42,42,96,108,105,115,116,96,42,42,32,45,32,65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,34,115,116,114,105,110,103,115,34,41,46,10,10,45,32,42,42,96,103,114,111,117,112,96,42,42,32,45,32,71,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,10,32,32,115,116,114,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,32,116,104,105,115,32,99,97,115,101,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,10,32,32,96,116,58,108,105,115,116,47,48,96,115,46,32,69,97,99,104,32,115,117,98,108,105,115,116,32,98,101,103,105,110,115,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,112,105,99,107,101,100,32,111,117,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,10,32,32,115,116,114,105,110,103,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,101,97,99,104,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,111,114,100,101,114,32,111,102,10,32,32,111,99,99,117,114,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,45,32,42,42,96,123,112,97,114,116,115,44,78,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,116,111,32,98,101,10,32,32,115,112,108,105,116,32,105,110,116,111,46,10,10,32,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,105,115,32,116,111,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,10,32,32,111,102,32,112,97,114,116,115,44,32,97,110,100,32,96,105,110,102,105,110,105,116,121,96,32,102,111,114,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,112,111,115,115,105,98,108,101,32,40,116,104,101,10,32,32,100,101,102,97,117,108,116,41,46,32,83,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,48,125,96,32,103,105,118,101,115,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,100,105,115,114,101,103,97,114,100,105,110,103,10,32,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,44,32,116,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,96,116,114,105,109,96,46,10,10,45,32,42,42,96,116,114,105,109,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,97,114,101,32,116,111,10,32,32,98,101,32,100,105,115,114,101,103,97,114,100,101,100,46,32,84,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,96,123,112,97,114,116,115,44,48,125,96,46,32,84,104,105,115,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,10,32,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,96,115,112,108,105,116,96,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,46>>},#{specification => [{attribute,{1058,2},spec,{{split,3},[{type,{1058,12},bounded_fun,[{type,{1058,12},'fun',[{type,{1058,12},product,[{var,{1058,13},'Subject'},{var,{1058,22},'RE'},{var,{1058,26},'Options'}]},{var,{1058,38},'SplitList'}]},[{type,{1059,7},constraint,[{atom,{1059,7},is_subtype},[{var,{1059,7},'Subject'},{type,{1059,18},union,[{type,{1059,18},iodata,[]},{remote_type,{1059,29},[{atom,{1059,29},unicode},{atom,{1059,37},charlist},[]]}]}]]},{type,{1060,7},constraint,[{atom,{1060,7},is_subtype},[{var,{1060,7},'RE'},{type,{1060,13},union,[{user_type,{1060,13},mp,[]},{type,{1060,20},iodata,[]},{remote_type,{1060,31},[{atom,{1060,31},unicode},{atom,{1060,39},charlist},[]]}]}]]},{type,{1061,7},constraint,[{atom,{1061,7},is_subtype},[{var,{1061,7},'Options'},{type,{1061,18},list,[{var,{1061,20},'Option'}]}]]},{type,{1062,7},constraint,[{atom,{1062,7},is_subtype},[{var,{1062,7},'Option'},{type,{1062,17},union,[{atom,{1062,17},anchored},{atom,{1062,28},notbol},{atom,{1062,37},noteol},{atom,{1062,46},notempty},{atom,{1062,57},notempty_atstart},{type,{1063,17},tuple,[{atom,{1063,18},offset},{type,{1063,26},non_neg_integer,[]}]},{type,{1063,47},tuple,[{atom,{1063,48},newline},{user_type,{1063,57},nl_spec,[]}]},{type,{1064,17},tuple,[{atom,{1064,18},match_limit},{type,{1064,31},non_neg_integer,[]}]},{type,{1065,17},tuple,[{atom,{1065,18},match_limit_recursion},{type,{1065,41},non_neg_integer,[]}]},{atom,{1066,17},bsr_anycrlf},{atom,{1066,31},bsr_unicode},{type,{1066,45},tuple,[{atom,{1066,46},return},{var,{1066,54},'ReturnType'}]},{type,{1067,17},tuple,[{atom,{1067,18},parts},{var,{1067,25},'NumParts'}]},{atom,{1067,37},group},{atom,{1067,45},trim},{var,{1067,52},'CompileOpt'}]}]]},{type,{1068,7},constraint,[{atom,{1068,7},is_subtype},[{var,{1068,7},'NumParts'},{type,{1068,19},union,[{type,{1068,19},non_neg_integer,[]},{atom,{1068,39},infinity}]}]]},{type,{1069,7},constraint,[{atom,{1069,7},is_subtype},[{var,{1069,7},'ReturnType'},{type,{1069,21},union,[{atom,{1069,21},iodata},{atom,{1069,30},list},{atom,{1069,37},binary}]}]]},{type,{1070,7},constraint,[{atom,{1070,7},is_subtype},[{var,{1070,7},'CompileOpt'},{user_type,{1070,21},compile_option,[]}]]},{type,{1071,7},constraint,[{atom,{1071,7},is_subtype},[{var,{1071,7},'SplitList'},{type,{1071,20},union,[{type,{1071,20},list,[{var,{1071,21},'RetData'}]},{type,{1071,32},list,[{var,{1071,33},'GroupedRetData'}]}]}]]},{type,{1072,7},constraint,[{atom,{1072,7},is_subtype},[{var,{1072,7},'GroupedRetData'},{type,{1072,25},list,[{var,{1072,26},'RetData'}]}]]},{type,{1073,7},constraint,[{atom,{1073,7},is_subtype},[{var,{1073,7},'RetData'},{type,{1073,18},union,[{type,{1073,18},iodata,[]},{remote_type,{1073,29},[{atom,{1073,29},unicode},{atom,{1073,37},charlist},[]]},{type,{1073,50},binary,[]},{type,{1073,61},list,[]}]}]]}]]}]}}]}},{{function,split,2},{881,1},[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,41>>],none,#{equiv => <<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>}},{{function,inspect,2},{820,2},[<<105,110,115,112,101,99,116,40,77,80,44,32,73,116,101,109,41>>],#{<<101,110>> => <<84,97,107,101,115,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,97,110,32,105,116,101,109,44,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,114,101,108,101,118,97,110,116,32,100,97,116,97,10,102,114,111,109,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,84,104,101,32,111,110,108,121,32,115,117,112,112,111,114,116,101,100,32,105,116,101,109,32,105,115,32,96,110,97,109,101,108,105,115,116,96,44,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32,96,123,110,97,109,101,108,105,115,116,44,32,91,98,105,110,97,114,121,40,41,93,125,96,44,10,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,40,117,110,105,113,117,101,41,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,70,111,114,32,101,120,97,109,112,108,101,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,111,107,44,77,80,68,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,67,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,44,91,100,117,112,110,97,109,101,115,93,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,56,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,52,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,68,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,96,96,96,10,10,78,111,116,105,99,101,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,101,120,97,109,112,108,101,32,116,104,97,116,32,116,104,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,32,111,110,108,121,32,111,99,99,117,114,115,32,111,110,99,101,32,105,110,32,116,104,101,10,114,101,116,117,114,110,101,100,32,108,105,115,116,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,108,105,115,116,32,105,115,32,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,114,101,10,116,104,101,32,110,97,109,101,115,32,97,114,101,32,112,111,115,105,116,105,111,110,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,110,97,109,101,115,32,105,115,10,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,111,114,100,101,114,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,102,32,96,123,99,97,112,116,117,114,101,44,32,97,108,108,95,110,97,109,101,115,125,96,32,105,115,10,115,112,101,99,105,102,105,101,100,32,97,115,32,97,110,32,111,112,116,105,111,110,32,116,111,32,96,114,117,110,47,51,96,46,32,89,111,117,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,99,114,101,97,116,101,32,97,32,110,97,109,101,45,116,111,45,118,97,108,117,101,10,109,97,112,112,105,110,103,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,108,105,107,101,32,116,104,105,115,58,10,10,96,96,96,101,114,108,97,110,103,10,49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,123,110,97,109,101,108,105,115,116,44,32,78,125,32,61,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,109,97,116,99,104,44,76,125,32,61,32,114,101,58,114,117,110,40,34,65,65,34,44,77,80,44,91,123,99,97,112,116,117,114,101,44,97,108,108,95,110,97,109,101,115,44,98,105,110,97,114,121,125,93,41,46,10,123,109,97,116,99,104,44,91,60,60,34,65,34,62,62,44,60,60,62,62,44,60,60,62,62,93,125,10,52,62,32,78,97,109,101,77,97,112,32,61,32,108,105,115,116,115,58,122,105,112,40,78,44,76,41,46,10,91,123,60,60,34,65,34,62,62,44,60,60,34,65,34,62,62,125,44,123,60,60,34,66,34,62,62,44,60,60,62,62,125,44,123,60,60,34,67,34,62,62,44,60,60,62,62,125,93,10,96,96,96>>},#{specification => [{attribute,{865,2},spec,{{inspect,2},[{type,{865,14},bounded_fun,[{type,{865,14},'fun',[{type,{865,14},product,[{var,{865,15},'MP'},{var,{865,18},'Item'}]},{type,{865,27},tuple,[{atom,{865,28},namelist},{type,{865,38},list,[{type,{865,40},binary,[]}]}]}]},[{type,{866,7},constraint,[{atom,{866,7},is_subtype},[{var,{866,7},'MP'},{user_type,{866,13},mp,[]}]]},{type,{867,7},constraint,[{atom,{867,7},is_subtype},[{var,{867,7},'Item'},{atom,{867,15},namelist}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,internal_run,4},{785,2},[<<105,110,116,101,114,110,97,108,95,114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,44,32,70,105,114,115,116,67,97,108,108,41>>],hidden,#{}},{{function,run,3},{249,2},[<<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<69,120,101,99,117,116,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,44,32,97,110,100,32,114,101,116,117,114,110,115,32,96,109,97,116,99,104,47,123,109,97,116,99,104,44,32,67,97,112,116,117,114,101,100,125,96,32,111,114,10,96,110,111,109,97,116,99,104,96,46,10,10,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,101,105,116,104,101,114,32,97,115,32,96,116,58,105,111,100,97,116,97,47,48,96,32,105,110,10,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,111,109,112,105,108,101,100,32,40,97,115,32,98,121,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,41,32,97,110,100,10,101,120,101,99,117,116,101,100,44,32,111,114,32,97,115,32,97,32,112,114,101,99,111,109,112,105,108,101,100,32,96,116,58,109,112,47,48,96,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,10,115,117,98,106,101,99,116,32,100,105,114,101,99,116,108,121,46,10,10,87,104,101,110,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,44,32,101,120,99,101,112,116,105,111,110,32,96,98,97,100,97,114,103,96,32,105,115,32,116,104,114,111,119,110,32,105,102,32,97,32,99,111,109,112,105,108,97,116,105,111,110,10,101,114,114,111,114,32,111,99,99,117,114,115,46,32,67,97,108,108,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,32,116,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,10,108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,44,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,111,110,108,121,10,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58,10,10,45,32,96,97,110,99,104,111,114,101,100,96,10,45,32,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,10,45,32,96,103,108,111,98,97,108,96,10,45,32,96,123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,10,45,32,96,110,111,116,98,111,108,96,10,45,32,96,110,111,116,101,109,112,116,121,96,10,45,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,10,45,32,96,110,111,116,101,111,108,96,10,45,32,96,123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,10,45,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,10,10,79,116,104,101,114,119,105,115,101,32,97,108,108,32,111,112,116,105,111,110,115,32,118,97,108,105,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32,91,96,99,111,109,112,105,108,101,47,50,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41,32,97,114,101,32,97,108,115,111,10,97,108,108,111,119,101,100,46,32,79,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,98,111,116,104,32,102,111,114,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,44,32,110,97,109,101,108,121,10,96,97,110,99,104,111,114,101,100,96,32,97,110,100,32,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,44,32,97,102,102,101,99,116,32,98,111,116,104,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,105,102,10,112,114,101,115,101,110,116,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,110,111,110,45,112,114,101,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,44,10,96,83,117,98,106,101,99,116,96,32,105,115,32,116,111,32,98,101,32,112,114,111,118,105,100,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,44,32,111,116,104,101,114,119,105,115,101,32,97,110,121,10,96,116,58,105,111,100,97,116,97,47,48,96,32,119,105,108,108,32,100,111,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,10,115,112,101,99,105,102,105,101,100,44,32,98,111,116,104,32,96,83,117,98,106,101,99,116,96,32,97,110,100,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,10,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,115,40,41,96,46,10,10,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,32,100,101,102,105,110,101,115,32,119,104,97,116,32,116,111,32,114,101,116,117,114,110,32,102,114,111,109,10,116,104,101,32,102,117,110,99,116,105,111,110,32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,46,32,84,104,101,32,96,99,97,112,116,117,114,101,96,32,116,117,112,108,101,32,99,97,110,32,99,111,110,116,97,105,110,32,98,111,116,104,32,97,10,118,97,108,117,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,119,104,105,99,104,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,44,32,97,110,100,32,97,32,116,121,112,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,114,101,116,117,114,110,101,100,32,40,97,115,32,105,110,100,101,120,32,116,117,112,108,101,115,44,32,108,105,115,116,115,44,32,111,114,32,98,105,110,97,114,105,101,115,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,10,100,101,116,97,105,108,32,98,101,108,111,119,46,10,10,73,102,32,116,104,101,32,99,97,112,116,117,114,101,32,111,112,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,97,116,32,110,111,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,116,111,32,98,101,32,100,111,110,101,10,40,96,123,99,97,112,116,117,114,101,44,32,110,111,110,101,125,96,41,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32,96,109,97,116,99,104,96,32,117,112,111,110,10,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,116,117,112,108,101,32,96,123,109,97,116,99,104,44,32,86,97,108,117,101,76,105,115,116,125,96,46,32,68,105,115,97,98,108,105,110,103,10,99,97,112,116,117,114,105,110,103,32,99,97,110,32,98,101,32,100,111,110,101,32,101,105,116,104,101,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,110,111,110,101,96,32,111,114,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,97,115,10,96,86,97,108,117,101,83,112,101,99,96,46,10,10,79,112,116,105,111,110,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,32,97,100,100,115,32,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,116,104,97,116,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,10,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,109,97,116,99,104,105,110,103,32,101,114,114,111,114,32,40,96,109,97,116,99,104,95,108,105,109,105,116,96,32,111,114,10,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,41,44,32,111,114,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,44,32,119,104,101,114,101,32,116,104,101,32,101,114,114,111,114,32,116,117,112,108,101,32,104,97,115,32,116,104,101,10,102,111,114,109,97,116,32,96,123,101,114,114,111,114,44,32,123,99,111,109,112,105,108,101,44,32,67,111,109,112,105,108,101,69,114,114,125,125,96,46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,10,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,101,114,114,111,114,32,116,117,112,108,101,115,44,32,98,117,116,32,114,101,112,111,114,116,115,10,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,97,115,32,97,32,96,98,97,100,97,114,103,96,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,102,97,105,108,101,100,32,109,97,116,99,104,101,115,32,98,101,99,97,117,115,101,32,111,102,10,101,120,99,101,101,100,101,100,32,109,97,116,99,104,32,108,105,109,105,116,115,32,115,105,109,112,108,121,32,97,115,32,96,110,111,109,97,116,99,104,96,46,10,10,84,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,114,101,108,101,118,97,110,116,32,102,111,114,32,101,120,101,99,117,116,105,111,110,58,10,10,45,32,42,42,96,97,110,99,104,111,114,101,100,96,42,42,32,45,32,76,105,109,105,116,115,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,116,111,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,10,32,32,112,111,115,105,116,105,111,110,46,32,73,102,32,97,32,112,97,116,116,101,114,110,32,119,97,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,96,97,110,99,104,111,114,101,100,96,44,32,111,114,32,116,117,114,110,101,100,32,111,117,116,32,116,111,32,98,101,10,32,32,97,110,99,104,111,114,101,100,32,98,121,32,118,105,114,116,117,101,32,111,102,32,105,116,115,32,99,111,110,116,101,110,116,115,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,109,97,100,101,32,117,110,97,110,99,104,111,114,101,100,32,97,116,32,109,97,116,99,104,105,110,103,10,32,32,116,105,109,101,44,32,104,101,110,99,101,32,116,104,101,114,101,32,105,115,32,110,111,32,96,117,110,97,110,99,104,111,114,101,100,96,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,103,108,111,98,97,108,96,42,42,32,45,32,73,109,112,108,101,109,101,110,116,115,32,103,108,111,98,97,108,32,40,114,101,112,101,116,105,116,105,118,101,41,32,115,101,97,114,99,104,32,40,102,108,97,103,32,96,103,96,32,105,110,32,80,101,114,108,41,46,32,69,97,99,104,10,32,32,109,97,116,99,104,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,96,116,58,108,105,115,116,47,48,96,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,99,32,109,97,116,99,104,32,97,110,100,10,32,32,97,110,121,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,40,111,114,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,111,112,116,105,111,110,32,96,99,97,112,116,117,114,101,96,46,32,84,104,101,10,32,32,96,67,97,112,116,117,114,101,100,96,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,104,101,110,99,101,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,32,96,116,58,108,105,115,116,47,48,96,115,32,119,104,101,110,10,32,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,10,32,32,84,104,101,32,105,110,116,101,114,97,99,116,105,111,110,32,111,102,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,119,105,116,104,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,10,32,32,101,109,112,116,121,32,115,116,114,105,110,103,32,115,117,114,112,114,105,115,101,115,32,115,111,109,101,32,117,115,101,114,115,46,32,87,104,101,110,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,104,97,110,100,108,101,115,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,80,101,114,108,58,32,97,10,32,32,122,101,114,111,45,108,101,110,103,116,104,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,105,110,116,32,105,115,32,97,108,115,111,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,10,32,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,46,32,73,102,32,116,104,97,116,32,115,101,97,114,99,104,32,103,105,118,101,115,32,97,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,44,10,32,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,105,110,99,108,117,100,101,100,46,32,69,120,97,109,112,108,101,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,99,97,116,34,44,34,40,124,97,116,41,34,44,91,103,108,111,98,97,108,93,41,46,10,32,32,96,96,96,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,105,110,103,115,32,97,114,101,32,112,101,114,102,111,114,109,101,100,58,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,48,96,42,42,32,45,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,96,40,124,97,116,41,96,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,32,116,104,101,10,32,32,32,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,32,111,102,32,115,116,114,105,110,103,32,96,99,97,116,96,44,32,103,105,118,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,115,101,116,32,96,91,123,48,44,48,125,44,123,48,44,48,125,93,96,32,40,116,104,101,10,32,32,32,32,115,101,99,111,110,100,32,96,123,48,44,48,125,96,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,41,46,10,32,32,32,32,65,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,32,105,115,32,48,44,32,119,101,32,100,111,32,110,111,116,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,112,111,115,105,116,105,111,110,32,121,101,116,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,48,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,115,105,116,105,111,110,44,10,32,32,32,32,119,104,105,99,104,32,100,111,101,115,32,110,111,116,32,103,105,118,101,32,97,110,121,32,105,110,116,101,114,101,115,116,105,110,103,32,114,101,115,117,108,116,32,111,102,32,108,111,110,103,101,114,32,108,101,110,103,116,104,44,32,115,111,32,116,104,101,32,115,101,97,114,99,104,10,32,32,32,32,112,111,115,105,116,105,111,110,32,105,115,32,97,100,118,97,110,99,101,100,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,96,97,96,41,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,114,101,115,117,108,116,115,32,105,110,32,96,91,123,49,44,48,125,44,123,49,44,48,125,93,96,44,32,115,111,32,116,104,105,115,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,97,108,115,111,32,114,101,112,101,97,116,101,100,32,119,105,116,104,32,116,104,101,32,101,120,116,114,97,32,111,112,116,105,111,110,115,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,65,108,116,101,114,110,97,116,105,118,101,32,96,97,98,96,32,105,115,10,32,32,32,32,102,111,117,110,100,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,92,91,92,123,49,44,50,92,125,44,92,123,49,44,50,92,125,93,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,10,32,32,32,32,111,102,32,114,101,115,117,108,116,115,32,97,110,100,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,101,97,114,99,104,32,115,116,114,105,110,103,32,105,115,32,97,100,118,97,110,99,101,100,32,116,119,111,32,115,116,101,112,115,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,51,96,42,42,32,45,32,84,104,101,32,115,101,97,114,99,104,32,111,110,99,101,32,97,103,97,105,110,32,109,97,116,99,104,101,115,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,103,105,118,105,110,103,10,32,32,32,32,96,91,123,51,44,48,125,44,123,51,44,48,125,93,96,46,10,10,32,32,45,32,42,42,65,116,32,111,102,102,115,101,116,32,96,49,96,32,119,105,116,104,32,96,91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93,96,42,42,32,45,32,84,104,105,115,32,103,105,118,101,115,32,110,111,32,114,101,115,117,108,116,10,32,32,32,32,111,102,32,108,101,110,103,116,104,32,62,32,48,32,97,110,100,32,119,101,32,97,114,101,32,97,116,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,44,32,115,111,32,116,104,101,32,103,108,111,98,97,108,32,115,101,97,114,99,104,32,105,115,10,32,32,32,32,99,111,109,112,108,101,116,101,46,10,10,32,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,108,108,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,91,123,48,44,48,125,44,123,48,44,48,125,93,44,91,123,49,44,48,125,44,123,49,44,48,125,93,44,91,123,49,44,50,125,44,123,49,44,50,125,93,44,91,123,51,44,48,125,44,123,51,44,48,125,93,93,125,10,32,32,96,96,96,10,10,45,32,42,42,96,110,111,116,101,109,112,116,121,96,42,42,32,45,32,65,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,97,32,118,97,108,105,100,32,109,97,116,99,104,32,105,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,105,115,116,44,32,116,104,101,121,32,97,114,101,32,116,114,105,101,100,46,32,73,102,10,32,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,10,10,32,32,95,69,120,97,109,112,108,101,58,95,10,10,32,32,73,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,32,115,116,114,105,110,103,32,110,111,116,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,34,97,34,32,111,114,32,34,98,34,44,10,32,32,105,116,32,119,111,117,108,100,32,110,111,114,109,97,108,108,121,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,97,63,98,63,10,32,32,96,96,96,10,10,32,32,87,105,116,104,32,111,112,116,105,111,110,32,96,110,111,116,101,109,112,116,121,96,44,32,116,104,105,115,32,109,97,116,99,104,32,105,115,32,105,110,118,97,108,105,100,44,32,115,111,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,115,101,97,114,99,104,101,115,10,32,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,115,116,114,105,110,103,32,102,111,114,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,34,97,34,32,111,114,32,34,98,34,46,10,10,45,32,42,42,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,42,42,32,45,32,76,105,107,101,32,96,110,111,116,101,109,112,116,121,96,44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,97,116,99,104,10,32,32,116,104,97,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,10,32,32,97,110,99,104,111,114,101,100,44,32,115,117,99,104,32,97,32,109,97,116,99,104,32,99,97,110,32,111,99,99,117,114,32,111,110,108,121,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,92,92,75,46,10,10,32,32,80,101,114,108,32,104,97,115,32,110,111,32,100,105,114,101,99,116,32,101,113,117,105,118,97,108,101,110,116,32,111,102,32,96,110,111,116,101,109,112,116,121,96,32,111,114,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,44,32,98,117,116,32,105,116,32,100,111,101,115,10,32,32,109,97,107,101,32,97,32,115,112,101,99,105,97,108,32,99,97,115,101,32,111,102,32,97,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,111,102,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,119,105,116,104,105,110,32,105,116,115,32,115,112,108,105,116,40,41,10,32,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,119,104,101,110,32,117,115,105,110,103,32,109,111,100,105,102,105,101,114,32,96,47,103,96,46,32,84,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,101,109,117,108,97,116,101,100,10,32,32,97,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,32,110,117,108,108,32,115,116,114,105,110,103,32,98,121,32,102,105,114,115,116,32,116,114,121,105,110,103,32,116,104,101,32,109,97,116,99,104,32,97,103,97,105,110,32,97,116,32,116,104,101,32,115,97,109,101,10,32,32,111,102,102,115,101,116,32,119,105,116,104,32,96,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,96,32,97,110,100,32,96,97,110,99,104,111,114,101,100,96,44,32,97,110,100,32,116,104,101,110,44,32,105,102,32,116,104,97,116,32,102,97,105,108,115,44,32,98,121,10,32,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,111,102,102,115,101,116,32,40,115,101,101,32,98,101,108,111,119,41,32,97,110,100,32,116,114,121,105,110,103,32,97,110,32,111,114,100,105,110,97,114,121,32,109,97,116,99,104,32,97,103,97,105,110,46,10,10,45,32,42,42,96,110,111,116,98,111,108,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,10,32,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,10,32,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32,96,109,117,108,116,105,108,105,110,101,96,32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,10,32,32,99,105,114,99,117,109,102,108,101,120,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,97,102,102,101,99,116,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,10,32,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,92,65,46,10,10,45,32,42,42,96,110,111,116,101,111,108,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,101,110,100,32,111,102,10,32,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,105,116,32,110,111,114,32,40,101,120,99,101,112,116,32,105,110,10,32,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,32,97,32,110,101,119,108,105,110,101,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,10,32,32,96,109,117,108,116,105,108,105,110,101,96,32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,100,111,108,108,97,114,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,10,32,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,92,90,10,32,32,111,114,32,92,92,122,46,10,10,45,32,42,42,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,42,42,32,45,32,71,105,118,101,115,32,98,101,116,116,101,114,32,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,105,110,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,32,87,104,101,110,32,115,112,101,99,105,102,105,101,100,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,40,105,102,32,116,104,101,32,114,101,103,117,108,97,114,10,32,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,109,112,105,108,101,100,41,32,97,110,100,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,32,97,114,101,32,101,120,112,108,105,99,105,116,108,121,32,114,101,116,117,114,110,101,100,10,32,32,97,115,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,46,10,10,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,111,115,115,105,98,108,101,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,58,10,10,32,32,45,32,42,42,96,109,97,116,99,104,95,108,105,109,105,116,96,42,42,32,45,32,84,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,115,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,116,104,101,10,32,32,32,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,99,97,108,108,101,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,108,105,98,114,97,114,121,10,32,32,32,32,99,111,109,112,105,108,101,100,32,102,111,114,32,69,114,108,97,110,103,46,32,73,102,32,96,123,101,114,114,111,114,44,32,109,97,116,99,104,95,108,105,109,105,116,125,96,32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,10,32,32,32,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,104,97,115,32,114,101,97,99,104,101,100,32,116,104,105,115,32,108,105,109,105,116,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,111,32,98,101,10,32,32,32,32,114,101,103,97,114,100,101,100,32,97,115,32,97,32,96,110,111,109,97,116,99,104,96,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,44,10,32,32,32,32,98,117,116,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,96,114,101,112,111,114,116,95,101,114,114,111,114,115,96,44,32,121,111,117,32,97,114,101,32,105,110,102,111,114,109,101,100,32,119,104,101,110,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,10,32,32,32,32,98,101,99,97,117,115,101,32,111,102,32,116,111,111,32,109,97,110,121,32,105,110,116,101,114,110,97,108,32,99,97,108,108,115,46,10,10,32,32,45,32,42,42,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,42,42,32,45,32,84,104,105,115,32,101,114,114,111,114,32,105,115,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,96,109,97,116,99,104,95,108,105,109,105,116,96,44,10,32,32,32,32,98,117,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,111,102,32,80,67,82,69,32,105,115,32,34,114,101,99,117,114,115,105,118,101,108,121,34,32,99,97,108,108,101,100,10,32,32,32,32,109,111,114,101,32,116,105,109,101,115,32,116,104,97,110,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,32,108,105,109,105,116,44,32,119,104,105,99,104,32,100,101,102,97,117,108,116,115,32,116,111,10,32,32,32,32,49,48,44,48,48,48,44,48,48,48,32,97,115,32,119,101,108,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,97,110,100,10,32,32,32,32,96,109,97,116,99,104,95,108,105,109,105,116,95,100,101,102,97,117,108,116,96,32,118,97,108,117,101,115,32,97,114,101,32,107,101,112,116,32,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,44,32,116,104,101,10,32,32,32,32,96,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,96,32,101,114,114,111,114,32,99,97,110,110,111,116,32,111,99,99,117,114,44,32,97,115,32,116,104,101,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,101,114,114,111,114,10,32,32,32,32,111,99,99,117,114,115,32,98,101,102,111,114,101,32,116,104,97,116,32,40,101,97,99,104,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,105,115,32,97,108,115,111,32,97,32,99,97,108,108,44,32,98,117,116,32,110,111,116,32,99,111,110,118,101,114,115,101,108,121,41,46,10,32,32,32,32,66,111,116,104,32,108,105,109,105,116,115,32,99,97,110,32,104,111,119,101,118,101,114,32,98,101,32,99,104,97,110,103,101,100,44,32,101,105,116,104,101,114,32,98,121,32,115,101,116,116,105,110,103,32,108,105,109,105,116,115,32,100,105,114,101,99,116,108,121,32,105,110,32,116,104,101,10,32,32,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,116,114,105,110,103,32,40,115,101,101,32,115,101,99,116,105,111,110,10,32,32,32,32,91,80,67,82,69,32,82,101,103,117,108,97,114,32,69,101,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,99,114,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,100,101,116,97,105,108,115,96,41,41,32,111,114,32,98,121,10,32,32,32,32,115,112,101,99,105,102,121,105,110,103,32,111,112,116,105,111,110,115,32,116,111,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,46,10,10,32,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,117,110,100,101,114,115,116,97,110,100,32,116,104,97,116,32,119,104,97,116,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,34,114,101,99,117,114,115,105,111,110,34,32,119,104,101,110,10,32,32,108,105,109,105,116,105,110,103,32,109,97,116,99,104,101,115,32,105,115,32,110,111,116,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,111,114,32,111,110,10,32,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,10,32,32,109,97,99,104,105,110,101,32,34,104,101,97,112,34,32,109,101,109,111,114,121,32,116,111,32,115,116,111,114,101,32,118,97,108,117,101,115,32,116,104,97,116,32,109,117,115,116,32,98,101,32,107,101,112,116,32,111,118,101,114,32,114,101,99,117,114,115,105,111,110,32,105,110,10,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,46,10,10,45,32,42,42,96,123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,97,32,109,97,116,99,104,32,105,110,10,32,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,10,32,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58,10,10,32,32,62,32,84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,32,102,105,101,108,100,32,112,114,111,118,105,100,101,115,32,97,32,109,101,97,110,115,32,111,102,32,112,114,101,118,101,110,116,105,110,103,32,80,67,82,69,32,102,114,111,109,32,117,115,105,110,103,10,32,32,62,32,117,112,32,97,32,118,97,115,116,32,97,109,111,117,110,116,32,111,102,32,114,101,115,111,117,114,99,101,115,32,119,104,101,110,32,114,117,110,110,105,110,103,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,103,111,105,110,103,10,32,32,62,32,116,111,32,109,97,116,99,104,44,32,98,117,116,32,119,104,105,99,104,32,104,97,118,101,32,97,32,118,101,114,121,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,112,111,115,115,105,98,105,108,105,116,105,101,115,32,105,110,32,116,104,101,105,114,10,32,32,62,32,115,101,97,114,99,104,32,116,114,101,101,115,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,117,115,101,115,32,110,101,115,116,101,100,10,32,32,62,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,46,10,32,32,62,10,32,32,62,32,73,110,116,101,114,110,97,108,108,121,44,32,112,99,114,101,95,101,120,101,99,40,41,32,117,115,101,115,32,97,32,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,109,97,116,99,104,40,41,44,32,119,104,105,99,104,32,105,116,32,99,97,108,108,115,10,32,32,62,32,114,101,112,101,97,116,101,100,108,121,32,40,115,111,109,101,116,105,109,101,115,32,114,101,99,117,114,115,105,118,101,108,121,41,46,32,84,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,109,97,116,99,104,95,108,105,109,105,116,32,105,115,10,32,32,62,32,105,109,112,111,115,101,100,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,44,10,32,32,62,32,119,104,105,99,104,32,104,97,115,32,116,104,101,32,101,102,102,101,99,116,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,104,97,116,32,99,97,110,10,32,32,62,32,116,97,107,101,32,112,108,97,99,101,46,32,70,111,114,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,44,32,116,104,101,32,99,111,117,110,116,32,114,101,115,116,97,114,116,115,10,32,32,62,32,102,114,111,109,32,122,101,114,111,32,102,111,114,32,101,97,99,104,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,10,10,32,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,114,117,110,97,119,97,121,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,99,97,110,32,102,97,105,108,32,102,97,115,116,101,114,32,105,102,32,116,104,101,10,32,32,108,105,109,105,116,32,105,115,32,108,111,119,101,114,101,100,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,49,48,44,48,48,48,44,48,48,48,32,105,115,32,99,111,109,112,105,108,101,100,10,32,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,10,10,32,32,62,32,35,35,35,35,32,78,111,116,101,32,123,58,32,46,105,110,102,111,32,125,10,32,32,62,10,32,32,62,32,84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,105,110,32,110,111,32,119,97,121,32,97,102,102,101,99,116,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,105,110,32,116,101,114,109,115,32,111,102,10,32,32,62,32,34,108,111,110,103,32,114,117,110,110,105,110,103,32,66,73,70,115,34,46,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,97,108,119,97,121,115,32,103,105,118,101,115,32,99,111,110,116,114,111,108,32,98,97,99,107,32,116,111,32,116,104,101,10,32,32,62,32,115,99,104,101,100,117,108,101,114,32,111,102,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,105,110,116,101,114,118,97,108,115,32,116,104,97,116,32,101,110,115,117,114,101,115,32,116,104,101,32,114,101,97,108,45,116,105,109,101,10,32,32,62,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,46,10,10,45,32,42,42,96,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,97,110,100,10,32,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,44,32,118,101,114,121,32,115,105,109,105,108,97,114,10,32,32,116,111,32,96,109,97,116,99,104,95,108,105,109,105,116,96,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58,10,10,32,32,62,32,84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,32,102,105,101,108,100,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,109,97,116,99,104,95,108,105,109,105,116,44,32,98,117,116,32,105,110,115,116,101,97,100,10,32,32,62,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,97,116,32,109,97,116,99,104,40,41,32,105,115,32,99,97,108,108,101,100,44,32,105,116,10,32,32,62,32,108,105,109,105,116,115,32,116,104,101,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,111,110,46,32,84,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,105,115,32,97,32,115,109,97,108,108,101,114,32,110,117,109,98,101,114,10,32,32,62,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,97,108,108,115,44,32,98,101,99,97,117,115,101,32,110,111,116,32,97,108,108,32,99,97,108,108,115,32,116,111,32,109,97,116,99,104,40,41,32,97,114,101,10,32,32,62,32,114,101,99,117,114,115,105,118,101,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,111,102,32,117,115,101,32,111,110,108,121,32,105,102,32,105,116,32,105,115,32,115,101,116,32,115,109,97,108,108,101,114,32,116,104,97,110,10,32,32,62,32,109,97,116,99,104,95,108,105,109,105,116,46,10,32,32,62,10,32,32,62,32,76,105,109,105,116,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,97,99,104,105,110,101,32,115,116,97,99,107,32,116,104,97,116,10,32,32,62,32,99,97,110,32,98,101,32,117,115,101,100,44,32,111,114,44,32,119,104,101,110,32,80,67,82,69,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,116,111,32,117,115,101,32,109,101,109,111,114,121,32,111,110,32,116,104,101,32,104,101,97,112,10,32,32,62,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,115,116,97,99,107,44,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,104,101,97,112,32,109,101,109,111,114,121,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,46,10,10,32,32,84,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,97,32,80,67,82,69,32,108,105,98,114,97,114,121,32,119,104,101,114,101,32,104,101,97,112,32,109,101,109,111,114,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,114,101,103,117,108,97,114,10,32,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,114,101,99,117,114,115,105,111,110,32,111,99,99,117,114,115,46,32,84,104,105,115,32,116,104,101,114,101,102,111,114,101,32,108,105,109,105,116,115,32,116,104,101,32,117,115,101,32,111,102,32,109,97,99,104,105,110,101,10,32,32,104,101,97,112,44,32,110,111,116,32,67,32,115,116,97,99,107,46,10,10,32,32,83,112,101,99,105,102,121,105,110,103,32,97,32,108,111,119,101,114,32,118,97,108,117,101,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,116,99,104,101,115,32,119,105,116,104,32,100,101,101,112,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,105,110,103,44,10,32,32,119,104,101,110,32,116,104,101,121,32,115,104,111,117,108,100,32,104,97,118,101,32,109,97,116,99,104,101,100,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,49,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,41,46,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,52,125,44,123,48,44,49,51,125,93,125,10,32,32,50,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,93,41,46,10,32,32,110,111,109,97,116,99,104,10,32,32,51,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,44,114,101,112,111,114,116,95,101,114,114,111,114,115,93,41,46,10,32,32,123,101,114,114,111,114,44,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,125,10,32,32,96,96,96,10,10,32,32,84,104,105,115,32,111,112,116,105,111,110,32,97,110,100,32,111,112,116,105,111,110,32,96,109,97,116,99,104,95,108,105,109,105,116,96,32,97,114,101,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,97,115,101,115,46,10,32,32,85,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,110,116,101,114,110,97,108,115,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,98,101,102,111,114,101,32,116,97,109,112,101,114,105,110,103,10,32,32,119,105,116,104,32,116,104,101,115,101,32,108,105,109,105,116,115,46,10,10,45,32,42,42,96,123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125,96,42,42,32,45,32,83,116,97,114,116,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,111,102,102,115,101,116,32,40,112,111,115,105,116,105,111,110,41,10,32,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,111,102,102,115,101,116,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,115,111,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,105,115,32,96,123,111,102,102,115,101,116,44,48,125,96,32,40,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,41,46,10,10,45,32,42,42,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,42,42,32,45,32,79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,10,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46,10,10,32,32,45,32,42,42,96,99,114,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,67,82,32,40,65,83,67,73,73,32,49,51,41,46,10,10,32,32,45,32,42,42,96,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,10,32,32,32,32,100,101,102,97,117,108,116,46,10,10,32,32,45,32,42,42,96,99,114,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,10,32,32,32,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46,10,10,32,32,45,32,42,42,96,97,110,121,99,114,108,102,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,32,32,45,32,42,42,96,97,110,121,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,10,32,32,32,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,10,32,32,32,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,10,10,45,32,42,42,96,98,115,114,95,97,110,121,99,114,108,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,10,32,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,32,40,79,118,101,114,114,105,100,101,115,10,32,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41,10,10,45,32,42,42,96,98,115,114,95,117,110,105,99,111,100,101,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,10,32,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,10,32,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41,10,10,45,32,42,42,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,96,47,96,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,10,32,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,110,100,32,105,110,32,119,104,97,116,32,102,111,114,109,97,116,46,32,66,121,32,100,101,102,97,117,108,116,44,10,32,32,91,96,114,117,110,47,51,96,93,40,96,114,117,110,47,51,96,41,32,99,97,112,116,117,114,101,115,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,97,110,100,32,97,108,108,10,32,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,40,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,112,116,117,114,101,100,41,46,32,84,104,101,10,32,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,40,122,101,114,111,45,98,97,115,101,100,41,32,105,110,100,101,120,101,115,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,112,97,114,116,115,32,111,102,32,116,104,101,10,32,32,115,116,114,105,110,103,44,32,115,112,101,99,105,102,105,101,100,32,97,115,32,96,123,79,102,102,115,101,116,44,76,101,110,103,116,104,125,96,32,112,97,105,114,115,32,40,116,104,101,32,96,105,110,100,101,120,96,32,96,84,121,112,101,96,32,111,102,10,32,32,99,97,112,116,117,114,105,110,103,41,46,10,10,32,32,65,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,32,114,101,116,117,114,110,115,44,32,97,115,32,102,105,114,115,116,10,32,32,97,110,100,32,111,110,108,121,32,99,97,112,116,117,114,101,100,32,115,116,114,105,110,103,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,40,34,97,98,99,100,34,32,105,110,32,116,104,101,10,32,32,109,105,100,100,108,101,41,32,97,115,32,97,110,32,105,110,100,101,120,32,112,97,105,114,32,96,123,51,44,52,125,96,44,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,122,101,114,111,45,98,97,115,101,100,44,10,32,32,106,117,115,116,32,97,115,32,105,110,32,111,102,102,115,101,116,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,97,98,99,100,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,105,115,32,99,97,108,108,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,96,96,96,10,10,32,32,65,110,111,116,104,101,114,32,40,97,110,100,32,113,117,105,116,101,32,99,111,109,109,111,110,41,32,99,97,115,101,32,105,115,32,119,104,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,97,108,108,32,111,102,10,32,32,116,104,101,32,115,117,98,106,101,99,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,97,98,99,100,46,42,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,72,101,114,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,108,121,32,112,111,105,110,116,115,32,111,117,116,32,97,108,108,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,101,103,105,110,110,105,110,103,10,32,32,97,116,32,105,110,100,101,120,32,48,44,32,97,110,100,32,105,116,32,105,115,32,49,48,32,99,104,97,114,97,99,116,101,114,115,32,108,111,110,103,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,93,125,10,32,32,96,96,96,10,10,32,32,73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,108,105,107,101,32,105,110,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,93,41,46,10,32,32,96,96,96,10,10,32,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,101,100,32,115,117,98,106,101,99,116,32,105,115,32,99,97,112,116,117,114,101,100,44,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,93,125,10,32,32,96,96,96,10,10,32,32,84,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,103,105,118,101,115,32,116,104,101,32,102,105,114,115,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,110,32,116,104,101,32,108,105,115,116,10,32,32,97,110,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,111,99,99,117,114,114,101,100,32,105,110,32,116,104,101,10,32,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,10,10,32,32,84,104,101,32,99,97,112,116,117,114,101,32,116,117,112,108,101,32,105,115,32,98,117,105,108,116,32,117,112,32,97,115,32,102,111,108,108,111,119,115,58,10,10,32,32,45,32,42,42,96,86,97,108,117,101,83,112,101,99,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,40,115,117,98,41,112,97,116,116,101,114,110,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,10,32,32,32,32,96,86,97,108,117,101,83,112,101,99,96,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,97,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,32,111,102,32,114,101,116,117,114,110,10,32,32,32,32,118,97,108,117,101,115,44,32,111,114,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,105,110,100,101,120,101,115,32,111,114,32,116,104,101,32,110,97,109,101,115,32,111,102,32,115,112,101,99,105,102,105,99,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,115,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,58,10,10,32,32,32,32,45,32,42,42,96,97,108,108,96,42,42,32,45,32,65,108,108,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,10,32,32,32,32,32,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,10,32,32,32,32,45,32,42,42,96,97,108,108,95,110,97,109,101,115,96,42,42,32,45,32,65,108,108,32,95,110,97,109,101,100,95,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,115,32,105,102,10,32,32,32,32,32,32,97,32,96,116,58,108,105,115,116,47,48,96,32,111,102,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,95,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,95,32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,10,32,32,32,32,32,32,108,105,115,116,32,111,102,32,97,108,108,32,110,97,109,101,115,32,99,97,110,32,97,108,115,111,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32,96,105,110,115,112,101,99,116,47,50,96,46,10,10,32,32,32,32,45,32,42,42,96,102,105,114,115,116,96,42,42,32,45,32,79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,105,115,32,97,108,119,97,121,115,32,116,104,101,10,32,32,32,32,32,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,10,32,32,32,32,32,32,97,114,101,32,100,105,115,99,97,114,100,101,100,46,10,10,32,32,32,32,45,32,42,42,96,97,108,108,95,98,117,116,95,102,105,114,115,116,96,42,42,32,45,32,65,108,108,32,98,117,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,97,116,32,105,115,44,32,97,108,108,10,32,32,32,32,32,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,98,117,116,32,110,111,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,10,32,32,32,32,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,115,32,97,32,119,104,111,108,101,10,32,32,32,32,32,32,109,97,116,99,104,101,115,32,97,32,108,97,114,103,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,98,117,116,32,116,104,101,32,112,97,114,116,32,121,111,117,32,97,114,101,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,10,32,32,32,32,32,32,105,110,32,97,110,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,96,108,105,115,116,96,32,111,114,10,32,32,32,32,32,32,96,98,105,110,97,114,121,96,44,32,110,111,116,32,114,101,116,117,114,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,121,111,117,32,97,114,101,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,97,32,103,111,111,100,10,32,32,32,32,32,32,119,97,121,32,116,111,32,111,112,116,105,109,105,122,101,46,10,10,32,32,32,32,45,32,42,42,96,110,111,110,101,96,42,42,32,45,32,82,101,116,117,114,110,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,103,105,118,101,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,10,32,32,32,32,32,32,96,109,97,116,99,104,96,32,97,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,115,117,99,99,101,115,115,102,117,108,108,121,10,32,32,32,32,32,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,96,123,109,97,116,99,104,44,32,108,105,115,116,40,41,125,96,32,114,101,116,117,114,110,46,32,83,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,103,105,118,101,115,10,32,32,32,32,32,32,116,104,101,32,115,97,109,101,32,98,101,104,97,118,105,111,114,46,10,10,32,32,32,32,84,104,101,32,118,97,108,117,101,32,108,105,115,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,100,101,120,101,115,32,102,111,114,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,44,32,119,104,101,114,101,10,32,32,32,32,105,110,100,101,120,32,48,32,105,115,32,102,111,114,32,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,49,32,105,115,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,99,97,112,116,117,114,105,110,103,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,110,100,32,115,111,32,111,110,46,32,87,104,101,110,32,117,115,105,110,103,32,110,97,109,101,100,32,99,97,112,116,117,114,101,100,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,115,32,40,115,101,101,32,98,101,108,111,119,41,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,111,110,101,32,99,97,110,32,117,115,101,32,96,116,58,97,116,111,109,47,48,96,115,10,32,32,32,32,111,114,32,96,116,58,115,116,114,105,110,103,47,48,96,115,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,10,32,32,32,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58,10,10,32,32,32,32,96,96,96,116,101,120,116,10,32,32,32,32,34,46,42,40,97,98,99,100,41,46,42,34,10,32,32,32,32,96,96,96,10,10,32,32,32,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,115,116,114,105,110,103,32,34,65,66,67,97,98,99,100,65,66,67,34,44,32,99,97,112,116,117,114,105,110,103,32,111,110,108,121,32,116,104,101,32,34,97,98,99,100,34,32,112,97,114,116,32,40,116,104,101,10,32,32,32,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,115,117,98,112,97,116,116,101,114,110,41,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,101,32,99,97,108,108,32,103,105,118,101,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,115,117,108,116,44,32,97,115,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,10,32,32,32,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,34,40,97,98,99,100,41,34,44,32,109,97,116,99,104,105,110,103,32,34,97,98,99,100,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,116,32,40,122,101,114,111,45,98,97,115,101,100,41,10,32,32,32,32,112,111,115,105,116,105,111,110,32,51,44,32,111,102,32,108,101,110,103,116,104,32,52,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,32,32,96,96,96,10,10,32,32,32,32,67,111,110,115,105,100,101,114,32,116,104,101,32,115,97,109,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,101,120,112,108,105,99,105,116,108,121,10,32,32,32,32,110,97,109,101,100,32,39,70,79,79,39,58,10,10,32,32,32,32,96,96,96,116,101,120,116,10,32,32,32,32,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,10,32,32,32,32,96,96,96,10,10,32,32,32,32,87,105,116,104,32,116,104,105,115,32,101,120,112,114,101,115,115,105,111,110,44,32,119,101,32,99,111,117,108,100,32,115,116,105,108,108,32,103,105,118,101,32,116,104,101,32,105,110,100,101,120,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,10,32,32,32,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,103,105,118,105,110,103,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,98,101,102,111,114,101,46,32,66,117,116,44,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,97,109,101,100,44,32,119,101,32,99,97,110,10,32,32,32,32,97,108,115,111,32,115,112,101,99,105,102,121,32,105,116,115,32,110,97,109,101,32,105,110,32,116,104,101,32,118,97,108,117,101,32,108,105,115,116,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,39,70,79,79,39,93,125,93,41,46,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,105,115,32,119,111,117,108,100,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,115,44,32,110,97,109,101,108,121,58,10,10,32,32,32,32,96,96,96,101,114,108,97,110,103,10,32,32,32,32,123,109,97,116,99,104,44,91,123,51,44,52,125,93,125,10,32,32,32,32,96,96,96,10,10,32,32,32,32,84,104,101,32,118,97,108,117,101,115,32,108,105,115,116,32,99,97,110,32,115,112,101,99,105,102,121,32,105,110,100,101,120,101,115,32,111,114,32,110,97,109,101,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,10,32,32,32,32,101,120,112,114,101,115,115,105,111,110,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,118,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,116,121,112,101,46,32,73,102,10,32,32,32,32,116,104,101,32,116,121,112,101,32,105,115,32,96,105,110,100,101,120,96,44,32,116,104,101,32,116,117,112,108,101,32,96,123,45,49,44,48,125,96,32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,118,97,108,117,101,115,32,119,105,116,104,32,110,111,10,32,32,32,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,102,111,114,32,116,104,101,32,111,116,104,101,114,32,116,121,112,101,115,10,32,32,32,32,40,96,98,105,110,97,114,121,96,32,97,110,100,32,96,108,105,115,116,96,41,44,32,116,104,101,32,118,97,108,117,101,115,32,97,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,10,32,32,32,32,114,101,115,112,101,99,116,105,118,101,108,121,46,10,10,32,32,45,32,42,42,96,84,121,112,101,96,42,42,32,45,32,79,112,116,105,111,110,97,108,108,121,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,10,32,32,32,32,114,101,116,117,114,110,101,100,46,32,73,102,32,111,109,105,116,116,101,100,44,32,116,104,101,32,100,101,102,97,117,108,116,32,111,102,32,96,105,110,100,101,120,96,32,105,115,32,117,115,101,100,46,10,10,32,32,32,32,96,84,121,112,101,96,32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58,10,10,32,32,32,32,45,32,42,42,96,105,110,100,101,120,96,42,42,32,45,32,82,101,116,117,114,110,115,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,112,97,105,114,115,32,111,102,32,98,121,116,101,32,105,110,100,101,120,101,115,32,105,110,116,111,10,32,32,32,32,32,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,110,100,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,40,97,115,32,105,102,10,32,32,32,32,32,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,97,115,32,102,108,97,116,116,101,110,101,100,32,119,105,116,104,32,96,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49,96,32,111,114,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50,96,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,112,116,105,111,110,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,96,32,114,101,115,117,108,116,115,32,105,110,32,95,98,121,116,101,45,111,114,105,101,110,116,101,100,95,32,105,110,100,101,120,101,115,32,105,110,32,97,32,40,112,111,115,115,105,98,108,121,32,118,105,114,116,117,97,108,41,10,32,32,32,32,32,32,95,85,84,70,45,56,32,101,110,99,111,100,101,100,95,32,98,105,110,97,114,121,46,32,65,32,98,121,116,101,32,105,110,100,101,120,32,116,117,112,108,101,32,96,123,48,44,50,125,96,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,114,101,112,114,101,115,101,110,116,10,32,32,32,32,32,32,111,110,101,32,111,114,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,119,104,101,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,105,110,32,101,102,102,101,99,116,46,32,84,104,105,115,32,99,97,110,32,115,101,101,109,10,32,32,32,32,32,32,99,111,117,110,116,101,114,45,105,110,116,117,105,116,105,118,101,44,32,98,117,116,32,104,97,115,32,98,101,101,110,32,100,101,101,109,101,100,32,116,104,101,32,109,111,115,116,32,101,102,102,101,99,116,105,118,101,32,97,110,100,32,117,115,101,102,117,108,32,119,97,121,10,32,32,32,32,32,32,116,111,32,100,111,32,105,116,46,32,84,111,32,114,101,116,117,114,110,32,108,105,115,116,115,32,105,110,115,116,101,97,100,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,115,105,109,112,108,101,114,32,99,111,100,101,32,105,102,32,116,104,97,116,32,105,115,10,32,32,32,32,32,32,100,101,115,105,114,101,100,46,32,84,104,105,115,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,10,10,32,32,32,32,45,32,42,42,96,108,105,115,116,96,42,42,32,45,32,82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,69,114,108,97,110,103,10,32,32,32,32,32,32,96,116,58,115,116,114,105,110,103,47,48,96,115,41,46,32,73,116,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,117,115,101,100,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,92,92,67,10,32,32,32,32,32,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,10,32,32,32,32,32,32,98,121,116,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,118,97,108,105,100,32,85,84,70,45,56,32,40,92,92,67,32,109,97,116,99,104,101,115,32,98,121,116,101,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,99,104,97,114,97,99,116,101,114,10,32,32,32,32,32,32,101,110,99,111,100,105,110,103,41,46,32,73,110,32,116,104,97,116,32,99,97,115,101,32,116,104,101,32,96,108,105,115,116,96,32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,116,104,101,32,115,97,109,101,32,116,121,112,101,115,10,32,32,32,32,32,32,111,102,32,116,117,112,108,101,115,32,116,104,97,116,32,96,117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50,96,32,99,97,110,32,114,101,116,117,114,110,44,32,110,97,109,101,108,121,10,32,32,32,32,32,32,116,104,114,101,101,45,116,117,112,108,101,115,32,119,105,116,104,32,116,97,103,32,96,105,110,99,111,109,112,108,101,116,101,96,32,111,114,32,96,101,114,114,111,114,96,44,32,116,104,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,111,110,118,101,114,116,101,100,10,32,32,32,32,32,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,116,104,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,32,116,97,105,108,32,111,102,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,10,32,32,32,32,32,32,98,101,115,116,32,115,116,114,97,116,101,103,121,32,105,115,32,116,111,32,97,118,111,105,100,32,117,115,105,110,103,32,116,104,101,32,92,92,67,32,115,101,113,117,101,110,99,101,32,119,104,101,110,32,99,97,112,116,117,114,105,110,103,32,108,105,115,116,115,46,10,10,32,32,32,32,45,32,42,42,96,98,105,110,97,114,121,96,42,42,32,45,32,82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,98,105,110,97,114,105,101,115,46,32,73,102,32,111,112,116,105,111,110,10,32,32,32,32,32,32,96,117,110,105,99,111,100,101,96,32,105,115,32,117,115,101,100,44,32,116,104,101,115,101,32,98,105,110,97,114,105,101,115,32,97,114,101,32,105,110,32,85,84,70,45,56,46,32,73,102,32,116,104,101,32,92,92,67,32,115,101,113,117,101,110,99,101,32,105,115,10,32,32,32,32,32,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,96,117,110,105,99,111,100,101,96,44,32,116,104,101,32,98,105,110,97,114,105,101,115,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,46,10,10,32,32,73,110,32,103,101,110,101,114,97,108,44,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,119,101,114,101,32,110,111,116,32,97,115,115,105,103,110,101,100,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,109,97,116,99,104,32,97,114,101,10,32,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,116,117,112,108,101,32,96,123,45,49,44,48,125,96,32,119,104,101,110,32,96,116,121,112,101,96,32,105,115,32,96,105,110,100,101,120,96,46,32,85,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,115,10,32,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,102,111,114,32,111,116,104,101,114,32,114,101,116,117,114,110,10,32,32,116,121,112,101,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,34,46,42,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,46,42,34,10,32,32,96,96,96,10,10,32,32,84,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,119,104,101,114,101,32,116,104,101,32,111,112,101,110,105,110,103,10,32,32,112,97,114,101,110,116,104,101,115,105,115,32,112,111,115,105,116,105,111,110,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,111,114,100,101,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,104,101,110,99,101,10,32,32,96,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,49,44,32,96,40,63,60,70,79,79,62,97,98,100,100,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,10,32,32,105,110,100,101,120,32,50,44,32,97,110,100,32,96,40,46,46,100,41,96,32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,51,46,32,87,104,101,110,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,10,32,32,115,116,114,105,110,103,58,10,10,32,32,96,96,96,116,101,120,116,10,32,32,34,65,66,67,97,98,99,100,65,66,67,34,10,32,32,96,96,96,10,10,32,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,44,32,97,115,32,34,97,98,100,100,34,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,10,32,32,115,116,114,105,110,103,44,32,98,117,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,40,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,10,32,32,96,97,40,46,46,100,41,96,41,46,32,84,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,110,97,115,115,105,103,110,101,100,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,10,32,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,44,123,45,49,44,48,125,44,123,52,44,51,125,93,125,10,32,32,96,96,96,10,10,32,32,83,101,116,116,105,110,103,32,116,104,101,32,99,97,112,116,117,114,101,32,96,84,121,112,101,96,32,116,111,32,96,98,105,110,97,114,121,96,32,103,105,118,101,115,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,60,60,34,65,66,67,97,98,99,100,65,66,67,34,62,62,44,60,60,34,97,98,99,100,34,62,62,44,60,60,62,62,44,60,60,34,98,99,100,34,62,62,93,125,10,32,32,96,96,96,10,10,32,32,72,101,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,40,96,60,60,62,62,96,41,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,117,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,110,32,116,104,101,10,32,32,96,98,105,110,97,114,121,96,32,99,97,115,101,44,32,115,111,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,116,104,101,114,101,102,111,114,101,32,108,111,115,116,44,32,97,115,10,32,32,96,60,60,62,62,96,32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,99,97,112,116,117,114,101,100,46,10,10,32,32,73,102,32,100,105,102,102,101,114,101,110,116,105,97,116,105,111,110,32,98,101,116,119,101,101,110,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,97,110,100,32,110,111,110,45,101,120,105,115,116,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,10,32,32,110,101,99,101,115,115,97,114,121,44,32,117,115,101,32,116,104,101,32,96,116,121,112,101,96,32,96,105,110,100,101,120,96,32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,116,104,101,32,102,105,110,97,108,32,116,121,112,101,32,105,110,10,32,32,69,114,108,97,110,103,32,99,111,100,101,46,10,10,32,32,87,104,101,110,32,111,112,116,105,111,110,32,96,103,108,111,98,97,108,96,32,105,115,32,115,112,101,99,105,105,102,105,101,100,44,32,116,104,101,32,96,99,97,112,116,117,114,101,96,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,102,102,101,99,116,115,32,101,97,99,104,10,32,32,109,97,116,99,104,32,115,101,112,97,114,97,116,101,108,121,44,32,115,111,32,116,104,97,116,58,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,114,101,58,114,117,110,40,34,99,97,99,98,34,44,34,99,40,97,124,98,41,34,44,91,103,108,111,98,97,108,44,123,99,97,112,116,117,114,101,44,91,49,93,44,108,105,115,116,125,93,41,46,10,32,32,96,96,96,10,10,32,32,103,105,118,101,115,10,10,32,32,96,96,96,101,114,108,97,110,103,10,32,32,123,109,97,116,99,104,44,91,91,34,97,34,93,44,91,34,98,34,93,93,125,10,32,32,96,96,96,10,10,70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,111,112,116,105,111,110,115,32,111,110,108,121,32,97,102,102,101,99,116,105,110,103,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,115,116,101,112,44,32,115,101,101,10,96,99,111,109,112,105,108,101,47,50,96,46>>},#{specification => [{attribute,{765,2},spec,{{run,3},[{type,{765,10},bounded_fun,[{type,{765,10},'fun',[{type,{765,10},product,[{var,{765,11},'Subject'},{var,{765,20},'RE'},{var,{765,24},'Options'}]},{type,{765,36},union,[{type,{765,36},tuple,[{atom,{765,37},match},{var,{765,44},'Captured'}]},{atom,{766,36},match},{atom,{767,36},nomatch},{type,{768,8},tuple,[{atom,{768,9},error},{var,{768,16},'ErrType'}]}]}]},[{type,{769,7},constraint,[{atom,{769,7},is_subtype},[{var,{769,7},'Subject'},{type,{769,18},union,[{type,{769,18},iodata,[]},{remote_type,{769,29},[{atom,{769,29},unicode},{atom,{769,37},charlist},[]]}]}]]},{type,{770,7},constraint,[{atom,{770,7},is_subtype},[{var,{770,7},'RE'},{type,{770,13},union,[{user_type,{770,13},mp,[]},{type,{770,20},iodata,[]},{remote_type,{770,31},[{atom,{770,31},unicode},{atom,{770,39},charlist},[]]}]}]]},{type,{771,7},constraint,[{atom,{771,7},is_subtype},[{var,{771,7},'Options'},{user_type,{771,18},options,[]}]]},{type,{772,7},constraint,[{atom,{772,7},is_subtype},[{var,{772,7},'Captured'},{type,{772,19},union,[{type,{772,19},list,[{var,{772,20},'CaptureData'}]},{type,{772,35},list,[{type,{772,36},list,[{var,{772,37},'CaptureData'}]}]}]}]]},{type,{773,7},constraint,[{atom,{773,7},is_subtype},[{var,{773,7},'CaptureData'},{type,{773,22},union,[{type,{773,22},tuple,[{type,{773,23},integer,[]},{type,{773,34},integer,[]}]},{var,{774,22},'ListConversionData'},{type,{775,22},binary,[]}]}]]},{type,{776,7},constraint,[{atom,{776,7},is_subtype},[{var,{776,7},'ListConversionData'},{type,{776,29},union,[{type,{776,29},string,[]},{type,{777,29},tuple,[{atom,{777,30},error},{type,{777,37},string,[]},{type,{777,47},binary,[]}]},{type,{778,29},tuple,[{atom,{778,30},incomplete},{type,{778,42},string,[]},{type,{778,52},binary,[]}]}]}]]},{type,{779,7},constraint,[{atom,{779,7},is_subtype},[{var,{779,7},'ErrType'},{type,{779,18},union,[{atom,{779,18},match_limit},{atom,{779,32},match_limit_recursion},{type,{779,56},tuple,[{atom,{779,57},compile},{var,{779,67},'CompileErr'}]}]}]]},{type,{780,7},constraint,[{atom,{780,7},is_subtype},[{var,{780,7},'CompileErr'},{type,{780,21},tuple,[{ann_type,{780,22},[{var,{780,22},'ErrString'},{type,{780,35},string,[]}]},{ann_type,{780,45},[{var,{780,45},'Position'},{type,{780,57},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,run,2},{246,1},[<<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,41>>],none,#{equiv => <<114,117,110,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>}},{{function,compile,2},{89,2},[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,32,79,112,116,105,111,110,115,41>>],#{<<101,110>> => <<67,111,109,112,105,108,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,119,105,116,104,32,116,104,101,32,115,121,110,116,97,120,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,44,32,105,110,116,111,32,97,110,32,105,110,116,101,114,110,97,108,10,102,111,114,109,97,116,32,116,111,32,98,101,32,117,115,101,100,32,108,97,116,101,114,32,97,115,32,97,32,112,97,114,97,109,101,116,101,114,32,116,111,32,96,114,117,110,47,50,96,32,97,110,100,32,96,114,117,110,47,51,96,46,10,10,67,111,109,112,105,108,105,110,103,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,115,97,109,101,10,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,109,97,116,99,104,105,110,103,32,97,103,97,105,110,115,116,32,109,117,108,116,105,112,108,101,32,115,117,98,106,101,99,116,115,32,100,117,114,105,110,103,32,116,104,101,10,108,105,102,101,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,103,114,97,109,46,32,67,111,109,112,105,108,105,110,103,32,111,110,99,101,32,97,110,100,32,101,120,101,99,117,116,105,110,103,32,109,97,110,121,32,116,105,109,101,115,32,105,115,32,102,97,114,32,109,111,114,101,10,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,111,109,112,105,108,105,110,103,32,101,97,99,104,32,116,105,109,101,32,111,110,101,32,119,97,110,116,115,32,116,111,32,109,97,116,99,104,46,10,10,87,104,101,110,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,10,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,44,32,111,116,104,101,114,119,105,115,101,32,97,115,32,97,110,121,32,118,97,108,105,100,32,96,116,58,105,111,100,97,116,97,47,48,96,46,10,10,91,93,40,41,123,58,32,35,99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,32,125,10,10,79,112,116,105,111,110,115,58,10,10,45,32,42,42,96,117,110,105,99,111,100,101,96,42,42,32,45,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,85,110,105,99,111,100,101,32,96,99,104,97,114,108,105,115,116,40,41,96,10,32,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,100,101,32,105,115,32,116,111,32,98,101,32,114,117,110,32,97,103,97,105,110,115,116,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,10,32,32,96,99,104,97,114,108,105,115,116,40,41,96,32,115,117,98,106,101,99,116,46,32,65,108,115,111,32,99,111,110,115,105,100,101,114,32,111,112,116,105,111,110,32,96,117,99,112,96,32,119,104,101,110,32,117,115,105,110,103,32,85,110,105,99,111,100,101,10,32,32,99,104,97,114,97,99,116,101,114,115,46,10,10,45,32,42,42,96,97,110,99,104,111,114,101,100,96,42,42,32,45,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,102,111,114,99,101,100,32,116,111,32,98,101,32,34,97,110,99,104,111,114,101,100,34,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,10,32,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,10,32,32,115,101,97,114,99,104,101,100,32,40,116,104,101,32,34,115,117,98,106,101,99,116,32,115,116,114,105,110,103,34,41,46,32,84,104,105,115,32,101,102,102,101,99,116,32,99,97,110,32,97,108,115,111,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,10,32,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,110,115,116,114,117,99,116,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,46,10,10,45,32,42,42,96,99,97,115,101,108,101,115,115,96,42,42,32,45,32,76,101,116,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,98,111,116,104,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,10,32,32,108,101,116,116,101,114,115,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,105,96,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,10,32,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,105,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,85,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,32,97,114,101,10,32,32,100,101,102,105,110,101,100,32,97,115,32,105,110,32,116,104,101,32,73,83,79,32,56,56,53,57,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46,10,10,45,32,42,42,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,42,42,32,45,32,65,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,10,32,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,111,112,116,105,111,110,44,32,97,32,100,111,108,108,97,114,32,97,108,115,111,32,109,97,116,99,104,101,115,10,32,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,117,116,32,110,111,116,32,98,101,102,111,114,101,32,97,110,121,10,32,32,111,116,104,101,114,32,110,101,119,108,105,110,101,115,41,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,105,103,110,111,114,101,100,32,105,102,32,111,112,116,105,111,110,32,96,109,117,108,116,105,108,105,110,101,96,32,105,115,32,115,112,101,99,105,102,105,101,100,46,10,32,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,44,32,97,110,100,32,105,116,32,99,97,110,110,111,116,32,98,101,32,115,101,116,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,100,111,116,97,108,108,96,42,42,32,45,32,65,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,116,104,111,115,101,10,32,32,105,110,100,105,99,97,116,105,110,103,32,110,101,119,108,105,110,101,46,32,87,105,116,104,111,117,116,32,105,116,44,32,97,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,10,32,32,105,115,32,97,116,32,97,32,110,101,119,108,105,110,101,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,115,96,32,97,110,100,32,105,116,32,99,97,110,32,98,101,10,32,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,115,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,65,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,44,32,115,117,99,104,32,97,115,10,32,32,96,91,94,97,93,96,44,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,116,104,105,115,10,32,32,111,112,116,105,111,110,46,10,10,45,32,42,42,96,101,120,116,101,110,100,101,100,96,42,42,32,45,32,73,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,101,116,44,32,109,111,115,116,32,119,104,105,116,101,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,10,32,32,112,97,116,116,101,114,110,32,97,114,101,32,116,111,116,97,108,108,121,32,105,103,110,111,114,101,100,32,101,120,99,101,112,116,32,119,104,101,110,32,101,115,99,97,112,101,100,32,111,114,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,10,32,32,72,111,119,101,118,101,114,44,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,96,40,63,62,96,32,116,104,97,116,10,32,32,105,110,116,114,111,100,117,99,101,32,118,97,114,105,111,117,115,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,110,111,114,32,119,105,116,104,105,110,32,97,32,110,117,109,101,114,105,99,97,108,32,113,117,97,110,116,105,102,105,101,114,10,32,32,115,117,99,104,32,97,115,32,96,123,49,44,51,125,96,46,32,72,111,119,101,118,101,114,44,32,105,103,110,111,114,97,98,108,101,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,98,101,116,119,101,101,110,32,97,110,32,105,116,101,109,10,32,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,98,101,116,119,101,101,110,32,97,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,43,32,116,104,97,116,10,32,32,105,110,100,105,99,97,116,101,115,32,112,111,115,115,101,115,115,105,118,101,110,101,115,115,46,10,10,32,32,87,104,105,116,101,32,115,112,97,99,101,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,98,101,99,97,117,115,101,32,80,101,114,108,10,32,32,100,105,100,32,110,111,116,32,116,114,101,97,116,32,116,104,105,115,32,99,104,97,114,97,99,116,101,114,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,10,32,32,53,46,49,56,44,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,44,32,97,110,100,32,86,84,32,105,115,32,110,111,119,32,116,114,101,97,116,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,10,10,32,32,84,104,105,115,32,97,108,115,111,32,99,97,117,115,101,115,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,10,32,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,44,32,105,110,99,108,117,115,105,118,101,44,32,116,111,32,98,101,32,105,103,110,111,114,101,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,39,115,10,32,32,96,47,120,96,32,111,112,116,105,111,110,44,32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32,96,40,63,120,41,96,32,111,112,116,105,111,110,10,32,32,115,101,116,116,105,110,103,46,10,10,32,32,87,105,116,104,32,116,104,105,115,32,111,112,116,105,111,110,44,32,99,111,109,109,101,110,116,115,32,105,110,115,105,100,101,32,99,111,109,112,108,105,99,97,116,101,100,32,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,46,10,32,32,72,111,119,101,118,101,114,44,32,110,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,115,46,32,87,104,105,116,101,115,112,97,99,101,10,32,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,110,101,118,101,114,32,97,112,112,101,97,114,32,119,105,116,104,105,110,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,10,32,32,102,111,114,32,101,120,97,109,112,108,101,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,32,96,40,63,40,96,32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,102,105,114,115,116,108,105,110,101,96,42,42,32,45,32,65,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,111,114,32,97,116,32,116,104,101,10,32,32,102,105,114,115,116,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,109,97,116,99,104,101,100,32,116,101,120,116,32,99,97,110,32,99,111,110,116,105,110,117,101,10,32,32,111,118,101,114,32,116,104,101,32,110,101,119,108,105,110,101,46,10,10,45,32,42,42,96,109,117,108,116,105,108,105,110,101,96,42,42,32,45,32,66,121,32,100,101,102,97,117,108,116,44,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,115,32,99,111,110,115,105,115,116,105,110,103,32,111,102,10,32,32,97,32,115,105,110,103,108,101,32,108,105,110,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,110,101,119,108,105,110,101,115,41,46,32,84,104,101,32,34,115,116,97,114,116,32,111,102,10,32,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40,96,94,96,41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,119,104,105,108,101,32,116,104,101,10,32,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40,96,36,96,41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,111,114,10,32,32,98,101,102,111,114,101,32,97,32,116,101,114,109,105,110,97,116,105,110,103,32,110,101,119,108,105,110,101,32,40,117,110,108,101,115,115,32,111,112,116,105,111,110,32,96,100,111,108,108,97,114,95,101,110,100,111,110,108,121,96,32,105,115,32,115,112,101,99,105,102,105,101,100,41,46,10,32,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,10,10,32,32,87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,97,110,100,32,34,101,110,100,32,111,102,32,108,105,110,101,34,10,32,32,99,111,110,115,116,114,117,99,116,115,32,109,97,116,99,104,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,10,32,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,97,115,32,119,101,108,108,32,97,115,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,46,10,32,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32,96,47,109,96,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,10,32,32,97,32,96,40,63,109,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,110,101,119,108,105,110,101,115,32,105,110,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,110,111,10,32,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,96,94,96,32,111,114,32,96,36,96,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,115,101,116,116,105,110,103,32,96,109,117,108,116,105,108,105,110,101,96,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,10,10,45,32,42,42,96,110,111,95,97,117,116,111,95,99,97,112,116,117,114,101,96,42,42,32,45,32,68,105,115,97,98,108,101,115,32,116,104,101,32,117,115,101,32,111,102,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,10,32,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,96,63,96,32,98,101,104,97,118,101,115,32,97,115,32,105,102,10,32,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,96,63,58,96,46,32,78,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,97,112,116,117,114,105,110,103,32,40,97,110,100,10,32,32,116,104,101,121,32,97,99,113,117,105,114,101,32,110,117,109,98,101,114,115,32,105,110,32,116,104,101,32,117,115,117,97,108,32,119,97,121,41,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,46,10,10,45,32,42,42,96,100,117,112,110,97,109,101,115,96,42,42,32,45,32,78,97,109,101,115,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,110,101,101,100,32,110,111,116,32,98,101,10,32,32,117,110,105,113,117,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,102,111,114,32,99,101,114,116,97,105,110,32,116,121,112,101,115,32,111,102,32,112,97,116,116,101,114,110,32,119,104,101,110,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,10,32,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,101,118,101,114,32,98,101,32,109,97,116,99,104,101,100,46,32,77,111,114,101,32,100,101,116,97,105,108,115,32,111,102,10,32,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46,10,10,45,32,42,42,96,117,110,103,114,101,101,100,121,96,42,42,32,45,32,73,110,118,101,114,116,115,32,116,104,101,32,34,103,114,101,101,100,105,110,101,115,115,34,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,115,111,32,116,104,97,116,32,116,104,101,121,32,97,114,101,10,32,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,98,101,99,111,109,101,32,103,114,101,101,100,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,34,63,34,46,32,73,116,32,105,115,32,110,111,116,10,32,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,97,32,96,40,63,85,41,96,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,119,105,116,104,105,110,32,116,104,101,10,32,32,112,97,116,116,101,114,110,46,10,10,45,32,42,42,96,123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125,96,42,42,32,45,32,79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,10,32,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46,10,10,32,32,45,32,42,42,96,99,114,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,96,99,114,96,32,40,65,83,67,73,73,32,49,51,41,46,10,10,32,32,45,32,42,42,96,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,10,32,32,32,32,100,101,102,97,117,108,116,46,10,10,32,32,45,32,42,42,96,99,114,108,102,96,42,42,32,45,32,78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,10,32,32,32,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46,10,10,32,32,45,32,42,42,96,97,110,121,99,114,108,102,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46,10,10,32,32,45,32,42,42,96,97,110,121,96,42,42,32,45,32,65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,10,32,32,32,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,10,32,32,32,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,10,10,45,32,42,42,96,98,115,114,95,97,110,121,99,114,108,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,44,10,32,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,10,10,45,32,42,42,96,98,115,114,95,117,110,105,99,111,100,101,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,10,32,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,10,10,45,32,42,42,96,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,96,42,42,32,45,32,68,105,115,97,98,108,101,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,99,97,110,32,109,97,108,102,117,110,99,116,105,111,110,32,105,102,10,32,32,34,83,112,101,99,105,97,108,32,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,65,10,32,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,119,111,117,108,100,32,98,101,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,68,69,70,65,66,67,34,32,97,103,97,105,110,115,116,32,34,40,42,67,79,77,77,73,84,41,65,66,67,34,44,32,119,104,101,114,101,10,32,32,116,104,101,32,115,116,97,114,116,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,80,67,82,69,32,119,111,117,108,100,32,115,107,105,112,32,116,104,101,32,115,117,98,106,101,99,116,32,117,112,32,116,111,32,34,65,34,32,97,110,100,32,110,101,118,101,114,10,32,32,114,101,97,108,105,122,101,32,116,104,97,116,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,115,116,114,117,99,116,105,111,110,32,105,115,32,116,111,32,104,97,118,101,32,109,97,100,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,97,105,108,46,32,84,104,105,115,10,32,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,114,101,108,101,118,97,110,116,32,105,102,32,121,111,117,32,117,115,101,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,44,32,97,115,32,100,105,115,99,117,115,115,101,100,32,105,110,10,32,32,115,101,99,116,105,111,110,32,91,80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115,93,40,96,109,58,114,101,35,109,111,100,117,108,101,45,112,99,114,101,45,114,101,103,117,108,97,114,45,101,120,112,114,101,115,115,105,111,110,45,100,101,116,97,105,108,115,96,41,46,10,10,45,32,42,42,96,117,99,112,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,116,111,32,98,101,32,117,115,101,100,32,119,104,101,110,10,32,32,114,101,115,111,108,118,105,110,103,32,92,92,66,44,32,92,92,98,44,32,92,92,68,44,32,92,92,100,44,32,92,92,83,44,32,92,92,115,44,32,92,92,87,32,97,110,100,32,92,92,119,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,102,108,97,103,44,32,111,110,108,121,10,32,32,73,83,79,32,76,97,116,105,110,45,49,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,85,115,105,110,103,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,104,117,114,116,115,32,112,101,114,102,111,114,109,97,110,99,101,44,10,32,32,98,117,116,32,105,115,32,115,101,109,97,110,116,105,99,97,108,108,121,32,99,111,114,114,101,99,116,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,98,101,121,111,110,100,32,116,104,101,10,32,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,46,10,10,45,32,42,42,96,110,101,118,101,114,95,117,116,102,96,42,42,32,45,32,83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,40,42,85,84,70,41,32,97,110,100,47,111,114,32,40,42,85,84,70,56,41,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,10,32,32,105,116,101,109,115,34,32,97,114,101,32,102,111,114,98,105,100,100,101,110,46,32,84,104,105,115,32,102,108,97,103,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32,96,117,110,105,99,111,100,101,96,46,10,32,32,85,115,101,102,117,108,32,105,102,32,73,83,79,32,76,97,116,105,110,45,49,32,112,97,116,116,101,114,110,115,32,102,114,111,109,32,97,110,32,101,120,116,101,114,110,97,108,32,115,111,117,114,99,101,32,97,114,101,32,116,111,32,98,101,32,99,111,109,112,105,108,101,100,46>>},#{specification => [{attribute,{229,2},spec,{{compile,2},[{type,{229,14},bounded_fun,[{type,{229,14},'fun',[{type,{229,14},product,[{var,{229,15},'Regexp'},{var,{229,23},'Options'}]},{type,{229,35},union,[{type,{229,35},tuple,[{atom,{229,36},ok},{var,{229,40},'MP'}]},{type,{229,46},tuple,[{atom,{229,47},error},{var,{229,54},'ErrSpec'}]}]}]},[{type,{230,7},constraint,[{atom,{230,7},is_subtype},[{var,{230,7},'Regexp'},{type,{230,17},union,[{type,{230,17},iodata,[]},{remote_type,{230,28},[{atom,{230,28},unicode},{atom,{230,36},charlist},[]]}]}]]},{type,{231,7},constraint,[{atom,{231,7},is_subtype},[{var,{231,7},'Options'},{type,{231,18},list,[{var,{231,19},'Option'}]}]]},{type,{232,7},constraint,[{atom,{232,7},is_subtype},[{var,{232,7},'Option'},{user_type,{232,17},compile_option,[]}]]},{type,{233,7},constraint,[{atom,{233,7},is_subtype},[{var,{233,7},'MP'},{user_type,{233,13},mp,[]}]]},{type,{234,7},constraint,[{atom,{234,7},is_subtype},[{var,{234,7},'ErrSpec'},{type,{234,18},tuple,[{ann_type,{234,19},[{var,{234,19},'ErrString'},{type,{234,32},string,[]}]},{ann_type,{234,42},[{var,{234,42},'Position'},{type,{234,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,compile,1},{80,2},[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,41>>],#{<<101,110>> => <<84,104,101,32,115,97,109,101,32,97,115,32,91,96,99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,91,93,41,96,93,40,96,99,111,109,112,105,108,101,47,50,96,41>>},#{specification => [{attribute,{81,2},spec,{{compile,1},[{type,{81,14},bounded_fun,[{type,{81,14},'fun',[{type,{81,14},product,[{var,{81,15},'Regexp'}]},{type,{81,26},union,[{type,{81,26},tuple,[{atom,{81,27},ok},{var,{81,31},'MP'}]},{type,{81,37},tuple,[{atom,{81,38},error},{var,{81,45},'ErrSpec'}]}]}]},[{type,{82,7},constraint,[{atom,{82,7},is_subtype},[{var,{82,7},'Regexp'},{type,{82,17},iodata,[]}]]},{type,{83,7},constraint,[{atom,{83,7},is_subtype},[{var,{83,7},'MP'},{user_type,{83,13},mp,[]}]]},{type,{84,7},constraint,[{atom,{84,7},is_subtype},[{var,{84,7},'ErrSpec'},{type,{84,18},tuple,[{ann_type,{84,19},[{var,{84,19},'ErrString'},{type,{84,32},string,[]}]},{ann_type,{84,42},[{var,{84,42},'Position'},{type,{84,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,version,0},{66,2},[<<118,101,114,115,105,111,110,40,41>>],#{<<101,110>> => <<84,104,101,32,114,101,116,117,114,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,121,115,116,101,109,32,116,104,97,116,10,119,97,115,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,99,111,109,112,105,108,97,116,105,111,110,46>>},#{specification => [{attribute,{71,2},spec,{{version,0},[{type,{71,14},'fun',[{type,{71,14},product,[]},{type,{71,20},binary,[]}]}]}}],since => <<79,84,80,32,50,48,46,48>>}}]}. \ No newline at end of file diff --git a/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1 index 5f1032916402..c335d2ca20f9 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1 +++ b/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1 @@ -1 +1 @@ -{docs_v1,{22,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,hidden,#{otp_doc_vsn => {1,0,0}},[{{function,execute,3},{529,1},[<<101,120,101,99,117,116,101,40,73,116,101,109,44,32,70,44,32,80,105,100,41>>],none,#{}},{{function,render_all,1},{436,1},[<<114,101,110,100,101,114,95,97,108,108,40,68,105,114,41>>],none,#{}},{{function,render_non_native,1},{417,1},[<<114,101,110,100,101,114,95,110,111,110,95,110,97,116,105,118,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,normalize,1},{398,1},[<<110,111,114,109,97,108,105,122,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,links,1},{342,1},[<<108,105,110,107,115,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_prop,1},{337,1},[<<114,101,110,100,101,114,95,112,114,111,112,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_callback,1},{242,1},[<<114,101,110,100,101,114,95,99,97,108,108,98,97,99,107,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_type,1},{219,1},[<<114,101,110,100,101,114,95,116,121,112,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_function,1},{190,1},[<<114,101,110,100,101,114,95,102,117,110,99,116,105,111,110,40,67,111,110,102,105,103,41>>],none,#{}},{{function,update_render,1},{115,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,40,68,97,116,97,68,105,114,41>>],none,#{}},{{function,update_render,0},{111,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,40,41>>],none,#{}},{{function,render,1},{87,1},[<<114,101,110,100,101,114,40,67,111,110,102,105,103,41>>],none,#{}},{{function,end_per_group,2},{69,1},[<<101,110,100,95,112,101,114,95,103,114,111,117,112,40,71,114,111,117,112,78,97,109,101,44,32,67,111,110,102,105,103,41>>],none,#{}},{{function,init_per_group,2},{64,1},[<<105,110,105,116,95,112,101,114,95,103,114,111,117,112,47,50>>],none,#{}},{{function,end_per_suite,1},{61,1},[<<101,110,100,95,112,101,114,95,115,117,105,116,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,init_per_suite,1},{57,1},[<<105,110,105,116,95,112,101,114,95,115,117,105,116,101,40,67,111,110,102,105,103,49,41>>],none,#{}},{{function,groups,0},{46,1},[<<103,114,111,117,112,115,40,41>>],none,#{}},{{function,all,0},{40,1},[<<97,108,108,40,41>>],none,#{}},{{function,suite,0},{37,1},[<<115,117,105,116,101,40,41>>],none,#{}}]}. \ No newline at end of file +{docs_v1,{22,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,hidden,#{otp_doc_vsn => {1,0,0}},[{{function,execute,3},{605,1},[<<101,120,101,99,117,116,101,40,73,116,101,109,44,32,70,44,32,80,105,100,41>>],none,#{}},{{function,columns,1},{551,2},[<<99,111,108,117,109,110,115,40,67,111,110,102,105,103,41>>],#{<<101,110>> => <<68,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,32,100,111,99,46>>},#{}},{{function,ansi,1},{530,1},[<<97,110,115,105,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_all,1},{453,1},[<<114,101,110,100,101,114,95,97,108,108,40,68,105,114,41>>],none,#{}},{{function,render_non_native,1},{434,1},[<<114,101,110,100,101,114,95,110,111,110,95,110,97,116,105,118,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,normalize,1},{415,1},[<<110,111,114,109,97,108,105,122,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,links,1},{359,1},[<<108,105,110,107,115,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_prop,1},{354,1},[<<114,101,110,100,101,114,95,112,114,111,112,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_callback,1},{259,1},[<<114,101,110,100,101,114,95,99,97,108,108,98,97,99,107,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_type,1},{236,1},[<<114,101,110,100,101,114,95,116,121,112,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,render_function,1},{207,1},[<<114,101,110,100,101,114,95,102,117,110,99,116,105,111,110,40,67,111,110,102,105,103,41>>],none,#{}},{{function,update_render,1},{132,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,40,68,97,116,97,68,105,114,41>>],none,#{}},{{function,update_render,0},{128,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,40,41>>],none,#{}},{{function,render,1},{104,1},[<<114,101,110,100,101,114,40,67,111,110,102,105,103,41>>],none,#{}},{{function,end_per_testcase,2},{80,1},[<<101,110,100,95,112,101,114,95,116,101,115,116,99,97,115,101,40,84,101,115,116,67,97,115,101,44,32,67,111,110,102,105,103,41>>],none,#{}},{{function,init_per_testcase,2},{74,1},[<<105,110,105,116,95,112,101,114,95,116,101,115,116,99,97,115,101,40,84,101,115,116,67,97,115,101,44,32,67,111,110,102,105,103,41>>],none,#{}},{{function,end_per_group,2},{71,1},[<<101,110,100,95,112,101,114,95,103,114,111,117,112,40,71,114,111,117,112,78,97,109,101,44,32,67,111,110,102,105,103,41>>],none,#{}},{{function,init_per_group,2},{66,1},[<<105,110,105,116,95,112,101,114,95,103,114,111,117,112,47,50>>],none,#{}},{{function,end_per_suite,1},{63,1},[<<101,110,100,95,112,101,114,95,115,117,105,116,101,40,67,111,110,102,105,103,41>>],none,#{}},{{function,init_per_suite,1},{59,1},[<<105,110,105,116,95,112,101,114,95,115,117,105,116,101,40,67,111,110,102,105,103,49,41>>],none,#{}},{{function,groups,0},{48,1},[<<103,114,111,117,112,115,40,41>>],none,#{}},{{function,all,0},{40,1},[<<97,108,108,40,41>>],none,#{}},{{function,suite,0},{37,1},[<<115,117,105,116,101,40,41>>],none,#{}}]}. \ No newline at end of file diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt index bfe04b7b38f5..36f99df60016 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt @@ -9,7 +9,7 @@ allocation has been reduced as much as possible. This is useful if the process does not expect to receive any messages soon. - The process is awaken when a message is sent to it, and control + The process is awakened when a message is sent to it, and control resumes in Module:Function with the arguments specified by Args with the call stack emptied, meaning that the process terminates when that function returns. Thus erlang:hibernate/3 never diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt index ecf0c99b1562..b80e71fb75d1 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt @@ -74,8 +74,8 @@ monitor is created. But the monitor will only supervise the connection. That is, a {'DOWN', _, process, _, noconnection} is the only message that may be received, - as the primitive node have no way of reporting the - status of the monitored process. + as the primitive node has no way of reporting the status + of the monitored process. • Monitoring a port - Creates monitor between the current process and a port identified by Item, which can be a  diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_func.txt index ebec52264484..00831e54725b 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_func.txt @@ -74,8 +74,8 @@ monitor is created. But the monitor will only supervise the connection. That is, a {'DOWN', _, process, _, noconnection} is the only message that may be received, - as the primitive node have no way of reporting the - status of the monitored process. + as the primitive node has no way of reporting the status + of the monitored process. • Monitoring a port - Creates monitor between the current process and a port identified by Item, which can be a  diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt index a4a2ff29be1e..e8149c4bf2ae 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt @@ -69,11 +69,11 @@ memory condition. Blocking due to disabled async_dist can be monitored by  - erlang:system_monitor() using the busy_dist_port option. - Only data buffered by processes which (at the time of - sending a signal) have disabled async_dist will be counted - when determining whether or not an operation should block - the caller. + trace:system() using the busy_dist_port option. Only data + buffered by processes which (at the time of sending a + signal) have disabled async_dist will be counted when + determining whether or not an operation should block the + caller. The async_dist flag can also be set on a new process when spawning it using the spawn_opt() BIF with the option  diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_func.txt index ba69d49ae169..9ec131074fef 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_func.txt @@ -69,11 +69,11 @@ memory condition. Blocking due to disabled async_dist can be monitored by  - erlang:system_monitor() using the busy_dist_port option. - Only data buffered by processes which (at the time of - sending a signal) have disabled async_dist will be counted - when determining whether or not an operation should block - the caller. + trace:system() using the busy_dist_port option. Only data + buffered by processes which (at the time of sending a + signal) have disabled async_dist will be counted when + determining whether or not an operation should block the + caller. The async_dist flag can also be set on a new process when spawning it using the spawn_opt() BIF with the option  diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_2_func.txt index c86da0685792..c8089685939f 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_2_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_2_func.txt @@ -8,134 +8,41 @@  OldMonitorPid :: pid(),  OldOptions :: [system_monitor_option()]. - Sets the system performance monitoring options. MonitorPid is a - local process identifier (pid) receiving system monitor messages. - - The second argument is a list of monitoring options: - - • {long_gc, Time} - If a garbage collection in the system - takes at least Time wall clock milliseconds, a message  - {monitor, GcPid, long_gc, Info} is sent to MonitorPid.  - GcPid is the pid that was garbage collected. Info is a - list of two-element tuples describing the result of the - garbage collection. - - One of the tuples is {timeout, GcTime}, where GcTime is - the time for the garbage collection in milliseconds. The - other tuples are tagged with heap_size, heap_block_size,  - stack_size, mbuf_size, old_heap_size, and  - old_heap_block_size. These tuples are explained in the - description of trace message gc_minor_start (see  - trace:process/4). New tuples can be added, and the order of - the tuples in the Info list can be changed at any time - without prior notice. - - • {long_message_queue, {Disable, Enable}} - If the message - queue length of a process in the system reach Enable - length, a long_message_queue monitor message is sent to - the process identified by MonitorPid. The monitor message - will be on the form {monitor, Pid, long_message_queue, - Long}, where Pid is the process identifier of the process - that got a long message queue and Long will equal true - indicating that it is in a long message queue state. No - more long_message_queue monitor messages will be sent due - to the process identified by Pid until its message queue - length falls down to a length of Disable length. When this - happens, a long_message_queue monitor message with Long - equal to false will be sent to the process identified by  - MonitorPid indicating that the process is no longer in a - long message queue state. As of this, if the message queue - length should again reach Enable length, a new  - long_message_queue monitor message with Long set to true - will again be sent. That is, a long_message_queue monitor - message is sent when a process enters or leaves a long - message queue state where these state changes are defined - by the Enable and Disable parameters. - - Enable length must be an integer larger than zero and  - Disable length must be an integer larger than or equal to - zero. Disable length must also be smaller than Enable - length. If the above is not satisfied the operation will - fail with a badarg error exception. You are recommended to - use a much smaller value for Disable length than Enable - length in order not to be flooded with long_message_queue - monitor messages. - - • {long_schedule, Time} - If a process or port in the system - runs uninterrupted for at least Time wall clock - milliseconds, a message {monitor, PidOrPort, long_schedule, - Info} is sent to MonitorPid. PidOrPort is the process - or port that was running. Info is a list of two-element - tuples describing the event. - - If a pid/0, the tuples {timeout, Millis}, {in, - Location}, and {out, Location} are present, where  - Location is either an MFA ({Module, Function, Arity}) - describing the function where the process was scheduled - in/out, or the atom undefined. - - If a port/0, the tuples {timeout, Millis} and  - {port_op,Op} are present. Op is one of proc_sig,  - timeout, input, output, event, or dist_cmd, - depending on which driver callback was executing. - - proc_sig is an internal operation and is never to appear, - while the others represent the corresponding driver - callbacks timeout, ready_input, ready_output, event, - and outputv (when the port is used by distribution). Value  - Millis in tuple timeout informs about the uninterrupted - execution time of the process or port, which always is equal - to or higher than the Time value supplied when starting - the trace. New tuples can be added to the Info list in a - future release. The order of the tuples in the list can be - changed at any time without prior notice. - - This can be used to detect problems with NIFs or drivers - that take too long to execute. 1 ms is considered a good - maximum time for a driver callback or a NIF. However, a - time-sharing system is usually to consider everything < 100 - ms as "possible" and fairly "normal". However, longer - schedule times can indicate swapping or a misbehaving - NIF/driver. Misbehaving NIFs and drivers can cause bad - resource utilization and bad overall system performance. - - • {large_heap, Size} - If a garbage collection in the system - results in the allocated size of a heap being at least Size - words, a message {monitor, GcPid, large_heap, Info} is - sent to MonitorPid. GcPid and Info are the same as for  - long_gc earlier, except that the tuple tagged with timeout - is not present. - - The monitor message is sent if the sum of the sizes of all - memory blocks allocated for all heap generations after a - garbage collection is equal to or higher than Size. - - When a process is killed by max_heap_size, it is killed - before the garbage collection is complete and thus no large - heap message is sent. - - • busy_port - If a process in the system gets suspended - because it sends to a busy port, a message {monitor, - SusPid, busy_port, Port} is sent to MonitorPid. SusPid - is the pid that got suspended when sending to Port. - - • busy_dist_port If a process in the system gets suspended - because it sends to a process on a remote node whose - inter-node communication was handled by a busy port, a - message {monitor, SusPid, busy_dist_port, Port} is sent to  - MonitorPid. SusPid is the pid that got suspended when - sending through the inter-node communication port Port. + Sets the system event monitoring options. MonitorPid is a local + process identifier (pid) receiving system monitor messages. - Returns the previous system monitor settings just like  - erlang:system_monitor/0. + Change + + This function is superseded by trace:system/3 that operate + on + + dynamic trace sessions. + + The second argument is a list of monitoring options to enable: + + • {long_gc, Time} + + • {long_message_queue, {Disable, Enable}} + + • {long_schedule, Time} - The arguments to system_monitor/2 specifies how all system - monitoring on the node should be done, not how it should be - changed. This means only one process at a time (MonitorPid) can - be the receiver of system monitor messages. Also, the way to clear - a specific monitor option is to not include it in the list  - Options. All system monitoring will, however, be cleared if the - process identified by MonitorPid terminates. + • {large_heap, Size} + + • busy_port + + • busy_dist_port + + For more detailed descriptions about the monitoring options, see  + trace:system/3. + + Unlink trace:system/3, the arguments to system_monitor/2 + specifies how all system monitoring should be set, not how it + should be changed. This means only one process at a time ( + MonitorPid) can be the receiver of messages from system + monitoring set with this function. Also, the way to clear a + specific monitor option is to not include it in the list Options. + All system monitoring will, however, be cleared if the process + identified by MonitorPid terminates. There are no special option values (like zero) to clear an option. Some of the options have a unspecified minimum value. Lower values @@ -143,6 +50,9 @@ currently not possible to monitor all garbage collections with  {long_gc, 0}. + Returns the previous system monitor settings just like  + erlang:system_monitor/0. + Note If a monitoring process gets so large that it itself starts to diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_func.txt index 531bf085463a..6a4e97bceaed 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_func.txt +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_monitor_func.txt @@ -39,134 +39,41 @@  OldMonitorPid :: pid(),  OldOptions :: [system_monitor_option()]. - Sets the system performance monitoring options. MonitorPid is a - local process identifier (pid) receiving system monitor messages. - - The second argument is a list of monitoring options: - - • {long_gc, Time} - If a garbage collection in the system - takes at least Time wall clock milliseconds, a message  - {monitor, GcPid, long_gc, Info} is sent to MonitorPid.  - GcPid is the pid that was garbage collected. Info is a - list of two-element tuples describing the result of the - garbage collection. - - One of the tuples is {timeout, GcTime}, where GcTime is - the time for the garbage collection in milliseconds. The - other tuples are tagged with heap_size, heap_block_size,  - stack_size, mbuf_size, old_heap_size, and  - old_heap_block_size. These tuples are explained in the - description of trace message gc_minor_start (see  - trace:process/4). New tuples can be added, and the order of - the tuples in the Info list can be changed at any time - without prior notice. - - • {long_message_queue, {Disable, Enable}} - If the message - queue length of a process in the system reach Enable - length, a long_message_queue monitor message is sent to - the process identified by MonitorPid. The monitor message - will be on the form {monitor, Pid, long_message_queue, - Long}, where Pid is the process identifier of the process - that got a long message queue and Long will equal true - indicating that it is in a long message queue state. No - more long_message_queue monitor messages will be sent due - to the process identified by Pid until its message queue - length falls down to a length of Disable length. When this - happens, a long_message_queue monitor message with Long - equal to false will be sent to the process identified by  - MonitorPid indicating that the process is no longer in a - long message queue state. As of this, if the message queue - length should again reach Enable length, a new  - long_message_queue monitor message with Long set to true - will again be sent. That is, a long_message_queue monitor - message is sent when a process enters or leaves a long - message queue state where these state changes are defined - by the Enable and Disable parameters. - - Enable length must be an integer larger than zero and  - Disable length must be an integer larger than or equal to - zero. Disable length must also be smaller than Enable - length. If the above is not satisfied the operation will - fail with a badarg error exception. You are recommended to - use a much smaller value for Disable length than Enable - length in order not to be flooded with long_message_queue - monitor messages. - - • {long_schedule, Time} - If a process or port in the system - runs uninterrupted for at least Time wall clock - milliseconds, a message {monitor, PidOrPort, long_schedule, - Info} is sent to MonitorPid. PidOrPort is the process - or port that was running. Info is a list of two-element - tuples describing the event. - - If a pid/0, the tuples {timeout, Millis}, {in, - Location}, and {out, Location} are present, where  - Location is either an MFA ({Module, Function, Arity}) - describing the function where the process was scheduled - in/out, or the atom undefined. - - If a port/0, the tuples {timeout, Millis} and  - {port_op,Op} are present. Op is one of proc_sig,  - timeout, input, output, event, or dist_cmd, - depending on which driver callback was executing. - - proc_sig is an internal operation and is never to appear, - while the others represent the corresponding driver - callbacks timeout, ready_input, ready_output, event, - and outputv (when the port is used by distribution). Value  - Millis in tuple timeout informs about the uninterrupted - execution time of the process or port, which always is equal - to or higher than the Time value supplied when starting - the trace. New tuples can be added to the Info list in a - future release. The order of the tuples in the list can be - changed at any time without prior notice. - - This can be used to detect problems with NIFs or drivers - that take too long to execute. 1 ms is considered a good - maximum time for a driver callback or a NIF. However, a - time-sharing system is usually to consider everything < 100 - ms as "possible" and fairly "normal". However, longer - schedule times can indicate swapping or a misbehaving - NIF/driver. Misbehaving NIFs and drivers can cause bad - resource utilization and bad overall system performance. - - • {large_heap, Size} - If a garbage collection in the system - results in the allocated size of a heap being at least Size - words, a message {monitor, GcPid, large_heap, Info} is - sent to MonitorPid. GcPid and Info are the same as for  - long_gc earlier, except that the tuple tagged with timeout - is not present. - - The monitor message is sent if the sum of the sizes of all - memory blocks allocated for all heap generations after a - garbage collection is equal to or higher than Size. - - When a process is killed by max_heap_size, it is killed - before the garbage collection is complete and thus no large - heap message is sent. - - • busy_port - If a process in the system gets suspended - because it sends to a busy port, a message {monitor, - SusPid, busy_port, Port} is sent to MonitorPid. SusPid - is the pid that got suspended when sending to Port. - - • busy_dist_port If a process in the system gets suspended - because it sends to a process on a remote node whose - inter-node communication was handled by a busy port, a - message {monitor, SusPid, busy_dist_port, Port} is sent to  - MonitorPid. SusPid is the pid that got suspended when - sending through the inter-node communication port Port. + Sets the system event monitoring options. MonitorPid is a local + process identifier (pid) receiving system monitor messages. - Returns the previous system monitor settings just like  - erlang:system_monitor/0. + Change + + This function is superseded by trace:system/3 that operate + on + + dynamic trace sessions. + + The second argument is a list of monitoring options to enable: + + • {long_gc, Time} + + • {long_message_queue, {Disable, Enable}} + + • {long_schedule, Time} - The arguments to system_monitor/2 specifies how all system - monitoring on the node should be done, not how it should be - changed. This means only one process at a time (MonitorPid) can - be the receiver of system monitor messages. Also, the way to clear - a specific monitor option is to not include it in the list  - Options. All system monitoring will, however, be cleared if the - process identified by MonitorPid terminates. + • {large_heap, Size} + + • busy_port + + • busy_dist_port + + For more detailed descriptions about the monitoring options, see  + trace:system/3. + + Unlink trace:system/3, the arguments to system_monitor/2 + specifies how all system monitoring should be set, not how it + should be changed. This means only one process at a time ( + MonitorPid) can be the receiver of messages from system + monitoring set with this function. Also, the way to clear a + specific monitor option is to not include it in the list Options. + All system monitoring will, however, be cleared if the process + identified by MonitorPid terminates. There are no special option values (like zero) to clear an option. Some of the options have a unspecified minimum value. Lower values @@ -174,6 +81,9 @@ currently not possible to monitor all garbage collections with  {long_gc, 0}. + Returns the previous system monitor settings just like  + erlang:system_monitor/0. + Note If a monitoring process gets so large that it itself starts to diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_columns_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_columns_1_func.txt new file mode 100644 index 000000000000..2dd584f1ee9b --- /dev/null +++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_columns_1_func.txt @@ -0,0 +1,4 @@ + +  columns(Config) + + Doc doc doc doc doc doc doc doc doc doc doc doc doc doc doc. diff --git a/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1 index 31e361ed6fc5..a37dc57550da 100644 --- a/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1 +++ b/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1 @@ -1 +1 @@ -{docs_v1,{21,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,hidden,#{otp_doc_vsn => {1,0,0}},[{{type,arguments,0},{114,2},[<<97,114,103,117,109,101,110,116,115,40,41>>],none,#{exported => false}},{{type,shell,0},{113,2},[<<115,104,101,108,108,40,41>>],none,#{exported => false}},{{type,request,0},{49,2},[<<114,101,113,117,101,115,116,40,41>>],none,#{exported => true}},{{type,message,0},{33,2},[<<109,101,115,115,97,103,101,40,41>>],none,#{exported => true}},{{function,switch_loop,3},{591,1},[<<115,119,105,116,99,104,95,108,111,111,112,47,51>>],none,#{}},{{function,server,3},{362,1},[<<115,101,114,118,101,114,47,51>>],none,#{}},{{function,init,3},{204,1},[<<105,110,105,116,47,51>>],none,#{}},{{function,init,1},{159,1},[<<105,110,105,116,40,65,114,103,115,41>>],none,#{}},{{function,callback_mode,0},{156,1},[<<99,97,108,108,98,97,99,107,95,109,111,100,101,40,41>>],none,#{}},{{function,start,1},{147,1},[<<115,116,97,114,116,47,49>>],none,#{}},{{function,whereis_group,0},{139,1},[<<119,104,101,114,101,105,115,95,103,114,111,117,112,40,41>>],none,#{}},{{function,start_shell,1},{135,1},[<<115,116,97,114,116,95,115,104,101,108,108,40,65,114,103,115,41>>],none,#{}},{{function,start_shell,0},{132,1},[<<115,116,97,114,116,95,115,104,101,108,108,40,41>>],none,#{}},{{function,start,0},{120,1},[<<115,116,97,114,116,40,41>>],none,#{}}]}. \ No newline at end of file +{docs_v1,{21,2},erlang,<<116,101,120,116,47,109,97,114,107,100,111,119,110>>,hidden,#{otp_doc_vsn => {1,0,0}},[{{type,arguments,0},{114,2},[<<97,114,103,117,109,101,110,116,115,40,41>>],none,#{exported => false}},{{type,shell,0},{113,2},[<<115,104,101,108,108,40,41>>],none,#{exported => false}},{{type,request,0},{49,2},[<<114,101,113,117,101,115,116,40,41>>],none,#{exported => true}},{{type,message,0},{33,2},[<<109,101,115,115,97,103,101,40,41>>],none,#{exported => true}},{{function,switch_loop,3},{588,1},[<<115,119,105,116,99,104,95,108,111,111,112,47,51>>],none,#{}},{{function,server,3},{359,1},[<<115,101,114,118,101,114,47,51>>],none,#{}},{{function,init,3},{204,1},[<<105,110,105,116,47,51>>],none,#{}},{{function,init,1},{159,1},[<<105,110,105,116,40,65,114,103,115,41>>],none,#{}},{{function,callback_mode,0},{156,1},[<<99,97,108,108,98,97,99,107,95,109,111,100,101,40,41>>],none,#{}},{{function,start,1},{147,1},[<<115,116,97,114,116,47,49>>],none,#{}},{{function,whereis_group,0},{139,1},[<<119,104,101,114,101,105,115,95,103,114,111,117,112,40,41>>],none,#{}},{{function,start_shell,1},{135,1},[<<115,116,97,114,116,95,115,104,101,108,108,40,65,114,103,115,41>>],none,#{}},{{function,start_shell,0},{132,1},[<<115,116,97,114,116,95,115,104,101,108,108,40,41>>],none,#{}},{{function,start,0},{120,1},[<<115,116,97,114,116,40,41>>],none,#{}}]}. \ No newline at end of file diff --git a/lib/stdlib/test/stdlib_SUITE.erl b/lib/stdlib/test/stdlib_SUITE.erl index 061e1bc96c1a..26d8e2fc944a 100644 --- a/lib/stdlib/test/stdlib_SUITE.erl +++ b/lib/stdlib/test/stdlib_SUITE.erl @@ -27,7 +27,7 @@ %% don't use it. Therefore, we explicitly disable it until OTP 25 is out of %% support. -feature(maybe_expr, disable). --compile(r24). +-compile(r25). -include_lib("common_test/include/ct.hrl"). -export([all/0, suite/0, init_per_suite/1, end_per_suite/1, diff --git a/lib/stdlib/test/supervisor_SUITE.erl b/lib/stdlib/test/supervisor_SUITE.erl index 566c36912df9..79ca0418b4b0 100644 --- a/lib/stdlib/test/supervisor_SUITE.erl +++ b/lib/stdlib/test/supervisor_SUITE.erl @@ -90,7 +90,8 @@ hanging_restart_loop_simple/1, code_change/1, code_change_map/1, code_change_simple/1, code_change_simple_map/1, order_of_children/1, scale_start_stop_many_children/1, - format_log_1/1, format_log_2/1, already_started_outside_supervisor/1]). + format_log_1/1, format_log_2/1, already_started_outside_supervisor/1, + which_children/1, which_children_simple_one_for_one/1]). %%------------------------------------------------------------------------- @@ -119,7 +120,8 @@ all() -> hanging_restart_loop_rest_for_one, hanging_restart_loop_simple, code_change, code_change_map, code_change_simple, code_change_simple_map, order_of_children, scale_start_stop_many_children, - format_log_1, format_log_2, already_started_outside_supervisor]. + format_log_1, format_log_2, already_started_outside_supervisor, + which_children, which_children_simple_one_for_one]. groups() -> [{sup_start, [], @@ -3727,6 +3729,72 @@ already_started_outside_supervisor(_Config) -> ok = check_exit([SupPid]), ok. +%% Test which_children/1 and which_child/2. +which_children(Config) when is_list(Config) -> + {ok, SupPid} = start_link({ok, {#{}, []}}), + + [] = supervisor:which_children(SupPid), + {error, not_found} = supervisor:which_child(SupPid, childx), + + {ok, Child1} = supervisor:start_child(SupPid, #{id => child1, + start => {supervisor_1, start_child, []}}), + [{child1, Child1, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {ok, {child1, Child1, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child1), + {error, not_found} = supervisor:which_child(SupPid, childx), + + {ok, Child2} = supervisor:start_child(SupPid, #{id => child2, + start => {supervisor_1, start_child, []}}), + [{child2, Child2, worker, [supervisor_1]}, + {child1, Child1, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {ok, {child1, Child1, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child1), + {ok, {child2, Child2, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child2), + {error, not_found} = supervisor:which_child(SupPid, childx), + + ok = supervisor:terminate_child(SupPid, child1), + [{child2, Child2, worker, [supervisor_1]}, + {child1, undefined, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {ok, {child1, undefined, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child1), + {ok, {child2, Child2, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child2), + {error, not_found} = supervisor:which_child(SupPid, childx), + + ok = supervisor:delete_child(SupPid, child1), + [{child2, Child2, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {error, not_found} = supervisor:which_child(SupPid, child1), + {ok, {child2, Child2, worker, [supervisor_1]}} = supervisor:which_child(SupPid, child2), + {error, not_found} = supervisor:which_child(SupPid, childx), + + ok. + +which_children_simple_one_for_one(Config) when is_list(Config) -> + {ok, SupPid} = start_link({ok, {#{strategy => simple_one_for_one}, [#{id => child, + start => {supervisor_1, start_child, []}, + restart => temporary}]}}), + + [] = supervisor:which_children(SupPid), + {error, not_found} = supervisor:which_child(SupPid, self()), + + {ok, Child1} = supervisor:start_child(SupPid, []), + [{undefined, Child1, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {ok, {undefined, Child1, worker, [supervisor_1]}} = supervisor:which_child(SupPid, Child1), + {error, not_found} = supervisor:which_child(SupPid, self()), + + {ok, Child2} = supervisor:start_child(SupPid, []), + [{undefined, Child1, worker, [supervisor_1]}, + {undefined, Child2, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {ok, {undefined, Child1, worker, [supervisor_1]}} = supervisor:which_child(SupPid, Child1), + {ok, {undefined, Child2, worker, [supervisor_1]}} = supervisor:which_child(SupPid, Child2), + {error, not_found} = supervisor:which_child(SupPid, self()), + + ok = supervisor:terminate_child(SupPid, Child1), + [{undefined, Child2, worker, [supervisor_1]}] = supervisor:which_children(SupPid), + {error, not_found} = supervisor:which_child(SupPid, Child1), + {ok, {undefined, Child2, worker, [supervisor_1]}} = supervisor:which_child(SupPid, Child2), + {error, not_found} = supervisor:which_child(SupPid, self()), + + {error, simple_one_for_one} = supervisor:which_child(SupPid, not_a_pid), + + ok. + %%------------------------------------------------------------------------- terminate(Pid, Reason) when Reason =/= supervisor -> terminate(dummy, Pid, dummy, Reason). diff --git a/lib/stdlib/test/tar_SUITE.erl b/lib/stdlib/test/tar_SUITE.erl index 294741574c7c..499a9ee5d2db 100644 --- a/lib/stdlib/test/tar_SUITE.erl +++ b/lib/stdlib/test/tar_SUITE.erl @@ -50,7 +50,7 @@ groups() -> []. init_per_suite(Config) -> - Config. + uid_config(Config). end_per_suite(_Config) -> ok. @@ -83,7 +83,7 @@ borderline(Config) when is_list(Config) -> Record = 512, Block = 20 * Record, - lists:foreach(fun(Size) -> borderline_test(Size, TempDir) end, + lists:foreach(fun(Size) -> borderline_test(Size, TempDir, Config) end, [0, 1, 10, 13, 127, 333, Record-1, Record, Record+1, Block-2*Record-1, Block-2*Record, Block-2*Record+1, Block-Record-1, Block-Record, Block-Record+1, @@ -95,13 +95,16 @@ borderline(Config) when is_list(Config) -> verify_ports(Config). -borderline_test(Size, TempDir) -> +borderline_test(Size, TempDir, Config) -> io:format("Testing size ~p", [Size]), - borderline_test(Size, TempDir, true), - borderline_test(Size, TempDir, false), + case long_uid(Config) of + true -> ok; + false -> borderline_test1(Size, TempDir, true) + end, + borderline_test1(Size, TempDir, false), ok. -borderline_test(Size, TempDir, IsUstar) -> +borderline_test1(Size, TempDir, IsUstar) -> Prefix = case IsUstar of true -> "file_"; @@ -341,7 +344,6 @@ create_long_names() -> ok = erl_tar:tt(TarName), %% Extract and verify. - true = is_ustar(TarName), ExtractDir = "extract_dir", ok = file:make_dir(ExtractDir), ok = erl_tar:extract(TarName, [{cwd,ExtractDir}]), @@ -588,7 +590,7 @@ symlinks(Config) when is_list(Config) -> {error, enotsup} -> {skip, "Symbolic links not supported on this platform"}; ok -> - symlinks(Dir, "bad_symlink", PointsTo), + symlinks(Dir, "bad_symlink", PointsTo, Config), long_symlink(Dir), symlink_vulnerability(VulnerableDir) end, @@ -621,7 +623,7 @@ make_symlink(Path, Link) -> file:make_symlink(Path, Link) end. -symlinks(Dir, BadSymlink, PointsTo) -> +symlinks(Dir, BadSymlink, PointsTo, Config) -> Tar = filename:join(Dir, "symlink.tar"), DerefTar = filename:join(Dir, "dereference.tar"), @@ -634,7 +636,6 @@ symlinks(Dir, BadSymlink, PointsTo) -> ok = file:write_file(AFile, ALine), ok = file:make_symlink(AFile, GoodSymlink), ok = erl_tar:create(Tar, [BadSymlink, GoodSymlink, AFile], [verbose]), - true = is_ustar(Tar), %% List contents of tar file. @@ -643,7 +644,12 @@ symlinks(Dir, BadSymlink, PointsTo) -> %% Also create another archive with the dereference flag. ok = erl_tar:create(DerefTar, [AFile, GoodSymlink], [dereference, verbose]), - true = is_ustar(DerefTar), + case long_uid(Config) of + true -> ok; + false -> + true = is_ustar(Tar), + true = is_ustar(DerefTar) + end, %% Extract files to a new directory. @@ -774,7 +780,11 @@ open_add_close(Config) when is_list(Config) -> ok = erl_tar:add(AD, ADir, [verbose]), ok = erl_tar:add(AD, AnotherDir, [verbose]), ok = erl_tar:close(AD), - true = is_ustar(TarOne), + case long_uid(Config) of + true -> ok; + false -> + true = is_ustar(TarOne) + end, ok = erl_tar:t(TarOne), ok = erl_tar:tt(TarOne), @@ -1137,3 +1147,14 @@ verify_ports(Config) -> [_|_]=Rem -> error({leaked_ports,Rem}) end. + +uid_config(Config) -> + DataDir = proplists:get_value(data_dir, Config), + Long = filename:join(DataDir, "long_names.tar"), + {ok, FileInfo} = file:read_file_info(Long), + Uid = FileInfo#file_info.uid, + Octal = integer_to_list(Uid, 8), + [{longuid, length(Octal) > 7}|Config]. + +long_uid(Config) -> + proplists:get_value(longuid, Config). \ No newline at end of file diff --git a/lib/stdlib/uc_spec/README-UPDATE.txt b/lib/stdlib/uc_spec/README-UPDATE.txt index 0bf611761168..95f829b2fa8b 100644 --- a/lib/stdlib/uc_spec/README-UPDATE.txt +++ b/lib/stdlib/uc_spec/README-UPDATE.txt @@ -31,7 +31,7 @@ version in lib/stdlib/uc_spec/gen_unicode_mod.escript 4. Read the release notes by visiting https://www.unicode.org/versions/latest/ and assess if additional changes are necessary in the Erlang code. -5. Replace all ocurrences of previous version of Unicode with the new one in +5. Replace all occurrences of the previous version of Unicode with the new one in this very same file (lib/stdlib/uc_spec/README-UPDATE.txt). Remember to update these instructions if a new file is added or any other change is required for future version updates. diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl index ff01d0f4e60a..1d7bd31883fa 100644 --- a/lib/syntax_tools/src/erl_prettypr.erl +++ b/lib/syntax_tools/src/erl_prettypr.erl @@ -423,22 +423,22 @@ add_comment_prefix(S) -> lay_2(Node, Ctxt) -> case erl_syntax:type(Node) of %% We list literals and other common cases first. - + variable -> text(erl_syntax:variable_literal(Node)); - + atom -> text(erl_syntax:atom_literal(Node, Ctxt#ctxt.encoding)); - + integer -> text(erl_syntax:integer_literal(Node)); float -> text(tidy_float(erl_syntax:float_literal(Node))); - + char -> text(erl_syntax:char_literal(Node, Ctxt#ctxt.encoding)); - + string -> lay_string(erl_syntax:string_literal(Node, Ctxt#ctxt.encoding), Ctxt); @@ -452,7 +452,7 @@ lay_2(Node, Ctxt) -> beside(floating(text("{")), beside(sep(Es), floating(text("}")))); - + list -> Ctxt1 = reset_prec(Ctxt), Node1 = erl_syntax:compact_list(Node), @@ -473,7 +473,7 @@ lay_2(Node, Ctxt) -> operator -> floating(text(erl_syntax:operator_literal(Node))); - + infix_expr -> Operator = erl_syntax:infix_expr_operator(Node), {PrecL, Prec, PrecR} = @@ -491,7 +491,7 @@ lay_2(Node, Ctxt) -> set_prec(Ctxt, PrecR)), D4 = par([D1, D2, D3], Ctxt#ctxt.break_indent), maybe_parentheses(D4, Prec, Ctxt); - + prefix_expr -> Operator = erl_syntax:prefix_expr_operator(Node), {{Prec, PrecR}, Name} = @@ -514,7 +514,7 @@ lay_2(Node, Ctxt) -> par([D1, D2], Ctxt#ctxt.break_indent) end, maybe_parentheses(D3, Prec, Ctxt); - + application -> {PrecL, Prec} = func_prec(), D = lay(erl_syntax:application_operator(Node), @@ -526,7 +526,7 @@ lay_2(Node, Ctxt) -> beside(sep(As), floating(text(")"))))), maybe_parentheses(D1, Prec, Ctxt); - + match_expr -> {PrecL, Prec, PrecR} = inop_prec('='), D1 = lay(erl_syntax:match_expr_pattern(Node), @@ -593,7 +593,7 @@ lay_2(Node, Ctxt) -> Ctxt1#ctxt.break_indent), nest(Ctxt1#ctxt.break_indent, D2), text("end")]); - + if_expr -> Ctxt1 = reset_prec(Ctxt), D = lay_clauses(erl_syntax:if_expr_clauses(Node), @@ -814,7 +814,7 @@ lay_2(Node, Ctxt) -> eof_marker -> empty(); - + form_list -> Es = seq(erl_syntax:form_list_elements(Node), none, reset_prec(Ctxt), fun lay/2), @@ -826,18 +826,42 @@ lay_2(Node, Ctxt) -> D2 = lay(erl_syntax:generator_body(Node), Ctxt1), par([D1, beside(text("<- "), D2)], Ctxt1#ctxt.break_indent); + strict_generator -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:strict_generator_pattern(Node), Ctxt1), + D2 = lay(erl_syntax:strict_generator_body(Node), Ctxt1), + par([D1, beside(text("<:- "), D2)], Ctxt1#ctxt.break_indent); + binary_generator -> Ctxt1 = reset_prec(Ctxt), D1 = lay(erl_syntax:binary_generator_pattern(Node), Ctxt1), D2 = lay(erl_syntax:binary_generator_body(Node), Ctxt1), par([D1, beside(text("<= "), D2)], Ctxt1#ctxt.break_indent); + strict_binary_generator -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:strict_binary_generator_pattern(Node), Ctxt1), + D2 = lay(erl_syntax:strict_binary_generator_body(Node), Ctxt1), + par([D1, beside(text("<:= "), D2)], Ctxt1#ctxt.break_indent); + map_generator -> Ctxt1 = reset_prec(Ctxt), D1 = lay(erl_syntax:map_generator_pattern(Node), Ctxt1), D2 = lay(erl_syntax:map_generator_body(Node), Ctxt1), par([D1, beside(text("<- "), D2)], Ctxt1#ctxt.break_indent); + strict_map_generator -> + Ctxt1 = reset_prec(Ctxt), + D1 = lay(erl_syntax:strict_map_generator_pattern(Node), Ctxt1), + D2 = lay(erl_syntax:strict_map_generator_body(Node), Ctxt1), + par([D1, beside(text("<:- "), D2)], Ctxt1#ctxt.break_indent); + + zip_generator -> + Ctxt1 = reset_prec(Ctxt), + par(seq(erl_syntax:zip_generator_body(Node), + floating(text("&&")), Ctxt1, + fun lay/2)); + implicit_fun -> D = lay(erl_syntax:implicit_fun_name(Node), reset_prec(Ctxt)), @@ -933,7 +957,7 @@ lay_2(Node, Ctxt) -> maybe_parentheses(beside(D1, D3), Prec, Ctxt); record_expr -> - {PrecL, Prec, _} = inop_prec('#'), + {PrecL, Prec, _} = inop_prec('#'), Ctxt1 = reset_prec(Ctxt), D1 = lay(erl_syntax:record_expr_type(Node), Ctxt1), D2 = par(seq(erl_syntax:record_expr_fields(Node), @@ -949,7 +973,7 @@ lay_2(Node, Ctxt) -> beside(lay(A, set_prec(Ctxt, PrecL)), D3) end, maybe_parentheses(D4, Prec, Ctxt); - + record_field -> Ctxt1 = reset_prec(Ctxt), D1 = lay(erl_syntax:record_field_name(Node), Ctxt1), @@ -962,7 +986,7 @@ lay_2(Node, Ctxt) -> end; record_index_expr -> - {Prec, PrecR} = preop_prec('#'), + {Prec, PrecR} = preop_prec('#'), D1 = lay(erl_syntax:record_index_expr_type(Node), reset_prec(Ctxt)), D2 = lay(erl_syntax:record_index_expr_field(Node), @@ -1342,7 +1366,7 @@ split_string_2([$x, ${ | Xs], N, L, As) -> split_string_2([X1, X2, X3 | Xs], N, L, As) when X1 >= $0, X1 =< $7, X2 >= $0, X2 =< $7, X3 >= $0, X3 =< $7 -> split_string_1(Xs, N - 3, L - 3, [X3, X2, X1 | As]); -split_string_2([X1, X2 | Xs], N, L, As) when +split_string_2([X1, X2 | Xs], N, L, As) when X1 >= $0, X1 =< $7, X2 >= $0, X2 =< $7 -> split_string_1(Xs, N - 2, L - 2, [X2, X1 | As]); split_string_2([X | Xs], N, L, As) -> diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl index a6fd397fda07..e1ec49ab82b2 100644 --- a/lib/syntax_tools/src/erl_syntax.erl +++ b/lib/syntax_tools/src/erl_syntax.erl @@ -269,6 +269,15 @@ trees. named_fun_expr_clauses/1, named_fun_expr_name/1, nil/0, + strict_binary_generator/2, + strict_binary_generator_body/1, + strict_binary_generator_pattern/1, + strict_generator/2, + strict_generator_body/1, + strict_generator_pattern/1, + strict_map_generator/2, + strict_map_generator_body/1, + strict_map_generator_pattern/1, operator/1, operator_literal/1, operator_name/1, @@ -351,6 +360,8 @@ trees. variable_literal/1, warning_marker/1, warning_marker_info/1, + zip_generator/1, + zip_generator_body/1, tree/1, tree/2, @@ -458,6 +469,7 @@ trees. | erl_parse:form_info() | erl_parse:af_binelement(term()) | erl_parse:af_generator() + | erl_parse:af_zip_generator() | erl_parse:af_remote_function(). %% The representation built by the Erlang standard library parser @@ -549,6 +561,7 @@ reason `badarg`. Node types currently defined by this module are: * `user_type_application` * `variable` * `warning_marker` +* `zip_generator` The user may (for special purposes) create additional nodes with other type tags, using the `tree/2` function. @@ -573,7 +586,7 @@ _See also: _`annotated_type/2`, `application/3`, `arity_qualifier/2`, `atom/1`, `size_qualifier/2`, `string/1`, `text/1`, `tree/2`, `try_expr/3`, `tuple/1`, `tuple_type/0`, `tuple_type/1`, `type_application/2`, `type_union/1`, `typed_record_field/2`, `underscore/0`, `user_type_application/2`, `variable/1`, -`warning_marker/1`. +`warning_marker/1`,`zip_generator/1`. """. -spec type(syntaxTree()) -> atom(). @@ -621,8 +634,12 @@ type(Node) -> {cons, _, _, _} -> list; {function, _, _, _, _} -> function; {b_generate, _, _, _} -> binary_generator; + {b_generate_strict, _, _, _} -> strict_binary_generator; {generate, _, _, _} -> generator; + {generate_strict, _, _, _} -> strict_generator; {m_generate, _, _, _} -> map_generator; + {m_generate_strict, _, _, _} -> strict_map_generator; + {zip,_,_} -> zip_generator; {lc, _, _, _} -> list_comp; {bc, _, _, _} -> binary_comp; {mc, _, _, _} -> map_comp; @@ -2650,7 +2667,7 @@ compact_list(Node) -> copy_attrs(Node, Node1)); _ -> - Node + Node end end; _ -> @@ -3172,7 +3189,7 @@ revert_attribute(Node) -> revert_attribute_1(module, [M], Pos, Node) -> case revert_module_name(M) of - {ok, A} -> + {ok, A} -> {attribute, Pos, module, A}; error -> Node end; @@ -3189,7 +3206,7 @@ revert_attribute_1(module, [M, List], Pos, Node) -> Node end, case revert_module_name(M) of - {ok, A} -> + {ok, A} -> {attribute, Pos, module, {A, Vs}}; error -> Node end; @@ -5836,6 +5853,68 @@ generator_body(Node) -> end. +%% ===================================================================== + +-record(strict_generator, {pattern :: syntaxTree(), body :: syntaxTree()}). + +-doc """ +Creates an abstract strict list generator. + +The result represents "`*Pattern*<:- *Body*`". + +_See also: _`binary_comp/2`, `strict_generator_body/1`, +`strict_generator_pattern/1`, `list_comp/2`. +""". +-spec strict_generator(syntaxTree(), syntaxTree()) -> syntaxTree(). + +%% `erl_parse' representation: +%% +%% {generate_strict, Pos, Pattern, Body} +%% +%% Pattern = Body = erl_parse() + +strict_generator(Pattern, Body) -> + tree(strict_generator, #strict_generator{pattern = Pattern, body = Body}). + +revert_strict_generator(Node) -> + Pos = get_pos(Node), + Pattern = strict_generator_pattern(Node), + Body = strict_generator_body(Node), + {generate_strict, Pos, Pattern, Body}. + + +-doc """ +Returns the pattern subtree of a `generator` node. + +_See also: _`strict_generator/2`. +""". +-spec strict_generator_pattern(syntaxTree()) -> syntaxTree(). + +strict_generator_pattern(Node) -> + case unwrap(Node) of + {generate_strict, _, Pattern, _} -> + Pattern; + Node1 -> + (data(Node1))#strict_generator.pattern + end. + + +-doc """ +Returns the body subtree of a `generator` node. + +_See also: _`strict_generator/2`. +""". +-spec strict_generator_body(syntaxTree()) -> syntaxTree(). + +strict_generator_body(Node) -> + case unwrap(Node) of + {generate_strict, _, _, Body} -> + Body; + Node1 -> + (data(Node1))#strict_generator.body + end. + + %% ===================================================================== -record(binary_generator, {pattern :: syntaxTree(), body :: syntaxTree()}). @@ -5898,6 +5977,68 @@ binary_generator_body(Node) -> end. +%% ===================================================================== + +-record(strict_binary_generator, {pattern :: syntaxTree(), body :: syntaxTree()}). + +-doc """ +Creates an abstract strict binary_generator. + +The result represents "`*Pattern*<:- *Body*`". + +_See also: _`binary_comp/2`, `strict_binary_generator_body/1`, +`strict_binary_generator_pattern/1`, `list_comp/2`. +""". +-spec strict_binary_generator(syntaxTree(), syntaxTree()) -> syntaxTree(). + +%% `erl_parse' representation: +%% +%% {b_generate_strict, Pos, Pattern, Body} +%% +%% Pattern = Body = erl_parse() + +strict_binary_generator(Pattern, Body) -> + tree(strict_binary_generator, #strict_binary_generator{pattern = Pattern, body = Body}). + +revert_strict_binary_generator(Node) -> + Pos = get_pos(Node), + Pattern = strict_binary_generator_pattern(Node), + Body = strict_binary_generator_body(Node), + {b_generate_strict, Pos, Pattern, Body}. + + +-doc """ +Returns the pattern subtree of a `generator` node. + +_See also: _`strict_binary_generator/2`. +""". +-spec strict_binary_generator_pattern(syntaxTree()) -> syntaxTree(). + +strict_binary_generator_pattern(Node) -> + case unwrap(Node) of + {b_generate_strict, _, Pattern, _} -> + Pattern; + Node1 -> + (data(Node1))#strict_binary_generator.pattern + end. + + +-doc """ +Returns the body subtree of a `generator` node. + +_See also: _`strict_binary_generator/2`. +""". +-spec strict_binary_generator_body(syntaxTree()) -> syntaxTree(). + +strict_binary_generator_body(Node) -> + case unwrap(Node) of + {b_generate_strict, _, _, Body} -> + Body; + Node1 -> + (data(Node1))#strict_binary_generator.body + end. + + %% ===================================================================== -record(map_generator, {pattern :: syntaxTree(), body :: syntaxTree()}). @@ -5962,6 +6103,110 @@ map_generator_body(Node) -> %% ===================================================================== +-record(strict_map_generator, {pattern :: syntaxTree(), body :: syntaxTree()}). + +-doc """ +Creates an abstract strict map_generator. The result represents +"`*Pattern*<- *Body*`". + +_See also: _`list_comp/2`, `map_comp/2`, +`strict_map_generator_body/1`, +`strict_map_generator_pattern/1`. +""". +-spec strict_map_generator(syntaxTree(), syntaxTree()) -> syntaxTree(). + +%% `erl_parse' representation: +%% +%% {m_generate_strict, Pos, Pattern, Body} +%% +%% Pattern = Body = erl_parse() + +strict_map_generator(Pattern, Body) -> + tree(strict_map_generator, #strict_map_generator{pattern = Pattern, body = Body}). + +revert_strict_map_generator(Node) -> + Pos = get_pos(Node), + Pattern = strict_map_generator_pattern(Node), + Body = strict_map_generator_body(Node), + {m_generate_strict, Pos, Pattern, Body}. + + +-doc """ +Returns the pattern subtree of a `generator` node. + +_See also: _`strict_map_generator/2`. +""". +-spec strict_map_generator_pattern(syntaxTree()) -> syntaxTree(). + +strict_map_generator_pattern(Node) -> + case unwrap(Node) of + {m_generate_strict, _, Pattern, _} -> + Pattern; + Node1 -> + (data(Node1))#strict_map_generator.pattern + end. + + +-doc """ +Returns the body subtree of a `generator` node. + +_See also: _`strict_map_generator/2`. +""". +-spec strict_map_generator_body(syntaxTree()) -> syntaxTree(). + +strict_map_generator_body(Node) -> + case unwrap(Node) of + {m_generate_strict, _, _, Body} -> + Body; + Node1 -> + (data(Node1))#strict_map_generator.body + end. + + +-record(zip_generator, {body :: [syntaxTree()]}). + +-doc """ +Creates an abstract zip_generator. + +The result represents `G1 && ... Gn`, where each `G` is a generator. + +_See also: _`binary_comp/2`, `list_comp/2`, `map_comp/2`, `map_generator_body/1`, +`map_generator_pattern/1`. +""". +-spec zip_generator([syntaxTree()]) -> syntaxTree(). + +%% `erl_parse' representation: +%% +%% {zip, Pos, Body} +%% +%% Body = erl_parse() + +zip_generator(Body) -> + tree(zip_generator, #zip_generator{body = Body}). + +revert_zip_generator(Node) -> + Pos = get_pos(Node), + Body = zip_generator_body(Node), + {zip, Pos, Body}. + + +-doc """ +Returns the body subtree of a `zip_generator` node. + +_See also: _`zip_generator/1`. +""". +-spec zip_generator_body(syntaxTree()) -> syntaxTree(). + +zip_generator_body(Node) -> + case unwrap(Node) of + {zip, _, Body} -> + Body; + Node1 -> + (data(Node1))#zip_generator.body + end. + +%% ===================================================================== + -doc """ Creates an abstract block expression. @@ -7337,6 +7582,12 @@ revert_root(Node) -> revert_named_fun_expr(Node); nil -> revert_nil(Node); + strict_binary_generator -> + revert_strict_binary_generator(Node); + strict_generator -> + revert_strict_generator(Node); + strict_map_generator -> + revert_strict_map_generator(Node); parentheses -> revert_parentheses(Node); prefix_expr -> @@ -7373,6 +7624,8 @@ revert_root(Node) -> revert_variable(Node); warning_marker -> revert_warning_marker(Node); + zip_generator -> + revert_zip_generator(Node); _ -> %% Non-revertible new-form node Node @@ -7528,7 +7781,7 @@ subtrees(T) -> Ts] end; binary_generator -> - [[binary_generator_pattern(T)], + [[binary_generator_pattern(T)], [binary_generator_body(T)]]; bitstring_type -> [[bitstring_type_m(T)], @@ -7655,6 +7908,15 @@ subtrees(T) -> named_fun_expr -> [[named_fun_expr_name(T)], named_fun_expr_clauses(T)]; + strict_binary_generator -> + [[strict_binary_generator_pattern(T)], + [strict_binary_generator_body(T)]]; + strict_generator -> + [[strict_generator_pattern(T)], + [strict_generator_body(T)]]; + strict_map_generator -> + [[strict_map_generator_pattern(T)], + [strict_map_generator_body(T)]]; parentheses -> [[parentheses_body(T)]]; prefix_expr -> @@ -7721,7 +7983,9 @@ subtrees(T) -> [typed_record_field_type(T)]]; user_type_application -> [[user_type_application_name(T)], - user_type_application_arguments(T)] + user_type_application_arguments(T)]; + zip_generator -> + [zip_generator_body(T)] end end. @@ -7816,6 +8080,9 @@ make_tree(maybe_expr, [Body, [Else]]) -> maybe_expr(Body, Else); make_tree(maybe_match_expr, [[P], [E]]) -> maybe_match_expr(P, E); make_tree(named_fun_expr, [[N], C]) -> named_fun_expr(N, C); make_tree(module_qualifier, [[M], [N]]) -> module_qualifier(M, N); +make_tree(strict_binary_generator, [[P], [E]]) -> strict_binary_generator(P, E); +make_tree(strict_generator, [[P], [E]]) -> strict_generator(P, E); +make_tree(strict_map_generator, [[P], [E]]) -> strict_map_generator(P, E); make_tree(parentheses, [[E]]) -> parentheses(E); make_tree(prefix_expr, [[F], [A]]) -> prefix_expr(F, A); make_tree(receive_expr, [C]) -> receive_expr(C); @@ -7837,7 +8104,8 @@ make_tree(tuple_type, [Es]) -> tuple_type(Es); make_tree(type_application, [[N], Ts]) -> type_application(N, Ts); make_tree(type_union, [Es]) -> type_union(Es); make_tree(typed_record_field, [[F],[T]]) -> typed_record_field(F, T); -make_tree(user_type_application, [[N], Ts]) -> user_type_application(N, Ts). +make_tree(user_type_application, [[N], Ts]) -> user_type_application(N, Ts); +make_tree(zip_generator, [Ts]) -> zip_generator(Ts). -doc """ diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl index 2e0df3c46b25..ea0e67ec7aba 100644 --- a/lib/syntax_tools/src/erl_syntax_lib.erl +++ b/lib/syntax_tools/src/erl_syntax_lib.erl @@ -492,8 +492,18 @@ vann(Tree, Env) -> vann_binary_comp(Tree, Env); generator -> vann_generator(Tree, Env); + strict_generator -> + vann_strict_generator(Tree, Env); binary_generator -> vann_binary_generator(Tree, Env); + strict_binary_generator -> + vann_strict_binary_generator(Tree, Env); + map_generator -> + vann_map_generator(Tree, Env); + strict_map_generator -> + vann_strict_map_generator(Tree, Env); + zip_generator -> + vann_zip_generator(Tree, Env); block_expr -> vann_block_expr(Tree, Env); macro -> @@ -626,10 +636,20 @@ vann_list_comp(Tree, Env) -> vann_list_comp_body_join() -> fun (T, {Env, Bound, Free}) -> {T1, Bound1, Free1} = case erl_syntax:type(T) of - binary_generator -> - vann_binary_generator(T,Env); - generator -> + generator -> vann_generator(T, Env); + strict_generator -> + vann_strict_generator(T, Env); + binary_generator -> + vann_binary_generator(T,Env); + strict_binary_generator -> + vann_strict_binary_generator(T,Env); + map_generator -> + vann_map_generator(T,Env); + strict_map_generator -> + vann_strict_map_generator(T,Env); + zip_generator -> + vann_zip_generator(T,Env); _ -> %% Bindings in filters are not %% exported to the rest of the @@ -639,7 +659,7 @@ vann_list_comp_body_join() -> end, Env1 = ordsets:union(Env, Bound1), {T1, {Env1, ordsets:union(Bound, Bound1), - ordsets:union(Free, + ordsets:union(Free, ordsets:subtract(Free1, Bound))}} end. @@ -662,10 +682,20 @@ vann_binary_comp(Tree, Env) -> vann_binary_comp_body_join() -> fun (T, {Env, Bound, Free}) -> {T1, Bound1, Free1} = case erl_syntax:type(T) of - binary_generator -> - vann_binary_generator(T, Env); - generator -> + generator -> vann_generator(T, Env); + strict_generator -> + vann_strict_generator(T, Env); + binary_generator -> + vann_binary_generator(T,Env); + strict_binary_generator -> + vann_strict_binary_generator(T,Env); + map_generator -> + vann_map_generator(T,Env); + strict_map_generator -> + vann_strict_map_generator(T,Env); + zip_generator -> + vann_zip_generator(T,Env); _ -> %% Bindings in filters are not %% exported to the rest of the @@ -675,7 +705,7 @@ vann_binary_comp_body_join() -> end, Env1 = ordsets:union(Env, Bound1), {T1, {Env1, ordsets:union(Bound, Bound1), - ordsets:union(Free, + ordsets:union(Free, ordsets:subtract(Free1, Bound))}} end. @@ -684,6 +714,25 @@ vann_binary_comp_body(Ts, Env) -> {Ts1, {_, Bound, Free}} = lists:mapfoldl(F, {Env, [], []}, Ts), {Ts1, {Bound, Free}}. +vann_zip_generator_body_join() -> + fun (T, {Env, Bound, Free}) -> + {T1, Bound1, Free1} = case erl_syntax:type(T) of + binary_generator -> + vann_binary_generator(T, Env); + generator -> + vann_generator(T, Env) + end, + Env1 = ordsets:union(Env, Bound1), + {T1, {Env1, ordsets:union(Bound, Bound1), + ordsets:union(Free, + ordsets:subtract(Free1, Bound))}} + end. + +vann_zip_generator_body(Ts, Env) -> + F = vann_zip_generator_body_join(), + {Ts1, {_, Bound, Free}} = lists:mapfoldl(F, {Env, [], []}, Ts), + {Ts1, {Bound, Free}}. + %% In list comprehension generators, the pattern variables are always %% viewed as new occurrences, shadowing whatever is in the input %% environment (thus, the pattern contains no variable uses, only @@ -697,6 +746,14 @@ vann_generator(Tree, Env) -> Tree1 = rewrite(Tree, erl_syntax:generator(P1, E1)), {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. +vann_strict_generator(Tree, Env) -> + P = erl_syntax:strict_generator_pattern(Tree), + {P1, Bound, _} = vann_pattern(P, []), + E = erl_syntax:strict_generator_body(Tree), + {E1, _, Free} = vann(E, Env), + Tree1 = rewrite(Tree, erl_syntax:strict_generator(P1, E1)), + {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. + vann_binary_generator(Tree, Env) -> P = erl_syntax:binary_generator_pattern(Tree), {P1, Bound, _} = vann_pattern(P, Env), @@ -705,6 +762,37 @@ vann_binary_generator(Tree, Env) -> Tree1 = rewrite(Tree, erl_syntax:binary_generator(P1, E1)), {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. +vann_strict_binary_generator(Tree, Env) -> + P = erl_syntax:strict_binary_generator_pattern(Tree), + {P1, Bound, _} = vann_pattern(P, Env), + E = erl_syntax:strict_binary_generator_body(Tree), + {E1, _, Free} = vann(E, Env), + Tree1 = rewrite(Tree, erl_syntax:strict_binary_generator(P1, E1)), + {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. + +vann_map_generator(Tree, Env) -> + P = erl_syntax:map_generator_pattern(Tree), + {P1, Bound, _} = vann_pattern(P, []), + E = erl_syntax:map_generator_body(Tree), + {E1, _, Free} = vann(E, Env), + Tree1 = rewrite(Tree, erl_syntax:map_generator(P1, E1)), + {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. + +vann_strict_map_generator(Tree, Env) -> + P = erl_syntax:strict_map_generator_pattern(Tree), + {P1, Bound, _} = vann_pattern(P, []), + E = erl_syntax:strict_map_generator_body(Tree), + {E1, _, Free} = vann(E, Env), + Tree1 = rewrite(Tree, erl_syntax:strict_map_generator(P1, E1)), + {ann_bindings(Tree1, Env, Bound, Free), Bound, Free}. + +vann_zip_generator(Tree, Env) -> + Es = erl_syntax:zip_generator_body(Tree), + {Es1, {Bound, Free}} = vann_zip_generator_body(Es, Env), + Env1 = ordsets:union(Env, Bound), + Tree1 = rewrite(Tree, erl_syntax:zip_generator(Es1)), + {ann_bindings(Tree1, Env1, Bound, Free), Bound, Free}. + vann_block_expr(Tree, Env) -> Es = erl_syntax:block_expr_body(Tree), {Es1, {Bound, Free}} = vann_body(Es, Env), @@ -863,7 +951,7 @@ _See also: _[//erts/erlang:error/1](`erlang:error/1`), """. -spec is_fail_expr(syntaxTree()) -> boolean(). -is_fail_expr(E) -> +is_fail_expr(E) -> case erl_syntax:type(E) of application -> N = length(erl_syntax:application_arguments(E)), diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl index 0ed660121fae..0ddbbb2ebde6 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl @@ -19,7 +19,7 @@ -include_lib("common_test/include/ct.hrl"). %% Test server specific exports --export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, +-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2]). %% Test cases @@ -32,7 +32,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}]. -all() -> +all() -> [app_test,appup_test,smoke_test,revert,revert_map,revert_map_type, revert_preserve_pos_changes, wrapped_subtrees, @@ -40,7 +40,7 @@ all() -> t_epp_dodger,t_epp_dodger_clever, t_comment_scan,t_prettypr,test_named_fun_bind_ann]. -groups() -> +groups() -> []. init_per_suite(Config) -> @@ -91,7 +91,7 @@ print_error_markers(F, File) -> _ -> ok end. - + %% Read with erl_parse, wrap and revert with erl_syntax and check for equality. revert(Config) when is_list(Config) -> @@ -332,9 +332,20 @@ t_erl_parse_type(Config) when is_list(Config) -> {"#{ a:=1, b:=2 }", map_expr,false}, {"M#{ a=>1, b=>2 }", map_expr,false}, {"[V||V <- Vs]", list_comp,false}, + {"[V||V <:- Vs]", list_comp,false}, {"[catch V||V <- Vs]", list_comp,false}, {"<< <> || <> <= Bs>>", binary_comp,false}, + {"<< <> || <> <:= Bs>>", binary_comp,false}, {"<< (catch <>) || <> <= Bs>>", binary_comp,false}, + {"#{K => V || {K,V} <- KVs}", map_comp,false}, + {"#{K => V || {K,V} <:- KVs}", map_comp,false}, + {"#{K => (catch V) || {K,V} <- KVs}", map_comp,false}, + {"[V+W||V <- Vs && W <- Ws]", list_comp,false}, + {"[catch V+W||V <- Vs && W <- Ws]", list_comp,false}, + {"<< <> || <> <= Bs>>", binary_comp,false}, + {"<< (catch <>) || <> <= Bs>>", binary_comp,false}, + {"<< <> || <> <= Bs && <> <= Cs>>", binary_comp,false}, + {"<< (catch <>) || <> <= Bs && <> <= Cs>>", binary_comp,false}, {"#state{ a = A, b = B}", record_expr,false}, {"#state{}", record_expr,false}, {"#s{ a = #def{ a=A }, b = B}", record_expr,false}, diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl index daa95b6a259e..ddf06a7597bc 100644 --- a/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl +++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl @@ -9,6 +9,7 @@ sub_string/2,sub_string/3,centre/2,centre/3, join/2]). -export([to_upper/1, to_lower/1]). -export([eep49/0, eep58/0]). +-export([strict_generators/0]). -import(lists,[reverse/1,member/2]). @@ -216,7 +217,7 @@ cspan([], _Cs, I) -> I. SubString :: string(), Start :: pos_integer(). -substr(String, 1) when is_list(String) -> +substr(String, 1) when is_list(String) -> String; substr(String, S) when is_integer(S), S > 1 -> substr2(String, S). @@ -344,9 +345,9 @@ sub_word(String, Index, Char) when is_integer(Index), is_integer(Char) -> s_word([], _, _, _,Res) -> reverse(Res); s_word([Char|_],Index,Char,Index,Res) -> reverse(Res); s_word([H|T],Index,Char,Index,Res) -> s_word(T,Index,Char,Index,[H|Res]); -s_word([Char|T],Stop,Char,Index,Res) when Index < Stop -> +s_word([Char|T],Stop,Char,Index,Res) when Index < Stop -> s_word(strip(T,left,Char),Stop,Char,Index+1,Res); -s_word([_|T],Stop,Char,Index,Res) when Index < Stop -> +s_word([_|T],Stop,Char,Index,Res) when Index < Stop -> s_word(T,Stop,Char,Index,Res). %%% STRIP %%% @@ -590,3 +591,17 @@ eep58() -> MapDouble = maps:from_list([{{key,I}, 2 * I} || I <- Seq]), ok. + +strict_generators() -> + [X+1 || X <:- [1,2,3]], + [X+1 || <> <:= <<1,2,3>>], + [X*Y || X := Y <:- #{1 => 2, 3 => 4}], + + ok. + +%% EEP-73: Zip generators. +eep73() -> + [{X,Y}||X <- [1,2,3] && Y <- [2,2,2]], + [{X,Y}||X <- [1,2,3] && <> <= <<2,2,2>>], + [{K1,K2,V1,V2}|| K1 := V1 <- #{a=>1} && K2 := V2 <- #{b=>3}], + ok. diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el index 6b8d8e11a7e4..f582c198ad0a 100644 --- a/lib/tools/emacs/erlang.el +++ b/lib/tools/emacs/erlang.el @@ -1186,7 +1186,7 @@ behaviour.") (defvar erlang-font-lock-keywords-lc (list - (list "\\(<-\\|<=\\|||\\)\\(\\s \\|$\\)" 1 'font-lock-keyword-face)) + (list "\\(<-\\|<:-\\|<=\\|<:=\\|||\\|&&\\)\\(\\s \\|$\\)" 1 'font-lock-keyword-face)) "Font lock keyword highlighting list comprehension operators.") (defvar erlang-font-lock-keywords-keywords @@ -1513,7 +1513,7 @@ Other commands: )) (add-to-list 'align-rules-list `(erlang-generator-arrows - (regexp . ,(concat space-group "\\(<-\\|<=\\)" space-group)) + (regexp . ,(concat space-group "\\(<-\\|<:-\\|<=\\|<:=\\|&&\\)" space-group)) (group . (1 3)) (separate . ,(concat "\\(||\\|" erl-sep-forms "\\|" erl-sep-symbols "\\)")) (repeat . t) @@ -1609,7 +1609,9 @@ Other commands: (put 'bitsyntax-close-outer 'syntax-table '(5 . ?<)) (put 'bitsyntax-close-outer 'rear-nonsticky '(category)) (make-local-variable 'parse-sexp-lookup-properties) - (setq parse-sexp-lookup-properties 't)) + (setq parse-sexp-lookup-properties 't) + (add-hook 'post-self-insert-hook + #'erlang-electric-pair-string-delimiter 'append t)) (defun erlang-mode-variables () @@ -4391,6 +4393,18 @@ non-whitespace characters following the point on the current line." '(category nil)) (forward-char 1)))))) +(defun erlang-electric-pair-string-delimiter () + "Check if a third double-quote was just inserted, and if so, insert three more." + (when (and electric-pair-mode + (eq last-command-event ?\") + (let ((count 0)) + (while (eq (char-before (- (point) count)) last-command-event) + (cl-incf count)) + (= count 3)) + (eq (char-after) last-command-event)) + (insert ?\n) + (save-excursion (insert "\n\"\"")))) + (defun erlang-after-bitsyntax-close () "Return t if point is immediately after a bit-syntax close parenthesis (`>>')." (and (>= (point) 3) diff --git a/lib/tools/priv/styles.css b/lib/tools/priv/styles.css index 84f00be9fd0a..80fb608fbc30 100644 --- a/lib/tools/priv/styles.css +++ b/lib/tools/priv/styles.css @@ -94,3 +94,17 @@ td.source { white-space: pre; font: 12px monospace; } + + +@media (prefers-color-scheme: dark) { + body { + filter: invert(100%) hue-rotate(180deg) brightness(105%) contrast(95%); + background-color: #000000; + } + a:link { + color: #2B507D; + } + a:visited, a:active { + color: #85ABD5; + } +} diff --git a/lib/tools/src/lcnt.erl b/lib/tools/src/lcnt.erl index 3f443d0c5788..840e7621ecde 100644 --- a/lib/tools/src/lcnt.erl +++ b/lib/tools/src/lcnt.erl @@ -959,7 +959,7 @@ summate_stats([S|Ss], #stats{ tries = Tries, colls = Colls, time = Time, nt = Nt summate_histogram(Tup,undefined) when is_tuple(Tup) -> Tup; summate_histogram(undefined,Tup) when is_tuple(Tup) -> Tup; summate_histogram(Hs1,Hs2) -> - list_to_tuple([ A + B || {A,B} <- lists:zip(tuple_to_list(Hs1),tuple_to_list(Hs2))]). + list_to_tuple([A + B || A <- tuple_to_list(Hs1) && B <- tuple_to_list(Hs2)]). %% manipulators filter_locks_type(Locks, undefined) -> Locks; diff --git a/lib/tools/src/tprof.erl b/lib/tools/src/tprof.erl index 616f08195271..8e2b20cfbfce 100644 --- a/lib/tools/src/tprof.erl +++ b/lib/tools/src/tprof.erl @@ -1037,6 +1037,7 @@ collect_trace(Session, Mod, FunList, Acc, Type) -> %% statistics won't be correct anyway. Hence the warning in the user %% guide, guarding against hot code reload while tracing. combine_trace({_, false}) -> fail; +combine_trace({_, undefined}) -> skip; %% module unloaded after code:all_loaded() combine_trace({call_count, 0}) -> skip; combine_trace({call_count, Num}) -> [{all, Num, Num}]; combine_trace({call_time, Times}) -> @@ -1122,12 +1123,14 @@ format_impl(Device, {Type, Total, Inspected}) -> format_each(Device, Type, Total, Inspected). format_each(Device, call_count, _Total, Inspected) -> - {Widths, Lines} = lists:foldl( - fun ({Mod, {F, A}, Calls, _Value, _VPC, Percent}, {Widths, Ln}) -> - Line = [lists:flatten(io_lib:format("~tw:~tw/~w", [Mod, F, A])), - integer_to_list(Calls), float_to_list(Percent, [{decimals, 2}])], - NewWidths = [erlang:max(Old, New) || {Old, New} <- lists:zip([string:length(L) || L <- Line], Widths)], - {NewWidths, [Line | Ln]} + {Widths, Lines} = + lists:foldl( + fun ({Mod, {F, A}, Calls, _Value, _VPC, Percent}, {Widths, Ln}) -> + Line = [lists:flatten(io_lib:format("~tw:~tw/~w", [Mod, F, A])), + integer_to_list(Calls), float_to_list(Percent, [{decimals, 2}])], + NewWidths = [max(Old, New) || + Old <- [string:length(L) || L <- Line] && New <- Widths], + {NewWidths, [Line | Ln]} end, {[0, 5, 5], []}, Inspected), %% figure out formatting line @@ -1145,15 +1148,17 @@ format_labelled(Device, Label, Total, Inspected) -> %% The width of the value is either total or label ValueWidth = erlang:max(length(Label), length(integer_to_list(Total))), - {Widths, Lines} = lists:foldl( - fun ({Mod, {F, A}, Calls, Value, VPC, Percent}, {Widths, Ln}) -> - Line = [lists:flatten(io_lib:format("~tw:~tw/~w", [Mod, F, A])), - integer_to_list(Calls), integer_to_list(Value), - float_to_list(VPC, [{decimals, 2}]), - float_to_list(Percent, [{decimals, 2}])], - NewWidths = [erlang:max(Old, New) || {Old, New} <- lists:zip([string:length(L) || L <- Line], Widths)], - {NewWidths, [Line | Ln]} - end, {[0, 5, ValueWidth, 8, 5], []}, Inspected), + {Widths, Lines} = + lists:foldl( + fun ({Mod, {F, A}, Calls, Value, VPC, Percent}, {Widths, Ln}) -> + Line = [lists:flatten(io_lib:format("~tw:~tw/~w", [Mod, F, A])), + integer_to_list(Calls), integer_to_list(Value), + float_to_list(VPC, [{decimals, 2}]), + float_to_list(Percent, [{decimals, 2}])], + NewWidths = [max(Old, New) || + Old <- [string:length(L) || L <- Line] && New <- Widths], + {NewWidths, [Line | Ln]} + end, {[0, 5, ValueWidth, 8, 5], []}, Inspected), %% figure out formatting line Fmt = lists:flatten(io_lib:format("~~.~wts ~~~ws ~~~wts ~~~ws [~~~ws]~~n", Widths)), diff --git a/lib/tools/test/cover_SUITE.erl b/lib/tools/test/cover_SUITE.erl index 97cd9fb65084..35d46719b93e 100644 --- a/lib/tools/test/cover_SUITE.erl +++ b/lib/tools/test/cover_SUITE.erl @@ -204,7 +204,7 @@ compile(Config) when is_list(Config) -> remove(files(Files, ".beam")). crypto_works() -> - try crypto:start() of + try application:start(crypto) of {error,{already_started,crypto}} -> true; ok -> true catch diff --git a/lib/tools/test/tprof_SUITE.erl b/lib/tools/test/tprof_SUITE.erl index 5fee1570ebdc..873ce24a7099 100644 --- a/lib/tools/test/tprof_SUITE.erl +++ b/lib/tools/test/tprof_SUITE.erl @@ -288,9 +288,10 @@ set_on_spawn(Config) when is_list(Config) -> %% check per-process stats ?assertMatch({?MODULE, {_, 0}, 1, DownMsgSz, DownMsgSzFl, _}, lists:keyfind(?MODULE, 1, TotalProfile)), - %% MFA takes 4 more words. The memory of the 'DOWN' message is a bit racy, - %% so sometimes it will be there or not. - MfaSz = 4, + %% MFA version takes 3 more words (fun + one environment variable). The + %% memory of the 'DOWN' message is a bit racy, so sometimes it will be + %% there or not. + MfaSz = 3, ?assertMatch({?MODULE, {seq, 1}, 1, Sz, SzAvg, _} when Sz =:= (DownMsgSz + MfaSz) andalso SzAvg == (DownMsgSz + MfaSz); Sz =:= MfaSz andalso SzAvg == MfaSz, diff --git a/lib/wx/configure b/lib/wx/configure index ab772005b2c3..776db74b11c8 100755 --- a/lib/wx/configure +++ b/lib/wx/configure @@ -3093,6 +3093,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi ## Delete previous failed configure results if test -f ./CONF_INFO; then @@ -3232,6 +3243,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3246,6 +3264,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3260,6 +3285,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3271,18 +3303,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -7310,6 +7343,11 @@ mkdir -p $WXERL_SYS_TYPE CONFIG_STATUS=$WXERL_SYS_TYPE/config.status +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi + + ac_config_files="$ac_config_files config.mk c_src/Makefile" @@ -8471,6 +8509,3 @@ if test X"$CORES" != X"" ; then echo "Configure dumped core files" > ignore_core_files fi - - - diff --git a/lib/wx/configure.ac b/lib/wx/configure.ac index ba34c709fc2d..3cde261a9387 100644 --- a/lib/wx/configure.ac +++ b/lib/wx/configure.ac @@ -26,6 +26,8 @@ AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf]) AC_PREREQ([2.71]) +ERL_PUSH_WERROR + ## Delete previous failed configure results if test -f ./CONF_INFO; then rm ./CONF_INFO @@ -749,6 +751,8 @@ AC_SUBST(WXERL_SYS_TYPE) mkdir -p $WXERL_SYS_TYPE CONFIG_STATUS=$WXERL_SYS_TYPE/config.status +ERL_POP_WERROR + dnl AC_CONFIG_FILES([ @@ -762,6 +766,3 @@ CORES=`ls core* 2>/dev/null` if test X"$CORES" != X"" ; then echo "Configure dumped core files" > ignore_core_files fi - - - diff --git a/lib/wx/examples/simple/menu.erl b/lib/wx/examples/simple/menu.erl index 558810ae28d8..ee4b92a00a24 100644 --- a/lib/wx/examples/simple/menu.erl +++ b/lib/wx/examples/simple/menu.erl @@ -161,14 +161,14 @@ create_file_menu() -> ])), ClearLogItem = wxMenuItem:new([ {id, ?menuID_FILE_CLEAR_LOG}, - {text, "Clear &log\tCtrl-L"} %% note mnemonic and accelerator + {text, "Clear &log\tCtrl+L"} %% note mnemonic and accelerator ]), wxMenu:append(FileMenu, ClearLogItem ), wxMenu:appendSeparator(FileMenu), wxMenu:append(FileMenu, wxMenuItem:new([ {id, ?menuID_FILE_QUIT} %, - %{text, "E&xit\tAlt-X"} + %{text, "E&xit\tAlt+X"} ])), FileMenu. @@ -179,47 +179,47 @@ create_menubar_menu() -> MenuBarMenu = wxMenu:new(), wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_APPEND}, - {text, "&Append menu\tCtrl-A"}, + {text, "&Append menu\tCtrl+A"}, {help, "Append a menu to the menubar"} ])), wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_INSERT}, - {text, "&Insert menu\tCtrl-I"}, + {text, "&Insert menu\tCtrl+I"}, {help, "Insert a menu into the menubar"} ])), wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_DELETE}, - {text, "&Delete menu\tCtrl-D"}, + {text, "&Delete menu\tCtrl+D"}, {help, "Insert a menu into the menubar"} ])), wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_TOGGLE}, - {text, "&Toggle menu\tCtrl-T"}, + {text, "&Toggle menu\tCtrl+T"}, {help, "Toggle the first menu in the menubar"}, {kind, ?wxITEM_CHECK} ])), wxMenu:appendSeparator(MenuBarMenu), %% -------------------------- wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_ENABLE}, - {text, "&Enable menu\tCtrl-E"}, + {text, "&Enable menu\tCtrl+E"}, {help, "Enable or disable the last menu"}, {kind, ?wxITEM_CHECK} ])), wxMenu:appendSeparator(MenuBarMenu), %% -------------------------- wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_GET_LABEL}, - {text, "&Get menu label\tCtrl-G"}, + {text, "&Get menu label\tCtrl+G"}, {help, "Get the label of the last menu"} ])), wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_SET_LABEL}, - {text, "&Set menu label\tCtrl-S"}, + {text, "&Set menu label\tCtrl+S"}, {help, "Change the label of the last menu"} ])), wxMenu:appendSeparator(MenuBarMenu), %% -------------------------- wxMenu:append(MenuBarMenu, wxMenuItem:new([ {id, ?menuID_MENUBAR_FIND_MENU}, - {text, "&Find menu from label\tCtrl-F"}, + {text, "&Find menu from label\tCtrl+F"}, {help, "Find a menu by searching for its label"} ])), MenuBarMenu. @@ -232,46 +232,46 @@ create_menu_menu() -> MenuMenu = wxMenu:new(), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_APPEND}, - {text, "&Append menu item\tAlt-A"}, + {text, "&Append menu item\tAlt+A"}, {help, "Append a menu item to the last menu"} ])), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_APPEND_SUB}, - {text, "&Append sub menu\tAlt-S"}, + {text, "&Append sub menu\tAlt+S"}, {help, "Append a sub menu to the last menu"} ])), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_INSERT}, - {text, "&Insert menu item\tAlt-I"}, + {text, "&Insert menu item\tAlt+I"}, {help, "Insert a menu item in head of the last menu"} ])), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_DELETE}, - {text, "&Delete menu item\tAlt-D"}, + {text, "&Delete menu item\tAlt+D"}, {help, "Delete the last menu item from the last menu"} ])), wxMenu:appendSeparator(MenuMenu), %% -------------------------- wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_ENABLE}, - {text, "&Enable menu item\tAlt-E"}, + {text, "&Enable menu item\tAlt+E"}, {help, "Enable or disable the last menu item"}, {kind, ?wxITEM_CHECK} ])), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_CHECK}, - {text, "&Check menu item\tAlt-C"}, + {text, "&Check menu item\tAlt+C"}, {help, "Check or uncheck the last menu item"}, {kind, ?wxITEM_CHECK} ])), wxMenu:appendSeparator(MenuMenu), %% -------------------------- wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_GET_INFO}, - {text, "Get menu item in&fo\tAlt-F"}, + {text, "Get menu item in&fo\tAlt+F"}, {help, "Show the state of the last menu item"} ])), wxMenu:append(MenuMenu, wxMenuItem:new([ {id, ?menuID_MENU_SET_LABEL}, - {text, "&Set menu label\tCtrl-S"}, + {text, "&Set menu label\tCtrl+S"}, {help, "Change the label of the last menu"} ])), wxMenu:appendSeparator(MenuMenu), %% -------------------------- @@ -378,9 +378,9 @@ create_stock_menu() -> create_dummy_menu() -> DummyMenu = wxMenu:new(), - wxMenu:append(DummyMenu, ?menuID_DUMMY_FIRST, "&First item\tCtrl-F1"), + wxMenu:append(DummyMenu, ?menuID_DUMMY_FIRST, "&First item\tCtrl+F1"), wxMenu:appendSeparator(DummyMenu), %% -------------------------- - wxMenu:append(DummyMenu, ?menuID_DUMMY_SECOND, "&Second item\tCtrl-F2"), + wxMenu:append(DummyMenu, ?menuID_DUMMY_SECOND, "&Second item\tCtrl+F2"), DummyMenu. loop(State) -> @@ -508,7 +508,7 @@ onMenuAction(#wx{id=?menuID_MENU_APPEND, obj=Frame}, #state{} = State) -> wxMenu:appendSeparator(Menu), wxMenu:append(Menu, wxMenuItem:new([ {id, ?menuID_DUMMY_THIRD}, - {text, "&Third dummy item\tCtrl-F3"}, + {text, "&Third dummy item\tCtrl+F3"}, {kind, ?wxITEM_CHECK} ])), diff --git a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl index 2af6165ee675..c7c10234d778 100644 --- a/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl +++ b/lib/xmerl/test/xmerl_xsd_Sun2002-01-16_SUITE.erl @@ -71,7 +71,7 @@ init_per_testcase(TestCase,Config) -> end_per_testcase(_Func,_Config) -> ok. -%% ID Constranints. Very naive test of identity constraint +%% ID Constraints. Very naive test of identity constraint 'Sun-idc001.nogen'(Config) when is_list(Config) -> STResList0 = [], @@ -88,7 +88,7 @@ end_per_testcase(_Func,_Config) -> xmerl_xsd_lib:compare_test_results(Config,STResList1,ITResList3). -%% ID Constranints. Reference to an undeclared key +%% ID Constraints. Reference to an undeclared key 'Sun-idc002.e'(Config) when is_list(Config) -> STResList0 = [], @@ -98,7 +98,7 @@ end_per_testcase(_Func,_Config) -> xmerl_xsd_lib:compare_test_results(Config,STResList1,[]). -%% ID Constranints. Reference to an undeclared key in an undeclared namespace +%% ID Constraints. Reference to an undeclared key in an undeclared namespace 'Sun-idc002b.e'(Config) when is_list(Config) -> STResList0 = [], @@ -108,7 +108,7 @@ end_per_testcase(_Func,_Config) -> xmerl_xsd_lib:compare_test_results(Config,STResList1,[]). -%% ID Constranints. Reference to non-key constraint. +%% ID Constraints. Reference to non-key constraint. 'Sun-idc003.e'(Config) when is_list(Config) -> STResList0 = [], @@ -118,7 +118,7 @@ end_per_testcase(_Func,_Config) -> xmerl_xsd_lib:compare_test_results(Config,STResList1,[]). -%% ID Constranints. +%% ID Constraints. 'Sun-idc004.nogen'(Config) when is_list(Config) -> STResList0 = [], diff --git a/make/app_targets.mk b/make/app_targets.mk index 6461d5bfa5fc..52b52d645634 100644 --- a/make/app_targets.mk +++ b/make/app_targets.mk @@ -24,7 +24,7 @@ APPLICATION ?= $(basename $(notdir $(PWD))) ifndef NO_TEST_TARGET test: - TEST_NEEDS_RELEASE=$(TEST_NEEDS_RELEASE) TYPE=$(TYPE) \ + TEST_NEEDS_RELEASE=$(TEST_NEEDS_RELEASE) TYPE=$(TYPE) MAKE="$(MAKE)" \ $(ERL_TOP)/make/test_target_script.sh $(ERL_TOP) endif diff --git a/make/autoconf/otp.m4 b/make/autoconf/otp.m4 index 92be871b1ebf..f0fd384c4bd2 100644 --- a/make/autoconf/otp.m4 +++ b/make/autoconf/otp.m4 @@ -30,11 +30,35 @@ dnl macros specific dnl to the Erlang system are prefixed ERL_ (this is dnl not always consistently made...). dnl +dnl We check if -Werror was given on command line and if so +dnl we disable it for the configure and only use it when +dnl actually building erts +AC_DEFUN([ERL_PUSH_WERROR], +[ +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi]) + +AC_DEFUN([ERL_POP_WERROR], +[ +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi]) + AC_DEFUN([ERL_CANONICAL_SYSTEM_TYPE], [ AC_CANONICAL_HOST # Adjust for local legacy windows hack... AS_CASE([$host], + [local-aarch64-*-windows], + [ + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ], [local-*-windows], [ host=win32 @@ -46,6 +70,13 @@ AC_DEFUN([ERL_CANONICAL_SYSTEM_TYPE], AC_CANONICAL_BUILD # Adjust for local legacy windows hack... AS_CASE([$build], + [local-aarch64-*-windows], + [ + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ], [local-*-windows], [ build=win32 @@ -57,6 +88,13 @@ AC_DEFUN([ERL_CANONICAL_SYSTEM_TYPE], AC_CANONICAL_TARGET # Adjust for local legacy windows hack... AS_CASE([$target], + [local-aarch64-*-windows], + [ + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ], [local-*-windows], [ target=win32 @@ -65,17 +103,18 @@ AC_DEFUN([ERL_CANONICAL_SYSTEM_TYPE], target_cpu= ]) - AS_IF([test "$cross_compiling" = "yes" -a "$build" = "$host"], + AS_IF([test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu"], [AC_MSG_ERROR([ - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. diff --git a/make/autoconf/win64-arm64.config.cache.static b/make/autoconf/win64-arm64.config.cache.static new file mode 100644 index 000000000000..a48a64dc6811 --- /dev/null +++ b/make/autoconf/win64-arm64.config.cache.static @@ -0,0 +1,358 @@ +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +# ac_cv_build=${ac_cv_build=local-aarch64-pc-windows} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} +ac_cv_c_compiler_gnu=${ac_cv_c_compiler_gnu=no} +ac_cv_c_const=${ac_cv_c_const=yes} +# ac_cv_c_double_middle_endian=${ac_cv_c_double_middle_endian=no} +ac_cv_c_undeclared_builtin_options=${ac_cv_c_undeclared_builtin_options='none needed'} +ac_cv_cxx_compiler_gnu=${ac_cv_cxx_compiler_gnu=no} +ac_cv_decl_h_errno=${ac_cv_decl_h_errno=no} +ac_cv_decl_inaddr_loopback=${ac_cv_decl_inaddr_loopback=no} +ac_cv_decl_inaddr_loopback_rpc=${ac_cv_decl_inaddr_loopback_rpc=no} +ac_cv_decl_inaddr_loopback_winsock2=${ac_cv_decl_inaddr_loopback_winsock2=yes} +ac_cv_decl_so_bsdcompat=${ac_cv_decl_so_bsdcompat=no} +ac_cv_decl_sys_errlist=${ac_cv_decl_sys_errlist=no} +ac_cv_env_AR_set=set +ac_cv_env_AR_value=ar.sh +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set=set +ac_cv_env_CC_value=cc.sh +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +# ac_cv_env_CFLAG_RUNTIME_LIBRARY_PATH_set= +# ac_cv_env_CFLAG_RUNTIME_LIBRARY_PATH_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set=set +ac_cv_env_CXX_value=cc.sh +# ac_cv_env_DED_LDFLAGS_set= +# ac_cv_env_DED_LDFLAGS_value= +# ac_cv_env_DED_LD_FLAG_RUNTIME_LIBRARY_PATH_set= +# ac_cv_env_DED_LD_FLAG_RUNTIME_LIBRARY_PATH_value= +# ac_cv_env_DED_LD_set= +# ac_cv_env_DED_LD_value= +# ac_cv_env_ERL_TOP_set=set +# ac_cv_env_ERL_TOP_value=$ERL_TOP +# ac_cv_env_GETCONF_set= +# ac_cv_env_GETCONF_value= +# ac_cv_env_LDFLAGS_set= +# ac_cv_env_LDFLAGS_value= +# ac_cv_env_LD_set= +# ac_cv_env_LD_value= +# ac_cv_env_LFS_CFLAGS_set= +# ac_cv_env_LFS_CFLAGS_value= +# ac_cv_env_LFS_LDFLAGS_set= +# ac_cv_env_LFS_LDFLAGS_value= +# ac_cv_env_LFS_LIBS_set= +# ac_cv_env_LFS_LIBS_value= +# ac_cv_env_LIBS_set= +# ac_cv_env_LIBS_value= +# ac_cv_env_RANLIB_set=set +# ac_cv_env_RANLIB_value=true +# ac_cv_env_STATIC_CFLAGS_set= +# ac_cv_env_STATIC_CFLAGS_value= +# ac_cv_env_YACC_set= +# ac_cv_env_YACC_value= +# ac_cv_env_YFLAGS_set= +# ac_cv_env_YFLAGS_value= +ac_cv_env_build_alias_set=set +ac_cv_env_build_alias_value=local-aarch64-pc-windows +# ac_cv_env_erl_xcomp_after_morecore_hook_set= +# ac_cv_env_erl_xcomp_after_morecore_hook_value= +# ac_cv_env_erl_xcomp_bigendian_set= +# ac_cv_env_erl_xcomp_bigendian_value= +# ac_cv_env_erl_xcomp_clock_gettime_cpu_time_set= +# ac_cv_env_erl_xcomp_clock_gettime_cpu_time_value= +# ac_cv_env_erl_xcomp_dlsym_brk_wrappers_set= +# ac_cv_env_erl_xcomp_dlsym_brk_wrappers_value= +# ac_cv_env_erl_xcomp_double_middle_endian_set= +# ac_cv_env_erl_xcomp_double_middle_endian_value= +# ac_cv_env_erl_xcomp_getaddrinfo_set= +# ac_cv_env_erl_xcomp_getaddrinfo_value= +# ac_cv_env_erl_xcomp_gethrvtime_procfs_ioctl_set= +# ac_cv_env_erl_xcomp_gethrvtime_procfs_ioctl_value= +# ac_cv_env_erl_xcomp_isysroot_set= +# ac_cv_env_erl_xcomp_isysroot_value= +# ac_cv_env_erl_xcomp_kqueue_set= +# ac_cv_env_erl_xcomp_kqueue_value= +# ac_cv_env_erl_xcomp_linux_nptl_set= +# ac_cv_env_erl_xcomp_linux_nptl_value= +# ac_cv_env_erl_xcomp_linux_usable_sigaltstack_set= +# ac_cv_env_erl_xcomp_linux_usable_sigaltstack_value= +# ac_cv_env_erl_xcomp_linux_usable_sigusrx_set= +# ac_cv_env_erl_xcomp_linux_usable_sigusrx_value= +# ac_cv_env_erl_xcomp_poll_set= +# ac_cv_env_erl_xcomp_poll_value= +# ac_cv_env_erl_xcomp_putenv_copy_set= +# ac_cv_env_erl_xcomp_putenv_copy_value= +# ac_cv_env_erl_xcomp_reliable_fpe_set= +# ac_cv_env_erl_xcomp_reliable_fpe_value= +# ac_cv_env_erl_xcomp_sysroot_set= +# ac_cv_env_erl_xcomp_sysroot_value= +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=local-aarch64-pc-windows +ac_cv_env_target_alias_set=set +ac_cv_env_target_alias_value=local-aarch64-pc-windows +ac_cv_exeext=${ac_cv_exeext=.exe} +ac_cv_func___brk=${ac_cv_func___brk=no} +ac_cv_func___sbrk=${ac_cv_func___sbrk=no} +ac_cv_func__brk=${ac_cv_func__brk=no} +ac_cv_func__doprnt=${ac_cv_func__doprnt=no} +ac_cv_func__sbrk=${ac_cv_func__sbrk=no} +ac_cv_func_brk=${ac_cv_func_brk=no} +ac_cv_func_clock_get_attributes=${ac_cv_func_clock_get_attributes=no} +ac_cv_func_clock_getres=${ac_cv_func_clock_getres=no} +ac_cv_func_closefrom=${ac_cv_func_closefrom=no} +ac_cv_func_connect=${ac_cv_func_connect=no} +ac_cv_func_decl_fread=${ac_cv_func_decl_fread=yes} +ac_cv_func_dlopen=${ac_cv_func_dlopen=no} +ac_cv_func_dlvsym=${ac_cv_func_dlvsym=no} +ac_cv_func_endprotoent=${ac_cv_func_endprotoent=no} +ac_cv_func_fdatasync=${ac_cv_func_fdatasync=no} +ac_cv_func_finite=${ac_cv_func_finite=no} +ac_cv_func_flockfile=${ac_cv_func_flockfile=no} +ac_cv_func_fpsetmask=${ac_cv_func_fpsetmask=no} +ac_cv_func_fstat=${ac_cv_func_fstat=yes} +ac_cv_func_gethostbyname2=${ac_cv_func_gethostbyname2=no} +ac_cv_func_gethostbyname=${ac_cv_func_gethostbyname=yes} +ac_cv_func_gethostbyname_r=${ac_cv_func_gethostbyname_r=no} +ac_cv_func_gethostname=${ac_cv_func_gethostname=no} +ac_cv_func_gethrtime=${ac_cv_func_gethrtime=no} +ac_cv_func_getifaddrs=${ac_cv_func_getifaddrs=no} +ac_cv_func_getipnodebyaddr=${ac_cv_func_getipnodebyaddr=no} +ac_cv_func_getipnodebyname=${ac_cv_func_getipnodebyname=no} +ac_cv_func_getprotoent=${ac_cv_func_getprotoent=no} +ac_cv_func_getrusage=${ac_cv_func_getrusage=no} +ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday=no} +ac_cv_func_gmtime_r=${ac_cv_func_gmtime_r=no} +ac_cv_func_ieee_handler=${ac_cv_func_ieee_handler=no} +ac_cv_func_if_freenameindex=${ac_cv_func_if_freenameindex=no} +ac_cv_func_if_indextoname=${ac_cv_func_if_indextoname=no} +ac_cv_func_if_nameindex=${ac_cv_func_if_nameindex=no} +ac_cv_func_if_nametoindex=${ac_cv_func_if_nametoindex=no} +ac_cv_func_isinf=${ac_cv_func_isinf=no} +ac_cv_func_isnan=${ac_cv_func_isnan=no} +ac_cv_func_localtime_r=${ac_cv_func_localtime_r=no} +ac_cv_func_log2=${ac_cv_func_log2=no} +ac_cv_func_madvise=${ac_cv_func_madvise=no} +ac_cv_func_mallopt=${ac_cv_func_mallopt=no} +ac_cv_func_memcpy=${ac_cv_func_memcpy=no} +ac_cv_func_memmove=${ac_cv_func_memmove=no} +ac_cv_func_mlockall=${ac_cv_func_mlockall=no} +ac_cv_func_mmap=${ac_cv_func_mmap=no} +ac_cv_func_mprotect=${ac_cv_func_mprotect=no} +ac_cv_func_mremap=${ac_cv_func_mremap=no} +ac_cv_func_nl_langinfo=${ac_cv_func_nl_langinfo=no} +ac_cv_func_openpty=${ac_cv_func_openpty=no} +ac_cv_func_poll=${ac_cv_func_poll=no} +ac_cv_func_posix2time=${ac_cv_func_posix2time=no} +ac_cv_func_posix_fadvise=${ac_cv_func_posix_fadvise=no} +ac_cv_func_posix_madvise=${ac_cv_func_posix_madvise=no} +ac_cv_func_posix_memalign=${ac_cv_func_posix_memalign=no} +ac_cv_func_ppoll=${ac_cv_func_ppoll=no} +ac_cv_func_pread=${ac_cv_func_pread=no} +ac_cv_func_pwrite=${ac_cv_func_pwrite=no} +ac_cv_func_res_gethostbyname=${ac_cv_func_res_gethostbyname=no} +ac_cv_func_sbrk=${ac_cv_func_sbrk=no} +ac_cv_func_setlocale=${ac_cv_func_setlocale=yes} +ac_cv_func_setns=${ac_cv_func_setns=no} +ac_cv_func_setprotoent=${ac_cv_func_setprotoent=no} +ac_cv_func_setsid=${ac_cv_func_setsid=no} +ac_cv_func_strerror=${ac_cv_func_strerror=yes} +ac_cv_func_strerror_r=${ac_cv_func_strerror_r=no} +ac_cv_func_strftime=${ac_cv_func_strftime=yes} +ac_cv_func_strlcat=${ac_cv_func_strlcat=no} +ac_cv_func_strlcpy=${ac_cv_func_strlcpy=no} +ac_cv_func_strncasecmp=${ac_cv_func_strncasecmp=no} +ac_cv_func_time2posix=${ac_cv_func_time2posix=no} +ac_cv_func_vprintf=${ac_cv_func_vprintf=no} +ac_cv_func_vsyslog=${ac_cv_func_vsyslog=no} +ac_cv_func_writev=${ac_cv_func_writev=no} +ac_cv_have_decl_IN6ADDR_ANY_INIT=${ac_cv_have_decl_IN6ADDR_ANY_INIT=no} +ac_cv_have_decl_IN6ADDR_LOOPBACK_INIT=${ac_cv_have_decl_IN6ADDR_LOOPBACK_INIT=no} +ac_cv_have_decl_IPV6_V6ONLY=${ac_cv_have_decl_IPV6_V6ONLY=no} +ac_cv_have_decl_posix2time=${ac_cv_have_decl_posix2time=no} +ac_cv_have_decl_time2posix=${ac_cv_have_decl_time2posix=no} +ac_cv_header_arpa_nameser_h=${ac_cv_header_arpa_nameser_h=no} +ac_cv_header_dirent_dirent_h=${ac_cv_header_dirent_dirent_h=no} +ac_cv_header_dirent_ndir_h=${ac_cv_header_dirent_ndir_h=no} +ac_cv_header_dirent_sys_dir_h=${ac_cv_header_dirent_sys_dir_h=no} +ac_cv_header_dirent_sys_ndir_h=${ac_cv_header_dirent_sys_ndir_h=no} +ac_cv_header_dlfcn_h=${ac_cv_header_dlfcn_h=no} +ac_cv_header_elf_h=${ac_cv_header_elf_h=no} +ac_cv_header_fcntl_h=${ac_cv_header_fcntl_h=yes} +ac_cv_header_ieeefp_h=${ac_cv_header_ieeefp_h=no} +ac_cv_header_ifaddrs_h=${ac_cv_header_ifaddrs_h=no} +ac_cv_header_inttypes_h=${ac_cv_header_inttypes_h=yes} +ac_cv_header_langinfo_h=${ac_cv_header_langinfo_h=no} +ac_cv_header_libdlpi_h=${ac_cv_header_libdlpi_h=no} +ac_cv_header_libutil_h=${ac_cv_header_libutil_h=no} +ac_cv_header_limits_h=${ac_cv_header_limits_h=yes} +ac_cv_header_linux_errqueue_h=${ac_cv_header_linux_errqueue_h=no} +ac_cv_header_linux_falloc_h=${ac_cv_header_linux_falloc_h=no} +ac_cv_header_linux_types_h=${ac_cv_header_linux_types_h=no} +ac_cv_header_malloc_h=${ac_cv_header_malloc_h=yes} +ac_cv_header_net_errno_h=${ac_cv_header_net_errno_h=no} +ac_cv_header_net_if_dl_h=${ac_cv_header_net_if_dl_h=no} +ac_cv_header_netinet_sctp_h=${ac_cv_header_netinet_sctp_h=no} +ac_cv_header_netpacket_packet_h=${ac_cv_header_netpacket_packet_h=no} +ac_cv_header_poll_h=${ac_cv_header_poll_h=no} +ac_cv_header_pty_h=${ac_cv_header_pty_h=no} +ac_cv_header_sched_h=${ac_cv_header_sched_h=no} +ac_cv_header_sdkddkver_h=${ac_cv_header_sdkddkver_h=yes} +ac_cv_header_setns_h=${ac_cv_header_setns_h=no} +ac_cv_header_stdint_h=${ac_cv_header_stdint_h=yes} +ac_cv_header_stdio_h=${ac_cv_header_stdio_h=yes} +ac_cv_header_stdlib_h=${ac_cv_header_stdlib_h=yes} +ac_cv_header_string_h=${ac_cv_header_string_h=yes} +ac_cv_header_strings_h=${ac_cv_header_strings_h=no} +ac_cv_header_sys_devpoll_h=${ac_cv_header_sys_devpoll_h=no} +ac_cv_header_sys_epoll_h=${ac_cv_header_sys_epoll_h=no} +ac_cv_header_sys_event_h=${ac_cv_header_sys_event_h=no} +ac_cv_header_sys_ioctl_h=${ac_cv_header_sys_ioctl_h=no} +ac_cv_header_sys_mman_h=${ac_cv_header_sys_mman_h=no} +ac_cv_header_sys_resource_h=${ac_cv_header_sys_resource_h=no} +ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no} +ac_cv_header_sys_socketio_h=${ac_cv_header_sys_socketio_h=no} +ac_cv_header_sys_sockio_h=${ac_cv_header_sys_sockio_h=no} +ac_cv_header_sys_stat_h=${ac_cv_header_sys_stat_h=yes} +ac_cv_header_sys_stropts_h=${ac_cv_header_sys_stropts_h=no} +ac_cv_header_sys_sysctl_h=${ac_cv_header_sys_sysctl_h=no} +ac_cv_header_sys_time_h=${ac_cv_header_sys_time_h=no} +ac_cv_header_sys_timerfd_h=${ac_cv_header_sys_timerfd_h=no} +ac_cv_header_sys_types_h=${ac_cv_header_sys_types_h=yes} +ac_cv_header_sys_uio_h=${ac_cv_header_sys_uio_h=no} +ac_cv_header_sys_un_h=${ac_cv_header_sys_un_h=no} +ac_cv_header_sys_wait_h=${ac_cv_header_sys_wait_h=no} +ac_cv_header_syslog_h=${ac_cv_header_syslog_h=no} +ac_cv_header_unistd_h=${ac_cv_header_unistd_h=no} +ac_cv_header_util_h=${ac_cv_header_util_h=no} +ac_cv_header_utmp_h=${ac_cv_header_utmp_h=no} +ac_cv_header_valgrind_valgrind_h=${ac_cv_header_valgrind_valgrind_h=no} +ac_cv_header_windows_h=${ac_cv_header_windows_h=yes} +ac_cv_header_winsock2_h=${ac_cv_header_winsock2_h=yes} +ac_cv_header_ws2tcpip_h=${ac_cv_header_ws2tcpip_h=yes} +ac_cv_host=${ac_cv_host=local-aarch64-pc-windows} +ac_cv_lib_dl_dlopen=${ac_cv_lib_dl_dlopen=no} +ac_cv_lib_dl_dlvsym=${ac_cv_lib_dl_dlvsym=no} +ac_cv_lib_dlpi_dlpi_open=${ac_cv_lib_dlpi_dlpi_open=no} +ac_cv_lib_inet_main=${ac_cv_lib_inet_main=no} +ac_cv_lib_kstat_kstat_open=${ac_cv_lib_kstat_kstat_open=no} +ac_cv_lib_kvm_kvm_open=${ac_cv_lib_kvm_kvm_open=no} +ac_cv_lib_m_sin=${ac_cv_lib_m_sin=no} +ac_cv_lib_rt_clock_gettime=${ac_cv_lib_rt_clock_gettime=no} +ac_cv_lib_socket_main=${ac_cv_lib_socket_main=yes} +ac_cv_lib_util_openpty=${ac_cv_lib_util_openpty=no} +ac_cv_member_struct_ifreq_ifr_enaddr=${ac_cv_member_struct_ifreq_ifr_enaddr=no} +ac_cv_member_struct_ifreq_ifr_hwaddr=${ac_cv_member_struct_ifreq_ifr_hwaddr=no} +ac_cv_member_struct_ifreq_ifr_ifindex=${ac_cv_member_struct_ifreq_ifr_ifindex=no} +ac_cv_member_struct_ifreq_ifr_index=${ac_cv_member_struct_ifreq_ifr_index=no} +ac_cv_member_struct_ifreq_ifr_map=${ac_cv_member_struct_ifreq_ifr_map=no} +ac_cv_member_struct_sockaddr_dl_sdl_len=${ac_cv_member_struct_sockaddr_dl_sdl_len=no} +ac_cv_member_struct_sockaddr_un_sun_path=${ac_cv_member_struct_sockaddr_un_sun_path=no} +ac_cv_objext=${ac_cv_objext=o} +# ac_cv_path_CP=${ac_cv_path_CP=/bin/cp} +# ac_cv_path_EGREP=${ac_cv_path_EGREP='/usr/bin/grep -E'} +# ac_cv_path_GREP=${ac_cv_path_GREP=/usr/bin/grep} +# ac_cv_path_MKDIR=${ac_cv_path_MKDIR=/bin/mkdir} +# ac_cv_path_PERL=${ac_cv_path_PERL=/usr/bin/perl} +# ac_cv_path_install=${ac_cv_path_install='/usr/bin/install -c'} +ac_cv_prog_AR=${ac_cv_prog_AR=ar.sh} +ac_cv_prog_CC=${ac_cv_prog_CC=cc.sh} +ac_cv_prog_CPP=${ac_cv_prog_CPP='cc.sh -E'} +ac_cv_prog_GETCONF=${ac_cv_prog_GETCONF=getconf} +ac_cv_prog_JAVAC=${ac_cv_prog_JAVAC=javac.sh} +ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=true} +ac_cv_prog_cc_c11=${ac_cv_prog_cc_c11=no} +ac_cv_prog_cc_c89=${ac_cv_prog_cc_c89=no} +ac_cv_prog_cc_c99=${ac_cv_prog_cc_c99=no} +ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes} +ac_cv_prog_cxx_11=${ac_cv_prog_cxx_11=no} +ac_cv_prog_cxx_g=${ac_cv_prog_cxx_g=yes} +ac_cv_prog_cxx_stdcxx=${ac_cv_prog_cxx_stdcxx=} +# ac_cv_prog_emu_cc=${ac_cv_prog_emu_cc=$ERL_TOP/git/otp/erts/etc/win32/wsl_tools/vc/emu_cc.sh} +# ac_cv_prog_javac_ver_1_6=${ac_cv_prog_javac_ver_1_6=no} +# ac_cv_prog_mkdir_p=${ac_cv_prog_mkdir_p='/usr/bin/install -c -d'} +ac_cv_search_fdatasync=${ac_cv_search_fdatasync=no} +ac_cv_search_opendir=${ac_cv_search_opendir=no} +ac_cv_search_strerror=${ac_cv_search_strerror='none required'} +ac_cv_sizeof__Float16=${ac_cv_sizeof__Float16=0} +ac_cv_sizeof___int128_t=${ac_cv_sizeof___int128_t=0} +ac_cv_sizeof___int64=${ac_cv_sizeof___int64=8} +ac_cv_sizeof_char=${ac_cv_sizeof_char=1} +ac_cv_sizeof_int=${ac_cv_sizeof_int=4} +ac_cv_sizeof_long=${ac_cv_sizeof_long=4} +ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long=8} +ac_cv_sizeof_off_t=${ac_cv_sizeof_off_t=4} +ac_cv_sizeof_short=${ac_cv_sizeof_short=2} +ac_cv_sizeof_size_t=${ac_cv_sizeof_size_t=8} +ac_cv_sizeof_suseconds_t=${ac_cv_sizeof_suseconds_t=0} +ac_cv_sizeof_time_t=${ac_cv_sizeof_time_t=8} +ac_cv_sizeof_void_p=${ac_cv_sizeof_void_p=8} +ac_cv_struct_sockaddr_sa_len=${ac_cv_struct_sockaddr_sa_len=no} +ac_cv_struct_tm=${ac_cv_struct_tm=time.h} +# ac_cv_sys_ipv6_support=${ac_cv_sys_ipv6_support=yes} +ac_cv_sys_multicast_support=${ac_cv_sys_multicast_support=no} +ac_cv_target=${ac_cv_target=local-aarch64-pc-windows} +ac_cv_type_off_t=${ac_cv_type_off_t=yes} +ac_cv_type_pid_t=${ac_cv_type_pid_t=no} +ac_cv_type_size_t=${ac_cv_type_size_t=yes} +erl_cv_clock_gettime_monotonic_default_resolution=${erl_cv_clock_gettime_monotonic_default_resolution=no} +erl_cv_clock_gettime_monotonic_high_resolution=${erl_cv_clock_gettime_monotonic_high_resolution=no} +erl_cv_clock_gettime_monotonic_raw=${erl_cv_clock_gettime_monotonic_raw=no} +erl_cv_clock_gettime_monotonic_try_find_pthread_compatible=${erl_cv_clock_gettime_monotonic_try_find_pthread_compatible=no} +erl_cv_clock_gettime_wall_default_resolution=${erl_cv_clock_gettime_wall_default_resolution=no} +erl_cv_mach_clock_get_time_monotonic=${erl_cv_mach_clock_get_time_monotonic=no} +erl_cv_mach_clock_get_time_wall=${erl_cv_mach_clock_get_time_wall=no} +erts_cv___after_morecore_hook_can_track_malloc=${erts_cv___after_morecore_hook_can_track_malloc=no} +erts_cv_fwrite_unlocked=${erts_cv_fwrite_unlocked=no} +erts_cv_have__end_symbol=${erts_cv_have__end_symbol=no} +erts_cv_have_end_symbol=${erts_cv_have_end_symbol=no} +erts_cv_have_in6addr_any=${erts_cv_have_in6addr_any=no} +erts_cv_have_in6addr_loopback=${erts_cv_have_in6addr_loopback=no} +erts_cv_putc_unlocked=${erts_cv_putc_unlocked=no} +erts_cv_windows_h_includes_winsock2_h=${erts_cv_windows_h_includes_winsock2_h=no} +ethr_cv_have__InterlockedAnd64=${ethr_cv_have__InterlockedAnd64=yes} +ethr_cv_have__InterlockedAnd=${ethr_cv_have__InterlockedAnd=yes} +ethr_cv_have__InterlockedCompareExchange128=${ethr_cv_have__InterlockedCompareExchange128=yes} +ethr_cv_have__InterlockedCompareExchange64=${ethr_cv_have__InterlockedCompareExchange64=yes} +# ethr_cv_have__InterlockedCompareExchange64_acq=${ethr_cv_have__InterlockedCompareExchange64_acq=no} +# ethr_cv_have__InterlockedCompareExchange64_rel=${ethr_cv_have__InterlockedCompareExchange64_rel=no} +ethr_cv_have__InterlockedCompareExchange=${ethr_cv_have__InterlockedCompareExchange=yes} +# ethr_cv_have__InterlockedCompareExchange_acq=${ethr_cv_have__InterlockedCompareExchange_acq=no} +# ethr_cv_have__InterlockedCompareExchange_rel=${ethr_cv_have__InterlockedCompareExchange_rel=no} +ethr_cv_have__InterlockedDecrement64=${ethr_cv_have__InterlockedDecrement64=yes} +# ethr_cv_have__InterlockedDecrement64_rel=${ethr_cv_have__InterlockedDecrement64_rel=no} +ethr_cv_have__InterlockedDecrement=${ethr_cv_have__InterlockedDecrement=yes} +# ethr_cv_have__InterlockedDecrement_rel=${ethr_cv_have__InterlockedDecrement_rel=no} +ethr_cv_have__InterlockedExchange64=${ethr_cv_have__InterlockedExchange64=yes} +ethr_cv_have__InterlockedExchange=${ethr_cv_have__InterlockedExchange=yes} +ethr_cv_have__InterlockedExchangeAdd64=${ethr_cv_have__InterlockedExchangeAdd64=yes} +# ethr_cv_have__InterlockedExchangeAdd64_acq=${ethr_cv_have__InterlockedExchangeAdd64_acq=no} +ethr_cv_have__InterlockedExchangeAdd=${ethr_cv_have__InterlockedExchangeAdd=yes} +# ethr_cv_have__InterlockedExchangeAdd_acq=${ethr_cv_have__InterlockedExchangeAdd_acq=no} +ethr_cv_have__InterlockedIncrement64=${ethr_cv_have__InterlockedIncrement64=yes} +# ethr_cv_have__InterlockedIncrement64_acq=${ethr_cv_have__InterlockedIncrement64_acq=no} +ethr_cv_have__InterlockedIncrement=${ethr_cv_have__InterlockedIncrement=yes} +# ethr_cv_have__InterlockedIncrement_acq=${ethr_cv_have__InterlockedIncrement_acq=no} +ethr_cv_have__InterlockedOr64=${ethr_cv_have__InterlockedOr64=yes} +ethr_cv_have__InterlockedOr=${ethr_cv_have__InterlockedOr=yes} +i_cv_fallocate_works=${i_cv_fallocate_works=no} +i_cv_posix_fallocate_works=${i_cv_posix_fallocate_works=no} diff --git a/make/autoconf/win64-x64_arm64.config.cache.static b/make/autoconf/win64-x64_arm64.config.cache.static new file mode 100644 index 000000000000..774914b0261e --- /dev/null +++ b/make/autoconf/win64-x64_arm64.config.cache.static @@ -0,0 +1,358 @@ +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +# ac_cv_build=${ac_cv_build=local-x86_64-pc-windows} +ac_cv_c_bigendian=${ac_cv_c_bigendian=no} +ac_cv_c_compiler_gnu=${ac_cv_c_compiler_gnu=no} +ac_cv_c_const=${ac_cv_c_const=yes} +# ac_cv_c_double_middle_endian=${ac_cv_c_double_middle_endian=no} +ac_cv_c_undeclared_builtin_options=${ac_cv_c_undeclared_builtin_options='none needed'} +ac_cv_cxx_compiler_gnu=${ac_cv_cxx_compiler_gnu=no} +ac_cv_decl_h_errno=${ac_cv_decl_h_errno=no} +ac_cv_decl_inaddr_loopback=${ac_cv_decl_inaddr_loopback=no} +ac_cv_decl_inaddr_loopback_rpc=${ac_cv_decl_inaddr_loopback_rpc=no} +ac_cv_decl_inaddr_loopback_winsock2=${ac_cv_decl_inaddr_loopback_winsock2=yes} +ac_cv_decl_so_bsdcompat=${ac_cv_decl_so_bsdcompat=no} +ac_cv_decl_sys_errlist=${ac_cv_decl_sys_errlist=no} +ac_cv_env_AR_set=set +ac_cv_env_AR_value=ar.sh +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set=set +ac_cv_env_CC_value=cc.sh +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +# ac_cv_env_CFLAG_RUNTIME_LIBRARY_PATH_set= +# ac_cv_env_CFLAG_RUNTIME_LIBRARY_PATH_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set=set +ac_cv_env_CXX_value=cc.sh +# ac_cv_env_DED_LDFLAGS_set= +# ac_cv_env_DED_LDFLAGS_value= +# ac_cv_env_DED_LD_FLAG_RUNTIME_LIBRARY_PATH_set= +# ac_cv_env_DED_LD_FLAG_RUNTIME_LIBRARY_PATH_value= +# ac_cv_env_DED_LD_set= +# ac_cv_env_DED_LD_value= +# ac_cv_env_ERL_TOP_set=set +# ac_cv_env_ERL_TOP_value=$ERL_TOP +# ac_cv_env_GETCONF_set= +# ac_cv_env_GETCONF_value= +# ac_cv_env_LDFLAGS_set= +# ac_cv_env_LDFLAGS_value= +# ac_cv_env_LD_set= +# ac_cv_env_LD_value= +# ac_cv_env_LFS_CFLAGS_set= +# ac_cv_env_LFS_CFLAGS_value= +# ac_cv_env_LFS_LDFLAGS_set= +# ac_cv_env_LFS_LDFLAGS_value= +# ac_cv_env_LFS_LIBS_set= +# ac_cv_env_LFS_LIBS_value= +# ac_cv_env_LIBS_set= +# ac_cv_env_LIBS_value= +# ac_cv_env_RANLIB_set=set +# ac_cv_env_RANLIB_value=true +# ac_cv_env_STATIC_CFLAGS_set= +# ac_cv_env_STATIC_CFLAGS_value= +# ac_cv_env_YACC_set= +# ac_cv_env_YACC_value= +# ac_cv_env_YFLAGS_set= +# ac_cv_env_YFLAGS_value= +ac_cv_env_build_alias_set=set +ac_cv_env_build_alias_value=local-x86_64-pc-windows +# ac_cv_env_erl_xcomp_after_morecore_hook_set= +# ac_cv_env_erl_xcomp_after_morecore_hook_value= +# ac_cv_env_erl_xcomp_bigendian_set= +# ac_cv_env_erl_xcomp_bigendian_value= +# ac_cv_env_erl_xcomp_clock_gettime_cpu_time_set= +# ac_cv_env_erl_xcomp_clock_gettime_cpu_time_value= +# ac_cv_env_erl_xcomp_dlsym_brk_wrappers_set= +# ac_cv_env_erl_xcomp_dlsym_brk_wrappers_value= +# ac_cv_env_erl_xcomp_double_middle_endian_set= +# ac_cv_env_erl_xcomp_double_middle_endian_value= +# ac_cv_env_erl_xcomp_getaddrinfo_set= +# ac_cv_env_erl_xcomp_getaddrinfo_value= +# ac_cv_env_erl_xcomp_gethrvtime_procfs_ioctl_set= +# ac_cv_env_erl_xcomp_gethrvtime_procfs_ioctl_value= +# ac_cv_env_erl_xcomp_isysroot_set= +# ac_cv_env_erl_xcomp_isysroot_value= +# ac_cv_env_erl_xcomp_kqueue_set= +# ac_cv_env_erl_xcomp_kqueue_value= +# ac_cv_env_erl_xcomp_linux_nptl_set= +# ac_cv_env_erl_xcomp_linux_nptl_value= +# ac_cv_env_erl_xcomp_linux_usable_sigaltstack_set= +# ac_cv_env_erl_xcomp_linux_usable_sigaltstack_value= +# ac_cv_env_erl_xcomp_linux_usable_sigusrx_set= +# ac_cv_env_erl_xcomp_linux_usable_sigusrx_value= +# ac_cv_env_erl_xcomp_poll_set= +# ac_cv_env_erl_xcomp_poll_value= +# ac_cv_env_erl_xcomp_putenv_copy_set= +# ac_cv_env_erl_xcomp_putenv_copy_value= +# ac_cv_env_erl_xcomp_reliable_fpe_set= +# ac_cv_env_erl_xcomp_reliable_fpe_value= +# ac_cv_env_erl_xcomp_sysroot_set= +# ac_cv_env_erl_xcomp_sysroot_value= +ac_cv_env_host_alias_set=set +ac_cv_env_host_alias_value=local-aarch64-pc-windows +ac_cv_env_target_alias_set=set +ac_cv_env_target_alias_value=local-aarch64-pc-windows +ac_cv_exeext=${ac_cv_exeext=.exe} +ac_cv_func___brk=${ac_cv_func___brk=no} +ac_cv_func___sbrk=${ac_cv_func___sbrk=no} +ac_cv_func__brk=${ac_cv_func__brk=no} +ac_cv_func__doprnt=${ac_cv_func__doprnt=no} +ac_cv_func__sbrk=${ac_cv_func__sbrk=no} +ac_cv_func_brk=${ac_cv_func_brk=no} +ac_cv_func_clock_get_attributes=${ac_cv_func_clock_get_attributes=no} +ac_cv_func_clock_getres=${ac_cv_func_clock_getres=no} +ac_cv_func_closefrom=${ac_cv_func_closefrom=no} +ac_cv_func_connect=${ac_cv_func_connect=no} +ac_cv_func_decl_fread=${ac_cv_func_decl_fread=yes} +ac_cv_func_dlopen=${ac_cv_func_dlopen=no} +ac_cv_func_dlvsym=${ac_cv_func_dlvsym=no} +ac_cv_func_endprotoent=${ac_cv_func_endprotoent=no} +ac_cv_func_fdatasync=${ac_cv_func_fdatasync=no} +ac_cv_func_finite=${ac_cv_func_finite=no} +ac_cv_func_flockfile=${ac_cv_func_flockfile=no} +ac_cv_func_fpsetmask=${ac_cv_func_fpsetmask=no} +ac_cv_func_fstat=${ac_cv_func_fstat=yes} +ac_cv_func_gethostbyname2=${ac_cv_func_gethostbyname2=no} +ac_cv_func_gethostbyname=${ac_cv_func_gethostbyname=yes} +ac_cv_func_gethostbyname_r=${ac_cv_func_gethostbyname_r=no} +ac_cv_func_gethostname=${ac_cv_func_gethostname=no} +ac_cv_func_gethrtime=${ac_cv_func_gethrtime=no} +ac_cv_func_getifaddrs=${ac_cv_func_getifaddrs=no} +ac_cv_func_getipnodebyaddr=${ac_cv_func_getipnodebyaddr=no} +ac_cv_func_getipnodebyname=${ac_cv_func_getipnodebyname=no} +ac_cv_func_getprotoent=${ac_cv_func_getprotoent=no} +ac_cv_func_getrusage=${ac_cv_func_getrusage=no} +ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday=no} +ac_cv_func_gmtime_r=${ac_cv_func_gmtime_r=no} +ac_cv_func_ieee_handler=${ac_cv_func_ieee_handler=no} +ac_cv_func_if_freenameindex=${ac_cv_func_if_freenameindex=no} +ac_cv_func_if_indextoname=${ac_cv_func_if_indextoname=no} +ac_cv_func_if_nameindex=${ac_cv_func_if_nameindex=no} +ac_cv_func_if_nametoindex=${ac_cv_func_if_nametoindex=no} +ac_cv_func_isinf=${ac_cv_func_isinf=no} +ac_cv_func_isnan=${ac_cv_func_isnan=no} +ac_cv_func_localtime_r=${ac_cv_func_localtime_r=no} +ac_cv_func_log2=${ac_cv_func_log2=no} +ac_cv_func_madvise=${ac_cv_func_madvise=no} +ac_cv_func_mallopt=${ac_cv_func_mallopt=no} +ac_cv_func_memcpy=${ac_cv_func_memcpy=no} +ac_cv_func_memmove=${ac_cv_func_memmove=no} +ac_cv_func_mlockall=${ac_cv_func_mlockall=no} +ac_cv_func_mmap=${ac_cv_func_mmap=no} +ac_cv_func_mprotect=${ac_cv_func_mprotect=no} +ac_cv_func_mremap=${ac_cv_func_mremap=no} +ac_cv_func_nl_langinfo=${ac_cv_func_nl_langinfo=no} +ac_cv_func_openpty=${ac_cv_func_openpty=no} +ac_cv_func_poll=${ac_cv_func_poll=no} +ac_cv_func_posix2time=${ac_cv_func_posix2time=no} +ac_cv_func_posix_fadvise=${ac_cv_func_posix_fadvise=no} +ac_cv_func_posix_madvise=${ac_cv_func_posix_madvise=no} +ac_cv_func_posix_memalign=${ac_cv_func_posix_memalign=no} +ac_cv_func_ppoll=${ac_cv_func_ppoll=no} +ac_cv_func_pread=${ac_cv_func_pread=no} +ac_cv_func_pwrite=${ac_cv_func_pwrite=no} +ac_cv_func_res_gethostbyname=${ac_cv_func_res_gethostbyname=no} +ac_cv_func_sbrk=${ac_cv_func_sbrk=no} +ac_cv_func_setlocale=${ac_cv_func_setlocale=yes} +ac_cv_func_setns=${ac_cv_func_setns=no} +ac_cv_func_setprotoent=${ac_cv_func_setprotoent=no} +ac_cv_func_setsid=${ac_cv_func_setsid=no} +ac_cv_func_strerror=${ac_cv_func_strerror=yes} +ac_cv_func_strerror_r=${ac_cv_func_strerror_r=no} +ac_cv_func_strftime=${ac_cv_func_strftime=yes} +ac_cv_func_strlcat=${ac_cv_func_strlcat=no} +ac_cv_func_strlcpy=${ac_cv_func_strlcpy=no} +ac_cv_func_strncasecmp=${ac_cv_func_strncasecmp=no} +ac_cv_func_time2posix=${ac_cv_func_time2posix=no} +ac_cv_func_vprintf=${ac_cv_func_vprintf=no} +ac_cv_func_vsyslog=${ac_cv_func_vsyslog=no} +ac_cv_func_writev=${ac_cv_func_writev=no} +ac_cv_have_decl_IN6ADDR_ANY_INIT=${ac_cv_have_decl_IN6ADDR_ANY_INIT=no} +ac_cv_have_decl_IN6ADDR_LOOPBACK_INIT=${ac_cv_have_decl_IN6ADDR_LOOPBACK_INIT=no} +ac_cv_have_decl_IPV6_V6ONLY=${ac_cv_have_decl_IPV6_V6ONLY=no} +ac_cv_have_decl_posix2time=${ac_cv_have_decl_posix2time=no} +ac_cv_have_decl_time2posix=${ac_cv_have_decl_time2posix=no} +ac_cv_header_arpa_nameser_h=${ac_cv_header_arpa_nameser_h=no} +ac_cv_header_dirent_dirent_h=${ac_cv_header_dirent_dirent_h=no} +ac_cv_header_dirent_ndir_h=${ac_cv_header_dirent_ndir_h=no} +ac_cv_header_dirent_sys_dir_h=${ac_cv_header_dirent_sys_dir_h=no} +ac_cv_header_dirent_sys_ndir_h=${ac_cv_header_dirent_sys_ndir_h=no} +ac_cv_header_dlfcn_h=${ac_cv_header_dlfcn_h=no} +ac_cv_header_elf_h=${ac_cv_header_elf_h=no} +ac_cv_header_fcntl_h=${ac_cv_header_fcntl_h=yes} +ac_cv_header_ieeefp_h=${ac_cv_header_ieeefp_h=no} +ac_cv_header_ifaddrs_h=${ac_cv_header_ifaddrs_h=no} +ac_cv_header_inttypes_h=${ac_cv_header_inttypes_h=yes} +ac_cv_header_langinfo_h=${ac_cv_header_langinfo_h=no} +ac_cv_header_libdlpi_h=${ac_cv_header_libdlpi_h=no} +ac_cv_header_libutil_h=${ac_cv_header_libutil_h=no} +ac_cv_header_limits_h=${ac_cv_header_limits_h=yes} +ac_cv_header_linux_errqueue_h=${ac_cv_header_linux_errqueue_h=no} +ac_cv_header_linux_falloc_h=${ac_cv_header_linux_falloc_h=no} +ac_cv_header_linux_types_h=${ac_cv_header_linux_types_h=no} +ac_cv_header_malloc_h=${ac_cv_header_malloc_h=yes} +ac_cv_header_net_errno_h=${ac_cv_header_net_errno_h=no} +ac_cv_header_net_if_dl_h=${ac_cv_header_net_if_dl_h=no} +ac_cv_header_netinet_sctp_h=${ac_cv_header_netinet_sctp_h=no} +ac_cv_header_netpacket_packet_h=${ac_cv_header_netpacket_packet_h=no} +ac_cv_header_poll_h=${ac_cv_header_poll_h=no} +ac_cv_header_pty_h=${ac_cv_header_pty_h=no} +ac_cv_header_sched_h=${ac_cv_header_sched_h=no} +ac_cv_header_sdkddkver_h=${ac_cv_header_sdkddkver_h=yes} +ac_cv_header_setns_h=${ac_cv_header_setns_h=no} +ac_cv_header_stdint_h=${ac_cv_header_stdint_h=yes} +ac_cv_header_stdio_h=${ac_cv_header_stdio_h=yes} +ac_cv_header_stdlib_h=${ac_cv_header_stdlib_h=yes} +ac_cv_header_string_h=${ac_cv_header_string_h=yes} +ac_cv_header_strings_h=${ac_cv_header_strings_h=no} +ac_cv_header_sys_devpoll_h=${ac_cv_header_sys_devpoll_h=no} +ac_cv_header_sys_epoll_h=${ac_cv_header_sys_epoll_h=no} +ac_cv_header_sys_event_h=${ac_cv_header_sys_event_h=no} +ac_cv_header_sys_ioctl_h=${ac_cv_header_sys_ioctl_h=no} +ac_cv_header_sys_mman_h=${ac_cv_header_sys_mman_h=no} +ac_cv_header_sys_resource_h=${ac_cv_header_sys_resource_h=no} +ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no} +ac_cv_header_sys_socketio_h=${ac_cv_header_sys_socketio_h=no} +ac_cv_header_sys_sockio_h=${ac_cv_header_sys_sockio_h=no} +ac_cv_header_sys_stat_h=${ac_cv_header_sys_stat_h=yes} +ac_cv_header_sys_stropts_h=${ac_cv_header_sys_stropts_h=no} +ac_cv_header_sys_sysctl_h=${ac_cv_header_sys_sysctl_h=no} +ac_cv_header_sys_time_h=${ac_cv_header_sys_time_h=no} +ac_cv_header_sys_timerfd_h=${ac_cv_header_sys_timerfd_h=no} +ac_cv_header_sys_types_h=${ac_cv_header_sys_types_h=yes} +ac_cv_header_sys_uio_h=${ac_cv_header_sys_uio_h=no} +ac_cv_header_sys_un_h=${ac_cv_header_sys_un_h=no} +ac_cv_header_sys_wait_h=${ac_cv_header_sys_wait_h=no} +ac_cv_header_syslog_h=${ac_cv_header_syslog_h=no} +ac_cv_header_unistd_h=${ac_cv_header_unistd_h=no} +ac_cv_header_util_h=${ac_cv_header_util_h=no} +ac_cv_header_utmp_h=${ac_cv_header_utmp_h=no} +ac_cv_header_valgrind_valgrind_h=${ac_cv_header_valgrind_valgrind_h=no} +ac_cv_header_windows_h=${ac_cv_header_windows_h=yes} +ac_cv_header_winsock2_h=${ac_cv_header_winsock2_h=yes} +ac_cv_header_ws2tcpip_h=${ac_cv_header_ws2tcpip_h=yes} +ac_cv_host=${ac_cv_host=local-aarch64-pc-windows} +ac_cv_lib_dl_dlopen=${ac_cv_lib_dl_dlopen=no} +ac_cv_lib_dl_dlvsym=${ac_cv_lib_dl_dlvsym=no} +ac_cv_lib_dlpi_dlpi_open=${ac_cv_lib_dlpi_dlpi_open=no} +ac_cv_lib_inet_main=${ac_cv_lib_inet_main=no} +ac_cv_lib_kstat_kstat_open=${ac_cv_lib_kstat_kstat_open=no} +ac_cv_lib_kvm_kvm_open=${ac_cv_lib_kvm_kvm_open=no} +ac_cv_lib_m_sin=${ac_cv_lib_m_sin=no} +ac_cv_lib_rt_clock_gettime=${ac_cv_lib_rt_clock_gettime=no} +ac_cv_lib_socket_main=${ac_cv_lib_socket_main=yes} +ac_cv_lib_util_openpty=${ac_cv_lib_util_openpty=no} +ac_cv_member_struct_ifreq_ifr_enaddr=${ac_cv_member_struct_ifreq_ifr_enaddr=no} +ac_cv_member_struct_ifreq_ifr_hwaddr=${ac_cv_member_struct_ifreq_ifr_hwaddr=no} +ac_cv_member_struct_ifreq_ifr_ifindex=${ac_cv_member_struct_ifreq_ifr_ifindex=no} +ac_cv_member_struct_ifreq_ifr_index=${ac_cv_member_struct_ifreq_ifr_index=no} +ac_cv_member_struct_ifreq_ifr_map=${ac_cv_member_struct_ifreq_ifr_map=no} +ac_cv_member_struct_sockaddr_dl_sdl_len=${ac_cv_member_struct_sockaddr_dl_sdl_len=no} +ac_cv_member_struct_sockaddr_un_sun_path=${ac_cv_member_struct_sockaddr_un_sun_path=no} +ac_cv_objext=${ac_cv_objext=o} +# ac_cv_path_CP=${ac_cv_path_CP=/bin/cp} +# ac_cv_path_EGREP=${ac_cv_path_EGREP='/usr/bin/grep -E'} +# ac_cv_path_GREP=${ac_cv_path_GREP=/usr/bin/grep} +# ac_cv_path_MKDIR=${ac_cv_path_MKDIR=/bin/mkdir} +# ac_cv_path_PERL=${ac_cv_path_PERL=/usr/bin/perl} +# ac_cv_path_install=${ac_cv_path_install='/usr/bin/install -c'} +ac_cv_prog_AR=${ac_cv_prog_AR=ar.sh} +ac_cv_prog_CC=${ac_cv_prog_CC=cc.sh} +ac_cv_prog_CPP=${ac_cv_prog_CPP='cc.sh -E'} +ac_cv_prog_GETCONF=${ac_cv_prog_GETCONF=getconf} +ac_cv_prog_JAVAC=${ac_cv_prog_JAVAC=javac.sh} +ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=true} +ac_cv_prog_cc_c11=${ac_cv_prog_cc_c11=no} +ac_cv_prog_cc_c89=${ac_cv_prog_cc_c89=no} +ac_cv_prog_cc_c99=${ac_cv_prog_cc_c99=no} +ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes} +ac_cv_prog_cxx_11=${ac_cv_prog_cxx_11=no} +ac_cv_prog_cxx_g=${ac_cv_prog_cxx_g=yes} +ac_cv_prog_cxx_stdcxx=${ac_cv_prog_cxx_stdcxx=} +# ac_cv_prog_emu_cc=${ac_cv_prog_emu_cc=$ERL_TOP/git/otp/erts/etc/win32/wsl_tools/vc/emu_cc.sh} +# ac_cv_prog_javac_ver_1_6=${ac_cv_prog_javac_ver_1_6=no} +# ac_cv_prog_mkdir_p=${ac_cv_prog_mkdir_p='/usr/bin/install -c -d'} +ac_cv_search_fdatasync=${ac_cv_search_fdatasync=no} +ac_cv_search_opendir=${ac_cv_search_opendir=no} +ac_cv_search_strerror=${ac_cv_search_strerror='none required'} +ac_cv_sizeof__Float16=${ac_cv_sizeof__Float16=0} +ac_cv_sizeof___int128_t=${ac_cv_sizeof___int128_t=0} +ac_cv_sizeof___int64=${ac_cv_sizeof___int64=8} +ac_cv_sizeof_char=${ac_cv_sizeof_char=1} +ac_cv_sizeof_int=${ac_cv_sizeof_int=4} +ac_cv_sizeof_long=${ac_cv_sizeof_long=4} +ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long=8} +ac_cv_sizeof_off_t=${ac_cv_sizeof_off_t=4} +ac_cv_sizeof_short=${ac_cv_sizeof_short=2} +ac_cv_sizeof_size_t=${ac_cv_sizeof_size_t=8} +ac_cv_sizeof_suseconds_t=${ac_cv_sizeof_suseconds_t=0} +ac_cv_sizeof_time_t=${ac_cv_sizeof_time_t=8} +ac_cv_sizeof_void_p=${ac_cv_sizeof_void_p=8} +ac_cv_struct_sockaddr_sa_len=${ac_cv_struct_sockaddr_sa_len=no} +ac_cv_struct_tm=${ac_cv_struct_tm=time.h} +# ac_cv_sys_ipv6_support=${ac_cv_sys_ipv6_support=yes} +ac_cv_sys_multicast_support=${ac_cv_sys_multicast_support=no} +ac_cv_target=${ac_cv_target=local-aarch64-pc-windows} +ac_cv_type_off_t=${ac_cv_type_off_t=yes} +ac_cv_type_pid_t=${ac_cv_type_pid_t=no} +ac_cv_type_size_t=${ac_cv_type_size_t=yes} +erl_cv_clock_gettime_monotonic_default_resolution=${erl_cv_clock_gettime_monotonic_default_resolution=no} +erl_cv_clock_gettime_monotonic_high_resolution=${erl_cv_clock_gettime_monotonic_high_resolution=no} +erl_cv_clock_gettime_monotonic_raw=${erl_cv_clock_gettime_monotonic_raw=no} +erl_cv_clock_gettime_monotonic_try_find_pthread_compatible=${erl_cv_clock_gettime_monotonic_try_find_pthread_compatible=no} +erl_cv_clock_gettime_wall_default_resolution=${erl_cv_clock_gettime_wall_default_resolution=no} +erl_cv_mach_clock_get_time_monotonic=${erl_cv_mach_clock_get_time_monotonic=no} +erl_cv_mach_clock_get_time_wall=${erl_cv_mach_clock_get_time_wall=no} +erts_cv___after_morecore_hook_can_track_malloc=${erts_cv___after_morecore_hook_can_track_malloc=no} +erts_cv_fwrite_unlocked=${erts_cv_fwrite_unlocked=no} +erts_cv_have__end_symbol=${erts_cv_have__end_symbol=no} +erts_cv_have_end_symbol=${erts_cv_have_end_symbol=no} +erts_cv_have_in6addr_any=${erts_cv_have_in6addr_any=no} +erts_cv_have_in6addr_loopback=${erts_cv_have_in6addr_loopback=no} +erts_cv_putc_unlocked=${erts_cv_putc_unlocked=no} +erts_cv_windows_h_includes_winsock2_h=${erts_cv_windows_h_includes_winsock2_h=no} +ethr_cv_have__InterlockedAnd64=${ethr_cv_have__InterlockedAnd64=yes} +ethr_cv_have__InterlockedAnd=${ethr_cv_have__InterlockedAnd=yes} +ethr_cv_have__InterlockedCompareExchange128=${ethr_cv_have__InterlockedCompareExchange128=yes} +ethr_cv_have__InterlockedCompareExchange64=${ethr_cv_have__InterlockedCompareExchange64=yes} +# ethr_cv_have__InterlockedCompareExchange64_acq=${ethr_cv_have__InterlockedCompareExchange64_acq=no} +# ethr_cv_have__InterlockedCompareExchange64_rel=${ethr_cv_have__InterlockedCompareExchange64_rel=no} +ethr_cv_have__InterlockedCompareExchange=${ethr_cv_have__InterlockedCompareExchange=yes} +# ethr_cv_have__InterlockedCompareExchange_acq=${ethr_cv_have__InterlockedCompareExchange_acq=no} +# ethr_cv_have__InterlockedCompareExchange_rel=${ethr_cv_have__InterlockedCompareExchange_rel=no} +ethr_cv_have__InterlockedDecrement64=${ethr_cv_have__InterlockedDecrement64=yes} +# ethr_cv_have__InterlockedDecrement64_rel=${ethr_cv_have__InterlockedDecrement64_rel=no} +ethr_cv_have__InterlockedDecrement=${ethr_cv_have__InterlockedDecrement=yes} +# ethr_cv_have__InterlockedDecrement_rel=${ethr_cv_have__InterlockedDecrement_rel=no} +ethr_cv_have__InterlockedExchange64=${ethr_cv_have__InterlockedExchange64=yes} +ethr_cv_have__InterlockedExchange=${ethr_cv_have__InterlockedExchange=yes} +ethr_cv_have__InterlockedExchangeAdd64=${ethr_cv_have__InterlockedExchangeAdd64=yes} +# ethr_cv_have__InterlockedExchangeAdd64_acq=${ethr_cv_have__InterlockedExchangeAdd64_acq=no} +ethr_cv_have__InterlockedExchangeAdd=${ethr_cv_have__InterlockedExchangeAdd=yes} +# ethr_cv_have__InterlockedExchangeAdd_acq=${ethr_cv_have__InterlockedExchangeAdd_acq=no} +ethr_cv_have__InterlockedIncrement64=${ethr_cv_have__InterlockedIncrement64=yes} +# ethr_cv_have__InterlockedIncrement64_acq=${ethr_cv_have__InterlockedIncrement64_acq=no} +ethr_cv_have__InterlockedIncrement=${ethr_cv_have__InterlockedIncrement=yes} +# ethr_cv_have__InterlockedIncrement_acq=${ethr_cv_have__InterlockedIncrement_acq=no} +ethr_cv_have__InterlockedOr64=${ethr_cv_have__InterlockedOr64=yes} +ethr_cv_have__InterlockedOr=${ethr_cv_have__InterlockedOr=yes} +i_cv_fallocate_works=${i_cv_fallocate_works=no} +i_cv_posix_fallocate_works=${i_cv_posix_fallocate_works=no} diff --git a/make/configure b/make/configure index 11ebf99c841f..b53787e0ba8e 100755 --- a/make/configure +++ b/make/configure @@ -3306,6 +3306,17 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + +no_werror_CFLAGS=$(echo " $CFLAGS " | sed 's/ -Werror / /g') +if test "X $CFLAGS " != "X$no_werror_CFLAGS"; then + CFLAGS="$no_werror_CFLAGS" + WERRORFLAGS=-Werror +fi default_cache_file=./config.cache @@ -3486,6 +3497,13 @@ test -n "$target_alias" && # Adjust for local legacy windows hack... case $host in #( + local-aarch64-*-windows) : + + host=win32 + host_os=win32 + host_vendor= + host_cpu=aarch64 + ;; #( local-*-windows) : host=win32 @@ -3500,6 +3518,13 @@ esac # Adjust for local legacy windows hack... case $build in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : build=win32 @@ -3514,6 +3539,13 @@ esac # Adjust for local legacy windows hack... case $target in #( + local-aarch64-*-windows) : + + build=win32 + build_os=win32 + build_vendor= + build_cpu=aarch64 + ;; #( local-*-windows) : target=win32 @@ -3525,18 +3557,19 @@ esac ;; esac - if test "$cross_compiling" = "yes" -a "$build" = "$host" + if test "$cross_compiling" = "yes" -a "$build" = "$host" -a "$build_cpu" = "$host_cpu" then : as_fn_error $? " - Cross compiling with the same canonicalized 'host' value - as the canonicalized 'build' value. + Cross compiling with the same canonicalized 'host' and 'host_cpu' + values as the canonicalized 'build' and 'build_cpu' values We are cross compiling since the '--host=$host_alias' and the '--build=$build_alias' arguments differ. When cross compiling Erlang/OTP, also the canonicalized values of the '--build' and the '--host' arguments *must* differ. The canonicalized values of these arguments however both equals: - $host + host = build = $host, + host_cpu = build_cpu = $host_cpu You can check the canonical value by passing a value as argument to the 'make/autoconf/config.sub' script. @@ -7255,6 +7288,11 @@ fi + + +if test "x$GCC" = xyes; then + CFLAGS="$WERRORFLAGS $CFLAGS" +fi ac_config_files="$ac_config_files ../Makefile output.mk ../make/$host/otp_ded.mk:../make/otp_ded.mk.in" diff --git a/make/configure.ac b/make/configure.ac index f2f423b09ff7..3d14c1901238 100644 --- a/make/configure.ac +++ b/make/configure.ac @@ -26,6 +26,8 @@ m4_include([otp.m4]) LM_PRECIOUS_VARS +ERL_PUSH_WERROR + default_cache_file=./config.cache if test "x$no_recursion" != "xyes" -a "x$OVERRIDE_CONFIG_CACHE" = "x"; then @@ -372,6 +374,8 @@ fi ERL_DED +ERL_POP_WERROR + AC_CONFIG_FILES([../Makefile output.mk ../make/$host/otp_ded.mk:../make/otp_ded.mk.in]) AC_OUTPUT diff --git a/make/ex_doc.exs b/make/ex_doc.exs index 9e2d71572ea4..bb19a1c7b8df 100644 --- a/make/ex_doc.exs +++ b/make/ex_doc.exs @@ -228,6 +228,9 @@ config = [ :epub -> """ + + """ end ] diff --git a/make/test_target_script.sh b/make/test_target_script.sh index 83e614135a9b..868436a3c5ce 100755 --- a/make/test_target_script.sh +++ b/make/test_target_script.sh @@ -112,7 +112,7 @@ EOM release_erlang () { local RELEASE_ROOT="${1}" - if ! (cd $ERL_TOP && make release TYPE= release_docs DOC_TARGETS=chunks RELEASE_ROOT="${RELEASE_ROOT}"); then + if ! (cd $ERL_TOP && ${MAKE:-make} release TYPE= release_docs DOC_TARGETS=chunks RELEASE_ROOT="${RELEASE_ROOT}"); then return 1 fi if ! (cd "$RELEASE_ROOT" && ./Install -minimal "`pwd`"); then @@ -120,7 +120,7 @@ release_erlang () { fi ## Need to release both TYPE= and TYPE=$TYPE for tests to work if [ "$TYPE" != "" ]; then - if ! (cd $ERL_TOP && make release TYPE=$TYPE RELEASE_ROOT="${RELEASE_ROOT}"); then + if ! (cd $ERL_TOP && ${MAKE:-make} release TYPE=$TYPE RELEASE_ROOT="${RELEASE_ROOT}"); then return 1 fi fi @@ -231,7 +231,7 @@ then fi fi -make RELEASE_PATH=$MAKE_TEST_DIR release_tests_spec > $RELEASE_TEST_SPEC_LOG 2>&1 +${MAKE:-make} RELEASE_PATH=$MAKE_TEST_DIR release_tests_spec > $RELEASE_TEST_SPEC_LOG 2>&1 if [ $? != 0 ] then @@ -271,7 +271,7 @@ fi # Compile test server and configure if [ ! -f "$ERL_TOP/lib/common_test/test_server/variables" ]; then cd "$ERL_TOP/lib/common_test/test_server" - ( make && erl -noshell -eval "ts:install()." -s init stop ) > "$INSTALL_TEST_LOG" 2>&1 + ( ${MAKE:-make} && erl -noshell -eval "ts:install()." -s init stop ) > "$INSTALL_TEST_LOG" 2>&1 if [ $? != 0 ] then cat "$INSTALL_TEST_LOG" diff --git a/otp_build b/otp_build index fbb8f42f2a94..d28f913870a1 100755 --- a/otp_build +++ b/otp_build @@ -176,12 +176,24 @@ set_config_flags () # the cross configuration have been moved here). if target_contains win32; then - if [ "$CONFIG_SUBTYPE" = "win64" ]; then - bht_type=local-x86_64-pc-windows + if [ "$CONFIG_SUBTYPE" = "win64" ]; then + build_type=local-x86_64-pc-windows + host_type=local-x86_64-pc-windows + target_type=local-x86_64-pc-windows + elif [ "$CONFIG_SUBTYPE" = "arm64" ]; then + build_type=local-aarch64-pc-windows + host_type=local-aarch64-pc-windows + target_type=local-aarch64-pc-windows + elif [ "$CONFIG_SUBTYPE" = "x64_arm64" ]; then + build_type=local-x86_64-pc-windows + host_type=local-aarch64-pc-windows + target_type=local-aarch64-pc-windows else - bht_type=local-x86-pc-windows + build_type=local-x86-pc-windows + host_type=local-x86-pc-windows + target_type=local-x86-pc-windows fi - CONFIG_FLAGS="--build=$bht_type --host=$bht_type --target=$bht_type $CONFIG_FLAGS" + CONFIG_FLAGS="--build=$build_type --host=$host_type --target=$target_type $CONFIG_FLAGS" fi @@ -740,7 +752,7 @@ echo_env_msys () echo_env_wsl () { - X64=$1 + ARCH=$1 #echo_envinfo if [ X"$SHELL" = X"" ]; then echo "You need to export the shell variable first," \ @@ -756,26 +768,37 @@ echo_env_wsl () WIN32_WRAPPER_PATH="$ERL_TOP/erts/etc/win32/wsl_tools/vc:$ERL_TOP/erts/etc/win32/wsl_tools" if [ ! -n "`lookup_prog_in_path cl`" ]; then - if [ X"$X64" = X"true" ]; then + if [ X"$ARCH" = X"x64" ]; then setup_win32_cl_env "x64" `wslpath -a -m erts/etc/win32/wsl_tools/SetupWSLcross.bat` + elif [ X"$ARCH" = X"arm64" ]; then + setup_win32_cl_env "arm64" `wslpath -a -m erts/etc/win32/wsl_tools/SetupWSLcross.bat` + elif [ X"$ARCH" = X"x64_arm64" ]; then + setup_win32_cl_env "x64_arm64" `wslpath -a -m erts/etc/win32/wsl_tools/SetupWSLcross.bat` else setup_win32_cl_env "x86" `wslpath -a -m erts/etc/win32/wsl_tools/SetupWSLcross.bat` fi fi echo_setenv OVERRIDE_TARGET win32 ';' - if [ X"$X64" = X"true" ]; then + if [ X"$ARCH" = X"x64" ]; then echo_setenv CONFIG_SUBTYPE win64 ';' + elif [ X"$ARCH" = X"arm64" -o X"$ARCH" = X"x64_arm64" ]; then + echo_setenv CONFIG_SUBTYPE "$ARCH" ';' fi echo_setenv WSLcross true ';' echo_setenv CC cc.sh ';' echo_setenv CXX cc.sh ';' echo_setenv AR ar.sh ';' echo_setenv RANLIB true ';' - if [ X"$X64" = X"true" ]; then + if [ X"$ARCH" = X"x64" ]; then if [ -f "$ERL_TOP/make/autoconf/win64.config.cache.static" ]; then echo_setenv OVERRIDE_CONFIG_CACHE_STATIC "$ERL_TOP/make/autoconf/win64.config.cache.static" ';' fi echo_setenv OVERRIDE_CONFIG_CACHE "$ERL_TOP/make/autoconf/win64.config.cache" ';' + elif [ X"$ARCH" = X"arm64" -o X"$ARCH" = X"x64_arm64" ]; then + if [ -f "$ERL_TOP/make/autoconf/win64-$ARCH.config.cache.static" ]; then + echo_setenv OVERRIDE_CONFIG_CACHE_STATIC "$ERL_TOP/make/autoconf/win64-$ARCH.config.cache.static" ';' + fi + echo_setenv OVERRIDE_CONFIG_CACHE "$ERL_TOP/make/autoconf/win64-$ARCH.config.cache" ';' else if [ -f "$ERL_TOP/make/autoconf/win32.config.cache.static" ]; then echo_setenv OVERRIDE_CONFIG_CACHE_STATIC "$ERL_TOP/make/autoconf/win32.config.cache.static" ';' @@ -1349,25 +1372,42 @@ case "$1" in fi; do_debuginfo_win32 "$2";; env_win32) - if [ x"$2" = x"x64" -o x"$2" = x"amd64" ]; then - ISX64=true + if [ x"$2" = x"x64" -o x"$2" = x"amd64" ]; then + ISX64=true + WSL_ARCH=x64 + elif [ x"$2" = x"arm64" ]; then + ISX64=false + WSL_ARCH=arm64 + elif [ x"$2" = x"x64_arm64" ]; then + ISX64=false + WSL_ARCH=x64_arm64 + else + ISX64=false + WSL_ARCH=x86 fi - if [ -x /bin/wslpath ]; then - echo_env_wsl $ISX64 - elif [ -x /usr/bin/msys-?.0.dll ]; then - echo_env_msys $ISX64 + if [ -x /bin/wslpath ]; then + echo_env_wsl $WSL_ARCH + elif [ -x /usr/bin/msys-?.0.dll ]; then + echo_env_msys $ISX64 else - echo_env_cygwin $ISX64 + echo_env_cygwin $ISX64 fi;; env_mingw32) echo_env_mingw32;; env_win64) - if [ -x /bin/wslpath ]; then - echo_env_wsl true - elif [ -x /usr/bin/msys-?.0.dll ]; then - echo_env_msys true + if [ -x /bin/wslpath ]; then + if [ x"$2" = x"arm64" ]; then + WSL_ARCH=arm64 + elif [ x"$2" = x"x64_arm64" ]; then + WSL_ARCH=x64_arm64 + else + WSL_ARCH=x64 + fi + echo_env_wsl $WSL_ARCH + elif [ -x /usr/bin/msys-?.0.dll ]; then + echo_env_msys true else - echo_env_cygwin true + echo_env_cygwin true fi;; env_msys32) echo_env_msys;; diff --git a/scripts/pre-push b/scripts/pre-push index f1a6de50fd8b..772d3f273ef1 100755 --- a/scripts/pre-push +++ b/scripts/pre-push @@ -23,14 +23,14 @@ # # Bump this version to give users an update notification. -PRE_PUSH_SCRIPT_VERSION=5 +PRE_PUSH_SCRIPT_VERSION=6 -NEW_RELEASES="26 25 24 23 22 21 20 19 18 17" +NEW_RELEASES="27 26 25 24 23 22 21 20 19 18 17" OLD_RELEASES="r16 r15 r14 r13" RELEASES="$NEW_RELEASES $OLD_RELEASES" # First commit on master, not allowed in other branches -MASTER_ONLY=c4a6a7a502cdb8ee0bd42d0e2cc58fe5bc0325a3 +MASTER_ONLY=bff328f24263af6c600efa8a2755a175c9dbb94f # Number of commits and files allowed in one push by this script NCOMMITS_MAX=100 @@ -230,18 +230,20 @@ then exit 1 fi - # Check for fixup! commits - FIXUPS=`git log --format='format:%h: %s' $remote_sha..$local_sha | grep -E '^\w+: fixup!'` - if [ -n "$FIXUPS" ] + # Check for invalid commit messages + INVALID_MSG='(fixup!|squash!|TEST|DEBUG)' + BAD_COMMITS=`git log --format='format:%h: %s' $remote_sha..$local_sha | grep -E "^\w+: $INVALID_MSG"` + if [ -n "$BAD_COMMITS" ] then error_color echo "$0 says:" echo "***" - echo "*** \"fixup!\" commit found: NOT ALLOWED!!!!" + echo "*** Forbidden commit message found!!!!" + echo "*** Not allowed: $INVALID_MSG" echo "***" notice_color cat <` operator is more efficient than multiple calls to `maps:put/3`, -especially for small maps. +If the compiler can determine that the third argument is always a map, it +will rewrite the call to `maps:put/3` to use the map syntax for updating the map. + +For example, consider the following function: + +```erlang +add_to_known_map(Map0, A, B, C) when is_map(Map0) -> + Map1 = maps:put(a, A, Map0), + Map2 = maps:put(b, B, Map1), + maps:put(c, C, Map2). +``` + +The compiler first rewrites each call to `maps:put/3` to use the map +syntax, and subsequently combines the three update operations to a +single update operation: + +```erlang +add_to_known_map(Map0, A, B, C) when is_map(Map0) -> + Map0#{a => A, b => B, c => C}. +``` + +If the compiler cannot determine that the third argument is always a +map, it retains the `maps:put/3` call. For example, given this +function: + +```erlang +add_to_map(Map0, A, B, C) -> + Map1 = maps:put(a, A, Map0), + Map2 = maps:put(b, B, Map1), + maps:put(c, C, Map2). +``` + +the compiler keeps the first call to `maps:put/3`, but rewrites +and combines the other two calls: + +```erlang +add_to_map(Map0, A, B, C) -> + Map1 = maps:put(a, A, Map0), + Map1#{b => B, c => C}. +``` + +> #### Change {: .info } +> +> The rewriting of `maps:put/3` to the map syntax was introduced in +> Erlang/OTP 28. ### maps:remove/2 diff --git a/system/doc/general_info/DEPRECATIONS b/system/doc/general_info/DEPRECATIONS index 3e5ba5150c41..7a19723a7a91 100644 --- a/system/doc/general_info/DEPRECATIONS +++ b/system/doc/general_info/DEPRECATIONS @@ -17,6 +17,13 @@ # is scheduled to be removed in OTP 25. # +# +# Added in OTP 28. +# +crypto:start/0 since=28 +crypto:stop/0 since=28 +crypto:enable_fips_mode/1 since=28 + # # Added in OTP 27. # diff --git a/system/doc/reference_manual/expressions.md b/system/doc/reference_manual/expressions.md index 5b600e581658..bc1b51683afb 100644 --- a/system/doc/reference_manual/expressions.md +++ b/system/doc/reference_manual/expressions.md @@ -577,7 +577,7 @@ Finally, let us assume that `a()` returns `{ok,-1}`. Because `true = A >= 0` use the match operator `=`, a `{badmatch,false}` run-time error occurs when the expression fails to match the pattern. -The example can be written in a less succient way using nested case expressions: +The example can be written in a less succinct way using nested case expressions: ``` case a() of @@ -1963,30 +1963,57 @@ is either a **generator** or a **filter**. > > Map comprehensions and map generators were introduced in Erlang/OTP 26. -There are three kinds of generators. +There are three kinds of generators, each with a relaxed and a strict +variant. -A _list generator_ has the following syntax: +> #### Change {: .info } +> +> Strict generators were introduced in Erlang/OTP 28. + +Relaxed generators ignore terms in the right-hand side expression that +do not match the left-hand side pattern. Strict generators on the other +hand fail with exception `badmatch`. + +A _list generator_ has the following syntax for relaxed: ``` Pattern <- ListExpr ``` +and strict variant: + +``` +Pattern <:- ListExpr +``` + where `ListExpr` is an expression that evaluates to a list of terms. -A _bit string generator_ has the following syntax: +A _bit string generator_ has the following syntax for relaxed: ``` BitstringPattern <= BitStringExpr ``` +and strict variant: + +``` +BitstringPattern <:= BitStringExpr +``` + where `BitStringExpr` is an expression that evaluates to a bit string. -A _map generator_ has the following syntax: +A _map generator_ has the following syntax for relaxed: ``` KeyPattern := ValuePattern <- MapExpression ``` +and strict variant: + +``` +KeyPattern := ValuePattern <:- MapExpression +``` + where `MapExpr` is an expression that evaluates to a map, or a map iterator obtained by calling `maps:iterator/1` or `maps:iterator/2`.