Introduction

Hi, I am a data practitioner with experience in various data-related areas (data engineering, data analysis, data science, machine learning) and business domains (customer support, customer success, product, marketing, personalization, sales).

I am an independent user (data-wise) of statistical packages (R, Python, Google Sheets, MS Excel) and database querying languages/dialects (PostgreSQL, MySQL, Snowflake, Standard SQL in BigQuery) with experience in areas ranging from the data collection through its wrangling, description, visualisation to the advanced linear models (regression models, PCA, SEM).

Lately, I have gained experience with data science techniques in the industry context (like segmentation or recommendation engine) and data engineering areas (ETL, data models, data architecture).

Data Engineer

Make, Prague, Czech Republic, 12/2022-present

  • Data engineering. Development and implementation of the CD/CI pipeline for Keboola using kb-cli, GitHub, and GitHub Actions. Building ELT pipelines and data modelling. Building custom Extract/Load components for various Sales/CRM platforms (Celonis, ZoomInfo) using the request library. Addressing data quality. Code reviewing. DataOps and FinOps.
  • Machine Learning. Deploying data science projects (LTV or personas) into production. MLOps. Strategy for the ML infrastructure development. Code reviewing.
  • Generally used tools. Python 3.11, Snowflake, Make, Jira, Confluence, Slack, Monday.

Machine Learning Engineer

Ataccama, Prague, Czech Republic, 07/2022-10/2022

  • As a part of the Data Stories team, I contributed to the back-end (idiomatic and pydantic-driven Python, FAST API) and front-end (TypeScript, Vue.js) codebases. The use-cases included user-defined filters or charts and attributes recommendation.
  • Unit testing via pytest (including contribution to the CI/CD pipeline). Git using Gitlab. Linting using black, isort, and flake8. Docker, Kubernetes, kustomize and Helm.
  • Data analytics and data science - prototyping via Jupyter Notebooks.
  • Generally used tools. Python 3.10, Snowflake, MySQL, REST API, Jira, Notion.

Data & Machine Learning Engineer

CloudTalk, Prague, Czech Republic, 04/2022-06/2022

  • Data engineering. Development and implementation of the CD/CI pipeline for Keboola using kb-cli, GitHub, and GitHub Actions. Building ELT pipelines and data modelling. Building custom Extract/Load components for various Sales/CRM platforms (HubSpot, Crunchbase, Apollo) using the request library. Addressing data quality topics like entity profiling. Code reviewing.
  • Machine Learning. Developing anti-fraud prediction models. Defined business logic with stakeholders and setting up alerting. Implementing cookiecutter framework for developing data science projects. Prepared a strategy for the ML infrastructure development. Code reviewing.
  • Data analytics. Ad hoc reports using Jupyter Notebooks and Redash.
  • Generally used tools. Python 3, Snowflake, ML Flow, MySQL, REST API, Jira, Outline.

Interim Product Owner of Personalization

Rohlik Group, Prague, Czech Republic, 09/2021-03/2022

  • Distributed leadership of the 4-member team (a back-end developer, a tester, a data analyst, a machine-learning engineer). Setting a roadmap, agile ceremonies (planning, grooming, retrospectives, etc.).
  • Feature Lifecycle Management - collecting and prioritising business requirements based on their alignment with the company’s business goals. Alignment with other relevant stakeholders across the company (including preemptive identification of dependencies, synergies, and blockers). Development and deployment of personalised features to production, including evaluating the business impact.
  • Setting up objectives, key results, and key performance indicators of the Personalisation squad based on the company’s OKRs (GTMHub). Reporting to the C-level management and the board of directors.

Machine Learning Engineer

Rohlik Group, Prague, Czech Republic, 02/2021-03/2022

  • Covered domains: stakeholder management in the agile set-up (using Jira), data engineering, ML model development and deployment in production using Keboola and AWS (both batch and real-time predictions) and performance evaluation. Focus on the personalization of the product and CRM, solving various classification and regression tasks in the international context.
  • Data engineering. Data models and ETL self-service in Keboola (including REST APIs via Postman) and AWS (S3, Redshift, MySQL).
  • MLOps using AWS - Sagemaker, Lambda, CloudWatch, Glue, API Gateway.
  • A/B testing - design, execution, and evaluation. Dashboards in Tableau, ad hoc reports using Jupyter Notebooks. Git using GitLab and AWS Codecommit.
  • Other tools - Python (including various packages like pandas or seaborn), Snowflake, PySpark, TensorFlow.

Data Analyst

Meiro, Brno, Czech Republic, 08/2020–11/2020

  • Covered domains: Data Engineering, Data Analysis, Data Science.
  • ETL pipelines management, Design of data models.
  • Integrating PostgreSQL and MySQL with R and Python, data wrangling, description, and visualization to advanced statistical techniques and data science techniques (e.g. recommendation engine and customer segmentation) in Python using VS Code. Fundamentals of Spark.
  • Linux desktop (Ubuntu), Bash, Git. Fundamentals of Docker and CD/CI.

Data Analyst

Kiwi.com, Brno, Czech Republic, 04/2019–07/2020

  • Covered domains: Product, Customer Experience, Customer Support.
  • Reports. Integrating PostgreSQL, Snowflake, and BigQuery with R and Python, data wrangling, description, and visualization to advanced statistical techniques (regression models, structural equation modelling) in R. Reporting in Markdown (R notebooks, Jupyter Notebooks, oral presentations).
  • Dashboards. I’m proficient in working with tools like Looker, GoodData, Google Data Studio, or Retool (Plotly).
  • Data engineering. Sense of data models and ETL self-service (Keboola, dbt).
  • Linux desktop (Ubuntu), Bash, Git.
  • Jira, Scrum.

Lecturer

Masaryk University, Brno, Czech Republic, 09/2015–09/2020

  • Demonstrations of analyses and their interpretations, providing oral and written feedback in the following courses:
    • Statistical Data Analysis I.
      • Correlation, contingency tables, t-test, an introduction to non-parametric tests (e.g. chi-square).
    • Statistical Data Analysis II.
      • Multiple linear regression, ANOVA, logistic regression, factor analysis, mixed effect models.
    • An Introduction to R
      • An introduction to the R language, data cleaning, wrangling, description and visualization, multivariate analyses in the R language.

Researcher

Transport Research Centre, Brno, Czech Republic, 06/2015–03/2019

  • Travel behaviour analyses, coordination of research activities, communication with the lay public as well as the community of experts.
  • Investigator in the project Česko v pohybu. Development of the research tool, development and implementation of the probabilistic sampling procedure and algorithms for automated control of the data quality.
  • Methodological and analytical supervision of the research project for the Czech Ministry of Transport related to the Public opinion on autonomous vehicles.
  • Project management of small project teams, e.g. program section for the conference Dopravní chování v datech.

Education

Psychology (Ph.D.)

Masaryk University, Brno, Czech Republic, 09/2015–06/2022

Psychology (Master degree)

Masaryk University, Brno, Czech Republic, 2013–2015

Psychology and Sociology (Bachelor degree)

Masaryk University, Brno, Czech Republic, 2010–2013

Internships

Danmarks Tekniske Universitet, Management Engineering, Lyngby, Denmark. 08-09/2017

Corpus Christi College, University of Cambridge, Cambridge, UK. 07-09/2015

Selected publications

Selected talks

Go back

LS0tCnRpdGxlOiAiQ3VycmljdWx1bSBWaXRhZSIKYXV0aG9yOiAiVml0IEdhYnJoZWwiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBhbGxpZ246IHJpZ2h0CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUKICAgIGNzczogL1VzZXJzL3ZpdGdhYnJoZWwvRGVza3RvcC9HaXQvUGVyc29uYWwvZGF0YW11c3RmbG93L3B1YmxpYy9jc3MvY29kZXIubWluLmE0ZjMzMjIxM2EyMWNlOGViNTIxNjcwYzYxNDQ3MGM1ODkyM2FhYWYzODVlMmE3Mzk4MmMzMWRkNzY0MmRlY2IuY3NzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMScKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IG5vCiAgICB0b2NfZGVwdGg6ICcxJwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IG5vCiAgICB0b2NfZGVwdGg6ICcxJwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyBJbnRyb2R1Y3Rpb24KCkhpLCBJIGFtIGEgZGF0YSBwcmFjdGl0aW9uZXIgd2l0aCBleHBlcmllbmNlIGluIHZhcmlvdXMgZGF0YS1yZWxhdGVkIGFyZWFzIChkYXRhIGVuZ2luZWVyaW5nLCBkYXRhIGFuYWx5c2lzLCBkYXRhIHNjaWVuY2UsIG1hY2hpbmUgbGVhcm5pbmcpIGFuZCBidXNpbmVzcyBkb21haW5zIChjdXN0b21lciBzdXBwb3J0LCBjdXN0b21lciBzdWNjZXNzLCBwcm9kdWN0LCBtYXJrZXRpbmcsIHBlcnNvbmFsaXphdGlvbiwgc2FsZXMpLiAKCkkgYW0gYW4gaW5kZXBlbmRlbnQgdXNlciAoZGF0YS13aXNlKSBvZiBzdGF0aXN0aWNhbCBwYWNrYWdlcyAoKipSLCBQeXRob24sIEdvb2dsZSBTaGVldHMsIE1TIEV4Y2VsKiopIGFuZCBkYXRhYmFzZSBxdWVyeWluZyBsYW5ndWFnZXMvZGlhbGVjdHMgKCoqUG9zdGdyZVNRTCwgTXlTUUwsIFNub3dmbGFrZSwgU3RhbmRhcmQgU1FMKiogaW4gKipCaWdRdWVyeSoqKSB3aXRoIGV4cGVyaWVuY2UgaW4gYXJlYXMgcmFuZ2luZyBmcm9tIHRoZSBkYXRhIGNvbGxlY3Rpb24gdGhyb3VnaCBpdHMgKip3cmFuZ2xpbmcsIGRlc2NyaXB0aW9uLCB2aXN1YWxpc2F0aW9uKiogdG8gdGhlIGFkdmFuY2VkIGxpbmVhciBtb2RlbHMgKCoqcmVncmVzc2lvbiBtb2RlbHMsIFBDQSwgU0VNKiopLiAKCkxhdGVseSwgSSBoYXZlIGdhaW5lZCBleHBlcmllbmNlIHdpdGggZGF0YSAqKnNjaWVuY2UgdGVjaG5pcXVlcyoqIGluIHRoZSBpbmR1c3RyeSBjb250ZXh0IChsaWtlIHNlZ21lbnRhdGlvbiBvciByZWNvbW1lbmRhdGlvbiBlbmdpbmUpIGFuZCAqKmRhdGEgZW5naW5lZXJpbmcqKiBhcmVhcyAoRVRMLCBkYXRhIG1vZGVscywgZGF0YSBhcmNoaXRlY3R1cmUpLgoKIyMgRGF0YSBFbmdpbmVlcgoKTWFrZSwgUHJhZ3VlLCBDemVjaCBSZXB1YmxpYywgKjEyLzIwMjItcHJlc2VudCoKCiogKipEYXRhIGVuZ2luZWVyaW5nKiouIERldmVsb3BtZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0QvQ0kgcGlwZWxpbmUgZm9yIEtlYm9vbGEgdXNpbmcga2ItY2xpLCBHaXRIdWIsIGFuZCBHaXRIdWIgQWN0aW9ucy4gQnVpbGRpbmcgRUxUIHBpcGVsaW5lcyBhbmQgZGF0YSBtb2RlbGxpbmcuIEJ1aWxkaW5nIGN1c3RvbSBFeHRyYWN0L0xvYWQgY29tcG9uZW50cyBmb3IgdmFyaW91cyBTYWxlcy9DUk0gcGxhdGZvcm1zIChDZWxvbmlzLCBab29tSW5mbykgdXNpbmcgdGhlIHJlcXVlc3QgbGlicmFyeS4gQWRkcmVzc2luZyBkYXRhIHF1YWxpdHkuIENvZGUgcmV2aWV3aW5nLiBEYXRhT3BzIGFuZCBGaW5PcHMuCiogKipNYWNoaW5lIExlYXJuaW5nKiouIERlcGxveWluZyBkYXRhIHNjaWVuY2UgcHJvamVjdHMgKExUViBvciBwZXJzb25hcykgaW50byBwcm9kdWN0aW9uLiBNTE9wcy4gU3RyYXRlZ3kgZm9yIHRoZSBNTCBpbmZyYXN0cnVjdHVyZSBkZXZlbG9wbWVudC4gQ29kZSByZXZpZXdpbmcuCiogR2VuZXJhbGx5IHVzZWQgdG9vbHMuIFB5dGhvbiAzLjExLCBTbm93Zmxha2UsIE1ha2UsIEppcmEsIENvbmZsdWVuY2UsIFNsYWNrLCBNb25kYXkuCgojIyBNYWNoaW5lIExlYXJuaW5nIEVuZ2luZWVyCgpBdGFjY2FtYSwgUHJhZ3VlLCBDemVjaCBSZXB1YmxpYywgKjA3LzIwMjItMTAvMjAyMioKCiogQXMgYSBwYXJ0IG9mIHRoZSBEYXRhIFN0b3JpZXMgdGVhbSwgSSBjb250cmlidXRlZCB0byB0aGUgYmFjay1lbmQgKGlkaW9tYXRpYyBhbmQgcHlkYW50aWMtZHJpdmVuIFB5dGhvbiwgRkFTVCBBUEkpIGFuZCBmcm9udC1lbmQgKFR5cGVTY3JpcHQsIFZ1ZS5qcykgY29kZWJhc2VzLiBUaGUgdXNlLWNhc2VzIGluY2x1ZGVkIHVzZXItZGVmaW5lZCBmaWx0ZXJzIG9yIGNoYXJ0cyBhbmQgYXR0cmlidXRlcyByZWNvbW1lbmRhdGlvbi4KKiBVbml0IHRlc3RpbmcgdmlhIHB5dGVzdCAoaW5jbHVkaW5nIGNvbnRyaWJ1dGlvbiB0byB0aGUgQ0kvQ0QgcGlwZWxpbmUpLiBHaXQgdXNpbmcgR2l0bGFiLiBMaW50aW5nIHVzaW5nIGJsYWNrLCBpc29ydCwgYW5kIGZsYWtlOC4gRG9ja2VyLCBLdWJlcm5ldGVzLCBrdXN0b21pemUgYW5kIEhlbG0uCiogRGF0YSBhbmFseXRpY3MgYW5kIGRhdGEgc2NpZW5jZSAtIHByb3RvdHlwaW5nIHZpYSBKdXB5dGVyIE5vdGVib29rcy4KKiBHZW5lcmFsbHkgdXNlZCB0b29scy4gUHl0aG9uIDMuMTAsIFNub3dmbGFrZSwgTXlTUUwsIFJFU1QgQVBJLCBKaXJhLCBOb3Rpb24uCgojIyBEYXRhICYgTWFjaGluZSBMZWFybmluZyBFbmdpbmVlcgoKQ2xvdWRUYWxrLCBQcmFndWUsIEN6ZWNoIFJlcHVibGljLCAqMDQvMjAyMi0wNi8yMDIyKgoKKiAqKkRhdGEgZW5naW5lZXJpbmcqKi4gRGV2ZWxvcG1lbnQgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDRC9DSSBwaXBlbGluZSBmb3IgS2Vib29sYSB1c2luZyBrYi1jbGksIEdpdEh1YiwgYW5kIEdpdEh1YiBBY3Rpb25zLiBCdWlsZGluZyBFTFQgcGlwZWxpbmVzIGFuZCBkYXRhIG1vZGVsbGluZy4gQnVpbGRpbmcgY3VzdG9tIEV4dHJhY3QvTG9hZCBjb21wb25lbnRzIGZvciB2YXJpb3VzIFNhbGVzL0NSTSBwbGF0Zm9ybXMgKEh1YlNwb3QsIENydW5jaGJhc2UsIEFwb2xsbykgdXNpbmcgdGhlIHJlcXVlc3QgbGlicmFyeS4gQWRkcmVzc2luZyBkYXRhIHF1YWxpdHkgdG9waWNzIGxpa2UgZW50aXR5IHByb2ZpbGluZy4gQ29kZSByZXZpZXdpbmcuCiogKipNYWNoaW5lIExlYXJuaW5nKiouIERldmVsb3BpbmcgYW50aS1mcmF1ZCBwcmVkaWN0aW9uIG1vZGVscy4gRGVmaW5lZCBidXNpbmVzcyBsb2dpYyB3aXRoIHN0YWtlaG9sZGVycyBhbmQgc2V0dGluZyB1cCBhbGVydGluZy4gSW1wbGVtZW50aW5nIGNvb2tpZWN1dHRlciBmcmFtZXdvcmsgZm9yIGRldmVsb3BpbmcgZGF0YSBzY2llbmNlIHByb2plY3RzLiBQcmVwYXJlZCBhIHN0cmF0ZWd5IGZvciB0aGUgTUwgaW5mcmFzdHJ1Y3R1cmUgZGV2ZWxvcG1lbnQuIENvZGUgcmV2aWV3aW5nLgoqICoqRGF0YSBhbmFseXRpY3MqKi4gQWQgaG9jIHJlcG9ydHMgdXNpbmcgSnVweXRlciBOb3RlYm9va3MgYW5kIFJlZGFzaC4KKiBHZW5lcmFsbHkgdXNlZCAqKnRvb2xzKiouIFB5dGhvbiAzLCBTbm93Zmxha2UsIE1MIEZsb3csIE15U1FMLCBSRVNUIEFQSSwgSmlyYSwgT3V0bGluZS4gCgojIyBJbnRlcmltIFByb2R1Y3QgT3duZXIgb2YgUGVyc29uYWxpemF0aW9uCgpSb2hsaWsgR3JvdXAsIFByYWd1ZSwgQ3plY2ggUmVwdWJsaWMsICowOS8yMDIxLTAzLzIwMjIqCgoqICoqRGlzdHJpYnV0ZWQgbGVhZGVyc2hpcCoqIG9mIHRoZSA0LW1lbWJlciB0ZWFtIChhIGJhY2stZW5kIGRldmVsb3BlciwgYSB0ZXN0ZXIsIGEgZGF0YSBhbmFseXN0LCBhIG1hY2hpbmUtbGVhcm5pbmcgZW5naW5lZXIpLiBTZXR0aW5nIGEgcm9hZG1hcCwgYWdpbGUgY2VyZW1vbmllcyAocGxhbm5pbmcsIGdyb29taW5nLCByZXRyb3NwZWN0aXZlcywgZXRjLikuCiogKipGZWF0dXJlIExpZmVjeWNsZSBNYW5hZ2VtZW50KiogLSBjb2xsZWN0aW5nIGFuZCBwcmlvcml0aXNpbmcgYnVzaW5lc3MgcmVxdWlyZW1lbnRzIGJhc2VkIG9uIHRoZWlyIGFsaWdubWVudCB3aXRoIHRoZSBjb21wYW55J3MgYnVzaW5lc3MgZ29hbHMuIEFsaWdubWVudCB3aXRoIG90aGVyIHJlbGV2YW50IHN0YWtlaG9sZGVycyBhY3Jvc3MgdGhlIGNvbXBhbnkgKGluY2x1ZGluZyBwcmVlbXB0aXZlIGlkZW50aWZpY2F0aW9uIG9mIGRlcGVuZGVuY2llcywgc3luZXJnaWVzLCBhbmQgYmxvY2tlcnMpLiBEZXZlbG9wbWVudCBhbmQgZGVwbG95bWVudCBvZiBwZXJzb25hbGlzZWQgZmVhdHVyZXMgdG8gcHJvZHVjdGlvbiwgaW5jbHVkaW5nIGV2YWx1YXRpbmcgdGhlIGJ1c2luZXNzIGltcGFjdC4KKiBTZXR0aW5nIHVwICoqb2JqZWN0aXZlcyoqLCAqKmtleSByZXN1bHRzKiosIGFuZCBrZXkgcGVyZm9ybWFuY2UgaW5kaWNhdG9ycyBvZiB0aGUgUGVyc29uYWxpc2F0aW9uIHNxdWFkIGJhc2VkIG9uIHRoZSBjb21wYW55J3MgT0tScyAoR1RNSHViKS4gUmVwb3J0aW5nIHRvIHRoZSBDLWxldmVsIG1hbmFnZW1lbnQgYW5kIHRoZSBib2FyZCBvZiBkaXJlY3RvcnMuCgojIyBNYWNoaW5lIExlYXJuaW5nIEVuZ2luZWVyCgpSb2hsaWsgR3JvdXAsIFByYWd1ZSwgQ3plY2ggUmVwdWJsaWMsICowMi8yMDIxLTAzLzIwMjIqCgoqICoqQ292ZXJlZCBkb21haW5zKio6IHN0YWtlaG9sZGVyIG1hbmFnZW1lbnQgaW4gdGhlIGFnaWxlIHNldC11cCAodXNpbmcgSmlyYSksIGRhdGEgZW5naW5lZXJpbmcsIE1MIG1vZGVsIGRldmVsb3BtZW50IGFuZCBkZXBsb3ltZW50IGluIHByb2R1Y3Rpb24gdXNpbmcgS2Vib29sYSBhbmQgQVdTIChib3RoIGJhdGNoIGFuZCByZWFsLXRpbWUgcHJlZGljdGlvbnMpIGFuZCBwZXJmb3JtYW5jZSBldmFsdWF0aW9uLiBGb2N1cyBvbiB0aGUgcGVyc29uYWxpemF0aW9uIG9mIHRoZSBwcm9kdWN0IGFuZCBDUk0sIHNvbHZpbmcgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiBhbmQgcmVncmVzc2lvbiB0YXNrcyBpbiB0aGUgaW50ZXJuYXRpb25hbCBjb250ZXh0LgoqICoqRGF0YSBlbmdpbmVlcmluZyoqLiBEYXRhIG1vZGVscyBhbmQgRVRMIHNlbGYtc2VydmljZSBpbiBLZWJvb2xhIChpbmNsdWRpbmcgUkVTVCBBUElzIHZpYSBQb3N0bWFuKSBhbmQgQVdTIChTMywgUmVkc2hpZnQsIE15U1FMKS4KKiAqKk1MT3BzIHVzaW5nIEFXUyoqIC0gU2FnZW1ha2VyLCBMYW1iZGEsIENsb3VkV2F0Y2gsIEdsdWUsIEFQSSBHYXRld2F5LgoqICoqQS9CIHRlc3RpbmcqKiAtIGRlc2lnbiwgZXhlY3V0aW9uLCBhbmQgZXZhbHVhdGlvbi4gRGFzaGJvYXJkcyBpbiBUYWJsZWF1LCBhZCBob2MgcmVwb3J0cyB1c2luZyBKdXB5dGVyIE5vdGVib29rcy4gR2l0IHVzaW5nIEdpdExhYiBhbmQgQVdTIENvZGVjb21taXQuCiogT3RoZXIgdG9vbHMgLSBQeXRob24gKGluY2x1ZGluZyB2YXJpb3VzIHBhY2thZ2VzIGxpa2UgcGFuZGFzIG9yIHNlYWJvcm4pLCBTbm93Zmxha2UsIFB5U3BhcmssIFRlbnNvckZsb3cuCgojIyBEYXRhIEFuYWx5c3QKCk1laXJvLCBCcm5vLCBDemVjaCBSZXB1YmxpYywgKjA4LzIwMjDigJMxMS8yMDIwKgoKKiBDb3ZlcmVkIGRvbWFpbnM6ICpEYXRhIEVuZ2luZWVyaW5nLCBEYXRhIEFuYWx5c2lzLCBEYXRhIFNjaWVuY2UqLgoqICoqRVRMIHBpcGVsaW5lcyBtYW5hZ2VtZW50KiosICoqRGVzaWduIG9mIGRhdGEgbW9kZWxzKiouCiogSW50ZWdyYXRpbmcgKipQb3N0Z3JlU1FMKiogYW5kICoqTXlTUUwqKiAgd2l0aCAqKlIqKiBhbmQgKipQeXRob24qKiwgZGF0YSB3cmFuZ2xpbmcsIGRlc2NyaXB0aW9uLCBhbmQgdmlzdWFsaXphdGlvbiB0byBhZHZhbmNlZCBzdGF0aXN0aWNhbCB0ZWNobmlxdWVzIGFuZCBkYXRhIHNjaWVuY2UgdGVjaG5pcXVlcyAoZS5nLiAqKnJlY29tbWVuZGF0aW9uIGVuZ2luZSoqIGFuZCAqKmN1c3RvbWVyIHNlZ21lbnRhdGlvbioqKSBpbiAqKlB5dGhvbioqIHVzaW5nICpWUyBDb2RlKi4gRnVuZGFtZW50YWxzIG9mICoqU3BhcmsqKi4KKiBMaW51eCBkZXNrdG9wIChVYnVudHUpLCBCYXNoLCBHaXQuIEZ1bmRhbWVudGFscyBvZiAqKkRvY2tlcioqIGFuZCAqKkNEL0NJKiouCgojIyBEYXRhIEFuYWx5c3QKS2l3aS5jb20sIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMDQvMjAxOeKAkzA3LzIwMjAqCgoqIENvdmVyZWQgZG9tYWluczogKlByb2R1Y3QsIEN1c3RvbWVyIEV4cGVyaWVuY2UsIEN1c3RvbWVyIFN1cHBvcnQqLgoqIFJlcG9ydHMuIEludGVncmF0aW5nICoqUG9zdGdyZVNRTCwgU25vd2ZsYWtlKiosIGFuZCAqKkJpZ1F1ZXJ5Kiogd2l0aCAqKlIqKiBhbmQgKipQeXRob24qKiwgZGF0YSB3cmFuZ2xpbmcsIGRlc2NyaXB0aW9uLCBhbmQgdmlzdWFsaXphdGlvbiB0byBhZHZhbmNlZCBzdGF0aXN0aWNhbCB0ZWNobmlxdWVzIChyZWdyZXNzaW9uIG1vZGVscywgc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbGxpbmcpIGluIFIuIFJlcG9ydGluZyBpbiBNYXJrZG93biAoKipSIG5vdGVib29rcywgSnVweXRlciBOb3RlYm9va3MqKiwgb3JhbCBwcmVzZW50YXRpb25zKS4KKiBEYXNoYm9hcmRzLiBJ4oCZbSBwcm9maWNpZW50IGluIHdvcmtpbmcgd2l0aCB0b29scyBsaWtlIExvb2tlciwgR29vZERhdGEsIEdvb2dsZSBEYXRhIFN0dWRpbywgb3IgUmV0b29sIChQbG90bHkpLgoqIERhdGEgZW5naW5lZXJpbmcuIFNlbnNlIG9mIGRhdGEgbW9kZWxzIGFuZCBFVEwgc2VsZi1zZXJ2aWNlIChLZWJvb2xhLCBkYnQpLgoqIExpbnV4IGRlc2t0b3AgKFVidW50dSksICoqQmFzaCoqLCAqKkdpdCoqLgoqICoqSmlyYSoqLCAqKlNjcnVtKiouCgojIyBMZWN0dXJlcgpNYXNhcnlrIFVuaXZlcnNpdHksIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMDkvMjAxNeKAkzA5LzIwMjAqCgoqIERlbW9uc3RyYXRpb25zIG9mIGFuYWx5c2VzIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHByb3ZpZGluZyBvcmFsIGFuZCB3cml0dGVuIGZlZWRiYWNrIGluIHRoZSBmb2xsb3dpbmcgY291cnNlczoKICAqIFtTdGF0aXN0aWNhbCBEYXRhIEFuYWx5c2lzIEkuXShodHRwczovL2lzLm11bmkuY3ovY291cnNlL2Zzcy9zcHJpbmcyMDE4L1BTWTExNykKICAgICogKkNvcnJlbGF0aW9uLCBjb250aW5nZW5jeSB0YWJsZXMsIHQtdGVzdCwgYW4gaW50cm9kdWN0aW9uIHRvIG5vbi1wYXJhbWV0cmljIHRlc3RzIChlLmcuIGNoaS1zcXVhcmUpKi4KICAqIFtTdGF0aXN0aWNhbCBEYXRhIEFuYWx5c2lzIElJLl0oaHR0cHM6Ly9pcy5tdW5pLmN6L2NvdXJzZS9mc3MvYXV0dW1uMjAxOC9QU1kyNTIpCiAgICAqICpNdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiwgQU5PVkEsIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIGZhY3RvciBhbmFseXNpcywgbWl4ZWQgZWZmZWN0IG1vZGVscyouCiAgKiBbQW4gSW50cm9kdWN0aW9uIHRvIFJdKGh0dHBzOi8vaXMubXVuaS5jei9jb3Vyc2UvZnNzL2F1dHVtbjIwMTkvUFNZbjUzMjApCiAgICAqIEFuIGludHJvZHVjdGlvbiB0byB0aGUgKipSIGxhbmd1YWdlKiosICpkYXRhIGNsZWFuaW5nLCB3cmFuZ2xpbmcsIGRlc2NyaXB0aW9uIGFuZCB2aXN1YWxpemF0aW9uLCBtdWx0aXZhcmlhdGUgYW5hbHlzZXMgaW4gdGhlIFIgbGFuZ3VhZ2UuKgoKIyMgUmVzZWFyY2hlcgpUcmFuc3BvcnQgUmVzZWFyY2ggQ2VudHJlLCBCcm5vLCBDemVjaCBSZXB1YmxpYywgKjA2LzIwMTXigJMwMy8yMDE5KgoKKiBUcmF2ZWwgYmVoYXZpb3VyIGFuYWx5c2VzLCBjb29yZGluYXRpb24gb2YgcmVzZWFyY2ggYWN0aXZpdGllcywgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBsYXkgcHVibGljIGFzIHdlbGwgYXMgdGhlIFtjb21tdW5pdHkgb2YgZXhwZXJ0c10oaHR0cHM6Ly9saW5rLnNwcmluZ2VyLmNvbS9hcnRpY2xlLzEwLjEwMDcvczEyNTQ0LTAxOC0wMjg2LTgpLgoqIEludmVzdGlnYXRvciBpbiB0aGUgcHJvamVjdCBbxIxlc2tvIHYgcG9oeWJ1XShodHRwczovL3d3dy5jZXNrb3Zwb2h5YnUuY3ovKS4gRGV2ZWxvcG1lbnQgb2YgdGhlIHJlc2VhcmNoIHRvb2wsIGRldmVsb3BtZW50IGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvYmFiaWxpc3RpYyBzYW1wbGluZyBwcm9jZWR1cmUgYW5kIGFsZ29yaXRobXMgZm9yIGF1dG9tYXRlZCBjb250cm9sIG9mIHRoZSBkYXRhIHF1YWxpdHkuCiogTWV0aG9kb2xvZ2ljYWwgYW5kIGFuYWx5dGljYWwgc3VwZXJ2aXNpb24gb2YgdGhlIHJlc2VhcmNoIHByb2plY3QgZm9yIHRoZSBDemVjaCBNaW5pc3RyeSBvZiBUcmFuc3BvcnQgcmVsYXRlZCB0byB0aGUgW1B1YmxpYyBvcGluaW9uIG9uIGF1dG9ub21vdXMgdmVoaWNsZXNdKGh0dHBzOi8vdG90cy51cG9sLmN6L2FydGtleS90b3QtMjAxOTAyLTAwMDRfcHVibGljLW9waW5pb24tb24tY29ubmVjdGVkLWFuZC1hdXRvbWF0ZWQtdmVoaWNsZXMtdGhlLWN6ZWNoLWNvbnRleHQucGhwKS4KKiBQcm9qZWN0IG1hbmFnZW1lbnQgb2Ygc21hbGwgcHJvamVjdCB0ZWFtcywgZS5nLiBwcm9ncmFtIHNlY3Rpb24gZm9yIHRoZSBjb25mZXJlbmNlIFtEb3ByYXZuw60gY2hvdsOhbsOtIHYgZGF0ZWNoXShodHRwczovL3d3dy5jZHYuY3ova29uZmVyZW5jZS1kb3ByYXZuaS1jaG92YW5pLXYtZGF0ZWNoLTIwMTgvKS4KCiMgRWR1Y2F0aW9uCgojIyBQc3ljaG9sb2d5IChQaC5ELikKTWFzYXJ5ayBVbml2ZXJzaXR5LCBCcm5vLCBDemVjaCBSZXB1YmxpYywgKjA5LzIwMTXigJMwNi8yMDIyKgoKKiBTcGVjaWFsaXNhdGlvbiBpbiBhZHZhbmNlZCBhbmFseXRpY2FsIG1ldGhvZHMg4oCTIFtzdHJ1Y3R1cmFsIGVxdWF0aW9uIG1vZGVsbGluZ10oaHR0cHM6Ly9kaWdpdGFsY29tbW9ucy5jaWlzLmVkdS9jZ2kvdmlld2NvbnRlbnQuY2dpP2FydGljbGU9MTUxNiZjb250ZXh0PWlqdHMtdHJhbnNwZXJzb25hbHN0dWRpZXMpLCBbbXVsdGlub21pYWwgcmVncmVzc2lvbl0oaHR0cHM6Ly93d3cudG90cy51cG9sLmN6L3BkZnMvdG90LzIwMTkvMDEvMDMucGRmKS4KKiBNZW1iZXIgb2YgdGhlICpEaXNjaXBsaW5hcnkgQ29tbWl0dGVlIOKAlCBGYWN1bHR5IG9mIFNvY2lhbCBTdHVkaWVzKi4KKiBUaGVzaXM6IFtJbnRlbnRpb24gdG8gVXNlIEF1dG9ub21vdXMgVmVoaWNsZXNdKGh0dHBzOi8vaXMubXVuaS5jei90aC92NjJ1bS8pCiogR3JhZHVhdGVkIHdpdGggW2hvbm91cnNdKGh0dHBzOi8vaXMubXVuaS5jei9zdHVkZW50L3Z5c3RhdmVuZV96bmFta3k/bGFuZz1lbjtzZXRsYW5nPWVuO3N0dWRpdW1fb3NvYnk9ODk2MjkwKS4KCiMjIFBzeWNob2xvZ3kgKE1hc3RlciBkZWdyZWUpCk1hc2FyeWsgVW5pdmVyc2l0eSwgQnJubywgQ3plY2ggUmVwdWJsaWMsICoyMDEz4oCTMjAxNSoKCiogU3BlY2lhbGlzYXRpb24gaW4gKipmcmVxdWVudGlzdCBzdGF0aXN0aWNzKiosIGludHJvZHVjdGlvbiB0byBCYXllc2lhbiBzdGF0aXN0aWNzLgoqIFNjaG9sYXJzaGlwIGZvciBleGNlbGxlbnQgcGVyZm9ybWFuY2UgaW4gcmVzZWFyY2ggYWN0aXZpdGllcyBnaXZlbiBieSB0aGUgRmFjdWx0eSBvZiBTb2NpYWwgU3R1ZGllcyBkdXJpbmcgdGhlIGFjYWRlbWljIHllYXIgMjAxMy8yMDE0LgoqIFRoZXNpczogW1N0dWRlbnQgU3R5bGVzIFF1ZXN0aW9ubmFpcmUgaW4gdGhlIEN6ZWNoIGNvbnRleHQ6IEEgcGlsb3Qgc3R1ZHldKGh0dHBzOi8vaXMubXVuaS5jei90aC9sbDFtNC8/bGFuZz1lbikKKiBHcmFkdWF0ZWQgd2l0aCBbaG9ub3Vyc10oaHR0cHM6Ly9pcy5tdW5pLmN6L3N0dWRlbnQvdnlzdGF2ZW5lX3puYW1reT9sYW5nPWVuO3N0dWRpdW1fb3NvYnk9NjY1MDk3KS4KCiMjIFBzeWNob2xvZ3kgYW5kIFNvY2lvbG9neSAoQmFjaGVsb3IgZGVncmVlKQpNYXNhcnlrIFVuaXZlcnNpdHksIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMjAxMOKAkzIwMTMqCgoqIFNwZWNpYWxpc2F0aW9uIGluIHF1YW50aXRhdGl2ZSBtZXRob2RvbG9neSBhbmQgc3RhdGlzdGljYWwgZGF0YSBhbmFseXNpcyBpbiBJQk0gU1BTUyB3aXRoIGZvY3VzIG9uIGxpbmVhciBtb2RlbHMuCiogU2Nob2xhcnNoaXAgZm9yIGJlc3Qgc3R1ZGVudHMgb2YgRmFjdWx0eSBvZiBTb2NpYWwgU3R1ZGllcyBkdXJpbmcgdGhlIGFjYWRlbWljIHllYXJzIDIwMTAvMjAxMSBhbmQgMjAxMS8yMDEyLgoqIFRoZXNpczogW1RoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzcGlyaXR1YWxpdHkgYW5kIGF1dG9ub215IGluIGxhdGUgYWRvbGVzY2VuY2UgYW5kIGVtZXJnaW5nIGFkdWx0aG9vZF0oaHR0cHM6Ly9pcy5tdW5pLmN6L3RoL25sZGFwLz9sYW5nPWVuKS4KKiBHcmFkdWF0ZWQgd2l0aCBbaG9ub3Vyc10oaHR0cHM6Ly9pcy5tdW5pLmN6L3N0dWRlbnQvdnlzdGF2ZW5lX3puYW1reT9sYW5nPWVuO3N0dWRpdW1fb3NvYnk9NTQ0NTQ0KS4KCiMgSW50ZXJuc2hpcHMKRGFubWFya3MgVGVrbmlza2UgVW5pdmVyc2l0ZXQsIE1hbmFnZW1lbnQgRW5naW5lZXJpbmcsIEx5bmdieSwgRGVubWFyay4gKjA4LTA5LzIwMTcqCgpDb3JwdXMgQ2hyaXN0aSBDb2xsZWdlLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSwgQ2FtYnJpZGdlLCBVSy4gKjA3LTA5LzIwMTUqCgojIFNlbGVjdGVkIHB1YmxpY2F0aW9ucwoKKiBHYWJyaGVsLCBWLiwgSmXFvmVrLCBTLiAoMjAxNykuIEZhY3RvciB2YWxpZGl0eSBhbmQgaW50ZXJuYWwgY29uc2lzdGVuY3kgb2YgdGhlIEV4cHJlc3Npb25zIG9mIFNwaXJpdHVhbGl0eSBJbnZlbnRvcnkg4oCTIFJldmlzZWQgKEVTSS1SKTogVGhlIEN6ZWNoIGNvbnRleHQuIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBUcmFuc3BlcnNvbmFsIFN0dWRpZXMsIDM2ICgxKSwgMTAxLTEwOS4gZG9pOjEwLjI0OTcyL2lqdHMuMjAxNy4zNi4xLjEwMS4KKiBHYWJyaGVsLCBWLiAoMjAxOSkuIEZlZWxpbmcgbGlrZSBjeWNsaW5nPyBQc3ljaG9sb2dpY2FsIGZhY3RvcnMgcmVsYXRlZCB0byBjeWNsaW5nIGFzIGEgbW9kZSBjaG9pY2UuIFRyYW5zYWN0aW9ucyBvbiBUcmFuc3BvcnQgU2NpZW5jZXMsIDEwICgxKS4gZG9pOjEwLjEwMDcvOTc4LTMtMzE5LTYwNDQxLTFfODAKKiBHYWJyaGVsLCBWLiwgSmXFvmVrLCBTLiwgSGF2bMOtxI1rb3bDoSwgRC4gKDIwMTkpLiBQdWJsaWMgb3BpbmlvbiBvbiBjb25uZWN0ZWQgYW5kIGF1dG9tYXRlZCB2ZWhpY2xlczogdGhlIEN6ZWNoIGNvbnRleHQuIFRyYW5zYWN0aW9ucyBvbiBUcmFuc3BvcnQgU2NpZW5jZXMsIDEwICgyKS4gZG9pOjEwLjU1MDcvdG90cy4yMDE5LjAxMQoqIEhhdmzDrcSNa292w6EsIEQuLCBHYWJyaGVsLCBWLiwgQWRhbW92c2vDoSwgRS4sIFrDoW1lxI1uw61rLCBQLiAoMjAxOSkuIFRoZSByb2xlIG9mIGdlbmRlciBhbmQgYWdlIGluIGF1dG9ub21vdXMgbW9iaWxpdHk6IGdlbmVyYWwgYXR0aXR1ZGUsIGF3YXJlbmVzcyBhbmQgbWVkaWEgcHJlZmVyZW5jZSBpbiB0aGUgY29udGV4dCBvZiBDemVjaCBSZXB1YmxpYy4gVHJhbnNhY3Rpb25zIG9uIFRyYW5zcG9ydCBTY2llbmNlcywgMTAgKDIpLiBkb2k6MTAuNTUwNy90b3RzLjIwMTkuMDEzCiogR2FicmhlbCwgVi4sIEplxb5laywgUy4sICYgWsOhbWXEjW7DrWssIFAuICgyMDIxKS4gRHJpdmluZyBsb2N1cyBvZiBjb250cm9sOiB0aGUgQ3plY2ggYWRhcHRhdGlvbi4gQ3plY2hvc2xvdmFrIFBzeWNob2xvZ3ksIDY1KDEpLCA4Ni0xMDAuIGRvaTogaHR0cHM6Ly9kb2kub3JnLzEwLjUxNTYxL2NzcHN5Y2guNjUuMS44Ni4KKiBKYWtvcGVjLCBBLiwgR2FicmhlbCwgVi4sIEtlYW5lLCBMLiwgS292YcSNLCBOLiwgUmVpZ2JlcnQsIEsuLCBBbmRlcnNlbiwgVC4gTC4gKDIwMTUpLiBXb3JrIEVuZ2FnZW1lbnQgYW5kIFBlcmZvcm1hbmNlOiBEb2VzIHRoZSAoTWlzKUFsaWdubWVudCBvZiBKdXN0aWNlIFNvdXJjZXMgTWF0dGVyPyBKb3VybmFsIG9mIEV1cm9wZWFuIFBzeWNob2xvZ3kgU3R1ZGVudHMsIDYgKDIpLCA3NeKAkzc4LiBkb2k6MTAuNTMzNC9qZXBzLmNzLgoqIEt1cmXEjWtvdsOhLCBWLiwgR2FicmhlbCwgVi4sIFrDoW1lxI1uw61rLCBQLiwgZXQgYWwuICgyMDE3KSBGaXJzdCBhaWQgYXMgYW4gaW1wb3J0YW50IHRyYWZmaWMgc2FmZXR5IGZhY3RvciDigJMgZXZhbHVhdGlvbiBvZiB0aGUgZXhwZXJpZW5jZeKAk2Jhc2VkIHRyYWluaW5nLiBFdXJvcGVhbiBUcmFuc3BvcnQgUmVzZWFyY2ggUmV2aWV3LCA5ICg1KS4gZG9pOjEwLjEwMDcvczEyNTQ0LTAxNi0wMjE4LTQvCiogxaBpbWXEjWVrLCBNLiwgR2FicmhlbCwgVi4sIFTDtmdlbCwgTS4sICYgTGF6b3IsIE0uICgyMDE4KS4gVHJhdmVsIGJlaGF2aW91ciBvZiBzZW5pb3JzIGluIEVhc3Rlcm4gRXVyb3BlOiBhIGNvbXBhcmF0aXZlIHN0dWR5IG9mIEJybm8gYW5kIEJyYXRpc2xhdmEuIEV1cm9wZWFuIFRyYW5zcG9ydCBSZXNlYXJjaCBSZXZpZXcsIDEwICgxNiksIDEtOC4gZG9pOjEwLjEwMDcvczEyNTQ0LTAxOC0wMjg2LTgKKiDFoHZhcmNvdsOhLCBKLiwgR2FicmhlbCwgVi4gKDIwMTQpLiBFZHVjYXRpb25hbCBNb2JpbGl0eSBhbmQgRWR1Y2F0aW9uYWwgQXNwaXJhdGlvbnMgb2YgSGlnaCBTY2hvb2wgU3R1ZGVudHMgaW4gdGhlIEN6ZWNoIFJlcHVibGljLiBUaGUgSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIEludGVyZGlzY2lwbGluYXJ5IEVkdWNhdGlvbmFsIFN0dWRpZXMsIDggKDIpLCAxLTEyLgoqIMWgdmFyY292w6EsIEouLCBIYXJhbnRvdsOhLCBMLiwgJiBHYWJyaGVsLCBWLiAoMjAxMykuIFN0YXRpc3RpY2FsIGFuYWx5c2lzIG9mIHN0dWRlbnTigJlzIGludGVyZXN0IGluIGNyZWF0aXZlIHByb2Zlc3Npb25zIGluIHRoZSBDemVjaCBSZXB1YmxpYy4gSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIE1hdGhlbWF0aWNhbCBNb2RlbHMgYW5kIE1ldGhvZHMgaW4gQXBwbGllZCBTY2llbmNlcywgNyAoMiksIDQ0NC00NTEuCiogVGhhcGEsIEQuLCBHYWJyaGVsLCBWLiwgJiBNaXNocmEsIFMuICgyMDIxKS4gV2hhdCBhcmUgdGhlIGZhY3RvcnMgZGV0ZXJtaW5pbmcgdXNlciBpbnRlbnRpb25zIHRvIHVzZSBBViB3aGlsZSBpbXBhaXJlZD8gVHJhbnNwb3J0YXRpb24gUmVzZWFyY2ggUGFydCBGOiBUcmFmZmljIFBzeWNob2xvZ3kgYW5kIEJlaGF2aW91ciwgODIsIDIzOC0yNTUuIGRvaTogMTAuMTAxNi9qLnRyZi4yMDIxLjA4LjAwOC4KCiMgU2VsZWN0ZWQgdGFsa3MKCiogR2FicmhlbCwgVi4gKDIwMTgpLiBQdWJsaWMgb3BpbmlvbiBvbiBhdXRvbWF0ZWQgdmVoaWNsZXM6IHRoZSBDemVjaCBjb250ZXh0LiBQYXBlciBwcmVzZW50ZWQgYXQgdGhlIGNvbmZlcmVuY2UgU2lsbmnEjW7DrSBrb25mZXJlbmNlIDIwMTggaW4gT3N0cmF2YSwgQ3plY2ggUmVwdWJsaWMuCiogR2FicmhlbCwgVi4sIEtvdcWZaWwsIFAuLCAmIExhem9yLCBNLiAoMjAxNykuIMSMZXNrbyB2IHBvaHlidS4gUGFwZXIgcHJlc2VudGVkIGF0IHRoZSBjb25mZXJlbmNlIFNpbG5pxI1uw60ga29uZmVyZW5jZSAyMDE3IGluIEJybm8sIEN6ZWNoIFJlcHVibGljLgoqIEdhYnJoZWwsIFYuLCDFoGVuaywgUC4sIExhem9yLCBNLiwgJiBPbmRyw6HEjWtvdsOhLCBKLiAoMjAxNikuIFRyYXZlbCBCZWhhdmlvciBpbiBDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZTogYSBCcmF0aXNsYXZhIENhc2UgU3R1ZHkuIFBhcGVyIHByZXNlbnRlZCBhdCB0aGUgV29ybGQgQ29uZmVyZW5jZSBvbiBUcmFuc3BvcnQgUmVzZWFyY2gg4oCTIFdDVFIgMjAxNiBTaGFuZ2hhaSBpbiBTaGFuZ2hhaSwgUGVvcGxl4oCZcyBSZXB1YmxpYyBvZiBDaGluYS4KKiBHYWJyaGVsLCBWLiAoMjAxOCkuIFB1YmxpYyBvcGluaW9uIG9uIGF1dG9tYXRlZCB2ZWhpY2xlczogdGhlIEN6ZWNoIGNvbnRleHQuIFBhcGVyIHByZXNlbnRlZCBhdCB0aGUgY29uZmVyZW5jZSBTaWxuacSNbsOtIGtvbmZlcmVuY2UgMjAxOCBpbiBPc3RyYXZhLCBDemVjaCBSZXB1YmxpYy4KKiBHYWJyaGVsLCBWLiwgWsOhbWXEjW7DrWssIFAuICgyMDE4KS4gQ29uY2VybnMgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBhdXRvbm9tb3VzIHZlaGljbGVzIGFuZCBvdGhlciB0cmFuc3BvcnQgc3lzdMOpbSB1c2Vycy4gUGFwZXIgcHJlc2VudGVkIGF0IHRoZSBjb25mZXJlbmNlIFJvYWQgU2FmZXR5IG9uIEZpdmUgQ29udGluZW50cyBpbiBKZWp1LCBSZXB1YmxpYyBvZiBLb3JlYS4KKiDFoGltZcSNZWssIE0uLCBHYWJyaGVsLCBWLiwgVG9nZWwsIE0uLCAmIExhem9yLCBNLiAoMjAxNikuIFRyYXZlbCBiZWhhdmlvdXIgb2Ygc2VuaW9ycyBpbiBDZW50cmFsIEV1cm9wZTogYSBjb21wYXJhdGl2ZSBzdHVkeSBvZiBCcm5vIGFuZCBCcmF0aXNsYXZhLiBQYXBlciBwcmVzZW50ZWQgYXQgdGhlIGNvbmZlcmVuY2UgTkVDVEFSIEpvaW50IENsdXN0ZXIgMiBhbmQgQ2x1c3RlciAzIEludGVybmF0aW9uYWwgV29ya3Nob3Ag4oCcVGhlIHJvbGUgb2YgcGxhbm5pbmcgdG93YXJkcyBzdXN0YWluYWJsZSB1cmJhbiBtb2JpbGl0eeKAnSBpbiBCcm5vLCBDemVjaCBSZXB1YmxpYy4KCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48Yj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HbyBiYWNrPC9iPjwvYT48L3A+