{"id":20138261,"url":"https://github.com/kukuster/ci_methods_analyser","last_synced_at":"2026-02-09T17:35:38.047Z","repository":{"id":62562197,"uuid":"351127329","full_name":"Kukuster/CI_methods_analyser","owner":"Kukuster","description":"Analyse efficacy of your own confidence interval (CI) methods","archived":false,"fork":false,"pushed_at":"2024-12-24T18:28:16.000Z","size":6179,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-08T20:55:53.333Z","etag":null,"topics":["accuracy","analytical-solution","ci-methods","confidence-interval","confidence-interval-plot","confidence-intervals","efficacy","mathematics","proportions","rnd","statistical-models","statistical-significance","statistics","statistics-toolbox","tool","toolkit","uncertainty","wald-interval","wilson-score","z-test"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/CI-methods-analyser/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kukuster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-24T15:18:27.000Z","updated_at":"2024-12-24T18:28:20.000Z","dependencies_parsed_at":"2024-12-24T19:31:57.405Z","dependency_job_id":"173679dc-a4ca-41e6-833c-1803d79275d6","html_url":"https://github.com/Kukuster/CI_methods_analyser","commit_stats":{"total_commits":21,"total_committers":1,"mean_commits":21.0,"dds":0.0,"last_synced_commit":"56d7d5f3c1ba0a9fdcdeafe5dff2219d9304a54e"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Kukuster/CI_methods_analyser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2FCI_methods_analyser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2FCI_methods_analyser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2FCI_methods_analyser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2FCI_methods_analyser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kukuster","download_url":"https://codeload.github.com/Kukuster/CI_methods_analyser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2FCI_methods_analyser/sbom","scorecard":{"id":80765,"data":{"date":"2025-08-11","repo":{"name":"github.com/Kukuster/CI_methods_analyser","commit":"7d3d236dd427aae9fe616ac5cd647f8a895f0318"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-15T05:47:46.353Z","repository_id":62562197,"created_at":"2025-08-15T05:47:46.353Z","updated_at":"2025-08-15T05:47:46.353Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276204814,"owners_count":25602738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-21T02:00:07.055Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accuracy","analytical-solution","ci-methods","confidence-interval","confidence-interval-plot","confidence-intervals","efficacy","mathematics","proportions","rnd","statistical-models","statistical-significance","statistics","statistics-toolbox","tool","toolkit","uncertainty","wald-interval","wilson-score","z-test"],"created_at":"2024-11-13T21:36:59.794Z","updated_at":"2025-09-21T06:32:32.909Z","avatar_url":"https://github.com/Kukuster.png","language":"Python","funding_links":["https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E"],"categories":[],"sub_categories":[],"readme":"\u003cdiv style=\"text-align: center; margin: auto\"\u003e\n    \u003cimg style=\"display: inline-block; margin: 5px; margin-bottom: 1px;\" src=\"https://img.shields.io/badge/dynamic/json?url=https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/ci-methods-analyser\u0026label=downloads\u0026query=$.downloads\" alt=\"number of downloads\" /\u003e\n    \u003cimg style=\"display: inline-block; margin: 5px; margin-bottom: 1px;\" src=\"https://img.shields.io/badge/dynamic/json?url=https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/ci-methods-analyser\u0026label=within\u0026query=$.downloads_period\" alt=\"downloads period\" /\u003e\n\u003c/div\u003e\n\n# CI methods analyser\nA toolkit for measuring the efficacy of various methods for calculating a confidence interval.\nCurrently provides a toolkit for measuring the efficacy of methods for a confidence interval for the following statistics:\n\n - proportion\n - the difference between two proportions\n\nThis library was mainly inspired by the library:\n[\"Five Confidence Intervals for Proportions That You Should Know About\" by Dr. Dennis Robert](https://towardsdatascience.com/five-confidence-intervals-for-proportions-that-you-should-know-about-7ff5484c024f)\n\n## Dependencies\n - python \u003e=3.8\n - python libs:\n    - numpy\n    - scipy\n    - matplotlib\n    - tqdm\n\n## Installation\n\nhttps://pypi.org/project/CI-methods-analyser/\n\n\n## Applications\n\n**Applied statistics and data science:** compare multiple CI methods to select the most appropriate for specific scenarios (by its accuracy at a specific range of true population properties, by computational performance, etc.)\n\n**Education on statistics and CI:** demonstrates how different CI methods perform under various conditions, helps to understand the concept of CI by comparing methods for evaluation of accuracy of CI methods\n\n\n## Usage\n\n### \u003cu\u003eTesting Wald Interval - a popular method for calculating a confidence interval for proportion\u003c/u\u003e\n\nWald Interval is defined as so:\n\n\u003cdiv style=\"text-align: center; margin: auto\"\u003e\n    \u003cimg style=\"display: inline-block; margin: 5px\" src=\"https://latex.codecogs.com/png.latex?%5Cbg_black%20%28w%5E-%2C%20w%5E\u0026plus;%29%20%3D%20%5Chat%7Bp%7D%5C%2C%5Cpm%5C%2Cz%5Csqrt%7B%5Cfrac%7B%5Chat%7Bp%7D%281-%5Chat%7Bp%7D%29%7D%7Bn%7D%7D\" alt=\"$$ (w^-, w^+) = p\\,\\pm\\,z\\sqrt{\\frac{p(1-p)}{n}} $$\" /\u003e\n\u003c/div\u003e\n\nHow well does it approximate the confidence interval?\n\nLet's assess what would be the quality of produced 95%CI with this method by testing on a range of proportions. We'll take 100 true proportions, with 1% step `[0.001, 0.011, 0.021, ..., 0.991]`.\n\n\n```python\nfrom CI_methods_analyser import CImethodForProportion_efficacyToolkit as toolkit, methods_for_CI_for_proportion\n\ntoolkit(\n    method=methods_for_CI_for_proportion.wald_interval, method_name=\"Wald Interval\"\n).calculate_coverage_and_show_plot(\n    sample_size=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title=\"Wald Interval coverage\"\n)\n\n\ninput('press Enter to exit')\n```\n\n\nThis outputs the image:\n\n![Wald Interval - real coverage](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/wald_interval_p_0.001_0.999_0.01_n100_conf95.png)\n\nThe plot indicates the overall bad performance of the method and particularly poor performance for extreme proportions. While for some true proportions the calculated CI has true confidence of around 95%, most of the time the confidence is significantly lower. For the true proportions of \u003c0.05 and \u003e0.95 the true confidence of the generated CI is generally lower than 90%, as indicated by the steep descent on the left-most and right-most parts of the plot.\n\n\u003chr\u003e\n\n*You really might want to use a different method. Check out this wonderful medium.com article by **Dr. Dennis Robert**:*\n - ***[Five Confidence Intervals for Proportions That You Should Know About](https://towardsdatascience.com/five-confidence-intervals-for-proportions-that-you-should-know-about-7ff5484c024f)** [code in R]*\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\nThe function `calculate_coverage_and_show_plot` that we just used is a shortcut. The code below does the same calculations and yields the same result. It relies on the public properties and methods, giving more control over parts of the calculation:\n\n```python\nfrom CI_methods_analyser import CImethodForProportion_efficacyToolkit as toolkit, methods_for_CI_for_proportion\n\n# take an already implemented method for calculating CI for proportions\nwald_interval = methods_for_CI_for_proportion.wald_interval\n\n# initialize the toolkit\nwald_interval_test_toolkit = toolkit(\n    method=wald_interval, method_name=\"Wald Interval\")\n\n\n# calculate the real coverage that the method produces\n# for each case of a true population proportion (taken from the list `proportions`)\nwald_interval_test_toolkit.calculate_coverage_analytically(\n    sample_size=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95)\n# now you can access the calculated coverage and a few statistics:\n# wald_interval_test_toolkit.coverage  # 1-d array of 0-100, the same shape as passed `proportions`\n# NOTE: `proportions`, when passed as a tuple of 3 float strings, expands to a list of evenly spaced float values where the #0 value is begin, #1 is end, #2 is step.\n# wald_interval_test_toolkit.average_coverage  # np.longdouble 0-100, avg of `coverage`\n# wald_interval_test_toolkit.average_deviation  # np.longdouble 0-100, avg abs diff w/ `confidence`\n\n# plots the calculated coverage in a matplotlib.pyplot figure\nwald_interval_test_toolkit.plot_coverage(\n    plt_figure_title=\"Wald Interval coverage\")\n# you can access the figure here:\n# wald_interval_test_toolkit.figure\n\n# shows the figure (non-blocking)\nwald_interval_test_toolkit.show_plot()\n\n# because show_plot() is non-blocking,\n# you have to pause the execution in order for the figure to be rendered completely\ninput('press Enter to exit')\n```\n\nI expose some style/color settings used by matplotlib.\n\nMy preference goes to the **night light-friendly** styling:\n\n```python\nfrom CI_methods_analyser import CImethodForProportion_efficacyToolkit as toolkit, methods_for_CI_for_proportion\n\n\ntoolkit(\n    method=methods_for_CI_for_proportion.wald_interval, method_name=\"Wald Interval\"\n).calculate_coverage_and_show_plot(\n    sample_size=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title=\"Wald Interval coverage\",\n    theme='dark_background', plot_color=\"green\", line_color=\"orange\"\n)\n\n\ninput('press Enter to exit')\n```\n\n![Wald Interval - real coverage (dark theme)](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/wald_interval_p_0.001_0.999_0.01_n100_conf95_dark.png)\n\n\n\n\n\u003cbr\u003e\n\n### \u003cu\u003eTesting custom method for CI for proportion\u003c/u\u003e\n\nYou can implement your own methods and test them:\n\n```python\nfrom CI_methods_analyser import CImethodForProportion_efficacyToolkit as toolkit\nfrom CI_methods_analyser.math_functions import normal_z_score_two_tailed\nfrom functools import lru_cache\n\n# not a particularly good method for calculating CI for proportion\n@lru_cache(100_000)\ndef im_telling_ya_test(x: int, n: int, conflevel: float = 0.95):\n    z = normal_z_score_two_tailed(conflevel)\n\n    p = float(x)/n\n    return (\n        p - 0.02*z,\n        p + 0.02*z\n    )\n\n\ntoolkit(\n    method=im_telling_ya_test, method_name='\"I\\'m telling ya\" test'\n).calculate_coverage_and_show_plot(\n    sample_size=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title='\"I\\'m telling ya\" coverage',\n    theme='dark_background', plot_color=\"green\", line_color=\"orange\"\n)\n\n\ninput('press Enter to exit')\n\n```\n![\"I'm telling ya\" test - real coverage](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/im_telling_ya_test_p_0.001_0.999_0.01_n100_conf95_dark.png)\n\n\nThis is the kind of test one would not trust. It shows very unreliable performance for the majority of the true proportions, as indicated by an extremely high discrepancy between the \"ordered\" confidence level of 95% and the true confidence of the CI range provided by this method. This means the output CIs are generally smaller than should be, therefore there's less confidence that the true value lies within the range of a CI. One could say, this method overestimates its ability to generate a confident range.\n\n\u003cb\u003eLet's try another custom method: \"God is my witness\" score\u003c/b\u003e\n\n```python\nfrom CI_methods_analyser import CImethodForProportion_efficacyToolkit as toolkit\nfrom CI_methods_analyser.math_functions import normal_z_score_two_tailed\nfrom functools import lru_cache\n\n# you could say, this method is \"too good\"\n@lru_cache(100_000)\ndef God_is_my_witness_score(x: int, n: int, conflevel: float = 0.95):\n    z = normal_z_score_two_tailed(conflevel)\n\n    p = float(x)/n\n    return (\n        (0 + p)/2 - 0.005*z,\n        (1 + p)/2 + 0.005*z\n    )\n\n\ntoolkit(\n    method=God_is_my_witness_score, method_name='\"God is my witness\" score'\n).calculate_coverage_and_show_plot(\n    sample_size=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title='\"God is my witness\" score coverage', theme='dark_background'\n)\n\ninput('press Enter to exit')\n```\n\n![\"God is my witness\" score - real coverage](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/God_is_my_witness_score_p_0.001_0.999_0.01_n100_conf95_dark.png)\n\n\nThis method clearly overdid the estimates. While one expects 95%CI, the output range is less clear, as it allows for a very wide range of possibilities. In a stats lingo one would say that this method is way too conservative.\n\n\n### \u003cu\u003eTesting methods for CI for the difference between two proportions\u003c/u\u003e\n\nLet's use the implemented **Pooled Z test**:\n\n\u003cdiv style=\"text-align: center; margin: auto\"\u003e\n    \u003cimg style=\"display: inline-block; margin: 5px\" src=\"https://latex.codecogs.com/gif.latex?%5Cbg_black%20%28%5Cdelta%5E-%2C%20%5Cdelta%5E\u0026plus;%29%20%3D%20%5Chat%7Bp%7D_T%20-%20%5Chat%7Bp%7D_C%20%5Cpm%20z_%7B%5Calpha%7D%5Csqrt%7B%5Cbar%7Bp%7D%281-%5Cbar%7Bp%7D%29%28%5Cfrac%7B1%7D%7Bn_T%7D\u0026plus;%5Cfrac%7B1%7D%7Bn_C%7D%29%7D\" alt=\"$$ (\\delta^-, \\delta^+) = \\hat{p}_T - \\hat{p}_C \\pm z_{\\alpha}\\sqrt{\\bar{p}(1-\\bar{p})(\\frac{1}{n_T}+\\frac{1}{n_C})} $$\" /\u003e\n\u003c/div\u003e\n, where:\n\u003cdiv style=\"text-align: center; margin: auto\"\u003e\n    \u003cimg style=\"display: inline-block; margin: 5px\" src=\"https://latex.codecogs.com/gif.latex?%5Cbg_black%20%5Cbar%7Bp%7D%20%3D%20%5Cfrac%7Bn_T%5Chat%7Bp%7D_T%20\u0026plus;%20n_C%5Chat%7Bp%7D_C%7D%7Bn_T%20\u0026plus;%20n_C%7D\" alt=\"$$ \\bar{p} = \\frac{n_T\\hat{p}_T + n_C\\hat{p}_C}{n_T + n_C} $$\" /\u003e\n\u003c/div\u003e\n\n\n```python\nfrom CI_methods_analyser import CImethodForDiffBetwTwoProportions_efficacyToolkit as toolkit_d, methods_for_CI_for_diff_betw_two_proportions as methods\n\n\ntoolkit_d(\n    method=methods.Z_test_pooled, method_name='Z test pooled'\n).calculate_coverage_and_show_plot(\n    sample_size1=100, sample_size2=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title='Z test pooled', theme='dark_background',\n)\n\ninput('press Enter to exit')\n```\n\n\n![Z test (unpooled) - real coverage](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/z_test_pooled_p_0.001_0.999_0.01_n1_100_n2_100_conf95.png)\n\nAs you can see, this test is generally perfect for close proportions (along `y = x` line) \u003cb\u003e[WHITE]\u003c/b\u003e, unless proportions have extreme values, where confidence of the outputted CIs is lower than expected \u003cb\u003e[PURPLE]\u003c/b\u003e\n\nAlso, this test is extremely conservative for the high and extreme differences between two proportions, i.e. for proportions whose values are far apart \u003cb\u003e[GREEN]\u003c/b\u003e\n\n\u003cbr\u003e\n\n\nYou may want to change the color palette (although I wouldn't):\n\n\n```python\nfrom CI_methods_analyser import CImethodForDiffBetwTwoProportions_efficacyToolkit as toolkit_d, methods_for_CI_for_diff_betw_two_proportions as methods\n\n\ntoolkit_d(\n    method=methods.Z_test_pooled, method_name='Z test pooled'\n).calculate_coverage_and_show_plot(\n    sample_size1=100, sample_size2=100, proportions=('0.001', '0.999', '0.01'), confidence=0.95,\n    plt_figure_title='Z test pooled', theme='dark_background',\n    colors=(\"gray\", \"purple\", \"white\", \"orange\", \"#d62728\")\n)\n\ninput('press Enter to exit')\n```\n\n![Z test (unpooled) - real coverage](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/z_test_pooled_p_0.001_0.999_0.01_n1_100_n2_100_conf95_hotcolors.png)\n\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## NOTES\n\n### Methods for measuring the efficacy of CI methods\nTwo ways can be used to calculate the efficacy of CI methods for a given confidence and a true population proportion:\n - approximately, with random simulation (as implemented in R by Dr. Dennis Robert, see link above). Here: `calculate_coverage_randomly`.\n - precisely, with the analytical solution. Here: `calculate_coverage_analytically`\n\n\u003cb\u003eBy default, always prefer the analytical solution.\u003c/b\u003e\n\nSampling the same binomial distribution n times, as it's typically done, (called \"random experiments\", or \"simulations\") is inefficient, because the binomial distribution is already fully determined by the given true population proportion.\n\nBy relying on the binomial distribution from scipy, the analytical solution provides 100% accuracy for any method (defined as a python function), any confidence level, any true population proportion(s), any sample and population size(s).\n\nMathematical proof of the analytical solution:\n\n![Proof of the analytical solution](https://github.com/Kukuster/CI_methods_analyser/raw/master/docs/2021-05-08_ci-method-for-proportions_analytical-solution.jpg)\n\n\nBoth \"simulation\" and \"analytical\" methods are implemented for CI for both statistics: *proportion*, and *the difference between two proportions*. For the precise analytical solution, an optimization was made. Theoretically, it is lossy, but practically, the error is always negligible (as shown by `test_z_precision_difference.py`) and is less significant than a 64-bit floating point precision error between the closest `float` representation and the true `Real` value. Optimization is regulated with the parameter `z_precision`, which is automatically estimated by default.\n\n\n\n\u003cbr\u003e\n\n## Various links\n**1. Equivalence and Noninferiority Testing (as I understand, are fancy terms for 2-sided and 1-sided p tests for the difference between two proportions)**\n - **[https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/PASS/Confidence_Intervals_for_the_Difference_Between_Two_Proportions.pdf](https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/PASS/Confidence_Intervals_for_the_Difference_Between_Two_Proportions.pdf)**\n - **[https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/PASS/Non-Inferiority_Tests_for_the_Difference_Between_Two_Proportions.pdf](https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/PASS/Non-Inferiority_Tests_for_the_Difference_Between_Two_Proportions.pdf)**\n - [https://www.ncss.com/wp-content/themes/ncss/pdf/Procedures/NCSS/Two_Proportions-Non-Inferiority,_Superiority,_Equivalence,_and_Two-Sided_Tests_vs_a_Margin.pdf](https://www.ncss.com/wp-content/themes/ncss/pdf/Procedures/NCSS/Two_Proportions-Non-Inferiority,_Superiority,_Equivalence,_and_Two-Sided_Tests_vs_a_Margin.pdf) \n - [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3019319/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3019319/)\n - [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2701110/](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2701110/)\n - [https://pubmed.ncbi.nlm.nih.gov/9595617/](https://pubmed.ncbi.nlm.nih.gov/9595617/)\n - [http://thescipub.com/pdf/10.3844/amjbsp.2010.23.31](http://thescipub.com/pdf/10.3844/amjbsp.2010.23.31) \n\n**2. Biostatistics course (Dr. Nicolas Padilla Raygoza, et al.)**\n - [https://docs.google.com/presentation/d/1t1DowyVDDRFYGHDlJgmYMRN4JCrvFl3q/edit#slide=id.p1](https://docs.google.com/presentation/d/1t1DowyVDDRFYGHDlJgmYMRN4JCrvFl3q/edit#slide=id.p1) \n - [https://www.google.com/search?q=Dr.+Sc.+Nicolas+Padilla+Raygoza+Biostatistics+course+Part+10\u0026oq=Dr.+Sc.+Nicolas+Padilla+Raygoza+Biostatistics+course+Part+10\u0026aqs=chrome..69i57.3448j0j7\u0026sourceid=chrome\u0026ie=UTF-8](https://www.google.com/search?q=Dr.+Sc.+Nicolas+Padilla+Raygoza+Biostatistics+course+Part+10\u0026oq=Dr.+Sc.+Nicolas+Padilla+Raygoza+Biostatistics+course+Part+10\u0026aqs=chrome..69i57.3448j0j7\u0026sourceid=chrome\u0026ie=UTF-8) \n - [https://slideplayer.com/slide/9837395/](https://slideplayer.com/slide/9837395/)\n\n**3. Using z-test instead of a binomial test:**\n - When can use [https://stats.stackexchange.com/questions/424446/when-can-we-use-a-z-test-instead-of-a-binomial-test](https://stats.stackexchange.com/questions/424446/when-can-we-use-a-z-test-instead-of-a-binomial-test) \n - How to use [https://cogsci.ucsd.edu/~dgroppe/STATZ/binomial_ztest.pdf](https://cogsci.ucsd.edu/~dgroppe/STATZ/binomial_ztest.pdf) \n\n\n\n## I accept donations!\n\n### Paypal\n\n\u003cp\u003e\n\u003c!--   \u003ca href=\"https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E\"\u003e\n      \u003cimg src=\"https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif\" alt=\"paypal\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003ca href=\"https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E\"\u003e\n      \u003cimg src=\"https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif\" alt=\"paypal\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n### Cryptocurrency\n\nYou can add a transaction message with the name of a project or a custom message if your wallet and the blockchain support this\n\nPreferred blockchains:\n\nblockchain | address |  \n--- | --- | ---\n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Bitcoin\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Bitcoin-402607?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjRjc5MzFBIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Qml0Y29pbjwvdGl0bGU+PHBhdGggZD0iTTIzLjYzOCAxNC45MDRjLTEuNjAyIDYuNDMtOC4xMTMgMTAuMzQtMTQuNTQyIDguNzM2QzIuNjcgMjIuMDUtMS4yNDQgMTUuNTI1LjM2MiA5LjEwNSAxLjk2MiAyLjY3IDguNDc1LTEuMjQzIDE0LjkuMzU4YzYuNDMgMS42MDUgMTAuMzQyIDguMTE1IDguNzM4IDE0LjU0OHYtLjAwMnptLTYuMzUtNC42MTNjLjI0LTEuNTktLjk3NC0yLjQ1LTIuNjQtMy4wM2wuNTQtMi4xNTMtMS4zMTUtLjMzLS41MjUgMi4xMDdjLS4zNDUtLjA4Ny0uNzA1LS4xNjctMS4wNjQtLjI1bC41MjYtMi4xMjctMS4zMi0uMzMtLjU0IDIuMTY1Yy0uMjg1LS4wNjctLjU2NS0uMTMyLS44NC0uMmwtMS44MTUtLjQ1LS4zNSAxLjQwN3MuOTc1LjIyNS45NTUuMjM2Yy41MzUuMTM2LjYzLjQ4Ni42MTUuNzY2bC0xLjQ3NyA1LjkyYy0uMDc1LjE2Ni0uMjQuNDA2LS42MTQuMzE0LjAxNS4wMi0uOTYtLjI0LS45Ni0uMjRsLS42NiAxLjUxIDEuNzEuNDI2LjkzLjI0Mi0uNTQgMi4xOSAxLjMyLjMyNy41NC0yLjE3Yy4zNi4xLjcwNS4xOSAxLjA1LjI3M2wtLjUxIDIuMTU0IDEuMzIuMzMuNTQ1LTIuMTljMi4yNC40MjcgMy45My4yNTcgNC42NC0xLjc3NC41Ny0xLjYzNy0uMDMtMi41OC0xLjIxNy0zLjE5Ni44NTQtLjE5MyAxLjUtLjc2IDEuNjgtMS45M2guMDF6bS0zLjAxIDQuMjJjLS40MDQgMS42NC0zLjE1Ny43NS00LjA1LjUzbC43Mi0yLjljLjg5Ni4yMyAzLjc1Ny42NyAzLjMzIDIuMzd6bS40MS00LjI0Yy0uMzcgMS40OS0yLjY2Mi43MzUtMy40MDUuNTVsLjY1NC0yLjY0Yy43NDQuMTggMy4xMzcuNTI0IDIuNzUgMi4wODR2LjAwNnoiLz48L3N2Zz4=\" /\u003e\u003c/a\u003e |  `bc1pjd2c4xcgq978979htc9admycue4nqqhda3vwsc38agked8yya50qz454xc` | \n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Ethereum\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Ethereum-6784c7?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjM0MzQzNEIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RXRoZXJldW08L3RpdGxlPjxwYXRoIGQ9Ik0xMS45NDQgMTcuOTdMNC41OCAxMy42MiAxMS45NDMgMjRsNy4zNy0xMC4zOC03LjM3MiA0LjM1aC4wMDN6TTEyLjA1NiAwTDQuNjkgMTIuMjIzbDcuMzY1IDQuMzU0IDcuMzY1LTQuMzVMMTIuMDU2IDB6Ii8+PC9zdmc+\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3` | \u003cspan\u003e![Tether](https://raw.githubusercontent.com/Kukuster/Kukuster/refs/heads/master/tether_20x20.svg)\u003c/span\u003e supports USDT ERC-20\n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via TRON\"\u003e\u003cimg src=\"https://img.shields.io/badge/-TRON-5C0E0E?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjRkYwNjBBIiBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDY0IDY0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2ZmMDYwYTt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPnRyb248L3RpdGxlPjxnIGlkPSJ0cm9uIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02MS41NSwxOS4yOGMtMy0yLjc3LTcuMTUtNy0xMC41My0xMGwtLjItLjE0YTMuODIsMy44MiwwLDAsMC0xLjExLS42MmwwLDBDNDEuNTYsNywzLjYzLS4wOSwyLjg5LDBhMS40LDEuNCwwLDAsMC0uNTguMjJMMi4xMi4zN2EyLjIzLDIuMjMsMCwwLDAtLjUyLjg0bC0uMDUuMTN2LjcxbDAsLjExQzUuODIsMTQuMDUsMjIuNjgsNTMsMjYsNjIuMTRjLjIuNjIuNTgsMS44LDEuMjksMS44NmguMTZjLjM4LDAsMi0yLjE0LDItMi4xNFM1OC40MSwyNi43NCw2MS4zNCwyM2E5LjQ2LDkuNDYsMCwwLDAsMS0xLjQ4QTIuNDEsMi40MSwwLDAsMCw2MS41NSwxOS4yOFpNMzYuODgsMjMuMzcsNDkuMjQsMTMuMTJsNy4yNSw2LjY4Wm0tNC44LS42N0wxMC44LDUuMjZsMzQuNDMsNi4zNVpNMzQsMjcuMjdsMjEuNzgtMy41MS0yNC45LDMwWk03LjkxLDcsMzAuMywyNiwyNy4wNiw1My43OFoiLz48L2c+PC9zdmc+\" /\u003e\u003c/a\u003e | `TMuNqEgEeBQ2GseWsqgaSdbtqasnJi8ePw` | \u003cspan\u003e![Tether](https://raw.githubusercontent.com/Kukuster/Kukuster/refs/heads/master/tether_20x20.svg)\u003c/span\u003e supports USDT TRC-20\n\n\n\n\u003cdetails\u003e\n  \u003csummary\u003eAlternative options (Ethereum L2, LN, EVM)\u003c/summary\u003e\n  \n  blockchain | address\n  --- | ---\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Polygon\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Polygon-2a0c60?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjN0IzRkU0IiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UG9seWdvbjwvdGl0bGU+PHBhdGggZD0ibTE3LjgyIDE2LjM0MiA1LjY5Mi0zLjI4N0EuOTguOTggMCAwIDAgMjQgMTIuMjFWNS42MzVhLjk4Ljk4IDAgMCAwLS40ODgtLjg0NmwtNS42OTMtMy4yODZhLjk4Ljk4IDAgMCAwLS45NzcgMEwxMS4xNSA0Ljc4OWEuOTguOTggMCAwIDAtLjQ4OS44NDZ2MTEuNzQ3TDYuNjcgMTkuNjg2bC0zLjk5Mi0yLjMwNHYtNC42MWwzLjk5Mi0yLjMwNCAyLjYzMyAxLjUyVjguODk2TDcuMTU4IDcuNjU4YS45OC45OCAwIDAgMC0uOTc3IDBMLjQ4OCAxMC45NDVhLjk4Ljk4IDAgMCAwLS40ODguODQ2djYuNTczYS45OC45OCAwIDAgMCAuNDg4Ljg0N2w1LjY5MyAzLjI4NmEuOTgxLjk4MSAwIDAgMCAuOTc3IDBsNS42OTItMy4yODZhLjk4Ljk4IDAgMCAwIC40ODktLjg0NlY2LjYxOGwuMDcyLS4wNDEgMy45Mi0yLjI2MyAzLjk5IDIuMzA1djQuNjA5bC0zLjk5IDIuMzA0LTIuNjMtMS41MTd2My4wOTJsMi4xNCAxLjIzNmEuOTgxLjk4MSAwIDAgMCAuOTc4IDB2LS4wMDFaIi8+PC9zdmc+\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Base\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Base-152846?logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjMwcHgiIGhlaWdodD0iMzBweCI+PHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTYzLjYgMzJjMCAxNy40LTE0LjIgMzEuNi0zMS42IDMxLjZDMTUuNSA2My42IDEuOSA1MC45LjUgMzQuN2g0MS43di01LjNILjVDMS45IDEzLjEgMTUuNS40IDMyIC40IDQ5LjUuNCA2My42IDE0LjYgNjMuNiAzMnoiPjwvcGF0aD48L3N2Zz4=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Arbitrum\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Arbitrum-3F3F3F?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxuczp4b2RtPSJodHRwOi8vd3d3LmNvcmVsLmNvbS9jb3JlbGRyYXcvb2RtLzIwMDMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjUwMCAyNTAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAwIDI1MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO30KCS5zdDF7ZmlsbDojMjEzMTQ3O30KCS5zdDJ7ZmlsbDojMTJBQUZGO30KCS5zdDN7ZmlsbDojOURDQ0VEO30KCS5zdDR7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KPGcgaWQ9IkxheWVyX3gwMDIwXzEiPgoJPGcgaWQ9Il8yNDA1NTg4NDc3MjMyIj4KCQk8cmVjdCBjbGFzcz0ic3QwIiB3aWR0aD0iMjUwMCIgaGVpZ2h0PSIyNTAwIj48L3JlY3Q+CgkJPGc+CgkJCTxnPgoJCQkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIyNiw3NjB2OTgwYzAsNjMsMzMsMTIwLDg4LDE1Mmw4NDksNDkwYzU0LDMxLDEyMSwzMSwxNzUsMGw4NDktNDkwYzU0LTMxLDg4LTg5LDg4LTE1MlY3NjAgICAgICBjMC02My0zMy0xMjAtODgtMTUybC04NDktNDkwYy01NC0zMS0xMjEtMzEtMTc1LDBMMzE0LDYwOGMtNTQsMzEtODcsODktODcsMTUySDIyNnoiPjwvcGF0aD4KCQkJCTxnPgoJCQkJCTxnPgoJCQkJCQk8Zz4KCQkJCQkJCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xNDM1LDE0NDBsLTEyMSwzMzJjLTMsOS0zLDE5LDAsMjlsMjA4LDU3MWwyNDEtMTM5bC0yODktNzkzQzE0NjcsMTQyMiwxNDQyLDE0MjIsMTQzNSwxNDQweiI+PC9wYXRoPgoJCQkJCQk8L2c+CgkJCQkJCTxnPgoJCQkJCQkJPHBhdGggY2xhc3M9InN0MiIgZD0iTTE2NzgsODgyYy03LTE4LTMyLTE4LTM5LDBsLTEyMSwzMzJjLTMsOS0zLDE5LDAsMjlsMzQxLDkzNWwyNDEtMTM5TDE2NzgsODgzVjg4MnoiPjwvcGF0aD4KCQkJCQkJPC9nPgoJCQkJCTwvZz4KCQkJCTwvZz4KCQkJCTxnPgoJCQkJCTxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0xMjUwLDE1NWM2LDAsMTIsMiwxNyw1bDkxOCw1MzBjMTEsNiwxNywxOCwxNywzMHYxMDYwYzAsMTItNywyNC0xNywzMGwtOTE4LDUzMGMtNSwzLTExLDUtMTcsNSAgICAgICBzLTEyLTItMTctNWwtOTE4LTUzMGMtMTEtNi0xNy0xOC0xNy0zMFY3MTljMC0xMiw3LTI0LDE3LTMwbDkxOC01MzBjNS0zLDExLTUsMTctNWwwLDBWMTU1eiBNMTI1MCwwYy0zMywwLTY1LDgtOTUsMjVMMjM3LDU1NSAgICAgICBjLTU5LDM0LTk1LDk2LTk1LDE2NHYxMDYwYzAsNjgsMzYsMTMwLDk1LDE2NGw5MTgsNTMwYzI5LDE3LDYyLDI1LDk1LDI1czY1LTgsOTUtMjVsOTE4LTUzMGM1OS0zNCw5NS05Niw5NS0xNjRWNzE5ICAgICAgIGMwLTY4LTM2LTEzMC05NS0xNjRMMTM0NCwyNWMtMjktMTctNjItMjUtOTUtMjVsMCwwSDEyNTB6Ij48L3BhdGg+CgkJCQk8L2c+CgkJCQk8cG9seWdvbiBjbGFzcz0ic3QxIiBwb2ludHM9IjY0MiwyMTc5IDcyNywxOTQ3IDg5NywyMDg4IDczOCwyMjM0ICAgICAiPjwvcG9seWdvbj4KCQkJCTxnPgoJCQkJCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0xMTcyLDY0NEg5MzljLTE3LDAtMzMsMTEtMzksMjdMNDAxLDIwMzlsMjQxLDEzOWw1NTAtMTUwN2M1LTE0LTUtMjgtMTktMjhMMTE3Miw2NDR6Ij48L3BhdGg+CgkJCQkJPHBhdGggY2xhc3M9InN0NCIgZD0iTTE1ODAsNjQ0aC0yMzNjLTE3LDAtMzMsMTEtMzksMjdMNzM4LDIyMzNsMjQxLDEzOWw2MjAtMTcwMWM1LTE0LTUtMjgtMTktMjhWNjQ0eiI+PC9wYXRoPgoJCQkJPC9nPgoJCQk8L2c+CgkJPC9nPgoJPC9nPgo8L2c+Cjwvc3ZnPgo=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Avalanche\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Avalanche-4B2224?logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iMTUwMyIgaGVpZ2h0PSIxNTA0IiB2aWV3Qm94PSIwIDAgMTUwMyAxNTA0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cmVjdCB4PSIyODciIHk9IjI1OCIgd2lkdGg9IjkyOCIgaGVpZ2h0PSI4NDQiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTUwMi41IDc1MkMxNTAyLjUgMTE2Ni43NyAxMTY2LjI3IDE1MDMgNzUxLjUgMTUwM0MzMzYuNzM0IDE1MDMgMC41IDExNjYuNzcgMC41IDc1MkMwLjUgMzM3LjIzNCAzMzYuNzM0IDEgNzUxLjUgMUMxMTY2LjI3IDEgMTUwMi41IDMzNy4yMzQgMTUwMi41IDc1MlpNNTM4LjY4OCAxMDUwLjg2SDM5Mi45NEMzNjIuMzE0IDEwNTAuODYgMzQ3LjE4NiAxMDUwLjg2IDMzNy45NjIgMTA0NC45NkMzMjcuOTk5IDEwMzguNSAzMjEuOTExIDEwMjcuOCAzMjEuMTczIDEwMTUuOTlDMzIwLjYxOSAxMDA1LjExIDMyOC4xODQgOTkxLjgyMiAzNDMuMzEyIDk2NS4yNTVMNzAzLjE4MiAzMzAuOTM1QzcxOC40OTUgMzAzLjk5OSA3MjYuMjQzIDI5MC41MzEgNzM2LjAyMSAyODUuNTVDNzQ2LjUzNyAyODAuMiA3NTkuMDgzIDI4MC4yIDc2OS41OTkgMjg1LjU1Qzc3OS4zNzcgMjkwLjUzMSA3ODcuMTI2IDMwMy45OTkgODAyLjQzOCAzMzAuOTM1TDg3Ni40MiA0NjAuMDc5TDg3Ni43OTcgNDYwLjczOEM4OTMuMzM2IDQ4OS42MzUgOTAxLjcyMyA1MDQuMjg5IDkwNS4zODUgNTE5LjY2OUM5MDkuNDQzIDUzNi40NTggOTA5LjQ0MyA1NTQuMTY5IDkwNS4zODUgNTcwLjk1OEM5MDEuNjk1IDU4Ni40NTUgODkzLjM5MyA2MDEuMjE1IDg3Ni42MDQgNjMwLjU0OUw2ODcuNTczIDk2NC43MDJMNjg3LjA4NCA5NjUuNTU4QzY3MC40MzYgOTk0LjY5MyA2NjEuOTk5IDEwMDkuNDYgNjUwLjMwNiAxMDIwLjZDNjM3LjU3NiAxMDMyLjc4IDYyMi4yNjMgMTA0MS42MyA2MDUuNDc0IDEwNDYuNjJDNTkwLjE2MSAxMDUwLjg2IDU3My4wMDQgMTA1MC44NiA1MzguNjg4IDEwNTAuODZaTTkwNi43NSAxMDUwLjg2SDExMTUuNTlDMTE0Ni40IDEwNTAuODYgMTE2MS45IDEwNTAuODYgMTE3MS4xMyAxMDQ0Ljc4QzExODEuMDkgMTAzOC4zMiAxMTg3LjM2IDEwMjcuNDMgMTE4Ny45MiAxMDE1LjYzQzExODguNDUgMTAwNS4xIDExODEuMDUgOTkyLjMzIDExNjYuNTUgOTY3LjMwN0MxMTY2LjA1IDk2Ni40NTUgMTE2NS41NSA5NjUuNTg4IDExNjUuMDQgOTY0LjcwNkwxMDYwLjQzIDc4NS43NUwxMDU5LjI0IDc4My43MzVDMTA0NC41NCA3NTguODc3IDEwMzcuMTIgNzQ2LjMyNCAxMDI3LjU5IDc0MS40NzJDMTAxNy4wOCA3MzYuMTIxIDEwMDQuNzEgNzM2LjEyMSA5OTQuMTk5IDc0MS40NzJDOTg0LjYwNSA3NDYuNDUzIDk3Ni44NTcgNzU5LjU1MiA5NjEuNTQ0IDc4NS45MzRMODU3LjMwNiA5NjQuODkxTDg1Ni45NDkgOTY1LjUwN0M4NDEuNjkgOTkxLjg0NyA4MzQuMDY0IDEwMDUuMDEgODM0LjYxNCAxMDE1LjgxQzgzNS4zNTIgMTAyNy42MiA4NDEuNDQgMTAzOC41IDg1MS40MDIgMTA0NC45NkM4NjAuNDQzIDEwNTAuODYgODc1Ljk0IDEwNTAuODYgOTA2Ljc1IDEwNTAuODZaIiBmaWxsPSIjRTg0MTQyIi8+Cjwvc3ZnPgo=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n\u003c/details\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkukuster%2Fci_methods_analyser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkukuster%2Fci_methods_analyser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkukuster%2Fci_methods_analyser/lists"}