CINXE.COM

interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide · GitHub

<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-3e154969b9f9.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-9c5b7a476542.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-afda8eb0fb33.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-2494e44ccdc5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-56fff47acadc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-71cd4cc132ec.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fd5499848985.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-31d17ba3e139.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-68d6b2c79663.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-4cf0d59ab51a.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-af846850481e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-8b10f05a77e6.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-d3b66f11d613.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-9c77ed90200e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-a0610fd00b47.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["copilot_new_references_ui","copilot_beta_features_opt_in","copilot_chat_static_thread_suggestions","copilot_conversational_ux_history_refs","copilot_implicit_context","copilot_smell_icebreaker_ux","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","hovercard_accessibility","issues_react_new_timeline","issues_react_avatar_refactor","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","react_keyboard_shortcuts_dialog","remove_child_patch","sample_network_conn_type","site_metered_billing_update","issues_react_first_time_contribution_banner","ui_commands_respect_modals","lifecycle_label_name_updates"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-0c166a63ca9a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_js-b73fdff77a4e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-aff936e590ed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-247092-740e4ddd559d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-93b6a0551aa9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-cd35650c2e9c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-4aa4b0e95669.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-6d3967acd51c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_combobox-nav_dist_index_js-node_modules_github_g-emoji-element_di-6ce195-53781cbc550f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-6afc16-3cdfa69a0406.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-f5498b8d4e5d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-492b5042c841.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-1f651a-1e3d784c897c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-7671f1-dc6cac136d88.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-71486356f507.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-e3ab8405ef80.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-bb80ec-634de60bacfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-ce7225a304c5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-f3aee1-e6893db9c19e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-f8a5485c982a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-858e043fcf76.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-6cf3320416b8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_scroll-anchoring_dist_scroll-anchoring_esm_js-node_modules_stacktrace-pa-a71630-6f3c4f0189d8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-0e07cc183eed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-0b5e12-889cec8cf448.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-eae9df0dd562.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-18d1c91a7872.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-7cbef09a422c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-d0d0a6-0e9fa537dc4f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-c89801ebbe15.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-a6e4c4c86bfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-3366f6b6298e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-9b97703a4e6a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-13971a40799a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lodash-es__Stack_js-node_modules_lodash-es__Uint8Array_js-node_modules_l-4faaa6-13a0602a5edf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lodash-es__baseIsEqual_js-8929eb9718d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-9002b0-8e5e346f0cbe.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-014121-e1792bd5a31e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-c733d4a976df.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-b10086b6761e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_utilities_web-worker_ts-ui_packages_code-view-shared_worker-jobs-7fe572-d1c1cf476cef.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-0996d093463a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_utili-228da6-37a4eeff405d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-file-page-payload_ts-ui_packages_code-view-shared_comp-1beb66-b07e414af699.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_blob-anchor_ts-ui_packages_code-nav_code-nav_ts-ui_packages_filter--8253c1-87c39cb5708f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-code-view-2e4c003d0fcf.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-code-view.6b587a69b593e23c3657.module.css" /> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-3eda30673b32.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide · GitHub</title> <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient> <meta name="route-controller" content="blob" data-turbo-transient> <meta name="route-action" content="show" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="8756:22B485:C09196:D79ACC:67470F51" data-pjax-transient="true"/><meta name="html-safe-nonce" content="3c265bf49cb88b903d4c64475165a4eb3b55b41d9a2d57f22f76d6f48ea21e2c" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4NzU2OjIyQjQ4NTpDMDkxOTY6RDc5QUNDOjY3NDcwRjUxIiwidmlzaXRvcl9pZCI6IjUyMTU3MzMxOTI3ODY5MDY5NjEiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="2bd7843fd5878a06a50b3ad330befaa9c954e23973e2308d94eaf189f98b29f0" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:56664648" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="推荐免费ChatGPT网站:https://www.lintcode.com/chat-gpt?utm_source=tf-github-NotFound 点此领取7天VIP会员:https://www.lintcode.com/vip/activity/z1qgMH 《大厂面试指北》——包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结构、操作系统、设计模式、系统设计、框架原理。 - interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/af0729f8647c3c6befe726f9d9641af8cd4a93bdf708602b5aaff93d2c3f26ed/NotFound9/interviewGuide" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide" /><meta name="twitter:description" content="推荐免费ChatGPT网站:https://www.lintcode.com/chat-gpt?utm_source=tf-github-NotFound 点此领取7天VIP会员:https://www.lintcode.com/vip/activity/z1qgMH 《大厂面试指北》——包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结..." /> <meta property="og:image" content="https://opengraph.githubassets.com/af0729f8647c3c6befe726f9d9641af8cd4a93bdf708602b5aaff93d2c3f26ed/NotFound9/interviewGuide" /><meta property="og:image:alt" content="推荐免费ChatGPT网站:https://www.lintcode.com/chat-gpt?utm_source=tf-github-NotFound 点此领取7天VIP会员:https://www.lintcode.com/vip/activity/z1qgMH 《大厂面试指北》——包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide" /><meta property="og:url" content="https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md" /><meta property="og:description" content="推荐免费ChatGPT网站:https://www.lintcode.com/chat-gpt?utm_source=tf-github-NotFound 点此领取7天VIP会员:https://www.lintcode.com/vip/activity/z1qgMH 《大厂面试指北》——包括Java基础、JVM、数据库、mysql、redis、计算机网络、算法、数据结..." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="cc7767a0c18d7e936a37ec4b8ef829934f464822634943ba0cbdcb5e25e14f1d" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="ace39c3b6632770952207593607e6e0be0db363435a8b877b1f96abe6430f345" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="15b18460ccb38585911f0182c65a829cc58635f60a4a305813e3a2bc7ff7d158" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="b683bfe8ba503fb752a8a7e87a8162efe7eaf74732202ad69805baa0fa057db8" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta name="turbo-cache-control" content="no-cache" data-turbo-transient> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/NotFound9/interviewGuide git https://github.com/NotFound9/interviewGuide.git"> <meta name="octolytics-dimension-user_id" content="16741621" /><meta name="octolytics-dimension-user_login" content="NotFound9" /><meta name="octolytics-dimension-repository_id" content="56664648" /><meta name="octolytics-dimension-repository_nwo" content="NotFound9/interviewGuide" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="56664648" /><meta name="octolytics-dimension-repository_network_root_nwo" content="NotFound9/interviewGuide" /> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-78b8b9792a5f.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-cf3dd69d89eb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-8fa3b694f335.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Logomark;ref_loc:Header&quot;}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FNotFound9%2FinterviewGuide%2Fblob%2Fmaster%2Fdocs%2FJavaMultiThread.md" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7584f6ea1edadfc4fff880e0992b79cfb39a4f287a25517ae9c55a6a7c8363d5" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to Sign in&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_copilot&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_copilot_link_product_navbar&quot;}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;security&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;security_link_product_navbar&quot;}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;actions&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;actions_link_product_navbar&quot;}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;codespaces&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;codespaces_link_product_navbar&quot;}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;issues&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;issues_link_product_navbar&quot;}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_review&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_review_link_product_navbar&quot;}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;discussions&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;discussions_link_product_navbar&quot;}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;code_search&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;code_search_link_product_navbar&quot;}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;all_features&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;all_features_link_product_navbar&quot;}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;documentation&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;documentation_link_product_navbar&quot;}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_skills&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_skills_link_product_navbar&quot;}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;blog&quot;,&quot;context&quot;:&quot;product&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;blog_link_product_navbar&quot;}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprises&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;startups&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}" href="https://github.com/enterprise/startups"> Startups </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devsecops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ci_cd&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ci_cd_link_solutions_navbar&quot;}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;healthcare&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;financial_services&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;manufacturing&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;government&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all_industries&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;ai&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;devops&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;security&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;software_development&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;view_all&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;view_all_link_resources_navbar&quot;}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;learning_pathways&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;learning_pathways_link_resources_navbar&quot;}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;white_papers_ebooks_webinars&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;white_papers_ebooks_webinars_link_resources_navbar&quot;}" href="https://resources.github.com"> White papers, Ebooks, Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;customer_stories&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;partners&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_sponsors&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;the_readme_project&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;the_readme_project_link_open_source_navbar&quot;}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;topics&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;trending&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;collections&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;advanced_security&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;advanced_security_link_enterprise_navbar&quot;}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;github_copilot&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;github_copilot_link_enterprise_navbar&quot;}" href="/features/copilot#enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;premium_support&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;pricing&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;pricing_link_global_navbar&quot;}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:NotFound9/interviewGuide" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="8JQ0bxklNRInLp8skTEsly9ZMIIrvZf7oWJ-MWuKmZ6tUP8b8HTrpFH2zpC3d-QNWFxnw-iYY0uFJVnbMr8Q2A" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="NotFound9/interviewGuide" data-current-org="" data-current-owner="NotFound9" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{&quot;location&quot;:&quot;navbar&quot;,&quot;action&quot;:&quot;searchbar&quot;,&quot;context&quot;:&quot;global&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-c642ded7-41b8-4110-9014-0c486d9275b6" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-c642ded7-41b8-4110-9014-0c486d9275b6" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2"> Search syntax tips </a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="YXMmq54KUhxwPPdX1eXXowB2Cex4VqtTZygrD4JPqixpDLQjyfvH+/Qn5nfnkzax7s4Qxh8eNsiDEwXCLCBeEQ==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="TMpEtXznAw/VOwKDEQDOsNZGQ/ytjjwvKXtNLr2G4C1UTSrUQcBJLB/6RQEAjgoWy5KrHoagwnh/VjzmkTORow==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="krMk3dILdm1KuDZereAN0eCAnOBHFu34LqeldaMmscyTqGpqjT2dYj7o1FxQ917gbVtdTDJr4dRZcCn66AD1ZA==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FNotFound9%2FinterviewGuide%2Fblob%2Fmaster%2Fdocs%2FJavaMultiThread.md" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7584f6ea1edadfc4fff880e0992b79cfb39a4f287a25517ae9c55a6a7c8363d5" data-analytics-event="{&quot;category&quot;:&quot;Marketing nav&quot;,&quot;action&quot;:&quot;click to go to homepage&quot;,&quot;label&quot;:&quot;ref_page:Marketing;ref_cta:Sign in;ref_loc:Header&quot;}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=NotFound9%2FinterviewGuide" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7584f6ea1edadfc4fff880e0992b79cfb39a4f287a25517ae9c55a6a7c8363d5" data-analytics-event="{&quot;category&quot;:&quot;Sign up&quot;,&quot;action&quot;:&quot;click to sign up for account&quot;,&quot;label&quot;:&quot;ref_page:/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show;ref_cta:Sign up;ref_loc:header logged out&quot;}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-670aa46c-327a-4d6c-9531-782c03f8b131" aria-labelledby="tooltip-f3d227b7-17c7-4173-bb8f-c68b545e1aa8" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-f3d227b7-17c7-4173-bb8f-c68b545e1aa8" for="icon-button-670aa46c-327a-4d6c-9531-782c03f8b131" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/NotFound9/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/NotFound9"> NotFound9 </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/NotFound9/interviewGuide">interviewGuide</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2FNotFound9%2FinterviewGuide" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="13526313356da40276271897498ddcdc0dcbf3162b56b428b464fa52e0230009" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-cc8067b8-ecd2-4d71-9a6d-f48d314de771" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2FNotFound9%2FinterviewGuide" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:56664648,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="1e56d8103d2459665c92ac640a408580c1b934c819163422af4749544c549986" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="684" data-view-component="true" class="Counter">684</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FNotFound9%2FinterviewGuide" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:56664648,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="6202e79ae030266da68eea6f12d6531656469bc19d07e1c7a45ec387d769fb92" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="3935 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="3,935" data-view-component="true" class="Counter js-social-count">3.9k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/NotFound9/interviewGuide" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /NotFound9/interviewGuide" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/NotFound9/interviewGuide/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /NotFound9/interviewGuide/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="12" data-view-component="true" class="Counter">12</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/NotFound9/interviewGuide/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /NotFound9/interviewGuide/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="2" data-view-component="true" class="Counter">2</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/NotFound9/interviewGuide/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /NotFound9/interviewGuide/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/NotFound9/interviewGuide/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /NotFound9/interviewGuide/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Projects&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/NotFound9/interviewGuide/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /NotFound9/interviewGuide/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/NotFound9/interviewGuide/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/NotFound9/interviewGuide/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /NotFound9/interviewGuide/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-button" popovertarget="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-overlay" aria-controls="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-list" aria-haspopup="true" aria-labelledby="tooltip-ac4c640c-ea78-4797-a525-d80a68bdbf7d" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-ac4c640c-ea78-4797-a525-d80a68bdbf7d" for="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position id="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-overlay" anchor="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-button" id="action-menu-a5ea670a-0c3f-4e32-bbae-8dc9f91da40c-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-76571f09-c057-4d68-99f8-ac4113c40f75" href="/NotFound9/interviewGuide" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-64449677-4569-47da-a1e7-db8ff8fda487" href="/NotFound9/interviewGuide/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-85b9a755-d15b-4888-bd89-860474b50f98" href="/NotFound9/interviewGuide/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-092a0a11-7cc2-4151-868c-f785f22b538b" href="/NotFound9/interviewGuide/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-c73fd546-84dd-4111-99c6-ccb6830db414" href="/NotFound9/interviewGuide/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-86079b5f-35e2-49d8-bc63-e13375e81c64" href="/NotFound9/interviewGuide/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-1c18299d-19b0-4229-9ca9-28dec000007b" href="/NotFound9/interviewGuide/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <react-app app-name="react-code-view" initial-path="/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md" style="display: block; min-height: calc(100vh - 64px);" data-attempted-ssr="true" data-ssr="true" data-lazy="false" data-alternate="false" > <script type="application/json" data-target="react-app.embeddedData">{"payload":{"allShortcutsEnabled":false,"fileTree":{"docs":{"items":[{"name":"ArrayList.md","path":"docs/ArrayList.md","contentType":"file"},{"name":"BATInterview.md","path":"docs/BATInterview.md","contentType":"file"},{"name":"CodingInterviews.md","path":"docs/CodingInterviews.md","contentType":"file"},{"name":"Coding_Array.md","path":"docs/Coding_Array.md","contentType":"file"},{"name":"Coding_BinaryTree.md","path":"docs/Coding_BinaryTree.md","contentType":"file"},{"name":"Coding_LinkedList.md","path":"docs/Coding_LinkedList.md","contentType":"file"},{"name":"Git.md","path":"docs/Git.md","contentType":"file"},{"name":"HTTP.md","path":"docs/HTTP.md","contentType":"file"},{"name":"HashMap.md","path":"docs/HashMap.md","contentType":"file"},{"name":"JVMBook.md","path":"docs/JVMBook.md","contentType":"file"},{"name":"JavaBasic.md","path":"docs/JavaBasic.md","contentType":"file"},{"name":"JavaJVM.md","path":"docs/JavaJVM.md","contentType":"file"},{"name":"JavaMultiThread.md","path":"docs/JavaMultiThread.md","contentType":"file"},{"name":"Kafka.md","path":"docs/Kafka.md","contentType":"file"},{"name":"LeetCode.md","path":"docs/LeetCode.md","contentType":"file"},{"name":"LeetCode1.md","path":"docs/LeetCode1.md","contentType":"file"},{"name":"Lock.md","path":"docs/Lock.md","contentType":"file"},{"name":"MySQLBook1.md","path":"docs/MySQLBook1.md","contentType":"file"},{"name":"MySQLNote.md","path":"docs/MySQLNote.md","contentType":"file"},{"name":"MySQLOptimize.md","path":"docs/MySQLOptimize.md","contentType":"file"},{"name":"MySQLWork.md","path":"docs/MySQLWork.md","contentType":"file"},{"name":"Nginx.md","path":"docs/Nginx.md","contentType":"file"},{"name":"RedisBasic.md","path":"docs/RedisBasic.md","contentType":"file"},{"name":"RedisBook1.md","path":"docs/RedisBook1.md","contentType":"file"},{"name":"RedisBook2.md","path":"docs/RedisBook2.md","contentType":"file"},{"name":"RedisDataStruct.md","path":"docs/RedisDataStruct.md","contentType":"file"},{"name":"RedisStore.md","path":"docs/RedisStore.md","contentType":"file"},{"name":"RedisUserful.md","path":"docs/RedisUserful.md","contentType":"file"},{"name":"Rule.md","path":"docs/Rule.md","contentType":"file"},{"name":"Spring.md","path":"docs/Spring.md","contentType":"file"},{"name":"SystemDesign.md","path":"docs/SystemDesign.md","contentType":"file"},{"name":"ZooKeeper.md","path":"docs/ZooKeeper.md","contentType":"file"},{"name":"_sidebar.md","path":"docs/_sidebar.md","contentType":"file"},{"name":"algorithm.md","path":"docs/algorithm.md","contentType":"file"},{"name":"bookRecommend.md","path":"docs/bookRecommend.md","contentType":"file"},{"name":"idgenerator.md","path":"docs/idgenerator.md","contentType":"file"},{"name":"linux.md","path":"docs/linux.md","contentType":"file"}],"totalCount":37},"":{"items":[{"name":"docs","path":"docs","contentType":"directory"},{"name":"static","path":"static","contentType":"directory"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".nojekyll","path":".nojekyll","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"_sidebar.md","path":"_sidebar.md","contentType":"file"},{"name":"index.html","path":"index.html","contentType":"file"}],"totalCount":8}},"fileTreeProcessingTime":4.870423,"foldersToFetch":[],"repo":{"id":56664648,"defaultBranch":"master","name":"interviewGuide","ownerLogin":"NotFound9","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-04-20T07:17:09.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/16741621?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1477196194.0","canEdit":false,"refType":"branch","currentOid":"2d117250c7df32ce37fd8f635c37bd221310531d"},"path":"docs/JavaMultiThread.md","currentUser":null,"blob":{"rawLines":["(PS:扫描[首页里面的二维码](README.md)进群,分享我自己在看的技术资料给大家,希望和大家一起学习进步!)","# 多线程专题","","#### [1.进程与线程的区别是什么?](#进程与线程的区别是什么?)","#### [2.进程间如何通信?](#进程间如何通信?)","","#### [3.Java中单例有哪些写法?](#Java中单例有哪些写法?)","#### [4.Java中创建线程有哪些方式?](#Java中创建线程有哪些方式?)","#### [5.如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)","#### [6.volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?](#volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?)","#### [7.Java中线程的状态是怎么样的?](#Java中线程的状态是怎么样的?)","#### [8.wait(),join(),sleep()方法有什么作用?](#wait(),join(),sleep()方法有什么作用?)","#### [9.Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?](#Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?)","#### [10.谈一谈你对线程中断的理解?](#谈一谈你对线程中断的理解?)","#### [11.线程间怎么通信?](#线程间怎么通信?)","#### [12.怎么实现实现一个生产者消费者?](#怎么实现实现一个生产者消费者?)","#### [13.谈一谈你对线程池的理解?](#谈一谈你对线程池的理解?)","#### [14.线程池有哪些状态?](#线程池有哪些状态?)","","### 进程与线程的区别是什么?","","#### 批处理操作系统","","**批处理操作系统**就是把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。","","批处理操作系统在一定程度上提高了计算机的效率,但是由于**批处理操作系统的指令运行方式仍然是串行的,内存中始终只有一个程序在运行**,后面的程序需要等待前面的程序执行完成后才能开始执行,而前面的程序有时会由于I/O操作、网络等原因阻塞,导致CPU闲置所以**批处理操作效率也不高**。","","#### 进程的提出","","批处理操作系统的瓶颈在于内存中只存在一个程序,进程的提出,可以让内存中存在多个程序,每个程序对应一个进程,进程是操作系统资源分配的最小单位。CPU采用时间片轮转的方式运行进程:CPU为每个进程分配一个时间段,称作它的时间片。如果在时间片结束时进程还在运行,则暂停这个进程的运行,并且CPU分配给另一个进程(这个过程叫做上下文切换)。如果进程在时间片结束前阻塞或结束,则CPU立即进行切换,不用等待时间片用完。多进程的好处在于一个在进行IO操作时可以让出CPU时间片,让CPU执行其他进程的任务。","","#### 线程的提出","","随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。","","#### 进程和线程的区别","","进程是计算机中已运行程序的实体,进程是操作系统资源分配的最小单位。而线程是在进程中执行的一个任务,是CPU调度和执行的最小单位。他们两个本质的区别是是否**单独占有内存地址空间及其它系统资源(比如I/O)**:","","* 进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。","","* 进程单独占有一定的内存地址空间,一个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高;一个线程崩溃可能影响整个程序的稳定性,可靠性较低。","","* 进程单独占有一定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较大;线程只需要保存寄存器和栈信息,开销较小。","","另外一个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位 。","","#### 独立性","","Linux系统会给每个进程分配4G的虚拟地址空间(0到3G是User地址空间,3到4G部分是kernel地址空间),进程具备私有的地址空间,未经允许,一个用户进程不能访问其他进程的地址空间。","","#### 动态性","","程序是一个静态的指令集合,而进程是正在操作系统中运行的指令集合,进程有自己的生命周期和各种不同的状态。","","五态模型一般指的是:","","**新建态**(创建一个进程)","","**就绪态**(已经获取到资源,准备好了,进入运行队列,一旦获得时间片可以立即执行)","","**运行态**(获取到了时间片,执行程序)","","**阻塞态**(运行过程中等待获取其他资源,I/O请求等)","","**终止态**(进程被杀死了)","","#### 并发性","","多个进程可以在CPU上并发执行。","线程是独立运行和调度的最小单位,线程会共享进程的虚拟空间,一个进程会对应多个线程。在Java中,线程拥有自己私有的程序计数器,虚拟机栈,本地方法栈。","","#### PS:虚拟内存","","虚拟内存是一种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做一级存储器来用。虚拟内存技术的实现利用了自动覆盖和交换技术。简单的说就是将硬盘的一部分作为内存来使用。","","#### PS:虚拟地址空间","","每个进程有4G的地址空间,在运行程序时,只有一部分数据是真正加载到内存中的,内存管理单元将虚拟地址转换为物理地址,如果内存中不存在这部分数据,那么会使用页面置换方法,将内存页置换出来,然后将外存中的数据加入到内存中,使得程序正常运行。","","### 进程间如何通信?","","进程间通信的方式主要有管道,","","#### 管道","","调用pipe函数在内存中开辟一块缓冲区,管道半双工的(即数据只能在一个方向上流动),具有固定的读端和写端,调用","","```","#include \u003cunistd.h\u003e","int pipe(int pipefd[2]);","```","","### Java中创建线程有哪些方式?","","#### 第一种 继承Thread类,重写Run方法","","这种方法就是通过自定义CustomThread类继承Thread类,重写run()方法,然后创建CustomThread的对象,然后调用start()方法,JVM会创建出一个新线程,并且为线程创建方法调用栈和程序计数器,此时线程处于就绪状态,当线程获取CPU时间片后,线程会进入到运行状态,会去调用run()方法。并且创建CustomThread类的对象的线程(这里的例子中是主线程)与调用run()方法的线程之间是并发的,也就是在执行run()方法时,主线程可以去执行其他操作。","","```java","class CustomThread extends Thread {"," public static void main(String[] args) {"," System.out.println(Thread.currentThread().getName()+\"线程调用了main方法\");"," for (int i = 0; i \u003c 10; i++) {"," if (i == 1) {"," CustomThread customThread = new CustomThread();"," customThread.start();"," System.out.println(Thread.currentThread().getName()+\"线程--i是\"+i);"," }"," }"," System.out.println(\"main()方法执行完毕!\");"," }"," void run() {"," System.out.println(Thread.currentThread().getName()+\"线程调用了run()方法\");"," for (int j = 0; j \u003c 5; j++) {"," System.out.println(Thread.currentThread().getName()+\"线程--j是\"+j);"," }"," System.out.println(\"run()方法执行完毕!\");"," }","}","```","","输出结果如下:","","```","main线程调用了main方法","Thread-0线程调用了run()方法","Thread-0线程--j是0","main线程--i是1","Thread-0线程--j是2","Thread-0线程--j是3","Thread-0线程--j是4","run()方法执行完毕!","main()方法执行完毕!","```","","可以看到在创建一个CustomThread对象,调用start()方法后,Thread-0调用了run方法,进行for循环,对j进行打印,与此同时,main线程并没有被阻塞,而是继续执行for循环,对i进行打印。","","##### 执行原理","","首先我们可以来看看start的源码,首先会判断threadStatus是否为0,如果不为0会抛出异常。然后会将当前对象添加到线程组,最后调用start0方法,因为是native方法,看不到源码,根据上面的执行结果来看,JVM新建了一个线程调用了run方法。","","```java","private native void start0();","","public synchronized void start() {"," \t//判断当前Thread对象是否是新建态,否则抛出异常"," if (threadStatus != 0)"," throw new IllegalThreadStateException();"," //将当前对象添加到线程组"," group.add(this);"," boolean started = false;"," try {"," start0();//这是一个native方法,调用后JVM会新建一个线程来调用run方法"," started = true;"," } finally {"," try {"," if (!started) {"," group.threadStartFailed(this);"," }"," } catch (Throwable ignore) {"," /* do nothing. If start0 threw a Throwable then"," it will be passed up the call stack */"," }"," }","}","```","扩展问题:多次调用Thread对象的start()方法会怎么样?","","会抛出IllegalThreadStateException异常。其实在Thread#start()方法里面的的注释中有提到,多次调用start()方法是非法的,所以在上面的start()方法源码中一开始就是对threadStatus进行判断,不为0就会抛出IllegalThreadStateException异常。","","![image-20200105144159345](../static/image-20200105144159345.png)","","##### 注意事项:","","start()方法中判断threadStatus是否为0,是判断当前线程是否新建态,0是代表新建态(上图中的源码注释里面有提到),而不是就绪态,因为Java的Thread类中,Thread的Runnable状态包括了线程的就绪态和运行态,(Thread的state为RUNNABLE时(也就是threadStatus为4时),代表线程为就绪态或运行态)。执行start()方法的线程还不是JVM新建的线程,所以不是就绪态。有一些技术文章把这里弄错了,例如这一篇[《深入浅出线程Thread类的start()方法和run()方法》](https://juejin.im/post/5b09274af265da0de25759d5)","","![image-20200105144031591](../static/image-20200105144031591.png)","","##### 总结","","这种方式的缺点很明显,就是需要继承Thread类,而且实际上我们的需求可能仅仅是希望某些操作被一个其他的线程来执行,所以有了第二种方法。","","#### 第二种 实现Runnable接口","","这种方式就是创建一个类(例如下面代码中的Target类),实现Runnable接口的Run方法,然后将Target类的实例对象作为Thread的构造器入参target,实际的线程对象还是Thread实例,只不过线程Thread与线程执行体(Target类的run方法)分离了,耦合度更低一些。","","```java","class ThreadTarget implements Runnable {"," void run() {"," System.out.println(Thread.currentThread().getName()+\"线程执行了run方法\");"," }"," public static void main(String[] args) {"," System.out.println(Thread.currentThread().getName()+\"线程执行了main方法\");"," ThreadTarget target = new ThreadTarget();"," Thread thread = new Thread(target);"," thread.start();"," }","}","```","","输出结果如下:","","![image-20200105163553969](../static/image-20200105163553969.png)","","##### 原理","","之所以有这种实现方法,是因为Thread类的run()方法中会判断成员变量target是否为空,不为空就会调用target类的run方法。","","```java","private Runnable target;","public void run() {"," if (target != null) {"," \t\ttarget.run();"," }","}","```","","##### 另外一种写法","","这种实现方式也有其他的写法,可以不创建Target类。","","##### 匿名内部类","","可以不创建Target类,可以使用匿名内部类的方式来实现,因此上面的代码也可以按以下方式写:","","```java","Thread thread = new Thread(new Runnable() {"," @Override"," public void run() {"," \t\tSystem.out.println(Thread.currentThread().getName()+\"线程执行了run方法\");"," }","});","thread.start();","```","##### Lamda表达式","","在Java8之后,使用了@FunctionalInterface注解来修饰Runnable接口,表明Runnable接口是一个函数式接口,有且只有一个抽象方法,可以Lambda方式来创建Runnable对象,比使用匿名类的方式更加简洁一些。","","```java","@FunctionalInterface","public interface Runnable {"," public abstract void run();","}","```","","因此上面的代码也可以按以下方式写:","","```java","Thread thread = new Thread(()-\u003e{"," System.out.println(Thread.currentThread().getName()+\"线程执行了run方法\");","})","thread.start() ","```","","##### 总结","","这种写法不用继承Thread,但是同样也有缺点,就是线程方法体(也就是run方法)不能设置返回值。","","#### 第三种 实现Callable接口","","Runnable接口中的run()方法是没有返回值,如果我们需要执行的任务带返回值就不能使用Runnable接口。创建一个类CallableTarget,实现Callable接口,实现带有**返回值的call()方法**,然后根据CallableTarget创建一个任务FutureTask,然后根据FutureTask来创建一个线程Thread,调用Thread的start方法可以执行任务。","","```java","public class CallableTarget implements Callable\u003cInteger\u003e {"," public Integer call() throws InterruptedException {"," System.out.println(Thread.currentThread().getName()+\"线程执行了call方法\");"," Thread.sleep(5000);"," return 1;"," }"," public static void main(String[] args) throws ExecutionException, InterruptedException {"," System.out.println(Thread.currentThread().getName()+\"线程执行了main方法\");"," CallableTarget callableTarget = new CallableTarget();"," FutureTask\u003cInteger\u003e task = new FutureTask\u003cInteger\u003e(callableTarget);"," Thread thread = new Thread(task);"," thread.start();"," Integer result = task.get();//当前线程会阻塞,一直等到结果返回。"," System.out.println(\"执行完毕,打印result=\"+result);"," System.out.println(\"执行完毕\");"," }","}","```","","原理就是Thread类默认的run()方法实现是会去调用自身实例变量target的run()方法,(target就是我们构造Thread传入的FutureTask),而FutureTask的run方法中就会调用Callable接口的实例的call()方法。","","```java","//Thread类的run方法实现","@Override","public void run() {"," if (target != null) {"," //这里target就是我们在创建Thread时传入的FutureTask实例变量"," target.run();"," }","}","//FutureTask类的run方法实现","public void run() {"," if (state != NEW ||"," !UNSAFE.compareAndSwapObject(this, runnerOffset,"," null, Thread.currentThread()))"," return;"," try {"," Callable\u003cV\u003e c = callable;"," if (c != null \u0026\u0026 state == NEW) {"," V result;"," boolean ran;"," try {"," //在这里会调用Callable实例的call方法"," result = c.call();"," ran = true;"," } catch (Throwable ex) {"," result = null;"," ran = false;"," setException(ex);"," }"," if (ran)"," set(result);"," }"," } finally {"," // runner must be non-null until state is settled to"," // prevent concurrent calls to run()"," runner = null;"," // state must be re-read after nulling runner to prevent"," // leaked interrupts"," int s = state;"," if (s \u003e= INTERRUPTING)"," handlePossibleCancellationInterrupt(s);"," }","}","```","","### Java中的Runnable、Callable、Future、FutureTask的区别和联系?","","最原始的通过新建线程执行任务的方法就是我们去新建一个类,继承Thread,然后去重写run()方法,但是这样限制太大了,Java也不支持多继承。所以有了Runnable。","##### Runnable","Runnable是一个接口,只需要新建一个类实现这个接口,然后重写run方法,将该类的实例作为创建Thread的入参,线程运行时就会调用该实例的run方法。","```java","@FunctionalInterfacepublic interface Runnable {"," public abstract void run();","}","```","","Thread.start()方法-\u003eThread.run()方法-\u003etarget.run()方法","","##### Callable","","Callable跟Runnable类似,也是一个接口。只不过它的call方法有返回值,可以供程序接收任务执行的结果。","","```java","@FunctionalInterfacepublic interface Callable\u003cV\u003e {"," V call() throws Exception;","}","```","","##### Future","","Future也是一个接口,Future就像是一个管理的容器一样,进一步对Runable和Callable的实例进行封装,定义了一些方法。取消任务的cancel()方法,查询任务是否完成的isDone()方法,获取执行结果的get()方法,带有超时时间来获取执行结果的get()方法。","","```java","public interface Future\u003cV\u003e {"," //mayInterruptIfRunning代表是否强制中断"," //为true,如果任务已经执行,那么会调用Thread.interrupt()方法设置中断标识"," //为false,如果任务已经执行,就只会将任务状态标记为取消,而不会去设置中断标识"," boolean cancel(boolean mayInterruptIfRunning);"," boolean isCancelled();"," boolean isDone();"," V get() throws InterruptedException, ExecutionException;"," V get(long timeout, TimeUnit unit) "," throws InterruptedException, ExecutionException, TimeoutException;","}","```","","##### FutureTask","","因为Future只是一个接口,并不能实例化,可以认为FutureTask就是Future接口的实现类,FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承Runnable接口和Future接口。","","```java","public class FutureTask\u003cV\u003e implements RunnableFuture\u003cV\u003e {","...","}","","public interface RunnableFuture\u003cV\u003e extends Runnable, Future\u003cV\u003e {"," void run();","}","```","","##### 使用案例","","使用时,Runnable实现类的实例可以作为Thread的入参使用,而Callable只能使用FutureTask进行封装使用。","","```java","//Runnable配合Thread进行使用","Thread threadA = new Thread(new Runnable() {"," @Override"," public void run() { ","\t\t\t//任务的代码"," }"," });","","//Callable使用FutureTask封装后,配合线程池进行使用","ExecutorService pool = Executors.newSingleThreadExecutor();","FutureTask task = new FutureTask(new Callable() {"," @Override"," public Object call() throws Exception {"," //任务的代码"," return null;"," }","});","pool.submit(task);","","//Runnable使用FutureTask封装后,配合线程池进行使用","FutureTask task1 = new FutureTask(new Runnable() {"," @Override"," public void run() {"," \t\t\t\t//任务的代码"," }","});","pool.submit(task1);","```","","### Java中单例有哪些写法?","","正确并且可以做到延迟加载的写法其实就是三种:","","1.使用volatile修饰变量并且双重校验的写法来实现。","","2.使用静态内部类来实现(类A有一个静态内部类B,类B有一个静态变量instance,类A的getInstance()方法会返回类B的静态变量instance,因为只有调用getInstance()方法时才会加载静态内部类B,这种写法缺点是不能传参。)","","3.使用枚举来实现","","#### 第1种 不加锁(裸奔写法)","","多线程执行时,可能会在instance完成初始化之前,其他线性线程判断instance为null,从而也执行第二步的代码,导致初始化覆盖。","","```java","public class UnsafeLazyInitialization {","\tprivate static Instance instance;","\tpublic static Instance getInstance() {"," if (instance == null) //1"," instance = new Instance(); //2"," }"," return instance;","}","```","","#### 第2种-对方法加sychronize锁(俗称的懒汉模式)","","初始化完成以后,每次调用getInstance()方法都需要获取同步锁,导致不必要的开销。","","```java","public class Singleton {"," private static Singleton instance;"," public synchronized static Singleton getInstance() {"," if (instance == null)"," instance = new Instance();"," return instance;"," }","}","```","#### 第3种-使用静态变量(俗称的饿汉模式)","","```","public class Singleton { "," private static Singleton instance = new Singleton(); "," public static Singleton getInstance() { "," return instance; "," } ","} ","```","这种方法是缺点在于不能做到延时加载,在第一次调用getInstance()方法之前,如果Singleton类被使用到,那么就会对instance变量初始化。","","#### 第4种-使用双重检查锁定","","代码如下:","","```java","public class Singleton { "," private static Singleton instance; "," public static Singleton getInstance() { "," if (instance == null) { "," synchronized (Singleton.class) { "," if (instance == null) { //双重检查存在的意义在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。 "," instance = new Singleton(); "," }"," } "," } "," return instance; "," } ","} ","```","","instance = new Singleton(); ","","这句代码在执行时会分解为三个步骤:","","1.为对象分配内存空间。","","2.执行初始化的代码。","","3.将分配好的内存地址设置给instance引用。","","但是编译器会对指令进行重排序,只能保证单线程执行时结果不会变化,也就是可能第3步会在第2步之前执行,某个线程A刚好执行完第3步,正在执行第2步时,此时如果有其他线程B进入if (instance == null)判断,会发现instance不为null,然后将instance返回,但是实际上instance还没有完成初始化,线程B会访问到一个未初始化完成的instance对象。所以需要像第5种解法一样使用volatile来修饰变量,防止重排序。","","#### 第5种 基于 volatile 的双重检查锁定的解决方案","","代码如下:","","```java","public class Singleton { "," private volatile static Singleton instance; "," public static Singleton getInstance() { "," if (instance == null) { "," synchronized (Singleton.class) { "," if (instance == null)//双重检查存在的意义在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。"," instance = new Singleton(); "," } "," } "," return instance; "," } ","} ","```","","volatile可以保证变量的内存可见性及防止指令重排。","","volatile修饰的变量在编译后,会多出一个lock前缀指令,lock前缀指令相当于一个内存屏障(内存栅栏),有三个作用:","","* 确保指令重排序时,内存屏障前的指令不会排到后面去,内存屏障后的指令不会排到前面去。","* 强制对变量在线程工作内存中的修改操作立即写入到物理内存。","* 如果是写操作,会导致其他CPU中对这个变量的缓存失效,强制其他CPU中的线程在获取变量时从物理内存中获取更新后的值。","","所以使用volatile修饰后不会出现第3种写法中由于指令重排序导致的问题。","","#### 第6种 - 使用静态内部类来实现","","```java","class Test { "," public static Signleton getInstance() {"," return Signleton.instance ; // 只有调用getInstance()方法时,才会引用到静态内部类Signleton,从而会触发Signleton类的instance变量的初始化,以此实现懒加载的目的。"," }",""," private static class Signleton {"," private static Signleton instance = new Signleton();"," }","}","```","","因为JVM底层通过加锁实现,保证一个类只会被加载一次,多个线程在对类进行初始化时,只有一个线程会获得锁,然后对类进行初始化,其他线程会阻塞等待。所以可以使用上面的代码来保证instance只会被初始化一次,这种写法的问题在于创建单例时不能传参。","","#### 7.使用枚举来实现单例","","```java","public enum Singleton {"," //每个元素就是一个单例"," INSTANCE;"," //自定义的一些方法"," public void method(){}","}","```","这种写法比较简洁,但是不太便于阅读和理解,所以实际开发中应用得比较少,而且由于枚举类是不能通过反射来创建实例的(反射方法newInstance中判断是枚举类型,会抛出IllegalArgumentException异常),所以可以防止反射。而且由于枚举类型的反序列化是通过java.lang.Enum的valueOf方法来实现的,不能自定义序列化方法,可以防止通过序列化来创建多个单例。","","### 如何解决序列化时可以创建出单例对象的问题?","","如果将单例对象序列化成字节序列后,然后再反序列成对象,那么就可以创建出一个新的单例对象,从而导致单例不唯一,避免发生这种情况的解决方案是在单例类中实现readResolve()方法。","","```java","public class Singleton implements java.io.Serializable { ",""," private Object readResolve() { "," return INSTANCE; "," } ","} ","```","通过实现readResolve方法,ObjectInputStream实例对象在调用readObject()方法进行反序列化时,就会判断相应的类是否实现了readResolve()方法,如果实现了,就会调用readResolve()方法返回一个对象作为反序列化的结果,而不是去创建一个新的对象。","","### volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?","","当线程进行一个volatile变量的写操作时,JIT编译器生成的汇编指令会在写操作的指令后面加上一个“lock”指令。","Java代码如下:","```java","instance = new Singleton(); // instance是volatile变量","转变成汇编代码,如下。","0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);","```","“lock”有三个作用:","","1.将当前CPU缓存行的数据会写回到系统内存。","","2.这个写回内存的操作会使得其他CPU里缓存了该内存地址的数据无效。","","3.确保指令重排序时,内存屏障前的指令不会排到后面去,内存屏障后的指令不会排到前面去。","","可见性可以理解为一个线程的写操作可以立即被其他线程得知。为了提高CPU处理速度,CPU一般不直接与内存进行通信,而是将系统内存的数据读到内部缓存,再进行操作。对于普通的变量,修改完不知道何时会更新到系统内存。但是如果是对volatile修饰的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在的缓存行的数据立即写回到系统内存。但是即便写回到系统内存,其他CPU中的缓存行数据还是旧的,为了保证数据一致性,其他CPU会嗅探在总线上传播的数据来检查自己的缓存行的值是否过期,当CPU发现缓存行对应的内存地址被修改,那么就会将当前缓存行设置为无效,下次当CPU对这个缓存行上的数据进行修改时,会重新从系统内存中把数据读到处理器缓存里。","","","##### 使用场景","","##### 读写锁","","如果需要实现一个读写锁,每次只能一个线程去写数据,但是有多个线程来读数据,就synchronized同步锁来对set方法加锁,get方法不加锁, 使用volatile来修饰变量,保证内存可见性,不然多个线程可能会在变量修改后还读到一个旧值。","","```java","volatile Integer a;","//可以实现一写多读的场景,保证并发修改数据时的正确。","set(Integer c) {"," synchronized(this.a) {","\t\t this.a = c;"," "," }","}","get() {","\treturn a;","}","```","","##### 状态位","","用于做状态位标志,如果多个线程去需要根据一个状态位来执行一些操作,使用volatile修饰可以保证内存可见性。","","用于单例模式用于保证内存可见性,以及防止指令重排序。","","","### Java中线程的状态是怎么样的?","","在操作系统中,线程等同于轻量级的进程。","","![img](../static/4621.png)","","所以传统的操作系统线程一般有以下状态","","1. **新建状态**:"," 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。","","2. **就绪状态**:"," 当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。","","3. **运行状态:**"," 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。","","4. **阻塞状态:**",""," 如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:",""," - 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。"," - 同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。"," - 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。","","5. **死亡状态:**"," 一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。","","但是Java中Thread对象的状态划分跟传统的操作系统线程状态有一些区别。","","```java","public enum State {"," NEW,//新建态"," RUNNABLE,//运行态"," BLOCKED,//阻塞态"," WAITING,//等待态"," TIMED_WAITING,//有时间限制的等待态"," TERMINATED;//死亡态","}","```","","![线程状态图](../static/watermark.jpeg)","","","","#### NEW 新建态","","处于NEW状态的线程此时尚未启动,还没调用Thread实例的start()方法。","","#### RUNNABLE 运行态","","表示当前线程正在运行中。处于RUNNABLE状态的线程可能在Java虚拟机中运行,也有可能在等待其他系统资源(比如I/O)。","","\u003e Java线程的**RUNNABLE**状态其实是包括了传统操作系统线程的**ready**和**running**两个状态的。","","#### BLOCKED 阻塞态","","阻塞状态。线程没有申请到synchronize同步锁,就会处于阻塞状态,等待锁的释放以进入同步区。","","#### WAITING 等待态","","等待状态。处于等待状态的线程变成RUNNABLE状态需要其他线程唤醒。","","调用如下3个方法会使线程进入等待状态:","","- Object.wait():使当前线程处于等待状态直到另一个线程调用notify唤醒它;","- Thread.join():等待线程执行完毕,底层调用的是Object实例的wait()方法;","- LockSupport.park():除非获得调用许可,否则禁用当前线程进行线程调度。","","#### TIMED_WAITING 超时等待状态","","超时等待状态。线程等待一个具体的时间,时间到后会被自动唤醒。","","调用如下方法会使线程进入超时等待状态:","","- Thread.sleep(long millis):使当前线程睡眠指定时间;","","- Object.wait(long timeout):线程休眠指定时间,等待期间可以通过notify()/notifyAll()唤醒;","","- Thread.join(long millis):等待当前线程最多执行millis毫秒,如果millis为0,则会一直执行;","","- LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;","","- LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间;","","#### TERMINATED 终止态","","终止状态。此时线程已执行完毕。","","#### 状态转换","","1.BLOCKED与RUNNABLE状态的转换","","处于BLOCKED状态的线程是因为在等待锁的释放,当获得锁之后就转换为RUNNABLE状态。","","2.WAITING状态与RUNNABLE状态的转换","","**Object.wait()**,**Thread.join()**和**LockSupport.park()**这3个方法可以使线程从RUNNABLE状态转为WAITING状态。","","3.TIMED_WAITING与RUNNABLE状态转换","","TIMED_WAITING与WAITING状态类似,只是TIMED_WAITING状态等待的时间是指定的。","","调用**Thread.sleep(long)**,**Object.wait(long)**,**Thread.join(long)**会使得RUNNABLE状态转换为TIMED_WAITING状态","","### wait(),join(),sleep()方法有什么作用?","","首先需要对wait(),join(),sleep()方法进行介绍。","","#### Object.wait()方法是什么?","","调用wait()方法前线程必须持有对象Object的锁。线程调用wait()方法后,会释放当前的Object锁,进入锁的monitor对象的等待队列,直到有其他线程调用notify()/notifyAll()方法唤醒等待锁的线程。","","需要注意的是,其他线程调用notify()方法只会唤醒单个等待锁的线程,如果有多个线程都在等待这个锁的话,不一定会唤醒到之前调用wait()方法的线程。","","同样,调用notifyAll()方法唤醒所有等待锁的线程之后,也不一定会马上把时间片分给刚才放弃锁的那个线程,具体要看系统的调度。","","#### Thread.join()方法是什么?","","join()方法是Thread类的一个实例方法。它的作用是让当前线程陷入“等待”状态,等join的这个线程threadA执行完成后,再继续执行当前线程。","","实现原理是join()方法本身是一个sychronized修饰的方法,也就是调用join()这个方法需要先获取threadA的锁,获得锁之后再调用wait()方法来进行等待,一直到threadA执行完成后,threadA会调用notify_all()方法,唤醒所有等待的线程,当前线程才会结束等待。","","```java","Thread threadA = new Thread();","threadA.join();","```","","join()方法的源码:","","```java","public final void join() throws InterruptedException {"," join(0);//0的话代表没有超时时间一直等下去","}","public final synchronized void join(long millis)","throws InterruptedException {"," long base = System.currentTimeMillis();"," long now = 0;",""," if (millis \u003c 0) {"," throw new IllegalArgumentException(\"timeout value is negative\");"," }",""," if (millis == 0) {"," while (isAlive()) {"," wait(0);"," }"," } else {"," while (isAlive()) {"," long delay = millis - now;"," if (delay \u003c= 0) {"," break;"," }"," wait(delay);"," now = System.currentTimeMillis() - base;"," }"," }","}","```","","这是jvm中Thead的源码,在线程执行结束后会调用notify_all来唤醒等待的线程。","","```java","//一个c++函数:","void JavaThread::exit(bool destroy_vm, ExitType exit_type) ;","//里面有一个贼不起眼的一行代码","ensure_join(this);","","static void ensure_join(JavaThread* thread) {"," Handle threadObj(thread, thread-\u003ethreadObj());",""," ObjectLocker lock(threadObj, thread);",""," thread-\u003eclear_pending_exception();",""," java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);"," java_lang_Thread::set_thread(threadObj(), NULL);"," //同志们看到了没,别的不用看,就看这一句"," //thread就是当前线程,是啥?就是刚才例子中说的threadA线程"," lock.notify_all(thread);"," thread-\u003eclear_pending_exception();","}","```","","#### sleep()方法是什么?","","sleep方法是Thread类的一个静态方法。它的作用是让当前线程睡眠一段时间。:**sleep方法是不会释放当前线程持有的锁,而wait方法会。**","","sleep与wait方法的区别:","","- wait可以指定时间,也可以不指定;而sleep必须指定时间。","- wait释放cpu资源,同时释放锁;sleep释放cpu资源,但是不释放锁,所以易死锁。(调用join()方法也不会释放锁)","- wait必须放在同步块或同步方法中,而sleep可以再任意位置。","","参考文章:","","http://redspider.group:4000/article/01/4.html","","https://www.jianshu.com/p/5d88b122a050","","### Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?","","1.这三个方法都会让线程挂起,释放CPU时间片,进入到阻塞态。但是Object.wait()需要释放锁,所以必须在synchronized同步锁中使用,同理配套的Object.notify()也是。而Thead.sleep(),LockSupport.park()不需要在synchronized同步锁中使用,并且在调用时也不会释放锁。","","2.由于Thread.sleep()没有对应的唤醒线程的方法,所以必须指定超时时间,超过时间后,线程恢复。所以调用Thread.sleep()后的线程一般是出于TIME_WAITING状态,而调用了Object.wait(),LockSupport.park()的方法是进入到WAITING状态。","","3.Object.wait()对应的唤醒方法为Object.notify(),LockSupport.park()对应的唤醒方法为LockSupport.unpark()。","","4.在代码中必须能保证wait方法比notify方法先执行,如果notify方法比wait方法早执行的话,就会导致因wait方法进入休眠的线程接收不到唤醒通知的问题。而park、unpark则不会有这个问题,我们可以先调用unpark方法释放一个许可证,这样后面线程调用park方法时,发现已经许可证了,就可以直接获取许可证而不用进入休眠状态了。(**LockSupport.park() 的实现原理是通过二元信号量做的阻塞,要注意的是,这个信号量最多只能加到1,也就是无论执行多少次unpark()方法,也最多只会有一个许可证。**)","","5.三种方法让线程进入阻塞态后,都可以响应中断,也就是调用Thread.interrupt()方法会设置中断标志位,之前执行Thread.sleep(),Object.wait()了的线程会抛出InterruptedException异常,然后需要代码进行处理。而调用了park()方法的线程在响应中断只会相当于一次正常的唤醒操作(等价于调用unpark()方法),让线程唤醒,继续执行后面的代码,不会抛出InterruptedException异常。","","![img](../static/5bff9535e4b04dd2799a6ae8.png)","","参考链接:","","https://blog.csdn.net/u013332124/article/details/84647915","","### 谈一谈你对线程中断的理解?","","在Java中认为,一个线程不应该由其他线程来强制中断或者停止,所以一些会强制中断线程的方法Thread.stop(), Thread.suspend()方法都已经废弃了。所以一般是通过调用thread.interrupt();方法来设置线程的中断标识,","","1.这样如果线程是处于阻塞状态,会抛出InterruptedException异常,代码可以进行捕获,进行一些处理。(例如Object#wait、Thread#sleep、BlockingQueue#put、BlockingQueue#take。其中BlockingQueue主要调用conditon.await()方法进行等待,底层通过LockSupport.park()实现)","","2.如果线程是处于RUNNABLE状态,也就是正常运行,调用thread.interrupt();只是会设置中断标志位,不会有什么其他操作。","","```java","//将线程的中断标识设置为true","thread.interrupt();","//判断线程的中断标识是否为true","thread.isInterrupted()","//会返回当前的线程中断状态,并且重置线程的中断标识,将中断标识设置为false","thread.interrupted()","```","","### 线程执行的任务可以终止吗?","","##### 1.设置中断","","FutureTask提供了cancel(boolean mayInterruptIfRunning)方法来取消任务,并且","","如果入参为false,如果任务已经在执行,那么任务就不会被取消。","","如果入参为true,如果任务已经在执行,那么会调用Thread的interrupt()方法来设置线程的中断标识,如果线程处于阻塞状态,会抛出InterruptedException异常,如果正常状态只是设置标志位,修改interrupted变量的值。所以如果要取消任务只能在任务内部中调用thread.isInterrupted()方法获取当前线程的中断状态,自行取消。","","##### 2.线程的stop方法","","线程的stop()方法可以让线程停止执行,释放所有的锁,抛出ThreadDeath这种Error。但是在释放锁之后,没有办法让受这些锁保护的资源,对象处于一个安全,一致的状态。(例如有一个变量a,本来的值是0,你的线程任务是将a++后然后再进行a--。正常情况下任务执行完之后,其他线程取到这个变量a的值应该是0,但是如果之前调用了Thread.stop方法时,正好是在a++之后,那么变量a就会是1,这样其他线程取到的a就是出于不一致的状态。)","","### 让线程顺序执行有哪些方法?","","##### 1.主线程Join","","就是调用threadA.start()方法让线程A先执行,然后主线程调用threadA.join()方法,然后主线程进入TIME_WAITING状态,直到threadA执行结束后,主线程才能继续往下执行,执行线程B的任务。(join方法的底层实现其实是调用了threadA的wait()方法,当线程A执行完毕后,会自动调用notifyAll()方法唤醒所有线程。)","","示例代码如下:","","```java","Thread threadA = new Thread(new Runnable() {"," @Override"," public void run() {"," //执行threadA的任务"," }","});","Thread threadB= new Thread(new Runnable() {"," @Override"," public void run() {"," //执行threadB的任务"," }","});","//执行线程A任务","threadA.start();","//主线程进行等待","threadA.join();","//执行线程B的任务","threadB.start();","```","","##### 子线程Join","","就是让线程B的任务在执行时,调用threadA.join()方法,这样就只有等线程A的任务执行完成后,才会执行线程B。","","```java"," Thread threadA = new Thread(new Runnable() {"," @Override"," public void run() {"," //执行threadA的任务"," }"," });"," Thread threadB= new Thread(new Runnable() {"," @Override"," public void run() {"," \t//子线程进行等待,知道threadA任务执行完毕"," \t\t\t\tthreadA.join();"," //执行threadB的任务"," }"," });","\t\t//执行线程A任务"," threadA.start();","\t\t//执行线程B的任务"," threadB.start();","```","##### 单线程池法","","就是使用Executors.newSingleThreadExecutor()这个线程池,这个线程池的特点就是只有一个执行线程,可以保证任务按顺序执行。","","```java","ExecutorService pool = Executors.newSingleThreadExecutor();","//提交任务A","executorService.submit(taskA);","//提交任务B","executorService.submit(taskB);","```","","##### 等待通知法(wait和notify)","","就是在线程B中调用Object.waiting()方法进行等待,线程A执行完毕后调用Object.notify()方法进行唤醒。(这种方法有两个缺点,一个是Object.waiting()和notify()方法必须在同步代码块中调用,第二个是如果线程A执行过快,先调用了object.notify()方法,就会导致线程B后面一直得不到唤醒。)","","```java"," \t\tfinal Object object = new Object();"," \t\tThread threadA = new Thread(new Runnable() {"," @Override"," public void run() {"," //执行threadA的任务"," synchronized(object) {"," object.notify();"," }"," }"," });"," Thread threadB= new Thread(new Runnable() {"," @Override"," public void run() {"," synchronized(object) {"," \t//子线程进行等待,知道threadA任务执行完毕"," \t\t\t\t\t\tobject.wait();"," //执行threadB的任务"," }"," }"," });","```","","##### 等待通知法(await和singal)","","具体实现就是Reentrantlock可以创建出一个Condition实例queue,可以认为是一个等待队列,线程B调用queue.await()就会进行等待,直到线程A执行完毕调用queue.signal()来唤醒线程B。","","```java"," \t\t\t\tfinal ReentrantLock lock = new ReentrantLock();"," final Condition queue1 = lock.newCondition();"," final Object object = new Object();"," final Thread threadA = new Thread(new Runnable() {"," @Override"," public void run() {"," //执行threadA的任务"," lock.lock();"," try {"," //唤醒线程B的任务"," queue1.signal();"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," System.out.println(\"执行了任务A2\");"," lock.unlock();"," }"," });"," final Thread threadB= new Thread(new Runnable() {"," @Override"," public void run() {"," lock.lock();"," //子线程进行等待,知道threadA任务执行完毕"," try {"," queue1.await();"," System.out.println(\"执行了任务B2\");",""," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," //执行threadB的任务"," lock.unlock();"," }"," });"," threadA.start();"," threadB.start();","```","","","","参考链接:","","http://cnblogs.com/wenjunwei/p/10573289.html","","### 线程间怎么通信?","","#### 1.synchronized锁","","通过synchronized锁来进行同步,让一次只能一个线程来执行。","","#### 2.等待/通知机制","","```java","//假设我们的需求是B执行结束后A才能执行","//线程A的代码","synchronized(对象) { while(条件不满足) {"," while(条件不满足) {"," 对象.wait(); //线程A进行等待"," }"," //线程A执行相关的的逻辑"," } "," ","//线程B的代码"," synchronized(对象) { "," \t\t//线程B执行相关的的逻辑"," \t\t//线程B唤醒线程A"," \t\t对象.notifyAll();"," }"," ","```","","等待/通知机制,是指一个线程A调用了对象objectA的wait()方法进入等待状态,而另一个线程B调用了对象objectA的notify()或者notifyAll()方法,线程A收到通知后从对象objectA的wait()方法返回,进而执行后续操作。上述两个线程通过对象objectA来完成交互,而对象上的wait()和notify/notifyAll()的关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。","","![image-20200518195123985](../static/image-20200518195123985.png)","","1)使用wait()、notify()和notifyAll()时需要先对调用对象加锁。 ","","2)调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的 ","","等待队列。 ","","3)notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,因为等待线程只是从等待队列到了同步队列,需要调用notify()或 notifAll()的线程释放锁之后,等待线程获得锁,才能从同步队列中移除,才有机会从wait()返回,才能继续往下执行。 ","","4)notify()方法将等待队列中的一个等待线程从等待队列中移到同步队列中,而notifyAll() 方法则是将等待队列中所有的线程全部移到同步队列,被移动的线程状态由WAITING变为 BLOCKED。 ","","5)从wait()方法返回的前提是获得了调用对象的锁。 ","","![image-20200518195448708](../static/image-20200518195448708.png)","","##### 3.管道","","管道输入/输出流 管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要 用于线程之间的数据传输,而传输的媒介为内存。 管道输入/输出流主要包括了如下4种具体实现:PipedOutputStream、PipedInputStream、 PipedReader和PipedWriter,前两种面向字节,而后两种面向字符。",""," PipedReader和PipedWriter可以一个线程A调用PipedWriter实例的write()方法,往里面写数据,然后与PipedWriter实例建立连接的PipedReader实例可以读到数据,线程B可以通过PipedReader实例读到数据。","","在代码清单4-12所示的例子中,创建了printThread,它用来接受main线程的输入,任何 main线程的输入均通过PipedWriter写入,而printThread在另一端通过PipedReader将内容读出并打印。 ","","代码清单4-12 Piped.java ","```java","public class Piped {"," public static void main(String[] args) throws Exception {"," PipedWriter out = new PipedWriter();"," PipedReader in = new PipedReader();"," // 将输出流和输入流进行连接,否则在使用时会抛出IOException \t\t\t\t\t\t\t\t\t\t\tout.connect(in);"," Thread printThread = new Thread(new Print(in), \"PrintThread\"); printThread.start();"," int receive = 0;"," try {","\t\t\t\t\t\t\twhile ((receive = System.in.read()) != -1) { \t\t\t\tout.write(receive);","\t\t\t\t\t\t\t\t\t}","\t\t\t\t\t} finally {\tout.close(); }"," }"," static class Print implements Runnable {"," private PipedReader in;"," public Print(PipedReader in) {","\t\t\t\t\t\t\t\tthis.in = in; ","\t\t\t\t\t}","\t\t\t\tpublic void run() { ","\t\t\t\t\t\t\tint receive = 0; ","\t\t\t\t\t\t\ttry {","\t\t\t\t\t\t\t\t\twhile ((receive = in.read()) != -1) { System.out.print((char) receive);"," }"," } catch (IOException ex) {"," \t\t\t}"," \t}","\t\t}","} ","```","","运行该示例,输入一组字符串,可以看到被printThread进行了原样输出。 ","","Repeat my words. ","Repeat my words. ","","#### 4.Thread.join","","Thread.join()的使用如果一个线程A执行了thread.join()语句,当前线程A会一直等待thread线程终止之后才从thread.join()返回,向下执行。线程Thread除了提供join()方法之外,还提供了join(long millis)和join(long millis,int nanos)两个具备超时参数的方法。","","#### 5.ThreadLocal的使用 ","","ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这 个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个 线程上的一个值。 ","","```java","public class Profiler {"," // 第一次get()方法调用时会进行初始化(如果set方法没有调用),每个线程会调用一次"," private static final ThreadLocal\u003cLong\u003e TIME_THREADLOCAL = new ThreadLocal\u003cLong\u003e() {"," protected Long initialValue() { return System.currentTimeMillis();} "," };"," public static final void begin() { "," TIME_THREADLOCAL.set(System.currentTimeMillis());"," }"," public static final long end() {"," return System.currentTimeMillis() - TIME_THREADLOCAL.get(); "," }"," public static void main(String[] args) throws Exception { "," Profiler.begin();"," TimeUnit.SECONDS.sleep(1);"," System.out.println(\"Cost: \" + Profiler.end() + \" mills\");"," } ","}","```","","Profiler可以被复用在方法调用耗时统计的功能上,在方法的入口前执行begin()方法,在 ","","方法调用后执行end()方法,好处是两个方法的调用不用在一个方法或者类中,比如在AOP(面 向方面编程)中,可以在方法调用前的切入点执行begin()方法,而在方法调用后的切入点执行 end()方法,这样依旧可以获得方法的执行耗时。 ","","### 怎么实现实现一个生产者消费者?","","#### 1.使用Object.wait()和Object.notify()实现","使用queue作为一个队列,存放数据,并且使用Synchronized同步锁,每次只能同时存在一个线程来生产或者消费数据,","","生成线程发现队列容量\u003e10,生产者线程就进入waiting状态,一旦成功往队列添加数据,那么就唤醒所有线程(主要是生产者线程起来消费)。","","消费线程消费时,发现队列容量==0,也会主动进入waiting状态。","","伪代码如下:","","```java","LinkedList\u003cInteger\u003e queue = new LinkedList\u003c\u003e();","void produce(Integer value) {"," synchronized(queue) {//加锁控制,保证同一时间点,只能有一个线程生成或者消费"," while(queue.size()\u003e10) {","\t\t\t\t\tqueue.waiting();"," }"," queue.add(value);"," //唤醒消费者线程"," queue.notifyAll();"," }","}","Integer consumer() {"," synchronized(queue) {//加锁控制,保证同一时间点,只能有一个线程生成或者消费"," while(queue.size()==0) {"," queue.waiting();"," }"," Integer value = queue.poll();"," //唤醒生产者线程"," queue.notifyAll();","\t\treturn value;"," }","}","```","","完整代码如下:","","```java","public static void main(String[] args) {"," Queue\u003cInteger\u003e queue = new LinkedList\u003c\u003e();"," final Customer customer = new Customer(queue);"," final Producer producer = new Producer(queue);"," ExecutorService pool = Executors.newCachedThreadPool();"," for (int i = 0; i \u003c 1000; i++) {"," pool.execute(new Runnable() {"," @Override"," public void run() {"," try {"," Thread.sleep(1000);"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," Integer a = customer.removeObject();"," System.out.println(\"消费了数据 \"+a);"," }"," });"," pool.execute(new Runnable() {"," @Override"," public void run() {"," try {"," Thread.sleep(1000);"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," Random random = new Random();"," Integer a = random.nextInt(1000);"," System.out.println(\"生成了数据 \"+a);"," producer.addObject(a);"," }"," });"," }","}","private static class Customer {"," Queue\u003cInteger\u003e queue;"," Customer(Queue\u003cInteger\u003e queue) { this.queue = queue; }"," public Integer removeObject() {"," synchronized (queue) {"," try {"," while (queue.size()==0) {"," System.out.println(\"队列中没有元素了,进行等待\");"," queue.wait();"," }"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," Integer number = queue.poll();"," System.out.println(\"唤醒所有生产线程,当前queue大小是\" + queue.size());"," queue.notifyAll();"," return number;"," }"," }","}","private static class Producer {"," Queue\u003cInteger\u003e queue;"," Producer(Queue\u003cInteger\u003e queue) { this.queue = queue; }"," public void addObject(Integer number) {"," synchronized (queue) {"," try {"," while (queue.size()\u003e10) {"," queue.wait();"," }"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," queue.add(number);"," queue.notifyAll();"," System.out.println(\"唤醒所有消费线程,当前queue大小是\"+queue.size());"," }"," }","}","```","","#### 2.使用Lock和Condition来实现","","调用Object.wait()方法可以让线程进入等待状态,被添加到Object的monitor监视器的等待队列中,Object.notifyAll()可以唤醒monitor监视器等待队列中的所有线程。","","而调用lock的newCondition()方法,可以返回一个ConditionObject实例对象,每个ConditionObject包含一个链表,存储等待队列。可以认为一个ReentrantLock有一个同步队列(存放没有获得锁的线程),和多个等待队列(存放调用await()方法的线程)。使用Condition.singal()和Condition.singalAll()可以更加**精准的唤醒线程**,也就是唤醒的都是这个Condition对应的等待队列里面的线程,而Object.notify()和Object.notifyAll()只能唤醒等待队列中的所有的线程。","","```java","ReentrantLock lock = new ReentrantLock();","Condition customerQueue = lock.newCondition();","```","ReentrantLock的Condition相关的实现","","![img](../static/640-5667220.jpeg)","","```java","abstract static class Sync extends AbstractQueuedSynchronizer {"," final ConditionObject newCondition() {"," return new ConditionObject();"," }","}","//AQS内部类 ConditionObject","public class ConditionObject implements Condition, java.io.Serializable {"," private static final long serialVersionUID = 1173984872572414699L;"," //链表头结点"," private transient Node firstWaiter;"," //链表尾结点"," private transient Node lastWaiter;"," //真正的创建Condition对象"," public ConditionObject() { }","}","```","","消费者-生产者实现","","```java","public static void main(String[] args) {"," ReentrantLock lock = new ReentrantLock();"," Condition customerQueue = lock.newCondition();"," Condition producerQueue = lock.newCondition();",""," Queue\u003cInteger\u003e queue = new LinkedList\u003c\u003e();"," final Customer customer = new Customer(lock,customerQueue, producerQueue,queue);"," final Producer producer = new Producer(lock,customerQueue, producerQueue,queue);",""," ExecutorService pool = Executors.newCachedThreadPool();"," for (int i = 0; i \u003c 1000; i++) {"," pool.execute(new Runnable() {"," @Override"," public void run() {"," try {"," Thread.sleep(1000);"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," Integer a = customer.take();","// System.out.println(\"消费了数据 \"+a);"," }"," });"," pool.execute(new Runnable() {"," @Override"," public void run() {"," try {"," Thread.sleep(1000);"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," Random random = new Random();"," Integer a = random.nextInt(1000);","// System.out.println(\"生成了数据 \"+a);"," producer.add(a);"," }"," });"," }","}","","private static class Customer {"," private ReentrantLock lock;"," private Condition customer;"," private Condition producer;"," private Queue\u003cInteger\u003e queue;",""," Customer(ReentrantLock lock, Condition customer, Condition producer,Queue\u003cInteger\u003e queue) {"," this.lock = lock;"," this.customer = customer;"," this.producer = producer;"," this.queue = queue;"," }",""," public Integer take() {"," lock.lock();"," Integer element = null;"," try {"," while (queue.size() == 0) {"," customer.await();"," }"," element = queue.poll();"," System.out.println(\"消费者线程取出来元素\"+element);"," producer.signalAll();"," } catch (InterruptedException e) {"," e.printStackTrace();"," } finally {"," lock.unlock();"," }"," return element;"," }","}","","private static class Producer {"," private ReentrantLock lock;"," private Condition customer;"," private Condition producer;"," private Queue\u003cInteger\u003e queue;",""," Producer(ReentrantLock lock, Condition customer, Condition producer,Queue\u003cInteger\u003e queue) {"," this.lock = lock;"," this.customer = customer;"," this.producer = producer;"," this.queue = queue;"," }",""," public void add( Integer element) {"," lock.lock();"," try {"," while (queue.size() \u003e 10) {"," producer.await();"," }"," queue.add(element);"," System.out.println(\"生成和线程添加元素\"+element);"," customer.signalAll();"," } catch (InterruptedException e) {"," e.printStackTrace();"," } finally {"," lock.unlock();"," }"," }","}","```","#### 3.使用BlockingQueue实现","利用阻塞队列BlockingQueue的特征进行生产和消费的同步(其实阻塞队列内部也是基于Lock,condition实现的 )","","```java","public class BlockQueueRepository\u003cT\u003e extends AbstractRepository\u003cT\u003e implements Repository\u003cT\u003e {"," public BlockQueueRepository(int cap) {"," //cap代表队列的最大容量"," products = new LinkedBlockingQueue\u003c\u003e(cap);"," }",""," @Override"," public void put(T t) {"," if (isFull()) {"," log.info(\"repository is full, waiting for consume.....\");"," }"," try {"," //如果队列长度已满,那么会阻塞等待"," ((BlockingQueue) products).put(t);"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," }",""," @Override"," public T take() {"," T product = null;"," if (isEmpty()) {"," log.info(\"repository is empty, waiting for produce.....\");"," }"," try {"," //如果队列元素为空,那么也会阻塞等待"," product = (T) ((BlockingQueue) products).take();"," } catch (InterruptedException e) {"," e.printStackTrace();"," }"," return product;"," }","}","```","","### 谈一谈你对线程池的理解?","","#### 首先线程池有什么作用?","","* 1.提高响应速度,如果线程池有空闲线程的话,可以直接复用这个线程执行任务,而不用去创建。","","* 2.减少资源占用,每次都创建线程都需要申请资源,而使用线程池可以复用已创建的线程。","","* 3.可以控制并发数,可以通过设置线程池的最大线程数量来控制最大并发数,如果每次都是创建新线程,来了大量的请求,可能会因为创建的线程过多,造成内存溢出。","","* 4.更加方便来管理线程资源。","","#### 线程池有哪些参数?","","```java","public ThreadPoolExecutor(int corePoolSize,"," int maximumPoolSize,"," long keepAliveTime,"," TimeUnit unit,"," BlockingQueue\u003cRunnable\u003e workQueue,"," ThreadFactory threadFactory) {"," this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,"," threadFactory, defaultHandler);"," }","```","","##### 1.corePoolSize 核心线程数","","该线程池中**核心线程数最大值**,添加任务时,即便有空闲线程,只要当前线程池线程数\u003ccorePoolSize,都是会新建线程来执行这个任务。并且核心线程空闲时间超过keepAliveTime也是不会被回收的。(","","从阻塞队列取任务时,如果阻塞队列为空:","","**核心线程**的会一直卡在`workQueue.take`方法,这个take方法每种等待队列的实现各不相同,以LinkedBlockingQueue为例,","","在这个方法里会调用notEmpty队列(这是Condition实例)的await()方法一直阻塞并挂起,不会占用CPU资源。","","**非核心线程**会调用workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS)方法取任务 ,这个poll方法每种等待队列的实现各不相同,以LinkedBlockingQueue为例,","","在这个方法里面会调用notEmpty队列(这是Condition实例)的awaitNanos()方法进行超时等待,如果超过keepAliveTime时间后还没有新的任务,就会返回`null`,Worker对象的`run()`方法循环体的判断为`null`,任务结束,然后线程被系统回收)","","##### 2.maximumPoolSize 最大线程数","","**该线程池中线程总数最大值** ,一般是用于当线程池中的线程都在执行任务,并且等待队列满了时,如果当前线程数\u003cmaximumPoolSize,可以创建一个新线程来执行任务。maximumPoolSize一般也可以用来现在最大线程并发执行量。","","##### **3.workQueue 等待队列**","","等待队列,一般是抽象类**BlockingQueue**的子类。","","| ArrayBlockingQueue | 有界队列,一种使用数组实现的先进先出的有界阻塞队列。支持公平锁和非公平锁,底层数据结构是数组,需要指定队列的大小。 |","| --------------------- | ------------------------------------------------------------ |","| LinkedBlockingQueue | 无界队列,一种使用链表实现的先进先出的有界阻塞队列。默认的容量是`Interge.MAX_VALUE`,相比于`ArrayBlockingQueue`具有更高的吞吐量,但是却丢失了快速随机存取的特性。默认大小是`Integer.MAX_VALUE`,也可以指定大小。newFixedThreadPool()和newSingleThreadExecutor()的等待队列都是这个阻塞队列。 |","| LinkedBlockingDeque | 一种使用链表实现的具有双向存取功能的有界阻塞队列。在高并发下,相比于`LinkedBlockingQueue`可以将锁竞争降低最多一半 |","| PriorityBlockingQueue | 一种提供了优先级排序的无界阻塞队列。如果没有提供具体的排列方法,那么将会使用自然排序进行排序,会抛出`OOM`异常。 |","| SynchronousQueue | SynchronousQueue一种不存储任务的同步队列,内部没有使用AQS。如果是公平锁模式,每次调用put方法往队列中添加一个线程后,线程先进行自旋,然后超时后就阻塞等待直到有提取线程把调用take方法把操作取出,这样之前调用put方法的线程才能继续执行。如果是非公平锁模式,每次添加任务就是就是把任务添加到栈中,这样就是先进后出,所以非公平。 |","| LinkedTransferQueue | 一种使用链表实现的无界阻塞队列。 |","| DelayQueue | 一种无界的延时队列,可以设置每个元素需要等待多久才能从队列中取出。 延迟队列,该队列中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素 。底层数据数据结构是数组实现的堆结构。 |","","**4.keepAliveTime**:**非核心线程闲置超时时长**。","","非核心线程如果处于闲置状态超过该值,就会被销毁。如果设置allowCoreThreadTimeOut(true),则会也作用于核心线程。","","**5.RejectedExecutionHandler 拒绝处理策略**","","**拒绝处理策略**,核心线程已经满了,等待队列也满了,并且线程数量大于最大线程数时,就会采用拒绝处理策略进行处理,四种拒绝处理的策略为 :","","1. ThreadPoolExecutor.AbortPolicy:**默认拒绝处理策略**,丢弃任务并抛出RejectedExecutionException异常。","2. ThreadPoolExecutor.DiscardPolicy:丢弃新来的任务,但是不抛出异常。","3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃等待队列头部(最旧的)的任务,然后重新尝试执行程序,将任务添加到队列中(如果再次失败,重复此过程)。","4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。","","##### 6.ThreadFactory创建线程的工厂","","ThreadFactory是一个接口,只有一个newThread()方法。(默认情况下ThreadPoolExecutor用的ThreadFactory默认都是Executors.defaultThreadFactory())。一般来说,你通过ThreadPoolExecutor来创建线程池,对于线程池中的线程你是无法直接接触到的,例如你为了更加方便得定位线程池的Bug,希望对线程池中线程设置跟业务相关的名称,那么就需要建一个类,实现ThreadFactory接口,编写newThread()方法的实现。","```","public interface ThreadFactory {"," Thread newThread(Runnable r);","}","```","","#### 线程池执行任务的过程?","","![图4 任务调度流程](../static/31bad766983e212431077ca8da92762050214.png)","","#### Executors提供的四种线程池的使用场景。","","Executors提供四种线程池,分别为:","","##### newFixedThreadPool 定长线程池","","","```java","public static ExecutorService newFixedThreadPool(int nThreads) {"," return new ThreadPoolExecutor(nThreads, nThreads,"," 0L, TimeUnit.MILLISECONDS,"," new LinkedBlockingQueue\u003cRunnable\u003e());","}","public LinkedBlockingQueue() {"," this(Integer.MAX_VALUE);","}","```","","一句话总结就是:**线程数固定,等待队列无限长**。","","创建一个线程池,核心线程数与最大线程数值都是传入参数nThreads。可控制线程最大并发数,超出的线程会在队列中等待(比较适合需要控制并发量的情况)。主要是通过将核心线程数设置为与最大线程数相等实现的。缺点是LinkedBlockingQueue队列的默认长度是Integer.MAX_VALUE,也存在内存溢出的风险。","","**与CachedThreadPool的区别**:","","- 因为 corePoolSize == maximumPoolSize ,所以**newFixedThreadPool**只会创建核心线程。 而**CachedThreadPool**因为corePoolSize=0,所以只会创建非核心线程。","- 在 getTask() 方法,如果队列里没有任务可取,线程会一直阻塞在 LinkedBlockingQueue.take() ,线程不会被回收。 **CachedThreadPool**的线程会在60s后收回。","- 由于线程不会被回收,会一直卡在阻塞,所以**没有任务的情况下, FixedThreadPool占用资源更多**。","- 都几乎不会触发拒绝策略,但是原理不同。FixedThreadPool是因为阻塞队列可以很大(最大为Integer最大值),故几乎不会触发拒绝策略;CachedThreadPool是因为线程池很大(最大为Integer最大值),几乎不会导致线程数量大于最大线程数,故几乎不会触发拒绝策略。","","##### newSingleThreadExecutor 单线程池","","```java","public static ExecutorService newSingleThreadExecutor() {"," return new FinalizableDelegatedExecutorService"," (new ThreadPoolExecutor(1, 1,"," 0L, TimeUnit.MILLISECONDS,"," new LinkedBlockingQueue\u003cRunnable\u003e()));"," }","```","一句话总结就是:**单线程池,等待队列无限长。**","创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。主要是通过将核心线程数和最大线程数都设置为1来实现。","","##### newCachedThreadPool可缓存线程池","","创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是由于最大线程数设置的是Integer.MAX_VALUE,存在内存溢出的风险。","","一句话总结就是:**最大线程数无限大,线程超时被回收**","","```java","public static ExecutorService newCachedThreadPool() {"," return new ThreadPoolExecutor(0, Integer.MAX_VALUE,"," 60L, TimeUnit.SECONDS,"," new SynchronousQueue\u003cRunnable\u003e());","}","```","","`CacheThreadPool`的**运行流程**如下:","","1. 提交任务进线程池。","2. 因为**corePoolSize**为0的关系,不创建核心线程,线程池最大为Integer.MAX_VALUE。","3. 尝试将任务添加到**SynchronousQueue**队列。(需要注意的是**SynchronousQueue**本身不存储任务,只是将添加任务的线程加入一个栈中,进行阻塞等待,然后线程池中的线程空闲时,会从栈中取出线程,取出线程携带的任务,进行执行。)","4. 如果**SynchronousQueue**入列成功,等待被当前运行的线程空闲后拉取执行。如果当前没有空闲线程,那么就创建一个非核心线程,然后从SynchronousQueue拉取任务并在当前线程执行。","5. 如果**SynchronousQueue**已有任务在等待,入列操作将会阻塞。","","当需要执行很多**短时间**的任务时,CacheThreadPool的线程复用率比较高, 会显著的**提高性能**。而且线程60s后会回收,意味着即使没有任务进来,CacheThreadPool并不会占用很多资源。","","##### newScheduledThreadPool定时执行线程池","","创建一个定时执行的线程池,主要是通过DelayedWorkQueue来实现(该队列中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素)。支持定时及周期性任务执行。但是由于最大线程数设置的是Integer.MAX_VALUE,存在内存溢出的风险。","","一句话总结就是:线程数无限大,定时执行。","","```java","public ScheduledThreadPoolExecutor(int corePoolSize,"," ThreadFactory threadFactory) {"," super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,"," new DelayedWorkQueue(), threadFactory);","}","```","","##### 为什么不建议大家使用Executors的四种线程池呢?","","主要是newFixedThreadPool和newSingleThreadExecutor的等待队列是LinkedBlockingQueue,长度是Integer.MAX_VALUE,,可以认为是无限大的,如果创建的任务特别多,可能会造成内存溢出。而newCachedThreadPool和newScheduledThreadPool的最大线程数是Integer.MAX_VALUE,如果创建的任务过多,可能会导致创建的线程过多,从而导致内存溢出。","","扩展资料:","","[Java线程池实现原理及其在美团业务中的实践](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)","","[SynchronousQueue实现原理](https://zhuanlan.zhihu.com/p/29227508)","","### 线程池有哪些状态?","","线程池生命周期:","","- **RUNNING**:表示线程池处于运行状态,这时候的线程池可以接受任务和处理任务。值是-1,","","- **SHUTDOWN**:表示线程池不接受新任务,但仍然可以处理队列中的任务,二进制值是0。调用showdown()方法会进入到SHUTDOWN状态。","","- **STOP**:表示线程池不接受新任务,也不处理队列中的任务,同时中断正在执行任务的线程,值是1。调用showdownNow()方法会进入到STOP状态。","","- **TIDYING**:表示所有的任务都已经终止,并且工作线程的数量为0。值是2。SHUTDOWN和STOP状态的线程池任务执行完了,工作线程也为0了就会进入到TIDYING状态。","","- **TERMINATED**:表示线程池处于终止状态。值是3",""," ![img](../static/640-20200728210136673.jpeg)","","### 怎么根据业务场景确定线程池的参数corePoolSize和maximumPoolSize?","","#### 方法一 计算密集型任务","因为是计算密集型任务,可以理解为每个任务在执行期间基本没有IO操作,全部都在CPU时间片中执行。所以可以理解为CPU就是满载的,CPU利用率就是100%,其实线程数等于CPU数就可以的,但是由于需要考虑到计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,此时应该需要有一个“额外”的空闲线程来获得时间片,然后执行,可以确保在这种情况下CPU周期不会中断工作,充分利用CPU。","```java","最佳线程数=CPU的数量+1 ","```","#### 方法二 IO密集型任务","这种任务在执行时,需要进行一些IO操作,所以为了充分利用CPU,应该在线程进行IO操作时,就让出时间片,CPU进行上下文切换,执行其他线程的任务,保证CPU利用率尽可能达到100%。","","如果任务有50%的时间需要CPU执行状态,其他时间进行IO操作,则程序所需线程数为CPU数量的1除以0.5,也就是2倍。如果任务有20%的时时间需要CPU执行,其他时间需要进行IO操作,最佳线程数也就是1除以0.2,也就是CPU数的5倍。","所以公式为","","```java","最佳线程数 = CPU数量/(每个任务中需要CPU执行的时间的比例)","= CPU数量/(CPU运行时间/任务执行总时间)=CPU数量/(CPU运行时间/(CPU运行时间+IO操作时间))","所以最终公式为","最佳线程数/CPU数量 = CPU运行时间/(CPU运行时间+IO操作时间)","```","##### 不足","但是在实际线上运行的环境中,每个任务执行的时间是各不相同的,而且我们其实是不太方便去监测每个任务执行时需要的CPU执行时间,IO操作时间的,所以这种方法只是一种理论。","","#### 方法三 动态化线程池","这种其实是美团他们做的一个线程池监测平台,主要把任务分成两种,","##### 追求响应时间的任务","一种是追求响应时间的任务,例如使用线程池对发起多个网络请求,然后对结果进行计算。 这种任务的最大线程数需要设置大一点,然后队列使用同步队列,队列中不缓存任务,任务来了就会被执行。判断线程池资源不够用时,一般是发现活跃线程数/最大线程数\u003e阀值(默认是0.8)时,或者是线程池抛出的RejectedExecut异常次数达到阀值,就会进行告警。然后程序员收到告警后,动态发送修改核心线程数,最大线程数,队列相关的指令,服务器进行动态修改。","","##### 追求高吞吐量的任务","","假设说需要定期自动化生成一些报表,不需要考虑响应时间,只是希望如何使用有限的资源,尽可能在单位时间内处理更多的任务,也就是吞吐量优先的问题。","这种就是使用有界队列,对任务进行缓存,然后线程进行并发执行。判断线程池资源不够用时,一般是发现等待队列中的任务数量/等待队列的长度\u003e阀值(默认是0.8)时,或者是线程池抛出的RejectedExecut异常次数达到阀值,就会进行告警。然后程序员收到告警后,动态发送修改核心线程数,最大线程数,队列相关的指令,服务器进行动态修改。","","ThreadPoolExecutor提供了如下几个public的setter方法","","![image-20210119104549770](../static/image-20210119104549770.png)","","调用corePoolSize方法之后,线程池会直接覆盖原来的corePoolSize值,并且基于当前值和原始值的比较结果采取不同的处理策略。(总得来说就是,多退少补的策略)","","**对于新corePoolSize\u003c当前工作线程数的情况:**","","说明有多余的worker线程,此时会向当前idle状态的worker线程发起中断请求以实现回收,多余的worker在下次idel的时候也会被回收。","","**对于新corePoolSize\u003e当前工作线程数且队列中有任务的情况:**","","如果当前队列中有待执行任务,则线程池会创建新的worker线程来执行队列任务。","","setCorePoolSize的方法的执行流程入下图所示:","","","","![图20 setCorePoolSize方法执行流程](../static/9379fe1666818237f842138812bf63bd85645.png)","","扩展资料:","[Java并发(八)计算线程池最佳线程数](https://www.cnblogs.com/jpfss/p/11016169.html)","","### ThreadLocal是什么?怎么避免内存泄露?","","从字面意思上,ThreadLocal会被理解为线程本地存储,就是对于代码中的一个变量,每个线程拥有这个变量的一个副本,访问和修改它时都是对副本进行操作。","##### 使用场景:","ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。(例如:方法直接调用时传递的变量过多,为了代码简洁性,可以使用ThreadLocal,在前一个方法中,将变量进行存储,后一个方法中取,进行使用。)","```java","public class A {"," // 每个线程本地副本初始化"," private static ThreadLocal \u003cUserData\u003e threadLocal = new ThreadLocal \u003c\u003e(). withInitial (() -\u003e new UserData ());"," public static void setUser (UserLogin user){"," if (user == null )"," return ;"," UserData userData = threadLocal.get();"," userData. setUserLogin (user);"," }"," public static UserLogin getUser (){"," return threadLocal.get(). getUserLogin ();"," }","}","```","","##### 实现原理","","就是每个Thread有一个ThreadLocalMap,类似于HashMap,当调用ThreadLocal#set()方法进行存值时,实际上是先获取到当前的线程,然后获取线程的map,是一个ThreadLocalMap类型,然后会在这个map中添加一个新的键值对,key就是我们ThreadLocal变量的地址,value就是我们存的值。ThreadLocalMap与HashMap不同的时,解决HashMap使用的是**开放定址法**,也就是当发现hashCode计算得到数组下标已经存储了元素后,会继续往后找,直到找到一个空的数组下标,存储键值对。","","```java","//ThreadLocal实例的赋值方法","public void set(T value) {"," \t//获取当前线程"," Thread t = Thread.currentThread();"," \t//获取线程对应的Map"," ThreadLocalMap map = getMap(t);"," \t//将值存入线程特有的Map中"," if (map != null)"," //key为this就是当前ThreadLocal引用变量的地址"," //value就是我们要存储的值"," map.set(this, value);"," else"," createMap(t, value);","}","ThreadLocalMap getMap(Thread t) {"," \t//线程的threadLocals实例变量就是Map"," return t.threadLocals;","}","```","","##### ThreadLocal中的Entry的key使用了弱引用,为什么使用弱引用?","","![thread](../static/thread.png)","","首先在上面类A的代码中,类A中有一个ThreadLocal类型的变量","","它们的引用链如下:","","```java","ThreadLocal变量所在的类的实例(代码中A的实例)-\u003eThreadLocal","执行代码的线程-\u003e线程独有的ThreadLocalMap-\u003e引用的key就是ThreadLocal","```","","可以看到ThreadLocal变量不仅被所在的类A的实例所引用,还被执行的线程所引用,","","1.如果使用强引用,也就是线程对ThreadLocal变量是强引用,那么即便实例A被回收了,只要线程还没有被回收,线程的ThreadLocalMap还会引用这个key(也就是这个ThreadLocal遍历),导致这个key 没有被回收,造成内存泄露。","","2.如果使用弱引用,不会影响key的回收,也就是不会影响引用了ThreadLocal的实例对象的回收。","","但是即便使用弱引用,ThreadLocalMap对value的引用是强引用(一边value是局部变量,也不能用弱引用,那样在用到的时候就会被),但是value依然不会被回收,会造成内存泄露。","","通常来说,value回收的时机有两个:","","1.我们在用完ThreadLocal后,应该遵循规范手动调用ThreadLocal#remove()对键值对value释放,这样可以使value被回收。","","2.此线程在其他对象中使用ThreadLocal对线程ThreadLocalMap进行set()和get()时,由于需要进行开放定址法进行探测,会对沿途过期的键值对(就是key为null的键值对)进行清除。以及set()方法触发的cleanSomeSlots()方法对过期键值对进行清除。","","[《一篇文章,从源码深入详解ThreadLocal内存泄漏问题》](https://www.jianshu.com/p/dde92ec37bd1)","","### Random类取随机数的原理是什么?","","首先在初始化Random实例的时候就会根据当前的时间戳生成一个种子数seed。","","```java","public Random() {"," this(seedUniquifier() ^ System.nanoTime());"," }",""," private static long seedUniquifier() {"," // L'Ecuyer, \"Tables of Linear Congruential Generators of"," // Different Sizes and Good Lattice Structure\", 1999"," for (;;) {"," long current = seedUniquifier.get();"," long next = current * 181783497276652981L;"," if (seedUniquifier.compareAndSet(current, next))"," return next;"," }"," }","```","","然后每次取随机数时是拿seed乘以一个固定值multiplier,作为随机数。","","```java"," protected int next(int bits) {"," long oldseed, nextseed;"," AtomicLong seed = this.seed;"," do {"," oldseed = seed.get();"," nextseed = (oldseed * multiplier + addend) \u0026 mask;"," } while (!seed.compareAndSet(oldseed, nextseed));"," return (int)(nextseed \u003e\u003e\u003e (48 - bits));"," }","```","","但是这样的话,多线程并发使用Math.random取随机数时,同一个时间点取到的随机数一样的概率会比较大。所以可以使用ThreadLocalRandom.current().nextInt()方法去取随机数。每个线程第一次调用ThreadLocalRandomd的current()方法时,会为这个线程生成一个线程独立的种子数seed,这样多线程并发读取随机数时,可以保证取到的随机数都是不一样的。","","```java","public static ThreadLocalRandom current() {"," \t\t\t//判断这个线程是否生成种子"," if (UNSAFE.getInt(Thread.currentThread(), PROBE) == 0)"," localInit();"," return instance;"," }","","//为这个线程生成一个种子seed,并且将种子seed,和线程已生成种子的标志 存储到Unsafe类中","static final void localInit() {"," int p = probeGenerator.addAndGet(PROBE_INCREMENT);"," int probe = (p == 0) ? 1 : p; // skip 0"," long seed = mix64(seeder.getAndAdd(SEEDER_INCREMENT));"," Thread t = Thread.currentThread();"," UNSAFE.putLong(t, SEED, seed);"," UNSAFE.putInt(t, PROBE, probe);"," }","","//获取随机数,根据当前种子计算随机数","public int nextInt(int origin, int bound) {"," if (origin \u003e= bound)"," throw new IllegalArgumentException(BadRange);"," return internalNextInt(origin, bound);"," }","","final int internalNextInt(int origin, int bound) {"," int r = mix32(nextSeed());"," if (origin \u003c bound) {"," int n = bound - origin, m = n - 1;"," if ((n \u0026 m) == 0)"," r = (r \u0026 m) + origin;"," else if (n \u003e 0) {"," for (int u = r \u003e\u003e\u003e 1;"," u + m - (r = u % n) \u003c 0;"," u = mix32(nextSeed()) \u003e\u003e\u003e 1)"," ;"," r += origin;"," }"," else {"," while (r \u003c origin || r \u003e= bound)"," r = mix32(nextSeed());"," }"," }"," return r;"," }","```","","### 僵尸进程,孤儿进程,守护进程是什么?","","僵尸进程:通常来说,使用fork()系统调用从一个父进程创建出一个子进程,子进程退出,是需要父进程调用wait()或者是waitpid()函数来回收子进程的资源,如果父进程没有调用,子进程的信息就会一直在内存中,而不会被回收,变成僵尸进程。","","孤儿进程:就是父进程先退出了,它的子进程会被init进程接管,由它来收集子进程的状态。(init进程是内核启动时,创建出来的进程,是一个以root身份运行的普通用户进程,是永远不会停止的。)","","守护进程是脱离于终端并且在后台运行的进程,脱离终端是为了避免将在执行的过程中的信息打印在终端上,并且进程也不会被任何终端所产生的终端信息所打断。","","### BlockingQueue的原理是怎么样的?","","https://www.cnblogs.com/tjudzj/p/4454490.html","","### 进程间通信的方式","","https://network.51cto.com/art/201911/606827.htm?mobile"],"stylingDirectives":[[{"s":1,"e":3,"c":"pl-smi"},{"s":17,"e":23,"c":"pl-smi"},{"s":24,"e":26,"c":"pl-smi"},{"s":51,"e":52,"c":"pl-s1"}],[],[],[{"s":6,"e":8,"c":"pl-c1"}],[{"s":6,"e":8,"c":"pl-c1"}],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":12,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-s1"}],[{"s":7,"e":9,"c":"pl-c1"},{"s":9,"e":13,"c":"pl-s1"},{"s":27,"e":31,"c":"pl-s1"}],[{"s":6,"e":8,"c":"pl-c1"}],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":16,"c":"pl-s1"},{"s":32,"e":33,"c":"pl-s1"},{"s":47,"e":55,"c":"pl-k"},{"s":71,"e":72,"c":"pl-s1"}],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":12,"c":"pl-s1"},{"s":27,"e":31,"c":"pl-s1"}],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":12,"c":"pl-en"},{"s":15,"e":19,"c":"pl-en"},{"s":22,"e":27,"c":"pl-en"},{"s":40,"e":44,"c":"pl-en"},{"s":47,"e":51,"c":"pl-en"},{"s":54,"e":59,"c":"pl-en"}],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":20,"c":"pl-en"},{"s":23,"e":29,"c":"pl-smi"},{"s":30,"e":34,"c":"pl-en"},{"s":37,"e":48,"c":"pl-smi"},{"s":49,"e":53,"c":"pl-en"},{"s":64,"e":70,"c":"pl-smi"},{"s":71,"e":76,"c":"pl-en"},{"s":79,"e":85,"c":"pl-smi"},{"s":86,"e":90,"c":"pl-en"},{"s":93,"e":104,"c":"pl-smi"},{"s":105,"e":109,"c":"pl-en"}],[{"s":6,"e":9,"c":"pl-c1"},{"s":10,"e":11,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"}],[{"s":6,"e":9,"c":"pl-c1"}],[{"s":6,"e":9,"c":"pl-c1"},{"s":15,"e":16,"c":"pl-s1"},{"s":33,"e":34,"c":"pl-s1"}],[{"s":6,"e":9,"c":"pl-c1"},{"s":10,"e":11,"c":"pl-s1"},{"s":25,"e":26,"c":"pl-s1"}],[{"s":6,"e":9,"c":"pl-c1"}],[],[],[],[],[],[{"s":14,"e":15,"c":"pl-smi"},{"s":30,"e":31,"c":"pl-s1"},{"s":35,"e":36,"c":"pl-s1"},{"s":91,"e":92,"c":"pl-s1"}],[],[{"s":8,"e":9,"c":"pl-s1"},{"s":57,"e":58,"c":"pl-s1"},{"s":104,"e":105,"c":"pl-s1"},{"s":106,"e":107,"c":"pl-s1"},{"s":120,"e":123,"c":"pl-c1"}],[],[],[],[{"s":18,"e":19,"c":"pl-smi"},{"s":48,"e":49,"c":"pl-s1"},{"s":70,"e":73,"c":"pl-c1"},{"s":88,"e":91,"c":"pl-c1"},{"s":98,"e":99,"c":"pl-s1"},{"s":141,"e":144,"c":"pl-smi"},{"s":148,"e":149,"c":"pl-s1"},{"s":184,"e":187,"c":"pl-c1"},{"s":212,"e":213,"c":"pl-s1"},{"s":217,"e":219,"c":"pl-c1"},{"s":226,"e":229,"c":"pl-smi"},{"s":234,"e":237,"c":"pl-c1"}],[],[],[],[{"s":10,"e":13,"c":"pl-c1"},{"s":69,"e":70,"c":"pl-s1"},{"s":72,"e":73,"c":"pl-s1"},{"s":108,"e":109,"c":"pl-en"},{"s":115,"e":116,"c":"pl-s1"}],[],[],[],[{"s":44,"e":45,"c":"pl-s1"},{"s":50,"e":53,"c":"pl-c1"},{"s":98,"e":99,"c":"pl-s1"},{"s":100,"e":101,"c":"pl-s1"}],[],[{"s":8,"e":9,"c":"pl-s1"}],[],[{"s":8,"e":9,"c":"pl-s1"},{"s":18,"e":19,"c":"pl-s1"},{"s":51,"e":52,"c":"pl-s1"}],[],[{"s":8,"e":9,"c":"pl-smi"}],[],[{"s":2,"e":3,"c":"pl-s1"},{"s":48,"e":51,"c":"pl-c1"}],[],[],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":15,"e":16,"c":"pl-c1"},{"s":16,"e":17,"c":"pl-s1"},{"s":25,"e":26,"c":"pl-c1"},{"s":27,"e":28,"c":"pl-c1"},{"s":28,"e":29,"c":"pl-s1"},{"s":30,"e":34,"c":"pl-s1"},{"s":39,"e":40,"c":"pl-c1"},{"s":41,"e":42,"c":"pl-c1"},{"s":42,"e":43,"c":"pl-s1"},{"s":46,"e":52,"c":"pl-s1"},{"s":75,"e":76,"c":"pl-s1"}],[],[],[],[{"s":3,"e":4,"c":"pl-s1"}],[],[{"s":4,"e":5,"c":"pl-s1"}],[],[{"s":10,"e":11,"c":"pl-s1"}],[],[{"s":28,"e":29,"c":"pl-s1"}],[],[],[],[{"s":22,"e":23,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-s1"}],[],[],[],[],[],[{"s":7,"e":10,"c":"pl-c1"}],[{"s":29,"e":30,"c":"pl-s1"},{"s":42,"e":46,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"}],[],[{"s":5,"e":6,"c":"pl-s1"},{"s":46,"e":47,"c":"pl-s1"},{"s":86,"e":87,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"}],[],[{"s":5,"e":6,"c":"pl-c1"},{"s":6,"e":7,"c":"pl-s1"},{"s":22,"e":23,"c":"pl-smi"}],[],[],[],[],[],[],[],[{"s":2,"e":6,"c":"pl-s1"},{"s":14,"e":15,"c":"pl-s1"},{"s":33,"e":34,"c":"pl-s1"}],[],[],[{"s":1,"e":8,"c":"pl-s1"},{"s":10,"e":16,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-s1"}],[{"s":0,"e":3,"c":"pl-smi"},{"s":4,"e":8,"c":"pl-s1"},{"s":9,"e":12,"c":"pl-smi"},{"s":13,"e":19,"c":"pl-s1"},{"s":20,"e":21,"c":"pl-c1"}],[],[],[{"s":4,"e":8,"c":"pl-s1"}],[],[{"s":6,"e":7,"c":"pl-smi"},{"s":11,"e":17,"c":"pl-s1"},{"s":21,"e":24,"c":"pl-s1"}],[],[{"s":11,"e":23,"c":"pl-s1"},{"s":26,"e":32,"c":"pl-s1"},{"s":36,"e":39,"c":"pl-en"},{"s":48,"e":60,"c":"pl-en"},{"s":68,"e":73,"c":"pl-s1"},{"s":78,"e":81,"c":"pl-en"},{"s":85,"e":86,"c":"pl-s1"},{"s":126,"e":129,"c":"pl-c1"},{"s":149,"e":152,"c":"pl-s1"},{"s":161,"e":173,"c":"pl-en"},{"s":195,"e":198,"c":"pl-en"},{"s":218,"e":221,"c":"pl-en"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":18,"c":"pl-smi"},{"s":19,"e":26,"c":"pl-s1"},{"s":27,"e":33,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-s1"},{"s":28,"e":34,"c":"pl-smi"},{"s":37,"e":41,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":73,"c":"pl-s"}],[{"s":8,"e":11,"c":"pl-k"},{"s":13,"e":16,"c":"pl-smi"},{"s":17,"e":18,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-c1"},{"s":24,"e":25,"c":"pl-s1"},{"s":28,"e":30,"c":"pl-c1"},{"s":32,"e":33,"c":"pl-s1"}],[{"s":12,"e":14,"c":"pl-k"},{"s":16,"e":17,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-c1"}],[{"s":16,"e":28,"c":"pl-smi"},{"s":29,"e":41,"c":"pl-s1"},{"s":44,"e":47,"c":"pl-k"},{"s":48,"e":60,"c":"pl-smi"}],[{"s":16,"e":28,"c":"pl-s1"},{"s":29,"e":34,"c":"pl-en"}],[{"s":16,"e":22,"c":"pl-smi"},{"s":23,"e":26,"c":"pl-s1"},{"s":27,"e":34,"c":"pl-en"},{"s":35,"e":41,"c":"pl-smi"},{"s":42,"e":55,"c":"pl-en"},{"s":58,"e":65,"c":"pl-en"},{"s":68,"e":76,"c":"pl-s"},{"s":77,"e":78,"c":"pl-s1"}],[],[],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":42,"c":"pl-s"}],[],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":12,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":74,"c":"pl-s"}],[{"s":8,"e":11,"c":"pl-k"},{"s":13,"e":16,"c":"pl-smi"},{"s":17,"e":18,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-c1"},{"s":24,"e":25,"c":"pl-s1"},{"s":28,"e":29,"c":"pl-c1"},{"s":31,"e":32,"c":"pl-s1"}],[{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":23,"e":30,"c":"pl-en"},{"s":31,"e":37,"c":"pl-smi"},{"s":38,"e":51,"c":"pl-en"},{"s":54,"e":61,"c":"pl-en"},{"s":64,"e":72,"c":"pl-s"},{"s":73,"e":74,"c":"pl-s1"}],[],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":41,"c":"pl-s"}],[],[],[],[],[],[],[],[{"s":0,"e":4,"c":"pl-s1"},{"s":9,"e":13,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":8,"c":"pl-c1"},{"s":13,"e":16,"c":"pl-en"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":8,"c":"pl-c1"},{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":15,"c":"pl-c1"}],[{"s":0,"e":4,"c":"pl-s1"},{"s":8,"e":9,"c":"pl-s1"},{"s":10,"e":11,"c":"pl-c1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":8,"c":"pl-c1"},{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":15,"c":"pl-c1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":8,"c":"pl-c1"},{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":15,"c":"pl-c1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":8,"c":"pl-c1"},{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":15,"c":"pl-c1"}],[{"s":0,"e":3,"c":"pl-en"}],[{"s":0,"e":4,"c":"pl-en"}],[],[],[{"s":7,"e":8,"c":"pl-en"},{"s":9,"e":21,"c":"pl-s1"},{"s":26,"e":31,"c":"pl-s1"},{"s":37,"e":43,"c":"pl-s1"},{"s":44,"e":45,"c":"pl-c1"},{"s":48,"e":51,"c":"pl-smi"},{"s":56,"e":59,"c":"pl-k"},{"s":63,"e":64,"c":"pl-s1"},{"s":74,"e":78,"c":"pl-s1"},{"s":93,"e":96,"c":"pl-k"},{"s":100,"e":101,"c":"pl-s1"}],[],[],[],[{"s":9,"e":14,"c":"pl-s1"},{"s":23,"e":35,"c":"pl-s1"},{"s":38,"e":39,"c":"pl-c1"},{"s":44,"e":45,"c":"pl-c1"},{"s":70,"e":76,"c":"pl-smi"},{"s":82,"e":88,"c":"pl-k"},{"s":109,"e":112,"c":"pl-c1"},{"s":115,"e":116,"c":"pl-s1"},{"s":122,"e":125,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":7,"c":"pl-s1"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":26,"c":"pl-en"}],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":19,"c":"pl-k"},{"s":20,"e":24,"c":"pl-smi"},{"s":25,"e":30,"c":"pl-s1"}],[{"s":4,"e":31,"c":"pl-c"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":20,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-c1"}],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":17,"c":"pl-k"},{"s":18,"e":45,"c":"pl-s1"}],[{"s":4,"e":17,"c":"pl-c"}],[{"s":4,"e":9,"c":"pl-s1"},{"s":10,"e":13,"c":"pl-s1"},{"s":14,"e":18,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-smi"},{"s":12,"e":19,"c":"pl-s1"},{"s":22,"e":27,"c":"pl-c1"}],[{"s":4,"e":7,"c":"pl-k"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":17,"e":53,"c":"pl-c"}],[{"s":8,"e":15,"c":"pl-s1"},{"s":18,"e":22,"c":"pl-c1"}],[{"s":6,"e":13,"c":"pl-k"}],[{"s":8,"e":11,"c":"pl-k"}],[{"s":12,"e":14,"c":"pl-k"},{"s":17,"e":24,"c":"pl-s1"}],[{"s":16,"e":21,"c":"pl-s1"},{"s":22,"e":39,"c":"pl-s1"},{"s":40,"e":44,"c":"pl-smi"}],[],[{"s":10,"e":15,"c":"pl-k"},{"s":17,"e":26,"c":"pl-s1"},{"s":27,"e":33,"c":"pl-s1"}],[{"s":12,"e":59,"c":"pl-c"}],[{"s":0,"e":52,"c":"pl-c"}],[],[],[],[],[{"s":9,"e":15,"c":"pl-s1"},{"s":18,"e":23,"c":"pl-s1"}],[],[{"s":3,"e":30,"c":"pl-s1"},{"s":36,"e":42,"c":"pl-s1"},{"s":43,"e":48,"c":"pl-s1"},{"s":67,"e":72,"c":"pl-s1"},{"s":87,"e":92,"c":"pl-s1"},{"s":99,"e":100,"c":"pl-s1"},{"s":105,"e":117,"c":"pl-s1"},{"s":124,"e":125,"c":"pl-c1"},{"s":129,"e":156,"c":"pl-s1"}],[],[{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[],[],[{"s":0,"e":5,"c":"pl-en"},{"s":12,"e":24,"c":"pl-s1"},{"s":27,"e":28,"c":"pl-c1"},{"s":42,"e":43,"c":"pl-c1"},{"s":74,"e":78,"c":"pl-smi"},{"s":79,"e":85,"c":"pl-s1"},{"s":88,"e":94,"c":"pl-s1"},{"s":95,"e":103,"c":"pl-s1"},{"s":120,"e":126,"c":"pl-s1"},{"s":127,"e":132,"c":"pl-en"},{"s":133,"e":141,"c":"pl-c1"},{"s":146,"e":158,"c":"pl-s1"},{"s":159,"e":160,"c":"pl-c1"},{"s":179,"e":184,"c":"pl-en"},{"s":194,"e":197,"c":"pl-smi"},{"s":212,"e":213,"c":"pl-s1"},{"s":228,"e":229,"c":"pl-s1"},{"s":238,"e":244,"c":"pl-en"},{"s":246,"e":251,"c":"pl-s1"},{"s":256,"e":259,"c":"pl-en"},{"s":266,"e":271,"c":"pl-s1"},{"s":272,"e":314,"c":"pl-c"}],[],[{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[],[],[{"s":17,"e":23,"c":"pl-s1"},{"s":47,"e":48,"c":"pl-s1"}],[],[{"s":11,"e":19,"c":"pl-s1"}],[],[{"s":8,"e":9,"c":"pl-s1"},{"s":20,"e":26,"c":"pl-s1"},{"s":31,"e":39,"c":"pl-s1"},{"s":42,"e":45,"c":"pl-s1"},{"s":51,"e":57,"c":"pl-s1"},{"s":65,"e":71,"c":"pl-s1"},{"s":77,"e":83,"c":"pl-s1"},{"s":93,"e":99,"c":"pl-s1"},{"s":107,"e":113,"c":"pl-s1"},{"s":120,"e":126,"c":"pl-s1"},{"s":128,"e":131,"c":"pl-s1"},{"s":143,"e":144,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":5,"c":"pl-k"},{"s":6,"e":18,"c":"pl-s1"},{"s":19,"e":29,"c":"pl-k"},{"s":30,"e":38,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":12,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-s1"},{"s":27,"e":33,"c":"pl-s1"},{"s":34,"e":47,"c":"pl-s1"},{"s":50,"e":57,"c":"pl-s1"},{"s":60,"e":72,"c":"pl-s"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-s1"},{"s":28,"e":34,"c":"pl-smi"},{"s":37,"e":41,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":73,"c":"pl-s"}],[{"s":8,"e":20,"c":"pl-smi"},{"s":21,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":46,"c":"pl-smi"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":21,"c":"pl-s1"},{"s":24,"e":27,"c":"pl-k"},{"s":28,"e":34,"c":"pl-smi"},{"s":35,"e":41,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":15,"e":20,"c":"pl-en"}],[],[],[],[],[],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[],[],[{"s":14,"e":20,"c":"pl-s1"},{"s":22,"e":25,"c":"pl-en"},{"s":37,"e":43,"c":"pl-s1"},{"s":55,"e":61,"c":"pl-s1"},{"s":63,"e":66,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":7,"c":"pl-k"},{"s":8,"e":16,"c":"pl-smi"},{"s":17,"e":23,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":15,"c":"pl-s1"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":14,"c":"pl-s1"},{"s":18,"e":22,"c":"pl-c1"}],[{"s":6,"e":12,"c":"pl-s1"},{"s":13,"e":16,"c":"pl-en"}],[],[],[],[],[{"s":8,"e":9,"c":"pl-smi"}],[],[{"s":19,"e":25,"c":"pl-s1"}],[],[],[],[{"s":5,"e":11,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-s1"},{"s":16,"e":19,"c":"pl-k"},{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":30,"c":"pl-k"},{"s":31,"e":39,"c":"pl-smi"}],[{"s":4,"e":5,"c":"pl-c1"},{"s":5,"e":13,"c":"pl-c1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":19,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":72,"c":"pl-s"}],[],[],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-en"}],[],[{"s":6,"e":11,"c":"pl-smi"}],[],[{"s":1,"e":6,"c":"pl-s1"},{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":32,"c":"pl-c1"},{"s":37,"e":45,"c":"pl-s1"},{"s":50,"e":58,"c":"pl-s1"},{"s":61,"e":62,"c":"pl-s1"},{"s":73,"e":74,"c":"pl-s1"},{"s":82,"e":88,"c":"pl-s1"},{"s":93,"e":101,"c":"pl-s1"},{"s":117,"e":118,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":1,"c":"pl-c1"},{"s":1,"e":20,"c":"pl-c1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":16,"c":"pl-k"},{"s":17,"e":25,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":19,"c":"pl-k"},{"s":20,"e":24,"c":"pl-smi"},{"s":25,"e":28,"c":"pl-en"}],[],[],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-s1"},{"s":16,"e":19,"c":"pl-k"},{"s":20,"e":26,"c":"pl-smi"}],[{"s":6,"e":12,"c":"pl-smi"},{"s":13,"e":16,"c":"pl-s1"},{"s":17,"e":24,"c":"pl-en"},{"s":25,"e":31,"c":"pl-smi"},{"s":32,"e":45,"c":"pl-en"},{"s":48,"e":55,"c":"pl-en"},{"s":58,"e":70,"c":"pl-s"}],[],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-en"}],[],[],[],[],[{"s":8,"e":14,"c":"pl-s1"},{"s":35,"e":38,"c":"pl-s1"}],[],[{"s":11,"e":19,"c":"pl-s1"}],[],[{"s":0,"e":8,"c":"pl-s1"},{"s":12,"e":15,"c":"pl-s1"},{"s":46,"e":54,"c":"pl-smi"},{"s":59,"e":60,"c":"pl-s1"},{"s":62,"e":76,"c":"pl-s1"},{"s":79,"e":87,"c":"pl-s1"},{"s":100,"e":104,"c":"pl-s1"},{"s":115,"e":129,"c":"pl-smi"},{"s":131,"e":132,"c":"pl-s1"},{"s":135,"e":145,"c":"pl-s1"},{"s":150,"e":160,"c":"pl-s1"},{"s":163,"e":164,"c":"pl-s1"},{"s":167,"e":173,"c":"pl-s1"},{"s":176,"e":182,"c":"pl-s1"},{"s":183,"e":188,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":27,"c":"pl-smi"},{"s":28,"e":38,"c":"pl-k"},{"s":39,"e":47,"c":"pl-smi"},{"s":48,"e":55,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":18,"c":"pl-smi"},{"s":19,"e":23,"c":"pl-en"},{"s":26,"e":32,"c":"pl-k"},{"s":33,"e":53,"c":"pl-smi"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":73,"c":"pl-s"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":20,"c":"pl-en"},{"s":21,"e":25,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":16,"c":"pl-c1"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-en"},{"s":28,"e":34,"c":"pl-smi"},{"s":37,"e":41,"c":"pl-s1"},{"s":43,"e":49,"c":"pl-k"},{"s":50,"e":68,"c":"pl-smi"},{"s":70,"e":90,"c":"pl-smi"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":47,"c":"pl-en"},{"s":50,"e":57,"c":"pl-en"},{"s":60,"e":73,"c":"pl-s"}],[{"s":8,"e":22,"c":"pl-smi"},{"s":23,"e":37,"c":"pl-s1"},{"s":40,"e":43,"c":"pl-k"},{"s":44,"e":58,"c":"pl-smi"}],[{"s":8,"e":18,"c":"pl-smi"},{"s":19,"e":26,"c":"pl-smi"},{"s":28,"e":32,"c":"pl-s1"},{"s":35,"e":38,"c":"pl-k"},{"s":39,"e":49,"c":"pl-smi"},{"s":50,"e":57,"c":"pl-smi"},{"s":59,"e":73,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":21,"c":"pl-s1"},{"s":24,"e":27,"c":"pl-k"},{"s":28,"e":34,"c":"pl-smi"},{"s":35,"e":39,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":15,"e":20,"c":"pl-en"}],[{"s":8,"e":15,"c":"pl-smi"},{"s":16,"e":22,"c":"pl-s1"},{"s":25,"e":29,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-en"},{"s":36,"e":55,"c":"pl-c"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":43,"c":"pl-s"},{"s":44,"e":50,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":33,"c":"pl-s"}],[],[],[],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":14,"e":17,"c":"pl-s1"},{"s":34,"e":40,"c":"pl-smi"},{"s":41,"e":44,"c":"pl-s1"},{"s":50,"e":56,"c":"pl-smi"},{"s":62,"e":68,"c":"pl-s1"},{"s":71,"e":81,"c":"pl-s1"},{"s":84,"e":94,"c":"pl-smi"},{"s":95,"e":98,"c":"pl-s1"},{"s":105,"e":113,"c":"pl-s1"},{"s":119,"e":123,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":17,"c":"pl-c"}],[{"s":0,"e":1,"c":"pl-c1"},{"s":1,"e":9,"c":"pl-c1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":15,"c":"pl-s1"}],[{"s":2,"e":4,"c":"pl-k"},{"s":6,"e":12,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-c1"}],[{"s":4,"e":45,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-s1"},{"s":11,"e":14,"c":"pl-en"}],[],[],[{"s":0,"e":21,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":15,"c":"pl-s1"}],[{"s":2,"e":4,"c":"pl-k"},{"s":6,"e":11,"c":"pl-s1"},{"s":15,"e":18,"c":"pl-c1"}],[{"s":7,"e":13,"c":"pl-smi"},{"s":14,"e":34,"c":"pl-en"},{"s":35,"e":39,"c":"pl-smi"},{"s":41,"e":53,"c":"pl-s1"}],[{"s":35,"e":39,"c":"pl-c1"},{"s":41,"e":47,"c":"pl-smi"},{"s":48,"e":61,"c":"pl-en"}],[{"s":4,"e":10,"c":"pl-k"}],[{"s":2,"e":5,"c":"pl-k"}],[{"s":4,"e":12,"c":"pl-smi"},{"s":13,"e":14,"c":"pl-smi"},{"s":16,"e":17,"c":"pl-s1"},{"s":20,"e":28,"c":"pl-s1"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":9,"c":"pl-s1"},{"s":13,"e":17,"c":"pl-c1"},{"s":21,"e":26,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-c1"}],[{"s":6,"e":7,"c":"pl-smi"},{"s":8,"e":14,"c":"pl-s1"}],[{"s":6,"e":13,"c":"pl-smi"},{"s":14,"e":17,"c":"pl-s1"}],[{"s":6,"e":9,"c":"pl-k"}],[{"s":8,"e":33,"c":"pl-c"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-s1"},{"s":19,"e":23,"c":"pl-en"}],[{"s":8,"e":11,"c":"pl-s1"},{"s":14,"e":18,"c":"pl-c1"}],[{"s":8,"e":13,"c":"pl-k"},{"s":15,"e":24,"c":"pl-smi"},{"s":25,"e":27,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-s1"},{"s":17,"e":21,"c":"pl-c1"}],[{"s":8,"e":11,"c":"pl-s1"},{"s":14,"e":19,"c":"pl-c1"}],[{"s":8,"e":20,"c":"pl-en"},{"s":21,"e":23,"c":"pl-s1"}],[],[{"s":6,"e":8,"c":"pl-k"},{"s":10,"e":13,"c":"pl-s1"}],[{"s":8,"e":11,"c":"pl-en"},{"s":12,"e":18,"c":"pl-s1"}],[],[{"s":4,"e":11,"c":"pl-k"}],[{"s":4,"e":56,"c":"pl-c"}],[{"s":4,"e":40,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-s1"},{"s":13,"e":17,"c":"pl-c1"}],[{"s":4,"e":60,"c":"pl-c"}],[{"s":4,"e":24,"c":"pl-c"}],[{"s":4,"e":7,"c":"pl-smi"},{"s":8,"e":9,"c":"pl-s1"},{"s":12,"e":17,"c":"pl-s1"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":9,"c":"pl-s1"},{"s":13,"e":25,"c":"pl-c1"}],[{"s":6,"e":41,"c":"pl-en"},{"s":42,"e":43,"c":"pl-s1"}],[],[],[],[],[{"s":4,"e":8,"c":"pl-smi"},{"s":10,"e":18,"c":"pl-s1"},{"s":19,"e":27,"c":"pl-s1"},{"s":28,"e":34,"c":"pl-s1"},{"s":35,"e":45,"c":"pl-s1"}],[],[{"s":24,"e":25,"c":"pl-s1"},{"s":30,"e":36,"c":"pl-s1"},{"s":42,"e":45,"c":"pl-s1"},{"s":60,"e":64,"c":"pl-smi"},{"s":76,"e":84,"c":"pl-s1"}],[{"s":6,"e":14,"c":"pl-s1"}],[{"s":0,"e":8,"c":"pl-s1"},{"s":9,"e":10,"c":"pl-s1"},{"s":19,"e":20,"c":"pl-s1"},{"s":33,"e":36,"c":"pl-s1"},{"s":49,"e":55,"c":"pl-s1"},{"s":72,"e":75,"c":"pl-s1"}],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":1,"c":"pl-c1"},{"s":1,"e":26,"c":"pl-c1"},{"s":27,"e":36,"c":"pl-s1"},{"s":37,"e":45,"c":"pl-s1"}],[{"s":1,"e":7,"c":"pl-k"},{"s":8,"e":16,"c":"pl-k"},{"s":17,"e":21,"c":"pl-smi"},{"s":22,"e":25,"c":"pl-s1"}],[],[],[],[{"s":0,"e":6,"c":"pl-smi"},{"s":7,"e":12,"c":"pl-en"},{"s":18,"e":24,"c":"pl-smi"},{"s":25,"e":28,"c":"pl-en"},{"s":34,"e":40,"c":"pl-s1"},{"s":41,"e":44,"c":"pl-en"}],[],[{"s":6,"e":14,"c":"pl-smi"}],[],[{"s":0,"e":8,"c":"pl-s1"},{"s":9,"e":17,"c":"pl-s1"},{"s":22,"e":23,"c":"pl-s1"},{"s":32,"e":36,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":1,"c":"pl-c1"},{"s":1,"e":26,"c":"pl-c1"},{"s":27,"e":36,"c":"pl-s1"},{"s":37,"e":45,"c":"pl-s1"},{"s":46,"e":47,"c":"pl-s1"}],[{"s":2,"e":3,"c":"pl-smi"},{"s":4,"e":8,"c":"pl-s1"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-s1"}],[],[],[],[{"s":6,"e":12,"c":"pl-smi"}],[],[{"s":0,"e":6,"c":"pl-s1"},{"s":8,"e":9,"c":"pl-s1"},{"s":13,"e":19,"c":"pl-s1"},{"s":22,"e":23,"c":"pl-s1"},{"s":29,"e":30,"c":"pl-s1"},{"s":33,"e":34,"c":"pl-s1"},{"s":36,"e":43,"c":"pl-s1"},{"s":44,"e":52,"c":"pl-s1"},{"s":63,"e":64,"c":"pl-s1"},{"s":73,"e":79,"c":"pl-s1"},{"s":93,"e":99,"c":"pl-en"},{"s":111,"e":114,"c":"pl-en"},{"s":133,"e":136,"c":"pl-en"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":16,"c":"pl-k"},{"s":17,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-smi"}],[{"s":2,"e":33,"c":"pl-c"}],[{"s":2,"e":50,"c":"pl-c"}],[{"s":2,"e":44,"c":"pl-c"}],[{"s":1,"e":8,"c":"pl-smi"},{"s":9,"e":15,"c":"pl-en"},{"s":16,"e":23,"c":"pl-smi"},{"s":24,"e":45,"c":"pl-s1"}],[{"s":1,"e":8,"c":"pl-smi"},{"s":9,"e":20,"c":"pl-en"}],[{"s":1,"e":8,"c":"pl-smi"},{"s":9,"e":15,"c":"pl-en"}],[{"s":1,"e":2,"c":"pl-smi"},{"s":3,"e":6,"c":"pl-en"},{"s":9,"e":15,"c":"pl-k"},{"s":16,"e":36,"c":"pl-smi"},{"s":38,"e":56,"c":"pl-smi"}],[{"s":1,"e":2,"c":"pl-smi"},{"s":3,"e":6,"c":"pl-en"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":19,"c":"pl-s1"},{"s":21,"e":29,"c":"pl-smi"},{"s":30,"e":34,"c":"pl-s1"}],[{"s":3,"e":9,"c":"pl-k"},{"s":10,"e":30,"c":"pl-smi"},{"s":32,"e":50,"c":"pl-smi"},{"s":52,"e":68,"c":"pl-smi"}],[],[],[],[{"s":6,"e":16,"c":"pl-smi"}],[],[{"s":2,"e":8,"c":"pl-s1"},{"s":10,"e":11,"c":"pl-s1"},{"s":26,"e":36,"c":"pl-s1"},{"s":38,"e":44,"c":"pl-s1"},{"s":51,"e":61,"c":"pl-s1"},{"s":64,"e":78,"c":"pl-s1"},{"s":82,"e":96,"c":"pl-s1"},{"s":100,"e":108,"c":"pl-s1"},{"s":111,"e":117,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-smi"},{"s":27,"e":37,"c":"pl-k"},{"s":38,"e":52,"c":"pl-smi"},{"s":53,"e":54,"c":"pl-smi"}],[],[],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":16,"c":"pl-k"},{"s":17,"e":31,"c":"pl-smi"},{"s":32,"e":33,"c":"pl-smi"},{"s":35,"e":42,"c":"pl-k"},{"s":43,"e":51,"c":"pl-smi"},{"s":53,"e":59,"c":"pl-smi"},{"s":60,"e":61,"c":"pl-smi"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":12,"c":"pl-en"}],[],[],[],[],[],[{"s":4,"e":12,"c":"pl-smi"},{"s":22,"e":28,"c":"pl-s1"},{"s":35,"e":43,"c":"pl-s1"},{"s":47,"e":57,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":22,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":14,"c":"pl-s1"},{"s":17,"e":20,"c":"pl-k"},{"s":21,"e":27,"c":"pl-smi"},{"s":28,"e":31,"c":"pl-k"},{"s":32,"e":40,"c":"pl-smi"}],[{"s":3,"e":4,"c":"pl-c1"},{"s":4,"e":12,"c":"pl-c1"}],[{"s":6,"e":12,"c":"pl-k"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":21,"c":"pl-en"}],[{"s":3,"e":10,"c":"pl-c"}],[],[],[],[{"s":0,"e":35,"c":"pl-c"}],[{"s":0,"e":15,"c":"pl-smi"},{"s":16,"e":20,"c":"pl-s1"},{"s":23,"e":32,"c":"pl-smi"},{"s":33,"e":56,"c":"pl-en"}],[{"s":0,"e":10,"c":"pl-smi"},{"s":11,"e":15,"c":"pl-s1"},{"s":18,"e":21,"c":"pl-k"},{"s":22,"e":32,"c":"pl-smi"},{"s":33,"e":36,"c":"pl-k"},{"s":37,"e":45,"c":"pl-smi"}],[{"s":8,"e":9,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":21,"c":"pl-smi"},{"s":22,"e":26,"c":"pl-en"},{"s":29,"e":35,"c":"pl-k"},{"s":36,"e":45,"c":"pl-smi"}],[{"s":10,"e":17,"c":"pl-c"}],[{"s":10,"e":16,"c":"pl-k"},{"s":17,"e":21,"c":"pl-c1"}],[],[],[{"s":0,"e":4,"c":"pl-s1"},{"s":5,"e":11,"c":"pl-en"},{"s":12,"e":16,"c":"pl-s1"}],[],[{"s":0,"e":35,"c":"pl-c"}],[{"s":0,"e":10,"c":"pl-smi"},{"s":11,"e":16,"c":"pl-s1"},{"s":19,"e":22,"c":"pl-k"},{"s":23,"e":33,"c":"pl-smi"},{"s":34,"e":37,"c":"pl-k"},{"s":38,"e":46,"c":"pl-smi"}],[{"s":6,"e":7,"c":"pl-c1"},{"s":7,"e":15,"c":"pl-c1"}],[{"s":6,"e":12,"c":"pl-k"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":21,"c":"pl-en"}],[{"s":7,"e":14,"c":"pl-c"}],[],[],[{"s":0,"e":4,"c":"pl-s1"},{"s":5,"e":11,"c":"pl-en"},{"s":12,"e":17,"c":"pl-s1"}],[],[],[{"s":4,"e":8,"c":"pl-s1"}],[],[],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":4,"e":12,"c":"pl-k"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":14,"e":15,"c":"pl-smi"},{"s":16,"e":17,"c":"pl-s1"},{"s":23,"e":24,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"},{"s":28,"e":29,"c":"pl-s1"},{"s":34,"e":42,"c":"pl-s1"},{"s":44,"e":45,"c":"pl-s1"},{"s":46,"e":57,"c":"pl-s1"},{"s":65,"e":66,"c":"pl-s1"},{"s":71,"e":79,"c":"pl-smi"},{"s":86,"e":97,"c":"pl-s1"},{"s":111,"e":112,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[],[{"s":6,"e":7,"c":"pl-c1"}],[],[{"s":11,"e":19,"c":"pl-smi"},{"s":35,"e":43,"c":"pl-s1"},{"s":44,"e":48,"c":"pl-c1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":37,"c":"pl-smi"}],[{"s":1,"e":8,"c":"pl-k"},{"s":9,"e":15,"c":"pl-k"},{"s":16,"e":24,"c":"pl-smi"},{"s":25,"e":33,"c":"pl-s1"}],[{"s":1,"e":7,"c":"pl-k"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-smi"},{"s":24,"e":35,"c":"pl-en"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":16,"c":"pl-s1"},{"s":20,"e":24,"c":"pl-c1"},{"s":26,"e":29,"c":"pl-c"}],[{"s":6,"e":14,"c":"pl-s1"},{"s":17,"e":20,"c":"pl-k"},{"s":21,"e":29,"c":"pl-smi"},{"s":33,"e":36,"c":"pl-c"}],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":19,"c":"pl-s1"}],[],[],[],[{"s":6,"e":7,"c":"pl-c1"},{"s":13,"e":23,"c":"pl-en"}],[],[{"s":12,"e":23,"c":"pl-en"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":22,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":28,"c":"pl-smi"},{"s":29,"e":37,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":23,"c":"pl-k"},{"s":24,"e":30,"c":"pl-k"},{"s":31,"e":40,"c":"pl-smi"},{"s":41,"e":52,"c":"pl-s1"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":20,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-c1"}],[{"s":12,"e":20,"c":"pl-s1"},{"s":23,"e":26,"c":"pl-k"},{"s":27,"e":35,"c":"pl-smi"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-s1"}],[],[],[],[{"s":6,"e":7,"c":"pl-c1"}],[],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":22,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":28,"c":"pl-smi"},{"s":29,"e":37,"c":"pl-s1"},{"s":40,"e":43,"c":"pl-k"},{"s":44,"e":53,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-smi"},{"s":28,"e":39,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-s1"}],[],[],[],[{"s":20,"e":21,"c":"pl-smi"},{"s":24,"e":35,"c":"pl-s1"},{"s":44,"e":53,"c":"pl-smi"},{"s":64,"e":72,"c":"pl-s1"}],[],[{"s":6,"e":7,"c":"pl-c1"}],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":22,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":28,"c":"pl-smi"},{"s":29,"e":37,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-smi"},{"s":28,"e":39,"c":"pl-en"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":20,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-c1"}],[{"s":12,"e":24,"c":"pl-k"},{"s":26,"e":35,"c":"pl-smi"},{"s":36,"e":41,"c":"pl-k"}],[{"s":16,"e":18,"c":"pl-k"},{"s":20,"e":28,"c":"pl-s1"},{"s":32,"e":36,"c":"pl-c1"},{"s":40,"e":177,"c":"pl-c"}],[{"s":20,"e":28,"c":"pl-s1"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":44,"c":"pl-smi"}],[],[],[],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-s1"}],[],[],[],[],[{"s":0,"e":8,"c":"pl-s1"},{"s":11,"e":14,"c":"pl-k"},{"s":15,"e":24,"c":"pl-smi"}],[],[],[],[{"s":0,"e":2,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":14,"e":22,"c":"pl-s1"}],[],[{"s":38,"e":39,"c":"pl-c1"},{"s":43,"e":44,"c":"pl-c1"},{"s":54,"e":55,"c":"pl-s1"},{"s":61,"e":62,"c":"pl-c1"},{"s":69,"e":70,"c":"pl-c1"},{"s":82,"e":83,"c":"pl-s1"},{"s":85,"e":87,"c":"pl-k"},{"s":89,"e":97,"c":"pl-s1"},{"s":101,"e":105,"c":"pl-c1"},{"s":112,"e":120,"c":"pl-s1"},{"s":122,"e":126,"c":"pl-c1"},{"s":130,"e":138,"c":"pl-smi"},{"s":146,"e":154,"c":"pl-s1"},{"s":165,"e":166,"c":"pl-s1"},{"s":170,"e":171,"c":"pl-s1"},{"s":179,"e":187,"c":"pl-s1"},{"s":196,"e":197,"c":"pl-c1"},{"s":200,"e":201,"c":"pl-s1"},{"s":204,"e":212,"c":"pl-k"}],[],[{"s":6,"e":7,"c":"pl-c1"},{"s":12,"e":20,"c":"pl-k"}],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":22,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":20,"c":"pl-k"},{"s":21,"e":27,"c":"pl-k"},{"s":28,"e":37,"c":"pl-smi"},{"s":38,"e":46,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-smi"},{"s":28,"e":39,"c":"pl-en"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":20,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-c1"}],[{"s":12,"e":24,"c":"pl-k"},{"s":26,"e":35,"c":"pl-smi"},{"s":36,"e":41,"c":"pl-k"}],[{"s":16,"e":18,"c":"pl-k"},{"s":20,"e":28,"c":"pl-s1"},{"s":32,"e":36,"c":"pl-c1"},{"s":37,"e":158,"c":"pl-c"}],[{"s":20,"e":28,"c":"pl-s1"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":44,"c":"pl-smi"}],[],[],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-s1"}],[],[],[],[],[{"s":0,"e":8,"c":"pl-k"}],[],[{"s":0,"e":8,"c":"pl-k"},{"s":21,"e":22,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-s1"},{"s":32,"e":36,"c":"pl-s1"},{"s":43,"e":44,"c":"pl-s1"}],[],[],[],[{"s":14,"e":17,"c":"pl-c1"},{"s":33,"e":36,"c":"pl-c1"}],[],[{"s":4,"e":12,"c":"pl-k"},{"s":20,"e":21,"c":"pl-c1"}],[],[{"s":6,"e":7,"c":"pl-c1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":5,"c":"pl-k"},{"s":6,"e":10,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-smi"},{"s":28,"e":39,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":24,"c":"pl-smi"},{"s":25,"e":33,"c":"pl-s1"},{"s":37,"e":123,"c":"pl-c"}],[],[],[{"s":5,"e":12,"c":"pl-k"},{"s":13,"e":19,"c":"pl-k"},{"s":20,"e":25,"c":"pl-k"},{"s":26,"e":35,"c":"pl-smi"}],[{"s":8,"e":15,"c":"pl-k"},{"s":16,"e":22,"c":"pl-k"},{"s":23,"e":32,"c":"pl-smi"},{"s":33,"e":41,"c":"pl-s1"},{"s":44,"e":47,"c":"pl-k"},{"s":48,"e":57,"c":"pl-smi"}],[],[],[],[],[{"s":2,"e":5,"c":"pl-smi"},{"s":16,"e":17,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-s1"},{"s":43,"e":44,"c":"pl-s1"},{"s":86,"e":94,"c":"pl-s1"},{"s":100,"e":101,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-smi"}],[{"s":4,"e":16,"c":"pl-c"}],[{"s":4,"e":12,"c":"pl-c1"}],[{"s":4,"e":14,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":22,"c":"pl-en"}],[],[],[{"s":60,"e":71,"c":"pl-smi"},{"s":83,"e":107,"c":"pl-s1"},{"s":136,"e":140,"c":"pl-smi"},{"s":141,"e":145,"c":"pl-smi"},{"s":146,"e":150,"c":"pl-smi"},{"s":151,"e":158,"c":"pl-s1"}],[],[],[],[{"s":35,"e":36,"c":"pl-s1"},{"s":52,"e":53,"c":"pl-s1"},{"s":75,"e":86,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":22,"c":"pl-smi"},{"s":23,"e":33,"c":"pl-k"},{"s":34,"e":38,"c":"pl-smi"},{"s":39,"e":41,"c":"pl-smi"},{"s":42,"e":54,"c":"pl-smi"}],[],[{"s":3,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-smi"},{"s":18,"e":29,"c":"pl-en"}],[{"s":9,"e":15,"c":"pl-k"},{"s":16,"e":24,"c":"pl-c1"}],[],[],[],[{"s":4,"e":15,"c":"pl-smi"},{"s":18,"e":35,"c":"pl-s1"},{"s":42,"e":52,"c":"pl-s1"},{"s":77,"e":88,"c":"pl-en"},{"s":103,"e":114,"c":"pl-en"},{"s":120,"e":121,"c":"pl-smi"},{"s":140,"e":141,"c":"pl-s1"}],[],[{"s":4,"e":12,"c":"pl-k"},{"s":28,"e":29,"c":"pl-smi"}],[],[{"s":5,"e":6,"c":"pl-s1"},{"s":7,"e":15,"c":"pl-k"},{"s":23,"e":26,"c":"pl-smi"},{"s":48,"e":49,"c":"pl-s1"},{"s":51,"e":55,"c":"pl-s1"}],[{"s":0,"e":4,"c":"pl-s1"}],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":8,"c":"pl-s1"},{"s":11,"e":14,"c":"pl-k"},{"s":15,"e":24,"c":"pl-smi"},{"s":28,"e":50,"c":"pl-c"}],[],[{"s":0,"e":10,"c":"pl-c1"},{"s":12,"e":16,"c":"pl-smi"},{"s":17,"e":19,"c":"pl-s1"},{"s":20,"e":21,"c":"pl-c1"},{"s":22,"e":23,"c":"pl-c1"},{"s":24,"e":31,"c":"pl-c1"},{"s":33,"e":36,"c":"pl-s1"},{"s":38,"e":48,"c":"pl-c1"},{"s":50,"e":54,"c":"pl-s1"},{"s":55,"e":59,"c":"pl-smi"},{"s":60,"e":62,"c":"pl-s1"},{"s":63,"e":64,"c":"pl-c1"},{"s":67,"e":70,"c":"pl-s1"}],[],[{"s":1,"e":5,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":5,"e":8,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":16,"e":19,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[],[{"s":8,"e":9,"c":"pl-smi"},{"s":32,"e":35,"c":"pl-c1"},{"s":40,"e":44,"c":"pl-s1"},{"s":110,"e":118,"c":"pl-k"},{"s":129,"e":132,"c":"pl-smi"},{"s":140,"e":141,"c":"pl-s1"},{"s":142,"e":146,"c":"pl-s1"},{"s":190,"e":193,"c":"pl-c1"},{"s":211,"e":212,"c":"pl-s1"},{"s":217,"e":220,"c":"pl-c1"},{"s":249,"e":252,"c":"pl-c1"},{"s":287,"e":290,"c":"pl-c1"}],[],[],[],[],[],[],[{"s":6,"e":7,"c":"pl-s1"},{"s":16,"e":17,"c":"pl-s1"},{"s":38,"e":50,"c":"pl-k"},{"s":55,"e":58,"c":"pl-s1"},{"s":63,"e":66,"c":"pl-s1"},{"s":75,"e":83,"c":"pl-k"},{"s":115,"e":116,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":8,"c":"pl-k"},{"s":9,"e":16,"c":"pl-smi"},{"s":17,"e":18,"c":"pl-s1"}],[{"s":0,"e":27,"c":"pl-c"}],[{"s":0,"e":3,"c":"pl-en"},{"s":4,"e":11,"c":"pl-smi"},{"s":12,"e":13,"c":"pl-s1"}],[{"s":2,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":21,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":10,"c":"pl-s1"},{"s":13,"e":14,"c":"pl-s1"}],[],[],[],[{"s":0,"e":3,"c":"pl-en"}],[{"s":1,"e":7,"c":"pl-k"},{"s":8,"e":9,"c":"pl-s1"}],[],[],[],[],[],[{"s":20,"e":21,"c":"pl-smi"},{"s":28,"e":29,"c":"pl-s1"},{"s":35,"e":43,"c":"pl-k"}],[],[],[],[],[{"s":4,"e":8,"c":"pl-s1"}],[],[],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":5,"c":"pl-s1"},{"s":10,"e":16,"c":"pl-s1"},{"s":17,"e":22,"c":"pl-c1"},{"s":22,"e":25,"c":"pl-s1"}],[],[{"s":11,"e":12,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[{"s":6,"e":9,"c":"pl-k"},{"s":15,"e":21,"c":"pl-s1"},{"s":29,"e":30,"c":"pl-s1"},{"s":62,"e":67,"c":"pl-smi"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[{"s":11,"e":16,"c":"pl-en"},{"s":52,"e":55,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[{"s":15,"e":18,"c":"pl-en"},{"s":28,"e":31,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[],[{"s":5,"e":6,"c":"pl-s1"},{"s":12,"e":17,"c":"pl-s1"},{"s":22,"e":29,"c":"pl-s1"}],[],[{"s":21,"e":25,"c":"pl-en"}],[{"s":16,"e":28,"c":"pl-k"}],[{"s":18,"e":23,"c":"pl-en"},{"s":28,"e":32,"c":"pl-en"},{"s":39,"e":40,"c":"pl-s1"},{"s":41,"e":42,"c":"pl-en"},{"s":59,"e":64,"c":"pl-s1"},{"s":72,"e":76,"c":"pl-en"},{"s":92,"e":93,"c":"pl-s1"},{"s":94,"e":95,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[{"s":3,"e":4,"c":"pl-smi"}],[],[{"s":2,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-s1"},{"s":33,"e":34,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-k"},{"s":12,"e":17,"c":"pl-s1"}],[{"s":4,"e":7,"c":"pl-c1"},{"s":8,"e":13,"c":"pl-c"}],[{"s":4,"e":12,"c":"pl-c1"},{"s":13,"e":18,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-c1"},{"s":12,"e":17,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-c1"},{"s":12,"e":17,"c":"pl-c"}],[{"s":4,"e":17,"c":"pl-c1"},{"s":18,"e":29,"c":"pl-c"}],[{"s":4,"e":14,"c":"pl-c1"},{"s":15,"e":20,"c":"pl-c"}],[],[],[],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":28,"c":"pl-smi"},{"s":29,"e":33,"c":"pl-smi"}],[],[],[],[{"s":5,"e":8,"c":"pl-en"}],[],[{"s":2,"e":5,"c":"pl-c1"},{"s":21,"e":27,"c":"pl-s1"},{"s":30,"e":35,"c":"pl-s1"}],[],[{"s":5,"e":13,"c":"pl-c1"}],[],[{"s":14,"e":22,"c":"pl-c1"},{"s":30,"e":34,"c":"pl-s1"},{"s":57,"e":58,"c":"pl-s1"},{"s":59,"e":60,"c":"pl-s1"}],[],[{"s":2,"e":6,"c":"pl-s1"},{"s":11,"e":19,"c":"pl-c1"},{"s":40,"e":45,"c":"pl-s1"},{"s":50,"e":57,"c":"pl-s1"}],[],[{"s":5,"e":12,"c":"pl-c1"}],[],[{"s":12,"e":23,"c":"pl-s1"}],[],[{"s":5,"e":12,"c":"pl-c1"}],[],[{"s":16,"e":24,"c":"pl-c1"}],[],[{"s":4,"e":5,"c":"pl-c1"}],[],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-en"},{"s":30,"e":31,"c":"pl-s1"},{"s":36,"e":42,"c":"pl-s1"}],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-en"},{"s":31,"e":37,"c":"pl-s1"},{"s":40,"e":44,"c":"pl-en"}],[{"s":2,"e":13,"c":"pl-smi"},{"s":14,"e":18,"c":"pl-en"}],[],[{"s":6,"e":19,"c":"pl-c1"}],[],[{"s":11,"e":12,"c":"pl-s1"}],[],[],[],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":14,"c":"pl-en"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":26,"c":"pl-s1"}],[],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-en"},{"s":14,"e":18,"c":"pl-smi"},{"s":19,"e":26,"c":"pl-s1"},{"s":45,"e":51,"c":"pl-en"},{"s":54,"e":63,"c":"pl-en"}],[],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-en"},{"s":14,"e":18,"c":"pl-smi"},{"s":19,"e":25,"c":"pl-s1"},{"s":37,"e":43,"c":"pl-s1"},{"s":48,"e":54,"c":"pl-s1"},{"s":55,"e":56,"c":"pl-c1"},{"s":59,"e":60,"c":"pl-s1"}],[],[{"s":2,"e":13,"c":"pl-smi"},{"s":14,"e":23,"c":"pl-en"},{"s":24,"e":28,"c":"pl-smi"},{"s":29,"e":34,"c":"pl-s1"}],[],[{"s":2,"e":13,"c":"pl-smi"},{"s":14,"e":23,"c":"pl-en"},{"s":24,"e":28,"c":"pl-smi"},{"s":29,"e":37,"c":"pl-s1"}],[],[{"s":5,"e":15,"c":"pl-c1"}],[],[],[],[],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":2,"e":9,"c":"pl-c1"},{"s":10,"e":18,"c":"pl-c1"}],[],[{"s":2,"e":9,"c":"pl-c1"},{"s":35,"e":43,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":2,"e":9,"c":"pl-c1"},{"s":12,"e":20,"c":"pl-c1"}],[],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-en"},{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":31,"c":"pl-en"},{"s":38,"e":49,"c":"pl-smi"},{"s":50,"e":54,"c":"pl-en"},{"s":59,"e":60,"c":"pl-c1"},{"s":69,"e":77,"c":"pl-c1"},{"s":81,"e":88,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":2,"e":15,"c":"pl-c1"},{"s":16,"e":24,"c":"pl-c1"}],[],[{"s":0,"e":13,"c":"pl-c1"},{"s":14,"e":21,"c":"pl-c1"},{"s":28,"e":41,"c":"pl-c1"}],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":16,"c":"pl-en"},{"s":17,"e":21,"c":"pl-smi"},{"s":27,"e":33,"c":"pl-smi"},{"s":34,"e":38,"c":"pl-en"},{"s":39,"e":43,"c":"pl-smi"},{"s":49,"e":55,"c":"pl-smi"},{"s":56,"e":60,"c":"pl-en"},{"s":61,"e":65,"c":"pl-smi"},{"s":71,"e":79,"c":"pl-en"},{"s":84,"e":97,"c":"pl-c1"}],[],[{"s":4,"e":8,"c":"pl-s1"},{"s":11,"e":15,"c":"pl-en"},{"s":18,"e":23,"c":"pl-en"}],[],[{"s":5,"e":9,"c":"pl-en"},{"s":12,"e":16,"c":"pl-en"},{"s":19,"e":24,"c":"pl-en"}],[],[{"s":5,"e":11,"c":"pl-smi"},{"s":12,"e":16,"c":"pl-en"}],[],[{"s":2,"e":6,"c":"pl-en"},{"s":19,"e":25,"c":"pl-en"},{"s":32,"e":36,"c":"pl-s1"},{"s":48,"e":54,"c":"pl-en"},{"s":60,"e":67,"c":"pl-s1"},{"s":84,"e":90,"c":"pl-s1"},{"s":93,"e":102,"c":"pl-en"}],[],[{"s":13,"e":19,"c":"pl-en"},{"s":54,"e":55,"c":"pl-en"},{"s":64,"e":68,"c":"pl-s1"}],[],[{"s":5,"e":14,"c":"pl-en"},{"s":33,"e":34,"c":"pl-s1"}],[],[{"s":5,"e":11,"c":"pl-s1"},{"s":12,"e":16,"c":"pl-en"}],[],[{"s":0,"e":4,"c":"pl-en"},{"s":9,"e":15,"c":"pl-en"},{"s":17,"e":18,"c":"pl-s1"},{"s":44,"e":48,"c":"pl-s1"},{"s":53,"e":60,"c":"pl-s1"}],[],[{"s":5,"e":9,"c":"pl-s1"},{"s":16,"e":17,"c":"pl-en"},{"s":18,"e":29,"c":"pl-s1"},{"s":40,"e":44,"c":"pl-s1"},{"s":55,"e":62,"c":"pl-en"},{"s":73,"e":77,"c":"pl-s1"},{"s":87,"e":88,"c":"pl-en"},{"s":90,"e":97,"c":"pl-s1"},{"s":103,"e":110,"c":"pl-s1"},{"s":113,"e":123,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":14,"c":"pl-s1"},{"s":17,"e":20,"c":"pl-k"},{"s":21,"e":27,"c":"pl-smi"}],[{"s":0,"e":7,"c":"pl-s1"},{"s":8,"e":12,"c":"pl-en"}],[],[],[{"s":0,"e":4,"c":"pl-en"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-s1"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":22,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-k"},{"s":32,"e":52,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-en"},{"s":9,"e":10,"c":"pl-c1"},{"s":12,"e":30,"c":"pl-c"}],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":25,"c":"pl-k"},{"s":26,"e":30,"c":"pl-smi"},{"s":31,"e":35,"c":"pl-s1"},{"s":36,"e":40,"c":"pl-smi"},{"s":41,"e":47,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":27,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":13,"c":"pl-s1"},{"s":16,"e":22,"c":"pl-smi"},{"s":23,"e":40,"c":"pl-en"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":12,"c":"pl-s1"},{"s":15,"e":16,"c":"pl-c1"}],[],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":14,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-c1"}],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":17,"c":"pl-k"},{"s":18,"e":42,"c":"pl-smi"},{"s":43,"e":70,"c":"pl-s"}],[],[],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":14,"c":"pl-s1"},{"s":18,"e":19,"c":"pl-c1"}],[{"s":8,"e":13,"c":"pl-k"},{"s":15,"e":22,"c":"pl-en"}],[{"s":12,"e":16,"c":"pl-en"},{"s":17,"e":18,"c":"pl-c1"}],[],[{"s":6,"e":10,"c":"pl-k"}],[{"s":8,"e":13,"c":"pl-k"},{"s":15,"e":22,"c":"pl-en"}],[{"s":12,"e":16,"c":"pl-smi"},{"s":17,"e":22,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-s1"},{"s":34,"e":37,"c":"pl-s1"}],[{"s":12,"e":14,"c":"pl-k"},{"s":16,"e":21,"c":"pl-s1"},{"s":25,"e":26,"c":"pl-c1"}],[{"s":16,"e":21,"c":"pl-k"}],[],[{"s":12,"e":16,"c":"pl-en"},{"s":17,"e":22,"c":"pl-s1"}],[{"s":12,"e":15,"c":"pl-s1"},{"s":18,"e":24,"c":"pl-smi"},{"s":25,"e":42,"c":"pl-en"},{"s":47,"e":51,"c":"pl-s1"}],[],[],[],[],[],[{"s":2,"e":5,"c":"pl-smi"},{"s":6,"e":11,"c":"pl-s1"},{"s":26,"e":36,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":10,"c":"pl-c"}],[{"s":0,"e":4,"c":"pl-s1"},{"s":5,"e":15,"c":"pl-s1"},{"s":17,"e":21,"c":"pl-s1"},{"s":22,"e":26,"c":"pl-smi"},{"s":27,"e":37,"c":"pl-s1"},{"s":39,"e":47,"c":"pl-smi"},{"s":48,"e":57,"c":"pl-s1"}],[{"s":0,"e":16,"c":"pl-c"}],[{"s":0,"e":11,"c":"pl-en"},{"s":12,"e":16,"c":"pl-smi"}],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":23,"c":"pl-s1"},{"s":24,"e":34,"c":"pl-s1"},{"s":36,"e":42,"c":"pl-s1"}],[{"s":2,"e":8,"c":"pl-smi"},{"s":9,"e":18,"c":"pl-s1"},{"s":19,"e":25,"c":"pl-s1"},{"s":27,"e":33,"c":"pl-s1"},{"s":35,"e":44,"c":"pl-en"}],[],[{"s":2,"e":14,"c":"pl-smi"},{"s":15,"e":19,"c":"pl-s1"},{"s":20,"e":29,"c":"pl-s1"},{"s":31,"e":37,"c":"pl-s1"}],[],[{"s":2,"e":8,"c":"pl-s1"},{"s":10,"e":33,"c":"pl-en"}],[],[{"s":2,"e":18,"c":"pl-s1"},{"s":20,"e":37,"c":"pl-s1"},{"s":38,"e":47,"c":"pl-en"},{"s":58,"e":74,"c":"pl-s1"},{"s":76,"e":86,"c":"pl-c1"}],[{"s":2,"e":18,"c":"pl-s1"},{"s":20,"e":30,"c":"pl-s1"},{"s":31,"e":40,"c":"pl-en"},{"s":44,"e":48,"c":"pl-c1"}],[{"s":2,"e":23,"c":"pl-c"}],[{"s":2,"e":38,"c":"pl-c"}],[{"s":2,"e":6,"c":"pl-s1"},{"s":7,"e":17,"c":"pl-en"},{"s":18,"e":24,"c":"pl-s1"}],[{"s":2,"e":8,"c":"pl-s1"},{"s":10,"e":33,"c":"pl-en"}],[],[],[],[{"s":5,"e":10,"c":"pl-en"}],[],[{"s":0,"e":5,"c":"pl-smi"},{"s":8,"e":14,"c":"pl-s1"},{"s":16,"e":17,"c":"pl-s1"},{"s":35,"e":36,"c":"pl-s1"},{"s":43,"e":48,"c":"pl-s1"},{"s":65,"e":69,"c":"pl-s1"}],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":10,"c":"pl-s1"}],[],[{"s":2,"e":6,"c":"pl-s1"},{"s":21,"e":26,"c":"pl-s1"}],[{"s":2,"e":6,"c":"pl-smi"},{"s":8,"e":11,"c":"pl-s1"},{"s":20,"e":25,"c":"pl-s1"},{"s":27,"e":30,"c":"pl-s1"},{"s":49,"e":53,"c":"pl-en"}],[{"s":2,"e":6,"c":"pl-smi"},{"s":21,"e":26,"c":"pl-s1"}],[],[],[],[{"s":0,"e":4,"c":"pl-s1"},{"s":5,"e":45,"c":"pl-c"}],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":38,"c":"pl-c"}],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":16,"c":"pl-en"},{"s":19,"e":25,"c":"pl-smi"},{"s":26,"e":30,"c":"pl-en"},{"s":33,"e":44,"c":"pl-smi"},{"s":45,"e":49,"c":"pl-en"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":17,"e":20,"c":"pl-smi"},{"s":33,"e":39,"c":"pl-s1"},{"s":40,"e":44,"c":"pl-s1"},{"s":57,"e":69,"c":"pl-k"},{"s":81,"e":87,"c":"pl-smi"},{"s":88,"e":94,"c":"pl-smi"},{"s":100,"e":105,"c":"pl-smi"},{"s":106,"e":111,"c":"pl-en"},{"s":114,"e":125,"c":"pl-smi"},{"s":126,"e":130,"c":"pl-en"},{"s":136,"e":148,"c":"pl-k"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":16,"c":"pl-en"},{"s":57,"e":63,"c":"pl-smi"},{"s":64,"e":69,"c":"pl-en"},{"s":75,"e":76,"c":"pl-smi"},{"s":80,"e":92,"c":"pl-c1"},{"s":99,"e":105,"c":"pl-s1"},{"s":106,"e":110,"c":"pl-s1"},{"s":113,"e":124,"c":"pl-smi"},{"s":125,"e":129,"c":"pl-en"},{"s":138,"e":145,"c":"pl-c1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":2,"e":8,"c":"pl-s1"},{"s":9,"e":13,"c":"pl-en"},{"s":23,"e":29,"c":"pl-smi"},{"s":30,"e":36,"c":"pl-en"},{"s":39,"e":50,"c":"pl-smi"},{"s":51,"e":55,"c":"pl-en"},{"s":65,"e":76,"c":"pl-smi"},{"s":77,"e":83,"c":"pl-en"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":11,"e":15,"c":"pl-smi"},{"s":18,"e":24,"c":"pl-s1"},{"s":32,"e":38,"c":"pl-s1"},{"s":41,"e":45,"c":"pl-s1"},{"s":58,"e":62,"c":"pl-s1"},{"s":84,"e":88,"c":"pl-s1"},{"s":89,"e":95,"c":"pl-s1"},{"s":111,"e":117,"c":"pl-s1"},{"s":121,"e":122,"c":"pl-s1"},{"s":135,"e":139,"c":"pl-s1"},{"s":176,"e":187,"c":"pl-s1"},{"s":188,"e":192,"c":"pl-s1"},{"s":230,"e":231,"c":"pl-c1"},{"s":242,"e":248,"c":"pl-en"},{"s":259,"e":260,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":29,"e":35,"c":"pl-smi"},{"s":36,"e":45,"c":"pl-en"},{"s":62,"e":68,"c":"pl-smi"},{"s":69,"e":74,"c":"pl-en"},{"s":77,"e":83,"c":"pl-smi"},{"s":84,"e":88,"c":"pl-en"},{"s":97,"e":117,"c":"pl-smi"},{"s":135,"e":139,"c":"pl-s1"},{"s":156,"e":157,"c":"pl-smi"},{"s":171,"e":177,"c":"pl-s1"},{"s":203,"e":223,"c":"pl-s1"}],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":5,"c":"pl-s1"},{"s":10,"e":16,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-c1"},{"s":18,"e":41,"c":"pl-smi"},{"s":42,"e":45,"c":"pl-smi"}],[],[],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":57,"c":"pl-c"}],[],[{"s":5,"e":6,"c":"pl-smi"}],[],[{"s":1,"e":5,"c":"pl-s1"},{"s":9,"e":10,"c":"pl-s1"},{"s":33,"e":34,"c":"pl-s1"},{"s":45,"e":51,"c":"pl-s1"},{"s":52,"e":56,"c":"pl-s1"},{"s":60,"e":66,"c":"pl-smi"},{"s":67,"e":74,"c":"pl-en"},{"s":87,"e":88,"c":"pl-smi"},{"s":94,"e":100,"c":"pl-s1"},{"s":101,"e":110,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":19,"e":39,"c":"pl-smi"},{"s":53,"e":54,"c":"pl-s1"},{"s":61,"e":67,"c":"pl-s1"},{"s":68,"e":72,"c":"pl-s1"},{"s":73,"e":79,"c":"pl-s1"},{"s":80,"e":85,"c":"pl-s1"},{"s":86,"e":99,"c":"pl-s1"},{"s":100,"e":103,"c":"pl-s1"},{"s":104,"e":117,"c":"pl-s1"},{"s":118,"e":122,"c":"pl-s1"},{"s":125,"e":138,"c":"pl-s1"},{"s":142,"e":150,"c":"pl-s1"},{"s":151,"e":156,"c":"pl-s1"},{"s":169,"e":180,"c":"pl-smi"},{"s":181,"e":185,"c":"pl-en"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-smi"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":46,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":17,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":16,"c":"pl-s1"}],[{"s":0,"e":18,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":20,"c":"pl-en"}],[{"s":0,"e":40,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":18,"c":"pl-en"}],[],[],[],[],[{"s":6,"e":8,"c":"pl-c1"}],[],[{"s":0,"e":10,"c":"pl-s1"},{"s":13,"e":19,"c":"pl-s1"},{"s":20,"e":27,"c":"pl-smi"},{"s":28,"e":49,"c":"pl-s1"}],[],[{"s":5,"e":10,"c":"pl-c1"}],[],[{"s":5,"e":9,"c":"pl-c1"},{"s":25,"e":31,"c":"pl-s1"},{"s":32,"e":41,"c":"pl-s1"},{"s":70,"e":90,"c":"pl-s1"},{"s":109,"e":120,"c":"pl-s1"},{"s":144,"e":150,"c":"pl-s1"},{"s":151,"e":164,"c":"pl-s1"}],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":11,"e":15,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"},{"s":30,"e":41,"c":"pl-s1"},{"s":43,"e":48,"c":"pl-s1"},{"s":77,"e":78,"c":"pl-s1"},{"s":82,"e":83,"c":"pl-s1"},{"s":92,"e":93,"c":"pl-s1"},{"s":96,"e":97,"c":"pl-s1"},{"s":103,"e":104,"c":"pl-c1"},{"s":113,"e":114,"c":"pl-s1"},{"s":122,"e":123,"c":"pl-s1"},{"s":149,"e":150,"c":"pl-s1"},{"s":155,"e":156,"c":"pl-c1"},{"s":166,"e":172,"c":"pl-s1"},{"s":173,"e":177,"c":"pl-s1"},{"s":185,"e":186,"c":"pl-s1"},{"s":195,"e":196,"c":"pl-s1"},{"s":199,"e":200,"c":"pl-c1"},{"s":210,"e":211,"c":"pl-s1"},{"s":216,"e":217,"c":"pl-s1"}],[],[],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":11,"e":15,"c":"pl-s1"}],[],[{"s":4,"e":11,"c":"pl-s1"},{"s":12,"e":17,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-s1"},{"s":36,"e":43,"c":"pl-s1"},{"s":44,"e":48,"c":"pl-s1"},{"s":60,"e":72,"c":"pl-c1"},{"s":77,"e":84,"c":"pl-s1"},{"s":106,"e":107,"c":"pl-s1"},{"s":112,"e":116,"c":"pl-s1"},{"s":129,"e":136,"c":"pl-s1"},{"s":137,"e":141,"c":"pl-s1"},{"s":149,"e":150,"c":"pl-s1"},{"s":161,"e":170,"c":"pl-s1"}],[],[],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":14,"c":"pl-s1"},{"s":17,"e":20,"c":"pl-k"},{"s":21,"e":27,"c":"pl-smi"},{"s":28,"e":31,"c":"pl-k"},{"s":32,"e":40,"c":"pl-smi"}],[{"s":6,"e":7,"c":"pl-c1"},{"s":7,"e":15,"c":"pl-c1"}],[{"s":6,"e":12,"c":"pl-k"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":21,"c":"pl-en"}],[{"s":8,"e":22,"c":"pl-c"}],[],[],[{"s":0,"e":6,"c":"pl-smi"},{"s":7,"e":14,"c":"pl-s1"},{"s":16,"e":19,"c":"pl-k"},{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":30,"c":"pl-k"},{"s":31,"e":39,"c":"pl-smi"}],[{"s":6,"e":7,"c":"pl-c1"},{"s":7,"e":15,"c":"pl-c1"}],[{"s":6,"e":12,"c":"pl-k"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":21,"c":"pl-en"}],[{"s":8,"e":22,"c":"pl-c"}],[],[],[{"s":0,"e":9,"c":"pl-c"}],[{"s":0,"e":7,"c":"pl-s1"},{"s":8,"e":13,"c":"pl-en"}],[{"s":0,"e":9,"c":"pl-c"}],[{"s":0,"e":7,"c":"pl-s1"},{"s":8,"e":12,"c":"pl-en"}],[{"s":0,"e":10,"c":"pl-c"}],[{"s":0,"e":7,"c":"pl-s1"},{"s":8,"e":13,"c":"pl-en"}],[],[],[{"s":9,"e":13,"c":"pl-smi"}],[],[{"s":5,"e":6,"c":"pl-s1"},{"s":16,"e":23,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-s1"},{"s":41,"e":42,"c":"pl-s1"},{"s":57,"e":58,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":3,"e":9,"c":"pl-s1"},{"s":10,"e":17,"c":"pl-s1"},{"s":20,"e":23,"c":"pl-k"},{"s":24,"e":30,"c":"pl-smi"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":43,"c":"pl-smi"}],[{"s":8,"e":9,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":23,"c":"pl-en"}],[{"s":8,"e":22,"c":"pl-c"}],[],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":18,"c":"pl-s1"},{"s":20,"e":23,"c":"pl-k"},{"s":24,"e":30,"c":"pl-smi"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":43,"c":"pl-smi"}],[{"s":8,"e":9,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":23,"c":"pl-en"}],[{"s":11,"e":36,"c":"pl-c"}],[{"s":8,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-en"}],[{"s":12,"e":26,"c":"pl-c"}],[],[],[{"s":2,"e":11,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-s1"},{"s":12,"e":17,"c":"pl-en"}],[{"s":2,"e":12,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-s1"},{"s":12,"e":17,"c":"pl-en"}],[],[],[],[{"s":4,"e":13,"c":"pl-smi"},{"s":14,"e":37,"c":"pl-en"},{"s":57,"e":58,"c":"pl-smi"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-s1"},{"s":23,"e":32,"c":"pl-smi"},{"s":33,"e":56,"c":"pl-en"}],[{"s":0,"e":7,"c":"pl-c"}],[{"s":0,"e":15,"c":"pl-s1"},{"s":16,"e":22,"c":"pl-en"},{"s":23,"e":28,"c":"pl-s1"}],[{"s":0,"e":7,"c":"pl-c"}],[{"s":0,"e":15,"c":"pl-s1"},{"s":16,"e":22,"c":"pl-en"},{"s":23,"e":28,"c":"pl-s1"}],[],[],[{"s":12,"e":16,"c":"pl-smi"},{"s":17,"e":23,"c":"pl-s1"}],[],[{"s":5,"e":6,"c":"pl-smi"},{"s":9,"e":15,"c":"pl-s1"},{"s":16,"e":23,"c":"pl-s1"},{"s":34,"e":35,"c":"pl-s1"},{"s":42,"e":48,"c":"pl-smi"},{"s":49,"e":55,"c":"pl-en"},{"s":75,"e":76,"c":"pl-smi"},{"s":78,"e":84,"c":"pl-s1"},{"s":85,"e":92,"c":"pl-s1"},{"s":95,"e":101,"c":"pl-en"},{"s":125,"e":126,"c":"pl-smi"},{"s":135,"e":141,"c":"pl-s1"},{"s":142,"e":148,"c":"pl-s1"},{"s":159,"e":160,"c":"pl-smi"},{"s":162,"e":163,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":3,"e":8,"c":"pl-s1"},{"s":9,"e":15,"c":"pl-smi"},{"s":16,"e":22,"c":"pl-s1"},{"s":25,"e":28,"c":"pl-k"},{"s":29,"e":35,"c":"pl-smi"}],[{"s":3,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-s1"},{"s":20,"e":23,"c":"pl-k"},{"s":24,"e":30,"c":"pl-smi"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":43,"c":"pl-smi"}],[{"s":8,"e":9,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":23,"c":"pl-en"}],[{"s":8,"e":22,"c":"pl-c"}],[{"s":10,"e":22,"c":"pl-k"},{"s":23,"e":29,"c":"pl-s1"}],[{"s":13,"e":19,"c":"pl-s1"},{"s":20,"e":26,"c":"pl-en"}],[],[],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":18,"c":"pl-s1"},{"s":20,"e":23,"c":"pl-k"},{"s":24,"e":30,"c":"pl-smi"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":43,"c":"pl-smi"}],[{"s":8,"e":9,"c":"pl-c1"},{"s":9,"e":17,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":19,"c":"pl-smi"},{"s":20,"e":23,"c":"pl-en"}],[{"s":12,"e":24,"c":"pl-k"},{"s":25,"e":31,"c":"pl-s1"}],[{"s":11,"e":36,"c":"pl-c"}],[{"s":10,"e":16,"c":"pl-s1"},{"s":17,"e":21,"c":"pl-en"}],[{"s":12,"e":26,"c":"pl-c"}],[],[],[],[],[],[{"s":12,"e":17,"c":"pl-smi"},{"s":18,"e":24,"c":"pl-s1"}],[],[{"s":6,"e":19,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-s1"},{"s":26,"e":35,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":48,"e":49,"c":"pl-s1"},{"s":57,"e":58,"c":"pl-s1"},{"s":60,"e":65,"c":"pl-s1"},{"s":66,"e":71,"c":"pl-s1"},{"s":84,"e":85,"c":"pl-s1"},{"s":91,"e":96,"c":"pl-s1"},{"s":97,"e":103,"c":"pl-en"},{"s":110,"e":111,"c":"pl-smi"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":5,"e":10,"c":"pl-k"},{"s":11,"e":24,"c":"pl-smi"},{"s":25,"e":29,"c":"pl-s1"},{"s":34,"e":37,"c":"pl-k"},{"s":38,"e":51,"c":"pl-smi"}],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":23,"c":"pl-smi"},{"s":28,"e":34,"c":"pl-s1"},{"s":37,"e":41,"c":"pl-s1"},{"s":42,"e":54,"c":"pl-en"}],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":20,"c":"pl-smi"},{"s":21,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":40,"c":"pl-smi"}],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":20,"c":"pl-smi"},{"s":21,"e":28,"c":"pl-s1"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":41,"c":"pl-smi"},{"s":42,"e":45,"c":"pl-k"},{"s":46,"e":54,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":30,"c":"pl-c"}],[{"s":20,"e":24,"c":"pl-s1"},{"s":25,"e":29,"c":"pl-en"}],[{"s":20,"e":23,"c":"pl-k"}],[{"s":22,"e":32,"c":"pl-c"}],[{"s":24,"e":30,"c":"pl-s1"},{"s":31,"e":37,"c":"pl-en"}],[{"s":22,"e":27,"c":"pl-k"},{"s":29,"e":49,"c":"pl-smi"},{"s":50,"e":51,"c":"pl-s1"}],[{"s":24,"e":25,"c":"pl-s1"},{"s":26,"e":41,"c":"pl-en"}],[],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":30,"c":"pl-s1"},{"s":31,"e":38,"c":"pl-en"},{"s":39,"e":48,"c":"pl-s"}],[{"s":20,"e":24,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-en"}],[],[],[{"s":8,"e":13,"c":"pl-k"},{"s":14,"e":20,"c":"pl-smi"},{"s":21,"e":28,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":40,"c":"pl-smi"},{"s":41,"e":44,"c":"pl-k"},{"s":45,"e":53,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":20,"c":"pl-s1"},{"s":21,"e":25,"c":"pl-en"}],[{"s":16,"e":41,"c":"pl-c"}],[{"s":20,"e":23,"c":"pl-k"}],[{"s":24,"e":30,"c":"pl-s1"},{"s":31,"e":36,"c":"pl-en"}],[{"s":24,"e":30,"c":"pl-smi"},{"s":31,"e":34,"c":"pl-s1"},{"s":35,"e":42,"c":"pl-en"},{"s":43,"e":52,"c":"pl-s"}],[],[{"s":22,"e":27,"c":"pl-k"},{"s":29,"e":49,"c":"pl-smi"},{"s":50,"e":51,"c":"pl-s1"}],[{"s":24,"e":25,"c":"pl-s1"},{"s":26,"e":41,"c":"pl-en"}],[],[{"s":20,"e":34,"c":"pl-c"}],[{"s":16,"e":20,"c":"pl-s1"},{"s":21,"e":27,"c":"pl-en"}],[],[],[{"s":8,"e":15,"c":"pl-s1"},{"s":16,"e":21,"c":"pl-en"}],[{"s":8,"e":15,"c":"pl-s1"},{"s":16,"e":21,"c":"pl-en"}],[],[],[],[],[],[],[{"s":0,"e":4,"c":"pl-s1"},{"s":5,"e":44,"c":"pl-c"}],[],[],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":7,"e":19,"c":"pl-s1"}],[],[{"s":2,"e":14,"c":"pl-k"},{"s":22,"e":23,"c":"pl-smi"},{"s":26,"e":27,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":21,"c":"pl-c"}],[{"s":0,"e":8,"c":"pl-c"}],[{"s":0,"e":12,"c":"pl-en"},{"s":19,"e":24,"c":"pl-k"}],[{"s":4,"e":9,"c":"pl-k"}],[{"s":11,"e":15,"c":"pl-en"},{"s":19,"e":28,"c":"pl-c"}],[],[{"s":4,"e":17,"c":"pl-c"}],[],[],[{"s":0,"e":8,"c":"pl-c"}],[{"s":1,"e":13,"c":"pl-k"}],[{"s":3,"e":16,"c":"pl-c"}],[{"s":3,"e":13,"c":"pl-c"}],[{"s":6,"e":15,"c":"pl-en"}],[],[],[],[],[{"s":10,"e":11,"c":"pl-en"},{"s":14,"e":15,"c":"pl-s1"},{"s":20,"e":27,"c":"pl-s1"},{"s":28,"e":32,"c":"pl-s1"},{"s":45,"e":46,"c":"pl-en"},{"s":49,"e":50,"c":"pl-s1"},{"s":55,"e":62,"c":"pl-s1"},{"s":63,"e":69,"c":"pl-s1"},{"s":73,"e":82,"c":"pl-en"},{"s":89,"e":90,"c":"pl-en"},{"s":98,"e":105,"c":"pl-s1"},{"s":106,"e":110,"c":"pl-s1"},{"s":136,"e":143,"c":"pl-en"},{"s":154,"e":158,"c":"pl-s1"},{"s":161,"e":167,"c":"pl-s1"},{"s":168,"e":177,"c":"pl-en"},{"s":189,"e":190,"c":"pl-s1"}],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[{"s":0,"e":1,"c":"pl-c1"},{"s":4,"e":8,"c":"pl-s1"},{"s":11,"e":17,"c":"pl-s1"},{"s":20,"e":29,"c":"pl-s1"}],[],[{"s":0,"e":1,"c":"pl-c1"},{"s":4,"e":8,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-c1"},{"s":28,"e":35,"c":"pl-c1"}],[],[],[],[{"s":0,"e":1,"c":"pl-c1"},{"s":2,"e":8,"c":"pl-s1"},{"s":11,"e":20,"c":"pl-s1"},{"s":37,"e":41,"c":"pl-s1"},{"s":70,"e":76,"c":"pl-s1"},{"s":80,"e":88,"c":"pl-s1"},{"s":123,"e":127,"c":"pl-s1"}],[],[{"s":0,"e":1,"c":"pl-c1"},{"s":2,"e":8,"c":"pl-s1"},{"s":19,"e":20,"c":"pl-s1"},{"s":40,"e":49,"c":"pl-s1"},{"s":85,"e":92,"c":"pl-c1"},{"s":95,"e":102,"c":"pl-c1"}],[],[{"s":0,"e":1,"c":"pl-c1"},{"s":3,"e":7,"c":"pl-s1"}],[],[{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-k"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[{"s":6,"e":8,"c":"pl-c1"}],[],[{"s":88,"e":89,"c":"pl-c1"},{"s":95,"e":112,"c":"pl-s1"},{"s":113,"e":129,"c":"pl-s1"},{"s":131,"e":142,"c":"pl-s1"},{"s":143,"e":154,"c":"pl-s1"}],[],[{"s":1,"e":12,"c":"pl-s1"},{"s":13,"e":24,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"},{"s":30,"e":31,"c":"pl-s1"},{"s":33,"e":44,"c":"pl-s1"},{"s":47,"e":52,"c":"pl-s1"},{"s":67,"e":78,"c":"pl-s1"},{"s":85,"e":96,"c":"pl-s1"},{"s":107,"e":108,"c":"pl-s1"},{"s":112,"e":123,"c":"pl-s1"}],[],[{"s":5,"e":6,"c":"pl-c1"},{"s":7,"e":9,"c":"pl-c1"},{"s":19,"e":30,"c":"pl-s1"},{"s":36,"e":40,"c":"pl-s1"},{"s":49,"e":53,"c":"pl-s1"},{"s":61,"e":72,"c":"pl-s1"},{"s":76,"e":87,"c":"pl-s1"},{"s":89,"e":90,"c":"pl-s1"},{"s":93,"e":104,"c":"pl-s1"}],[],[{"s":4,"e":5,"c":"pl-c1"},{"s":6,"e":8,"c":"pl-c1"},{"s":9,"e":14,"c":"pl-s1"},{"s":15,"e":19,"c":"pl-s1"}],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":18,"c":"pl-smi"}],[{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":20,"c":"pl-k"},{"s":21,"e":25,"c":"pl-smi"},{"s":26,"e":30,"c":"pl-en"},{"s":31,"e":37,"c":"pl-smi"},{"s":40,"e":44,"c":"pl-s1"},{"s":46,"e":52,"c":"pl-k"},{"s":53,"e":62,"c":"pl-smi"}],[{"s":10,"e":21,"c":"pl-smi"},{"s":22,"e":25,"c":"pl-s1"},{"s":28,"e":31,"c":"pl-k"},{"s":32,"e":43,"c":"pl-smi"}],[{"s":10,"e":21,"c":"pl-smi"},{"s":22,"e":24,"c":"pl-s1"},{"s":27,"e":30,"c":"pl-k"},{"s":31,"e":42,"c":"pl-smi"}],[{"s":10,"e":74,"c":"pl-c"}],[{"s":10,"e":16,"c":"pl-smi"},{"s":17,"e":28,"c":"pl-s1"},{"s":31,"e":34,"c":"pl-k"},{"s":35,"e":41,"c":"pl-smi"},{"s":42,"e":45,"c":"pl-k"},{"s":46,"e":51,"c":"pl-smi"},{"s":52,"e":54,"c":"pl-s1"},{"s":57,"e":70,"c":"pl-s"},{"s":73,"e":84,"c":"pl-s1"},{"s":85,"e":90,"c":"pl-en"}],[{"s":10,"e":13,"c":"pl-smi"},{"s":14,"e":21,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-c1"}],[{"s":10,"e":13,"c":"pl-k"}],[{"s":7,"e":12,"c":"pl-k"},{"s":15,"e":22,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-smi"},{"s":32,"e":34,"c":"pl-s1"},{"s":35,"e":39,"c":"pl-en"},{"s":47,"e":48,"c":"pl-c1"},{"s":56,"e":59,"c":"pl-s1"},{"s":60,"e":65,"c":"pl-en"},{"s":66,"e":73,"c":"pl-s1"}],[],[{"s":7,"e":14,"c":"pl-k"},{"s":17,"e":20,"c":"pl-s1"},{"s":21,"e":26,"c":"pl-en"}],[],[{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":19,"c":"pl-k"},{"s":20,"e":25,"c":"pl-smi"},{"s":26,"e":36,"c":"pl-k"},{"s":37,"e":45,"c":"pl-smi"}],[{"s":11,"e":18,"c":"pl-k"},{"s":19,"e":30,"c":"pl-smi"},{"s":31,"e":33,"c":"pl-s1"}],[{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":23,"c":"pl-smi"},{"s":24,"e":35,"c":"pl-smi"},{"s":36,"e":38,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":15,"c":"pl-s1"},{"s":18,"e":20,"c":"pl-s1"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":19,"c":"pl-en"}],[{"s":7,"e":10,"c":"pl-smi"},{"s":11,"e":18,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-c1"}],[{"s":7,"e":10,"c":"pl-k"}],[{"s":9,"e":14,"c":"pl-k"},{"s":17,"e":24,"c":"pl-s1"},{"s":27,"e":29,"c":"pl-s1"},{"s":30,"e":34,"c":"pl-en"},{"s":42,"e":43,"c":"pl-c1"},{"s":47,"e":53,"c":"pl-smi"},{"s":54,"e":57,"c":"pl-s1"},{"s":58,"e":63,"c":"pl-en"},{"s":65,"e":69,"c":"pl-smi"},{"s":71,"e":78,"c":"pl-s1"}],[],[{"s":17,"e":22,"c":"pl-k"},{"s":24,"e":35,"c":"pl-smi"},{"s":36,"e":38,"c":"pl-s1"}],[],[],[],[],[],[],[{"s":8,"e":9,"c":"pl-smi"},{"s":19,"e":30,"c":"pl-s1"}],[],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":9,"c":"pl-s1"},{"s":10,"e":15,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":9,"c":"pl-s1"},{"s":10,"e":15,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":7,"e":13,"c":"pl-smi"},{"s":14,"e":18,"c":"pl-smi"}],[],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":11,"c":"pl-s1"},{"s":18,"e":19,"c":"pl-s1"},{"s":22,"e":23,"c":"pl-s1"},{"s":26,"e":32,"c":"pl-s1"},{"s":33,"e":37,"c":"pl-s1"},{"s":46,"e":47,"c":"pl-smi"},{"s":48,"e":49,"c":"pl-s1"},{"s":52,"e":58,"c":"pl-s1"},{"s":66,"e":72,"c":"pl-s1"},{"s":73,"e":77,"c":"pl-s1"},{"s":89,"e":95,"c":"pl-smi"},{"s":99,"e":103,"c":"pl-s1"},{"s":114,"e":118,"c":"pl-en"},{"s":119,"e":123,"c":"pl-smi"},{"s":124,"e":130,"c":"pl-s1"},{"s":132,"e":136,"c":"pl-en"},{"s":137,"e":141,"c":"pl-smi"},{"s":142,"e":148,"c":"pl-s1"},{"s":149,"e":152,"c":"pl-smi"},{"s":153,"e":158,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":7,"e":18,"c":"pl-s1"}],[],[{"s":0,"e":11,"c":"pl-smi"},{"s":19,"e":20,"c":"pl-s1"},{"s":22,"e":33,"c":"pl-s1"},{"s":67,"e":68,"c":"pl-s1"},{"s":75,"e":76,"c":"pl-s1"},{"s":77,"e":88,"c":"pl-s1"},{"s":103,"e":104,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":21,"c":"pl-smi"}],[{"s":4,"e":49,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":24,"c":"pl-k"},{"s":25,"e":36,"c":"pl-smi"},{"s":37,"e":41,"c":"pl-smi"},{"s":43,"e":59,"c":"pl-c1"},{"s":62,"e":65,"c":"pl-k"},{"s":66,"e":77,"c":"pl-smi"},{"s":78,"e":82,"c":"pl-smi"}],[{"s":8,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":35,"c":"pl-en"},{"s":40,"e":46,"c":"pl-k"},{"s":47,"e":53,"c":"pl-smi"},{"s":54,"e":71,"c":"pl-en"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":23,"c":"pl-k"},{"s":24,"e":28,"c":"pl-smi"},{"s":29,"e":34,"c":"pl-en"}],[{"s":8,"e":24,"c":"pl-smi"},{"s":25,"e":28,"c":"pl-en"},{"s":29,"e":35,"c":"pl-smi"},{"s":36,"e":53,"c":"pl-en"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":23,"c":"pl-k"},{"s":24,"e":28,"c":"pl-smi"},{"s":29,"e":32,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":21,"c":"pl-smi"},{"s":22,"e":39,"c":"pl-en"},{"s":44,"e":60,"c":"pl-smi"},{"s":61,"e":64,"c":"pl-en"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-en"},{"s":28,"e":34,"c":"pl-smi"},{"s":37,"e":41,"c":"pl-s1"},{"s":43,"e":49,"c":"pl-k"},{"s":50,"e":59,"c":"pl-smi"}],[{"s":8,"e":16,"c":"pl-smi"},{"s":17,"e":22,"c":"pl-en"}],[{"s":8,"e":16,"c":"pl-smi"},{"s":17,"e":24,"c":"pl-c1"},{"s":25,"e":30,"c":"pl-en"},{"s":31,"e":32,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":18,"c":"pl-s1"},{"s":19,"e":26,"c":"pl-en"},{"s":27,"e":35,"c":"pl-s"},{"s":38,"e":46,"c":"pl-smi"},{"s":47,"e":50,"c":"pl-en"},{"s":55,"e":63,"c":"pl-s"}],[],[],[],[],[{"s":0,"e":8,"c":"pl-smi"},{"s":36,"e":41,"c":"pl-s1"}],[],[{"s":7,"e":10,"c":"pl-en"},{"s":28,"e":29,"c":"pl-smi"},{"s":40,"e":43,"c":"pl-c1"},{"s":68,"e":73,"c":"pl-s1"},{"s":92,"e":95,"c":"pl-en"}],[],[{"s":10,"e":11,"c":"pl-s1"}],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":9,"e":15,"c":"pl-smi"},{"s":16,"e":20,"c":"pl-en"},{"s":23,"e":29,"c":"pl-smi"},{"s":30,"e":36,"c":"pl-en"}],[{"s":2,"e":7,"c":"pl-smi"},{"s":9,"e":10,"c":"pl-s1"},{"s":23,"e":35,"c":"pl-s1"},{"s":47,"e":48,"c":"pl-s1"}],[],[{"s":11,"e":13,"c":"pl-c1"},{"s":22,"e":29,"c":"pl-smi"},{"s":32,"e":33,"c":"pl-s1"}],[],[{"s":16,"e":17,"c":"pl-c1"},{"s":24,"e":31,"c":"pl-smi"}],[],[],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":10,"c":"pl-smi"},{"s":11,"e":18,"c":"pl-smi"},{"s":20,"e":25,"c":"pl-s1"},{"s":28,"e":31,"c":"pl-k"},{"s":32,"e":42,"c":"pl-smi"}],[{"s":0,"e":4,"c":"pl-smi"},{"s":5,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-smi"},{"s":21,"e":26,"c":"pl-s1"}],[{"s":2,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-s1"},{"s":23,"e":51,"c":"pl-c"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-en"},{"s":23,"e":25,"c":"pl-c1"}],[{"s":5,"e":10,"c":"pl-s1"},{"s":11,"e":18,"c":"pl-en"}],[],[{"s":4,"e":9,"c":"pl-s1"},{"s":10,"e":13,"c":"pl-en"},{"s":14,"e":19,"c":"pl-s1"}],[{"s":4,"e":13,"c":"pl-c"}],[{"s":4,"e":9,"c":"pl-s1"},{"s":10,"e":19,"c":"pl-en"}],[],[],[{"s":0,"e":7,"c":"pl-smi"},{"s":8,"e":16,"c":"pl-s1"}],[{"s":2,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-s1"},{"s":23,"e":51,"c":"pl-c"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-en"},{"s":24,"e":25,"c":"pl-c1"}],[{"s":7,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-en"}],[],[{"s":4,"e":11,"c":"pl-smi"},{"s":12,"e":17,"c":"pl-s1"},{"s":20,"e":25,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-en"}],[{"s":4,"e":13,"c":"pl-c"}],[{"s":4,"e":9,"c":"pl-s1"},{"s":10,"e":19,"c":"pl-en"}],[{"s":2,"e":8,"c":"pl-k"},{"s":9,"e":14,"c":"pl-s1"}],[],[],[],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-s1"},{"s":14,"e":18,"c":"pl-smi"},{"s":19,"e":23,"c":"pl-s1"},{"s":24,"e":30,"c":"pl-smi"},{"s":33,"e":37,"c":"pl-s1"}],[{"s":4,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-smi"},{"s":19,"e":24,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":44,"c":"pl-smi"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":18,"c":"pl-smi"},{"s":19,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":42,"c":"pl-smi"},{"s":43,"e":48,"c":"pl-s1"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":18,"c":"pl-smi"},{"s":19,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":42,"c":"pl-smi"},{"s":43,"e":48,"c":"pl-s1"}],[{"s":4,"e":19,"c":"pl-smi"},{"s":20,"e":24,"c":"pl-s1"},{"s":27,"e":36,"c":"pl-smi"},{"s":37,"e":56,"c":"pl-en"}],[{"s":4,"e":7,"c":"pl-k"},{"s":9,"e":12,"c":"pl-smi"},{"s":13,"e":14,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-c1"},{"s":20,"e":21,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-c1"},{"s":30,"e":31,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-en"},{"s":21,"e":24,"c":"pl-k"},{"s":25,"e":33,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":19,"c":"pl-k"}],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-en"},{"s":33,"e":37,"c":"pl-c1"}],[{"s":18,"e":23,"c":"pl-k"},{"s":25,"e":45,"c":"pl-smi"},{"s":46,"e":47,"c":"pl-s1"}],[{"s":20,"e":21,"c":"pl-s1"},{"s":22,"e":37,"c":"pl-en"}],[],[{"s":16,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-s1"},{"s":28,"e":36,"c":"pl-s1"},{"s":37,"e":49,"c":"pl-en"}],[{"s":16,"e":22,"c":"pl-smi"},{"s":23,"e":26,"c":"pl-s1"},{"s":27,"e":34,"c":"pl-en"},{"s":35,"e":43,"c":"pl-s"},{"s":44,"e":45,"c":"pl-s1"}],[],[],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-en"},{"s":21,"e":24,"c":"pl-k"},{"s":25,"e":33,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":19,"c":"pl-k"}],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-en"},{"s":33,"e":37,"c":"pl-c1"}],[{"s":18,"e":23,"c":"pl-k"},{"s":25,"e":45,"c":"pl-smi"},{"s":46,"e":47,"c":"pl-s1"}],[{"s":20,"e":21,"c":"pl-s1"},{"s":22,"e":37,"c":"pl-en"}],[],[{"s":16,"e":22,"c":"pl-smi"},{"s":24,"e":30,"c":"pl-s1"},{"s":33,"e":36,"c":"pl-k"},{"s":37,"e":43,"c":"pl-smi"}],[{"s":16,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-s1"},{"s":33,"e":39,"c":"pl-s1"},{"s":40,"e":47,"c":"pl-en"},{"s":48,"e":52,"c":"pl-c1"}],[{"s":16,"e":22,"c":"pl-smi"},{"s":23,"e":26,"c":"pl-s1"},{"s":27,"e":34,"c":"pl-en"},{"s":35,"e":43,"c":"pl-s"},{"s":44,"e":45,"c":"pl-s1"}],[{"s":16,"e":24,"c":"pl-s1"},{"s":25,"e":34,"c":"pl-en"},{"s":35,"e":36,"c":"pl-s1"}],[],[],[],[],[{"s":0,"e":7,"c":"pl-k"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-k"},{"s":21,"e":29,"c":"pl-smi"}],[{"s":4,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-smi"},{"s":19,"e":24,"c":"pl-s1"}],[{"s":4,"e":12,"c":"pl-smi"},{"s":13,"e":18,"c":"pl-smi"},{"s":19,"e":26,"c":"pl-smi"},{"s":28,"e":33,"c":"pl-s1"},{"s":37,"e":41,"c":"pl-smi"},{"s":42,"e":47,"c":"pl-s1"},{"s":50,"e":55,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":18,"c":"pl-smi"},{"s":19,"e":31,"c":"pl-en"}],[{"s":8,"e":20,"c":"pl-k"},{"s":22,"e":27,"c":"pl-s1"}],[{"s":12,"e":15,"c":"pl-k"}],[{"s":16,"e":21,"c":"pl-k"},{"s":23,"e":28,"c":"pl-s1"},{"s":29,"e":33,"c":"pl-en"},{"s":37,"e":38,"c":"pl-c1"}],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":30,"c":"pl-s1"},{"s":31,"e":38,"c":"pl-en"},{"s":39,"e":54,"c":"pl-s"}],[{"s":20,"e":25,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-en"}],[],[{"s":14,"e":19,"c":"pl-k"},{"s":21,"e":41,"c":"pl-smi"},{"s":42,"e":43,"c":"pl-s1"}],[{"s":16,"e":17,"c":"pl-s1"},{"s":18,"e":33,"c":"pl-en"}],[],[{"s":12,"e":19,"c":"pl-smi"},{"s":20,"e":26,"c":"pl-s1"},{"s":29,"e":34,"c":"pl-s1"},{"s":35,"e":39,"c":"pl-en"}],[{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":23,"e":30,"c":"pl-en"},{"s":31,"e":52,"c":"pl-s"},{"s":55,"e":60,"c":"pl-s1"},{"s":61,"e":65,"c":"pl-en"}],[{"s":12,"e":17,"c":"pl-s1"},{"s":18,"e":27,"c":"pl-en"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":25,"c":"pl-s1"}],[],[],[],[{"s":0,"e":7,"c":"pl-k"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-k"},{"s":21,"e":29,"c":"pl-smi"}],[{"s":4,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-smi"},{"s":19,"e":24,"c":"pl-s1"}],[{"s":4,"e":12,"c":"pl-smi"},{"s":13,"e":18,"c":"pl-smi"},{"s":19,"e":26,"c":"pl-smi"},{"s":28,"e":33,"c":"pl-s1"},{"s":37,"e":41,"c":"pl-smi"},{"s":42,"e":47,"c":"pl-s1"},{"s":50,"e":55,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":25,"c":"pl-en"},{"s":26,"e":33,"c":"pl-smi"},{"s":34,"e":40,"c":"pl-s1"}],[{"s":8,"e":20,"c":"pl-k"},{"s":22,"e":27,"c":"pl-s1"}],[{"s":12,"e":15,"c":"pl-k"}],[{"s":16,"e":21,"c":"pl-k"},{"s":23,"e":28,"c":"pl-s1"},{"s":29,"e":33,"c":"pl-en"},{"s":36,"e":38,"c":"pl-c1"}],[{"s":20,"e":25,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-en"}],[],[{"s":14,"e":19,"c":"pl-k"},{"s":21,"e":41,"c":"pl-smi"},{"s":42,"e":43,"c":"pl-s1"}],[{"s":16,"e":17,"c":"pl-s1"},{"s":18,"e":33,"c":"pl-en"}],[],[{"s":12,"e":17,"c":"pl-s1"},{"s":18,"e":21,"c":"pl-en"},{"s":22,"e":28,"c":"pl-s1"}],[{"s":12,"e":17,"c":"pl-s1"},{"s":18,"e":27,"c":"pl-en"}],[{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":23,"e":30,"c":"pl-en"},{"s":31,"e":52,"c":"pl-s"},{"s":53,"e":58,"c":"pl-s1"},{"s":59,"e":63,"c":"pl-en"}],[],[],[],[],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":9,"e":13,"c":"pl-smi"},{"s":14,"e":23,"c":"pl-s1"}],[],[{"s":2,"e":8,"c":"pl-s1"},{"s":9,"e":13,"c":"pl-s1"},{"s":33,"e":39,"c":"pl-smi"},{"s":40,"e":47,"c":"pl-s1"},{"s":57,"e":63,"c":"pl-s1"},{"s":64,"e":73,"c":"pl-s1"},{"s":79,"e":86,"c":"pl-smi"}],[],[{"s":3,"e":7,"c":"pl-s1"},{"s":8,"e":20,"c":"pl-s1"},{"s":29,"e":30,"c":"pl-smi"},{"s":31,"e":46,"c":"pl-s1"},{"s":53,"e":68,"c":"pl-s1"},{"s":70,"e":71,"c":"pl-s1"},{"s":86,"e":87,"c":"pl-s1"},{"s":88,"e":101,"c":"pl-s1"},{"s":102,"e":103,"c":"pl-s1"},{"s":133,"e":138,"c":"pl-s1"},{"s":149,"e":158,"c":"pl-smi"},{"s":159,"e":165,"c":"pl-en"},{"s":168,"e":177,"c":"pl-smi"},{"s":178,"e":187,"c":"pl-en"},{"s":215,"e":224,"c":"pl-smi"},{"s":238,"e":244,"c":"pl-s1"},{"s":245,"e":251,"c":"pl-en"},{"s":254,"e":260,"c":"pl-smi"},{"s":261,"e":270,"c":"pl-en"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":13,"c":"pl-s1"},{"s":14,"e":18,"c":"pl-s1"},{"s":21,"e":24,"c":"pl-k"},{"s":25,"e":38,"c":"pl-smi"}],[{"s":0,"e":9,"c":"pl-smi"},{"s":10,"e":23,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-s1"},{"s":31,"e":43,"c":"pl-en"}],[],[{"s":0,"e":13,"c":"pl-smi"},{"s":14,"e":23,"c":"pl-s1"}],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":5,"c":"pl-s1"},{"s":10,"e":16,"c":"pl-s1"},{"s":17,"e":20,"c":"pl-c1"},{"s":21,"e":29,"c":"pl-c1"},{"s":29,"e":33,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":8,"c":"pl-k"},{"s":9,"e":15,"c":"pl-k"},{"s":16,"e":21,"c":"pl-k"},{"s":22,"e":26,"c":"pl-smi"},{"s":27,"e":34,"c":"pl-k"},{"s":35,"e":61,"c":"pl-smi"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":25,"c":"pl-smi"},{"s":26,"e":38,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":18,"c":"pl-k"},{"s":19,"e":34,"c":"pl-smi"}],[],[],[{"s":0,"e":24,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":28,"c":"pl-smi"},{"s":29,"e":39,"c":"pl-k"},{"s":40,"e":49,"c":"pl-smi"},{"s":51,"e":55,"c":"pl-smi"},{"s":56,"e":58,"c":"pl-smi"},{"s":59,"e":71,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":24,"c":"pl-k"},{"s":25,"e":29,"c":"pl-smi"},{"s":30,"e":46,"c":"pl-s1"},{"s":49,"e":69,"c":"pl-c1"}],[{"s":4,"e":11,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-k"},{"s":22,"e":26,"c":"pl-smi"},{"s":27,"e":38,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-k"},{"s":22,"e":26,"c":"pl-smi"},{"s":27,"e":37,"c":"pl-s1"}],[{"s":4,"e":22,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":26,"c":"pl-smi"}],[],[],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":18,"c":"pl-smi"},{"s":19,"e":23,"c":"pl-s1"},{"s":24,"e":30,"c":"pl-smi"},{"s":33,"e":37,"c":"pl-s1"}],[{"s":4,"e":17,"c":"pl-smi"},{"s":18,"e":22,"c":"pl-s1"},{"s":25,"e":28,"c":"pl-k"},{"s":29,"e":42,"c":"pl-smi"}],[{"s":4,"e":13,"c":"pl-smi"},{"s":14,"e":27,"c":"pl-s1"},{"s":30,"e":34,"c":"pl-s1"},{"s":35,"e":47,"c":"pl-en"}],[{"s":4,"e":13,"c":"pl-smi"},{"s":14,"e":27,"c":"pl-s1"},{"s":30,"e":34,"c":"pl-s1"},{"s":35,"e":47,"c":"pl-en"}],[],[{"s":4,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-smi"},{"s":23,"e":28,"c":"pl-s1"},{"s":34,"e":37,"c":"pl-k"},{"s":38,"e":48,"c":"pl-smi"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":18,"c":"pl-smi"},{"s":19,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":34,"e":42,"c":"pl-smi"},{"s":43,"e":47,"c":"pl-s1"},{"s":48,"e":61,"c":"pl-s1"},{"s":63,"e":76,"c":"pl-s1"},{"s":77,"e":82,"c":"pl-s1"}],[{"s":4,"e":9,"c":"pl-k"},{"s":10,"e":18,"c":"pl-smi"},{"s":19,"e":27,"c":"pl-s1"},{"s":30,"e":33,"c":"pl-k"},{"s":35,"e":43,"c":"pl-smi"},{"s":44,"e":48,"c":"pl-s1"},{"s":49,"e":62,"c":"pl-s1"},{"s":64,"e":77,"c":"pl-s1"},{"s":78,"e":83,"c":"pl-s1"}],[],[{"s":4,"e":19,"c":"pl-smi"},{"s":23,"e":27,"c":"pl-s1"},{"s":34,"e":43,"c":"pl-smi"},{"s":44,"e":63,"c":"pl-en"}],[{"s":4,"e":7,"c":"pl-k"},{"s":9,"e":12,"c":"pl-smi"},{"s":13,"e":14,"c":"pl-s1"},{"s":17,"e":18,"c":"pl-c1"},{"s":20,"e":21,"c":"pl-s1"},{"s":24,"e":28,"c":"pl-c1"},{"s":30,"e":31,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-en"},{"s":21,"e":24,"c":"pl-k"},{"s":25,"e":33,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":19,"c":"pl-k"}],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-en"},{"s":33,"e":37,"c":"pl-c1"}],[{"s":18,"e":23,"c":"pl-k"},{"s":25,"e":45,"c":"pl-smi"},{"s":46,"e":47,"c":"pl-s1"}],[{"s":20,"e":21,"c":"pl-s1"},{"s":22,"e":37,"c":"pl-en"}],[],[{"s":16,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-s1"},{"s":28,"e":36,"c":"pl-s1"},{"s":37,"e":41,"c":"pl-en"}],[{"s":0,"e":53,"c":"pl-c"}],[],[],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":20,"c":"pl-en"},{"s":21,"e":24,"c":"pl-k"},{"s":25,"e":33,"c":"pl-smi"}],[{"s":12,"e":13,"c":"pl-c1"},{"s":13,"e":21,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":27,"c":"pl-en"}],[{"s":16,"e":19,"c":"pl-k"}],[{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-en"},{"s":33,"e":37,"c":"pl-c1"}],[{"s":18,"e":23,"c":"pl-k"},{"s":25,"e":45,"c":"pl-smi"},{"s":46,"e":47,"c":"pl-s1"}],[{"s":20,"e":21,"c":"pl-s1"},{"s":22,"e":37,"c":"pl-en"}],[],[{"s":16,"e":22,"c":"pl-smi"},{"s":24,"e":30,"c":"pl-s1"},{"s":33,"e":36,"c":"pl-k"},{"s":37,"e":43,"c":"pl-smi"}],[{"s":16,"e":23,"c":"pl-smi"},{"s":24,"e":25,"c":"pl-s1"},{"s":33,"e":39,"c":"pl-s1"},{"s":40,"e":47,"c":"pl-en"},{"s":48,"e":52,"c":"pl-c1"}],[{"s":0,"e":53,"c":"pl-c"}],[{"s":16,"e":24,"c":"pl-s1"},{"s":25,"e":28,"c":"pl-en"},{"s":29,"e":30,"c":"pl-s1"}],[],[],[],[],[],[{"s":0,"e":7,"c":"pl-k"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-k"},{"s":21,"e":29,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":25,"c":"pl-smi"},{"s":26,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-smi"},{"s":22,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-smi"},{"s":22,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":17,"c":"pl-smi"},{"s":18,"e":25,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-s1"}],[],[{"s":4,"e":12,"c":"pl-smi"},{"s":13,"e":26,"c":"pl-smi"},{"s":27,"e":31,"c":"pl-s1"},{"s":33,"e":42,"c":"pl-smi"},{"s":43,"e":51,"c":"pl-s1"},{"s":53,"e":62,"c":"pl-smi"},{"s":63,"e":71,"c":"pl-s1"},{"s":72,"e":77,"c":"pl-smi"},{"s":78,"e":85,"c":"pl-smi"},{"s":87,"e":92,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":17,"c":"pl-s1"},{"s":20,"e":24,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":21,"c":"pl-s1"},{"s":24,"e":32,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":21,"c":"pl-s1"},{"s":24,"e":32,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":18,"c":"pl-s1"},{"s":21,"e":26,"c":"pl-s1"}],[],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":18,"c":"pl-smi"},{"s":19,"e":23,"c":"pl-en"}],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":17,"c":"pl-en"}],[{"s":8,"e":15,"c":"pl-smi"},{"s":16,"e":23,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-c1"}],[{"s":8,"e":11,"c":"pl-k"}],[{"s":12,"e":17,"c":"pl-k"},{"s":19,"e":24,"c":"pl-s1"},{"s":25,"e":29,"c":"pl-en"},{"s":35,"e":36,"c":"pl-c1"}],[{"s":16,"e":24,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-en"}],[],[{"s":12,"e":19,"c":"pl-s1"},{"s":22,"e":27,"c":"pl-s1"},{"s":28,"e":32,"c":"pl-en"}],[{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":23,"e":30,"c":"pl-en"},{"s":31,"e":43,"c":"pl-s"},{"s":44,"e":51,"c":"pl-s1"}],[{"s":12,"e":20,"c":"pl-s1"},{"s":21,"e":30,"c":"pl-en"}],[{"s":10,"e":15,"c":"pl-k"},{"s":17,"e":37,"c":"pl-smi"},{"s":38,"e":39,"c":"pl-s1"}],[{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":29,"c":"pl-en"}],[{"s":10,"e":17,"c":"pl-k"}],[{"s":12,"e":16,"c":"pl-s1"},{"s":17,"e":23,"c":"pl-en"}],[],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":22,"c":"pl-s1"}],[],[],[],[{"s":0,"e":7,"c":"pl-k"},{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":20,"c":"pl-k"},{"s":21,"e":29,"c":"pl-smi"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":25,"c":"pl-smi"},{"s":26,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-smi"},{"s":22,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":21,"c":"pl-smi"},{"s":22,"e":30,"c":"pl-s1"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":17,"c":"pl-smi"},{"s":18,"e":25,"c":"pl-smi"},{"s":27,"e":32,"c":"pl-s1"}],[],[{"s":4,"e":12,"c":"pl-smi"},{"s":13,"e":26,"c":"pl-smi"},{"s":27,"e":31,"c":"pl-s1"},{"s":33,"e":42,"c":"pl-smi"},{"s":43,"e":51,"c":"pl-s1"},{"s":53,"e":62,"c":"pl-smi"},{"s":63,"e":71,"c":"pl-s1"},{"s":72,"e":77,"c":"pl-smi"},{"s":78,"e":85,"c":"pl-smi"},{"s":87,"e":92,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":17,"c":"pl-s1"},{"s":20,"e":24,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":21,"c":"pl-s1"},{"s":24,"e":32,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":21,"c":"pl-s1"},{"s":24,"e":32,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":18,"c":"pl-s1"},{"s":21,"e":26,"c":"pl-s1"}],[],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":19,"c":"pl-en"},{"s":21,"e":28,"c":"pl-smi"},{"s":29,"e":36,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-s1"},{"s":13,"e":17,"c":"pl-en"}],[{"s":8,"e":11,"c":"pl-k"}],[{"s":12,"e":17,"c":"pl-k"},{"s":19,"e":24,"c":"pl-s1"},{"s":25,"e":29,"c":"pl-en"},{"s":34,"e":36,"c":"pl-c1"}],[{"s":16,"e":24,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-en"}],[],[{"s":13,"e":18,"c":"pl-s1"},{"s":19,"e":22,"c":"pl-en"},{"s":23,"e":30,"c":"pl-s1"}],[{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":23,"e":30,"c":"pl-en"},{"s":31,"e":42,"c":"pl-s"},{"s":43,"e":50,"c":"pl-s1"}],[{"s":12,"e":20,"c":"pl-s1"},{"s":21,"e":30,"c":"pl-en"}],[{"s":10,"e":15,"c":"pl-k"},{"s":17,"e":37,"c":"pl-smi"},{"s":38,"e":39,"c":"pl-s1"}],[{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":29,"c":"pl-en"}],[{"s":10,"e":17,"c":"pl-k"}],[{"s":12,"e":16,"c":"pl-s1"},{"s":17,"e":23,"c":"pl-en"}],[],[],[],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":9,"e":22,"c":"pl-smi"}],[{"s":6,"e":19,"c":"pl-s1"},{"s":45,"e":49,"c":"pl-s1"},{"s":50,"e":59,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":33,"c":"pl-smi"},{"s":34,"e":35,"c":"pl-smi"},{"s":37,"e":44,"c":"pl-k"},{"s":45,"e":63,"c":"pl-smi"},{"s":64,"e":65,"c":"pl-smi"},{"s":67,"e":77,"c":"pl-k"},{"s":78,"e":88,"c":"pl-smi"},{"s":89,"e":90,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":31,"c":"pl-smi"},{"s":32,"e":35,"c":"pl-smi"},{"s":36,"e":39,"c":"pl-s1"}],[{"s":6,"e":20,"c":"pl-c"}],[{"s":8,"e":16,"c":"pl-s1"},{"s":19,"e":22,"c":"pl-k"},{"s":23,"e":42,"c":"pl-smi"},{"s":45,"e":48,"c":"pl-s1"}],[],[],[{"s":4,"e":5,"c":"pl-c1"},{"s":5,"e":13,"c":"pl-c1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":15,"c":"pl-smi"},{"s":16,"e":19,"c":"pl-en"},{"s":20,"e":21,"c":"pl-smi"},{"s":22,"e":23,"c":"pl-s1"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":18,"c":"pl-en"}],[{"s":12,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-en"},{"s":21,"e":67,"c":"pl-s"}],[],[{"s":8,"e":11,"c":"pl-k"}],[{"s":10,"e":28,"c":"pl-c"}],[{"s":14,"e":27,"c":"pl-smi"},{"s":29,"e":37,"c":"pl-s1"},{"s":39,"e":42,"c":"pl-en"},{"s":43,"e":44,"c":"pl-s1"}],[{"s":10,"e":15,"c":"pl-k"},{"s":17,"e":37,"c":"pl-smi"},{"s":38,"e":39,"c":"pl-s1"}],[{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":29,"c":"pl-en"}],[],[],[],[{"s":4,"e":5,"c":"pl-c1"},{"s":5,"e":13,"c":"pl-c1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":12,"c":"pl-smi"},{"s":13,"e":17,"c":"pl-en"}],[{"s":8,"e":9,"c":"pl-smi"},{"s":10,"e":17,"c":"pl-s1"},{"s":20,"e":24,"c":"pl-c1"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":19,"c":"pl-en"}],[{"s":12,"e":15,"c":"pl-s1"},{"s":16,"e":20,"c":"pl-en"},{"s":21,"e":68,"c":"pl-s"}],[],[{"s":8,"e":11,"c":"pl-k"}],[{"s":12,"e":31,"c":"pl-c"}],[{"s":12,"e":19,"c":"pl-s1"},{"s":23,"e":24,"c":"pl-smi"},{"s":28,"e":41,"c":"pl-smi"},{"s":43,"e":51,"c":"pl-s1"},{"s":53,"e":57,"c":"pl-en"}],[{"s":10,"e":15,"c":"pl-k"},{"s":17,"e":37,"c":"pl-smi"},{"s":38,"e":39,"c":"pl-s1"}],[{"s":12,"e":13,"c":"pl-s1"},{"s":14,"e":29,"c":"pl-en"}],[],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":22,"c":"pl-s1"}],[],[],[],[],[{"s":5,"e":6,"c":"pl-s1"}],[],[],[],[{"s":2,"e":4,"c":"pl-c1"}],[],[{"s":2,"e":4,"c":"pl-c1"}],[],[{"s":2,"e":4,"c":"pl-c1"}],[],[{"s":2,"e":4,"c":"pl-c1"}],[],[],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":25,"c":"pl-en"},{"s":26,"e":29,"c":"pl-smi"},{"s":30,"e":42,"c":"pl-s1"}],[{"s":30,"e":33,"c":"pl-smi"},{"s":34,"e":49,"c":"pl-s1"}],[{"s":30,"e":34,"c":"pl-smi"},{"s":35,"e":48,"c":"pl-s1"}],[{"s":30,"e":38,"c":"pl-smi"},{"s":39,"e":43,"c":"pl-s1"}],[{"s":30,"e":43,"c":"pl-s1"},{"s":44,"e":52,"c":"pl-s1"},{"s":54,"e":63,"c":"pl-s1"}],[{"s":30,"e":43,"c":"pl-smi"},{"s":44,"e":57,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":25,"c":"pl-s1"},{"s":27,"e":42,"c":"pl-s1"},{"s":44,"e":57,"c":"pl-s1"},{"s":59,"e":63,"c":"pl-s1"},{"s":65,"e":74,"c":"pl-s1"}],[{"s":13,"e":26,"c":"pl-s1"},{"s":28,"e":42,"c":"pl-s1"}],[],[],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":20,"c":"pl-s1"}],[],[{"s":43,"e":55,"c":"pl-s1"},{"s":83,"e":96,"c":"pl-s1"}],[],[],[],[{"s":10,"e":11,"c":"pl-smi"},{"s":15,"e":24,"c":"pl-s1"},{"s":25,"e":29,"c":"pl-smi"},{"s":35,"e":39,"c":"pl-s1"},{"s":56,"e":75,"c":"pl-s1"}],[],[{"s":9,"e":17,"c":"pl-s1"},{"s":22,"e":31,"c":"pl-s1"},{"s":35,"e":40,"c":"pl-en"},{"s":44,"e":45,"c":"pl-s1"},{"s":56,"e":59,"c":"pl-c1"}],[],[{"s":12,"e":21,"c":"pl-s1"},{"s":22,"e":26,"c":"pl-en"},{"s":27,"e":40,"c":"pl-s1"},{"s":42,"e":50,"c":"pl-smi"},{"s":51,"e":62,"c":"pl-c1"},{"s":72,"e":76,"c":"pl-en"},{"s":93,"e":112,"c":"pl-s1"}],[],[{"s":10,"e":18,"c":"pl-s1"},{"s":23,"e":32,"c":"pl-s1"},{"s":36,"e":46,"c":"pl-en"},{"s":61,"e":74,"c":"pl-s1"},{"s":90,"e":94,"c":"pl-c1"},{"s":96,"e":102,"c":"pl-en"},{"s":106,"e":109,"c":"pl-s1"},{"s":122,"e":126,"c":"pl-c1"}],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":23,"c":"pl-s1"}],[],[{"s":18,"e":19,"c":"pl-s1"},{"s":56,"e":71,"c":"pl-smi"},{"s":76,"e":77,"c":"pl-smi"},{"s":87,"e":103,"c":"pl-s1"}],[],[{"s":8,"e":10,"c":"pl-c1"},{"s":10,"e":19,"c":"pl-s1"}],[],[{"s":5,"e":6,"c":"pl-s1"},{"s":13,"e":26,"c":"pl-s1"}],[],[{"s":2,"e":20,"c":"pl-s1"},{"s":31,"e":32,"c":"pl-s1"}],[],[{"s":2,"e":21,"c":"pl-s1"},{"s":31,"e":32,"c":"pl-smi"},{"s":59,"e":66,"c":"pl-s1"},{"s":67,"e":76,"c":"pl-smi"},{"s":82,"e":100,"c":"pl-s1"},{"s":132,"e":139,"c":"pl-s1"},{"s":140,"e":149,"c":"pl-smi"},{"s":159,"e":177,"c":"pl-s1"},{"s":180,"e":203,"c":"pl-en"}],[{"s":2,"e":21,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"},{"s":61,"e":80,"c":"pl-s1"},{"s":91,"e":92,"c":"pl-s1"}],[{"s":2,"e":23,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"},{"s":77,"e":80,"c":"pl-c1"}],[{"s":2,"e":18,"c":"pl-s1"},{"s":26,"e":43,"c":"pl-smi"},{"s":61,"e":64,"c":"pl-c1"},{"s":78,"e":81,"c":"pl-s1"},{"s":89,"e":90,"c":"pl-s1"},{"s":123,"e":127,"c":"pl-s1"},{"s":141,"e":144,"c":"pl-s1"}],[{"s":2,"e":21,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"}],[{"s":2,"e":12,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-s1"}],[],[{"s":2,"e":4,"c":"pl-c1"},{"s":4,"e":17,"c":"pl-s1"}],[],[{"s":28,"e":50,"c":"pl-en"},{"s":51,"e":55,"c":"pl-c1"}],[],[{"s":2,"e":4,"c":"pl-c1"},{"s":4,"e":28,"c":"pl-s1"}],[],[],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":3,"e":21,"c":"pl-smi"},{"s":22,"e":33,"c":"pl-smi"},{"s":54,"e":80,"c":"pl-s1"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":3,"e":21,"c":"pl-smi"},{"s":22,"e":35,"c":"pl-smi"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":3,"e":21,"c":"pl-smi"},{"s":22,"e":41,"c":"pl-smi"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":3,"e":21,"c":"pl-smi"},{"s":22,"e":38,"c":"pl-smi"}],[],[{"s":6,"e":8,"c":"pl-c1"},{"s":8,"e":21,"c":"pl-s1"}],[],[{"s":0,"e":13,"c":"pl-en"},{"s":14,"e":15,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-s1"},{"s":23,"e":32,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-smi"},{"s":63,"e":76,"c":"pl-s1"},{"s":80,"e":89,"c":"pl-s1"},{"s":90,"e":110,"c":"pl-s1"},{"s":114,"e":115,"c":"pl-smi"},{"s":122,"e":140,"c":"pl-s1"},{"s":183,"e":186,"c":"pl-s1"},{"s":213,"e":214,"c":"pl-s1"},{"s":219,"e":232,"c":"pl-s1"},{"s":237,"e":246,"c":"pl-s1"}],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":16,"c":"pl-smi"},{"s":17,"e":30,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-s1"},{"s":11,"e":20,"c":"pl-s1"},{"s":21,"e":29,"c":"pl-smi"},{"s":30,"e":31,"c":"pl-s1"}],[],[],[],[],[],[{"s":3,"e":4,"c":"pl-c1"},{"s":16,"e":22,"c":"pl-k"},{"s":23,"e":25,"c":"pl-c1"},{"s":25,"e":60,"c":"pl-smi"},{"s":61,"e":64,"c":"pl-smi"}],[],[{"s":5,"e":14,"c":"pl-s1"}],[],[{"s":0,"e":9,"c":"pl-s1"}],[],[{"s":6,"e":24,"c":"pl-s1"}],[],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":29,"c":"pl-smi"},{"s":30,"e":48,"c":"pl-s1"},{"s":49,"e":52,"c":"pl-smi"},{"s":53,"e":61,"c":"pl-s1"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":14,"c":"pl-k"},{"s":15,"e":33,"c":"pl-smi"},{"s":34,"e":42,"c":"pl-s1"},{"s":44,"e":52,"c":"pl-s1"}],[{"s":34,"e":36,"c":"pl-c1"},{"s":38,"e":46,"c":"pl-smi"},{"s":47,"e":59,"c":"pl-c1"}],[{"s":34,"e":37,"c":"pl-k"},{"s":38,"e":57,"c":"pl-smi"},{"s":58,"e":66,"c":"pl-smi"}],[],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":26,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-smi"},{"s":9,"e":16,"c":"pl-smi"},{"s":17,"e":26,"c":"pl-c1"}],[],[],[],[{"s":0,"e":1,"c":"pl-s1"}],[],[{"s":2,"e":3,"c":"pl-smi"},{"s":26,"e":34,"c":"pl-s1"},{"s":104,"e":123,"c":"pl-s1"},{"s":131,"e":138,"c":"pl-s1"},{"s":139,"e":148,"c":"pl-smi"}],[],[{"s":3,"e":19,"c":"pl-s1"}],[],[{"s":5,"e":17,"c":"pl-s1"},{"s":21,"e":36,"c":"pl-s1"},{"s":42,"e":60,"c":"pl-s1"},{"s":75,"e":91,"c":"pl-s1"},{"s":95,"e":107,"c":"pl-s1"},{"s":108,"e":109,"c":"pl-c1"}],[{"s":4,"e":11,"c":"pl-en"},{"s":32,"e":33,"c":"pl-s1"},{"s":38,"e":57,"c":"pl-s1"},{"s":58,"e":62,"c":"pl-en"},{"s":77,"e":93,"c":"pl-s1"},{"s":100,"e":102,"c":"pl-c1"},{"s":102,"e":103,"c":"pl-s1"}],[{"s":13,"e":14,"c":"pl-s1"},{"s":34,"e":49,"c":"pl-s1"}],[{"s":21,"e":36,"c":"pl-smi"},{"s":51,"e":58,"c":"pl-s1"},{"s":75,"e":91,"c":"pl-s1"},{"s":103,"e":110,"c":"pl-s1"}],[],[{"s":6,"e":29,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-smi"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":29,"c":"pl-smi"},{"s":30,"e":53,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":18,"c":"pl-k"},{"s":19,"e":54,"c":"pl-smi"}],[{"s":13,"e":16,"c":"pl-k"},{"s":17,"e":35,"c":"pl-smi"},{"s":36,"e":37,"c":"pl-c1"},{"s":39,"e":40,"c":"pl-c1"}],[{"s":36,"e":38,"c":"pl-c1"},{"s":40,"e":48,"c":"pl-smi"},{"s":49,"e":61,"c":"pl-c1"}],[{"s":36,"e":39,"c":"pl-k"},{"s":40,"e":59,"c":"pl-smi"},{"s":60,"e":68,"c":"pl-smi"}],[],[],[{"s":0,"e":1,"c":"pl-s1"}],[{"s":2,"e":3,"c":"pl-s1"},{"s":18,"e":19,"c":"pl-s1"},{"s":43,"e":47,"c":"pl-c1"},{"s":49,"e":53,"c":"pl-c1"},{"s":83,"e":84,"c":"pl-c1"}],[],[{"s":6,"e":25,"c":"pl-smi"}],[],[{"s":2,"e":3,"c":"pl-s1"},{"s":60,"e":67,"c":"pl-s1"},{"s":68,"e":77,"c":"pl-smi"}],[],[{"s":0,"e":1,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":29,"c":"pl-s1"},{"s":30,"e":49,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":18,"c":"pl-k"},{"s":19,"e":37,"c":"pl-smi"},{"s":38,"e":39,"c":"pl-c1"},{"s":41,"e":48,"c":"pl-smi"},{"s":49,"e":58,"c":"pl-c1"}],[{"s":38,"e":41,"c":"pl-c1"},{"s":43,"e":51,"c":"pl-smi"},{"s":52,"e":59,"c":"pl-c1"}],[{"s":38,"e":41,"c":"pl-k"},{"s":42,"e":58,"c":"pl-smi"},{"s":59,"e":67,"c":"pl-smi"}],[],[],[],[{"s":1,"e":16,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":7,"e":19,"c":"pl-s1"},{"s":22,"e":23,"c":"pl-c1"},{"s":41,"e":48,"c":"pl-smi"},{"s":49,"e":58,"c":"pl-smi"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":13,"e":29,"c":"pl-s1"},{"s":43,"e":59,"c":"pl-s1"},{"s":81,"e":82,"c":"pl-s1"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":7,"e":23,"c":"pl-s1"},{"s":64,"e":65,"c":"pl-s1"},{"s":75,"e":91,"c":"pl-s1"}],[{"s":0,"e":2,"c":"pl-c1"},{"s":7,"e":23,"c":"pl-s1"}],[],[{"s":19,"e":34,"c":"pl-s1"},{"s":62,"e":64,"c":"pl-c1"},{"s":64,"e":65,"c":"pl-s1"},{"s":82,"e":97,"c":"pl-smi"}],[],[{"s":6,"e":28,"c":"pl-s1"}],[],[{"s":2,"e":3,"c":"pl-s1"},{"s":18,"e":34,"c":"pl-s1"},{"s":100,"e":107,"c":"pl-smi"},{"s":108,"e":117,"c":"pl-smi"}],[],[{"s":0,"e":1,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":34,"c":"pl-s1"},{"s":35,"e":38,"c":"pl-smi"},{"s":39,"e":51,"c":"pl-s1"}],[{"s":35,"e":48,"c":"pl-smi"},{"s":49,"e":62,"c":"pl-s1"}],[{"s":4,"e":9,"c":"pl-en"},{"s":10,"e":22,"c":"pl-smi"},{"s":24,"e":31,"c":"pl-s1"},{"s":32,"e":41,"c":"pl-c1"},{"s":43,"e":44,"c":"pl-c1"},{"s":46,"e":57,"c":"pl-smi"},{"s":57,"e":57,"c":"pl-s1"}],[{"s":10,"e":13,"c":"pl-smi"},{"s":14,"e":30,"c":"pl-s1"},{"s":34,"e":47,"c":"pl-s1"}],[],[],[],[{"s":16,"e":25,"c":"pl-smi"}],[],[{"s":3,"e":21,"c":"pl-s1"},{"s":22,"e":45,"c":"pl-s1"},{"s":51,"e":70,"c":"pl-s1"},{"s":74,"e":81,"c":"pl-s1"},{"s":82,"e":91,"c":"pl-c1"},{"s":125,"e":144,"c":"pl-s1"},{"s":145,"e":167,"c":"pl-s1"},{"s":174,"e":181,"c":"pl-s1"},{"s":182,"e":191,"c":"pl-c1"}],[],[],[],[{"s":1,"e":5,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-s1"},{"s":31,"e":98,"c":"pl-c"}],[],[{"s":1,"e":17,"c":"pl-s1"},{"s":23,"e":28,"c":"pl-s1"},{"s":29,"e":61,"c":"pl-c"}],[],[],[],[],[],[{"s":4,"e":11,"c":"pl-c1"},{"s":48,"e":49,"c":"pl-c1"}],[],[{"s":4,"e":12,"c":"pl-c1"},{"s":46,"e":47,"c":"pl-c1"},{"s":50,"e":58,"c":"pl-en"},{"s":66,"e":74,"c":"pl-c1"}],[],[{"s":4,"e":8,"c":"pl-c1"},{"s":50,"e":51,"c":"pl-c1"},{"s":54,"e":65,"c":"pl-en"},{"s":73,"e":77,"c":"pl-c1"}],[],[{"s":4,"e":11,"c":"pl-c1"},{"s":37,"e":38,"c":"pl-c1"},{"s":41,"e":42,"c":"pl-c1"},{"s":43,"e":51,"c":"pl-c1"},{"s":52,"e":56,"c":"pl-c1"},{"s":75,"e":76,"c":"pl-c1"},{"s":82,"e":89,"c":"pl-c1"}],[],[{"s":4,"e":14,"c":"pl-c1"},{"s":31,"e":32,"c":"pl-c1"}],[],[{"s":4,"e":7,"c":"pl-s1"},{"s":12,"e":18,"c":"pl-s1"},{"s":19,"e":22,"c":"pl-c1"},{"s":23,"e":41,"c":"pl-c1"},{"s":41,"e":45,"c":"pl-s1"}],[],[{"s":20,"e":32,"c":"pl-s1"},{"s":33,"e":48,"c":"pl-s1"}],[],[{"s":7,"e":8,"c":"pl-s1"}],[{"s":29,"e":31,"c":"pl-c1"},{"s":38,"e":41,"c":"pl-c1"},{"s":55,"e":58,"c":"pl-c1"},{"s":64,"e":67,"c":"pl-c1"},{"s":72,"e":75,"c":"pl-c1"},{"s":84,"e":87,"c":"pl-smi"},{"s":119,"e":120,"c":"pl-s1"},{"s":142,"e":143,"c":"pl-s1"},{"s":175,"e":178,"c":"pl-c1"},{"s":191,"e":194,"c":"pl-c1"}],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":6,"e":9,"c":"pl-c1"},{"s":13,"e":14,"c":"pl-c1"}],[],[{"s":9,"e":11,"c":"pl-c1"}],[{"s":13,"e":14,"c":"pl-s1"},{"s":15,"e":17,"c":"pl-c1"},{"s":28,"e":31,"c":"pl-c1"},{"s":39,"e":41,"c":"pl-c1"},{"s":52,"e":55,"c":"pl-c1"},{"s":75,"e":78,"c":"pl-c1"},{"s":86,"e":89,"c":"pl-c1"}],[],[{"s":5,"e":7,"c":"pl-c1"},{"s":13,"e":16,"c":"pl-c1"},{"s":27,"e":29,"c":"pl-c1"},{"s":41,"e":44,"c":"pl-c1"},{"s":47,"e":48,"c":"pl-c1"},{"s":50,"e":53,"c":"pl-c1"},{"s":57,"e":58,"c":"pl-c1"},{"s":65,"e":67,"c":"pl-c1"},{"s":74,"e":77,"c":"pl-c1"},{"s":88,"e":90,"c":"pl-c1"},{"s":101,"e":102,"c":"pl-c1"},{"s":104,"e":107,"c":"pl-c1"},{"s":111,"e":114,"c":"pl-c1"},{"s":116,"e":117,"c":"pl-c1"}],[],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":8,"e":11,"c":"pl-c1"},{"s":22,"e":25,"c":"pl-c1"}],[{"s":2,"e":5,"c":"pl-c1"},{"s":9,"e":12,"c":"pl-c1"},{"s":26,"e":29,"c":"pl-c1"},{"s":33,"e":36,"c":"pl-c1"},{"s":42,"e":45,"c":"pl-c1"},{"s":50,"e":52,"c":"pl-c1"}],[],[{"s":6,"e":9,"c":"pl-c1"},{"s":14,"e":17,"c":"pl-c1"},{"s":23,"e":26,"c":"pl-c1"},{"s":31,"e":33,"c":"pl-c1"}],[],[],[{"s":54,"e":57,"c":"pl-c1"},{"s":62,"e":64,"c":"pl-c1"},{"s":78,"e":79,"c":"pl-s1"}],[],[],[{"s":11,"e":12,"c":"pl-s1"}],[],[{"s":0,"e":1,"c":"pl-s1"},{"s":56,"e":57,"c":"pl-s1"},{"s":101,"e":102,"c":"pl-s1"},{"s":124,"e":127,"c":"pl-c1"},{"s":139,"e":153,"c":"pl-s1"}],[],[],[],[{"s":12,"e":13,"c":"pl-s1"}],[{"s":42,"e":43,"c":"pl-s1"},{"s":72,"e":75,"c":"pl-c1"},{"s":87,"e":101,"c":"pl-s1"}],[],[{"s":0,"e":18,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-k"},{"s":32,"e":38,"c":"pl-s1"}],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":7,"c":"pl-s1"},{"s":8,"e":25,"c":"pl-c1"},{"s":30,"e":36,"c":"pl-s1"},{"s":37,"e":42,"c":"pl-s1"},{"s":43,"e":61,"c":"pl-c1"},{"s":61,"e":64,"c":"pl-s1"}],[],[{"s":2,"e":14,"c":"pl-s1"},{"s":30,"e":42,"c":"pl-s1"}],[],[{"s":5,"e":17,"c":"pl-smi"}],[],[{"s":6,"e":12,"c":"pl-smi"},{"s":21,"e":25,"c":"pl-s1"},{"s":28,"e":34,"c":"pl-s1"},{"s":51,"e":57,"c":"pl-s1"},{"s":60,"e":64,"c":"pl-s1"}],[],[{"s":5,"e":17,"c":"pl-smi"}],[],[{"s":23,"e":29,"c":"pl-s1"}],[],[{"s":0,"e":15,"c":"pl-s1"}],[],[],[],[{"s":3,"e":5,"c":"pl-c1"},{"s":6,"e":21,"c":"pl-s1"},{"s":32,"e":38,"c":"pl-k"},{"s":39,"e":44,"c":"pl-c1"},{"s":44,"e":76,"c":"pl-s1"},{"s":77,"e":80,"c":"pl-s1"}],[],[],[{"s":1,"e":5,"c":"pl-s1"},{"s":22,"e":27,"c":"pl-s1"},{"s":28,"e":68,"c":"pl-c"}],[],[{"s":4,"e":15,"c":"pl-s1"}],[],[{"s":7,"e":18,"c":"pl-s1"},{"s":38,"e":39,"c":"pl-s1"},{"s":54,"e":55,"c":"pl-s1"}],[],[{"s":0,"e":11,"c":"pl-s1"},{"s":98,"e":109,"c":"pl-s1"},{"s":112,"e":113,"c":"pl-s1"},{"s":127,"e":128,"c":"pl-s1"}],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":14,"c":"pl-s1"}],[{"s":4,"e":18,"c":"pl-c"}],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":30,"c":"pl-s1"},{"s":32,"e":40,"c":"pl-s1"},{"s":42,"e":53,"c":"pl-s1"},{"s":56,"e":59,"c":"pl-k"},{"s":60,"e":71,"c":"pl-smi"},{"s":78,"e":89,"c":"pl-en"},{"s":97,"e":100,"c":"pl-k"},{"s":101,"e":109,"c":"pl-smi"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":22,"c":"pl-smi"},{"s":23,"e":30,"c":"pl-s1"},{"s":32,"e":41,"c":"pl-smi"},{"s":42,"e":46,"c":"pl-s1"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":16,"c":"pl-s1"},{"s":20,"e":24,"c":"pl-c1"}],[{"s":12,"e":18,"c":"pl-k"}],[{"s":8,"e":16,"c":"pl-smi"},{"s":17,"e":25,"c":"pl-s1"},{"s":28,"e":39,"c":"pl-s1"},{"s":40,"e":43,"c":"pl-en"}],[{"s":8,"e":16,"c":"pl-s1"},{"s":18,"e":30,"c":"pl-en"},{"s":32,"e":36,"c":"pl-s1"}],[],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":17,"c":"pl-k"},{"s":18,"e":27,"c":"pl-smi"},{"s":28,"e":35,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":26,"c":"pl-s1"},{"s":27,"e":30,"c":"pl-en"},{"s":34,"e":46,"c":"pl-en"}],[],[],[],[],[],[],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":12,"c":"pl-s1"},{"s":13,"e":27,"c":"pl-s1"},{"s":31,"e":38,"c":"pl-s1"},{"s":42,"e":53,"c":"pl-s1"},{"s":54,"e":57,"c":"pl-s1"},{"s":88,"e":91,"c":"pl-smi"},{"s":93,"e":94,"c":"pl-s1"},{"s":95,"e":109,"c":"pl-s1"},{"s":118,"e":121,"c":"pl-s1"},{"s":124,"e":125,"c":"pl-s1"},{"s":132,"e":135,"c":"pl-s1"},{"s":139,"e":150,"c":"pl-s1"},{"s":156,"e":161,"c":"pl-s1"},{"s":169,"e":183,"c":"pl-s1"},{"s":184,"e":191,"c":"pl-s1"},{"s":198,"e":205,"c":"pl-s1"},{"s":225,"e":233,"c":"pl-s1"},{"s":261,"e":262,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":20,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":11,"c":"pl-smi"},{"s":12,"e":15,"c":"pl-s1"},{"s":16,"e":17,"c":"pl-smi"},{"s":18,"e":23,"c":"pl-s1"}],[{"s":3,"e":11,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-smi"},{"s":11,"e":12,"c":"pl-s1"},{"s":15,"e":21,"c":"pl-smi"},{"s":22,"e":35,"c":"pl-en"}],[{"s":3,"e":15,"c":"pl-c"}],[{"s":4,"e":18,"c":"pl-smi"},{"s":19,"e":22,"c":"pl-s1"},{"s":25,"e":31,"c":"pl-en"},{"s":32,"e":33,"c":"pl-s1"}],[{"s":3,"e":18,"c":"pl-c"}],[{"s":4,"e":6,"c":"pl-k"},{"s":8,"e":11,"c":"pl-s1"},{"s":15,"e":19,"c":"pl-c1"}],[{"s":6,"e":38,"c":"pl-c"}],[{"s":6,"e":22,"c":"pl-c"}],[{"s":6,"e":9,"c":"pl-s1"},{"s":10,"e":13,"c":"pl-en"},{"s":14,"e":18,"c":"pl-smi"},{"s":20,"e":25,"c":"pl-s1"}],[{"s":4,"e":8,"c":"pl-k"}],[{"s":6,"e":15,"c":"pl-en"},{"s":16,"e":17,"c":"pl-s1"},{"s":19,"e":24,"c":"pl-s1"}],[],[{"s":0,"e":14,"c":"pl-smi"},{"s":15,"e":21,"c":"pl-s1"},{"s":22,"e":28,"c":"pl-smi"},{"s":29,"e":30,"c":"pl-s1"}],[{"s":3,"e":29,"c":"pl-c"}],[{"s":4,"e":10,"c":"pl-k"},{"s":11,"e":12,"c":"pl-s1"},{"s":13,"e":25,"c":"pl-s1"}],[],[],[],[{"s":6,"e":17,"c":"pl-smi"},{"s":19,"e":24,"c":"pl-s1"},{"s":25,"e":28,"c":"pl-s1"}],[],[{"s":1,"e":1,"c":"pl-s1"},{"s":2,"e":8,"c":"pl-s1"},{"s":13,"e":19,"c":"pl-s1"},{"s":20,"e":26,"c":"pl-smi"},{"s":27,"e":30,"c":"pl-smi"}],[],[{"s":6,"e":7,"c":"pl-s1"},{"s":13,"e":14,"c":"pl-s1"},{"s":16,"e":17,"c":"pl-s1"},{"s":18,"e":29,"c":"pl-en"}],[],[],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":11,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-s1"},{"s":31,"e":42,"c":"pl-s1"}],[{"s":14,"e":28,"c":"pl-s1"},{"s":33,"e":36,"c":"pl-s1"},{"s":38,"e":49,"c":"pl-s1"}],[],[],[{"s":4,"e":15,"c":"pl-s1"},{"s":24,"e":25,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":16,"e":27,"c":"pl-en"},{"s":40,"e":41,"c":"pl-s1"},{"s":60,"e":74,"c":"pl-s1"},{"s":80,"e":83,"c":"pl-s1"},{"s":89,"e":100,"c":"pl-s1"},{"s":108,"e":111,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":14,"e":17,"c":"pl-en"},{"s":31,"e":42,"c":"pl-s1"}],[],[{"s":10,"e":24,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-s1"},{"s":38,"e":39,"c":"pl-s1"},{"s":40,"e":45,"c":"pl-s1"},{"s":74,"e":79,"c":"pl-s1"}],[],[{"s":5,"e":10,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":7,"e":18,"c":"pl-en"},{"s":30,"e":41,"c":"pl-s1"},{"s":42,"e":48,"c":"pl-s1"},{"s":54,"e":59,"c":"pl-s1"},{"s":67,"e":72,"c":"pl-s1"}],[],[{"s":0,"e":2,"c":"pl-c1"},{"s":13,"e":24,"c":"pl-en"},{"s":27,"e":41,"c":"pl-s1"},{"s":43,"e":46,"c":"pl-s1"},{"s":49,"e":52,"c":"pl-en"},{"s":85,"e":88,"c":"pl-s1"},{"s":89,"e":93,"c":"pl-c1"},{"s":105,"e":108,"c":"pl-en"},{"s":115,"e":129,"c":"pl-en"}],[],[{"s":2,"e":3,"c":"pl-s1"},{"s":14,"e":25,"c":"pl-s1"},{"s":34,"e":39,"c":"pl-smi"},{"s":40,"e":73,"c":"pl-c"}],[],[{"s":4,"e":10,"c":"pl-s1"}],[],[{"s":6,"e":12,"c":"pl-s1"},{"s":29,"e":30,"c":"pl-s1"},{"s":34,"e":38,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":27,"c":"pl-en"},{"s":32,"e":38,"c":"pl-smi"},{"s":39,"e":47,"c":"pl-en"}],[],[],[{"s":4,"e":11,"c":"pl-k"},{"s":12,"e":18,"c":"pl-k"},{"s":19,"e":23,"c":"pl-smi"},{"s":24,"e":38,"c":"pl-s1"}],[{"s":8,"e":65,"c":"pl-c"}],[{"s":8,"e":60,"c":"pl-c"}],[{"s":8,"e":11,"c":"pl-k"}],[{"s":12,"e":16,"c":"pl-smi"},{"s":17,"e":24,"c":"pl-s1"},{"s":27,"e":41,"c":"pl-s1"},{"s":42,"e":45,"c":"pl-en"}],[{"s":12,"e":16,"c":"pl-smi"},{"s":17,"e":21,"c":"pl-s1"},{"s":24,"e":31,"c":"pl-s1"},{"s":34,"e":53,"c":"pl-c1"}],[{"s":12,"e":14,"c":"pl-k"},{"s":16,"e":30,"c":"pl-s1"},{"s":31,"e":44,"c":"pl-en"},{"s":45,"e":52,"c":"pl-s1"},{"s":54,"e":58,"c":"pl-s1"}],[{"s":16,"e":22,"c":"pl-k"},{"s":23,"e":27,"c":"pl-s1"}],[],[],[],[],[{"s":11,"e":15,"c":"pl-smi"},{"s":17,"e":18,"c":"pl-s1"},{"s":22,"e":32,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":1,"e":10,"c":"pl-s1"},{"s":11,"e":14,"c":"pl-smi"},{"s":15,"e":19,"c":"pl-s1"},{"s":20,"e":23,"c":"pl-smi"},{"s":24,"e":28,"c":"pl-s1"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":20,"c":"pl-s1"},{"s":22,"e":30,"c":"pl-s1"}],[{"s":8,"e":18,"c":"pl-smi"},{"s":19,"e":23,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-smi"},{"s":31,"e":35,"c":"pl-s1"}],[{"s":8,"e":10,"c":"pl-k"}],[{"s":12,"e":19,"c":"pl-s1"},{"s":22,"e":26,"c":"pl-s1"},{"s":27,"e":30,"c":"pl-en"}],[{"s":12,"e":20,"c":"pl-s1"},{"s":24,"e":31,"c":"pl-s1"},{"s":34,"e":44,"c":"pl-s1"},{"s":47,"e":53,"c":"pl-s1"},{"s":57,"e":61,"c":"pl-s1"}],[{"s":10,"e":15,"c":"pl-k"},{"s":18,"e":22,"c":"pl-s1"},{"s":23,"e":36,"c":"pl-en"},{"s":37,"e":44,"c":"pl-s1"},{"s":46,"e":54,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":16,"e":19,"c":"pl-smi"},{"s":21,"e":29,"c":"pl-s1"},{"s":35,"e":37,"c":"pl-c1"},{"s":40,"e":44,"c":"pl-s1"}],[],[],[],[{"s":14,"e":18,"c":"pl-smi"},{"s":19,"e":25,"c":"pl-smi"},{"s":32,"e":33,"c":"pl-s1"},{"s":43,"e":44,"c":"pl-s1"},{"s":59,"e":76,"c":"pl-s1"},{"s":77,"e":84,"c":"pl-s1"},{"s":87,"e":94,"c":"pl-en"},{"s":109,"e":110,"c":"pl-smi"},{"s":113,"e":131,"c":"pl-s1"},{"s":132,"e":139,"c":"pl-s1"},{"s":153,"e":154,"c":"pl-smi"},{"s":163,"e":167,"c":"pl-s1"},{"s":195,"e":196,"c":"pl-s1"}],[],[{"s":3,"e":7,"c":"pl-s1"}],[{"s":0,"e":6,"c":"pl-s1"},{"s":7,"e":13,"c":"pl-k"},{"s":14,"e":31,"c":"pl-smi"},{"s":32,"e":39,"c":"pl-s1"}],[{"s":5,"e":19,"c":"pl-c"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":18,"c":"pl-smi"},{"s":19,"e":25,"c":"pl-en"},{"s":26,"e":32,"c":"pl-smi"},{"s":33,"e":46,"c":"pl-en"},{"s":50,"e":55,"c":"pl-c1"},{"s":60,"e":61,"c":"pl-c1"}],[{"s":12,"e":21,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":23,"c":"pl-s1"}],[],[],[{"s":0,"e":51,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":12,"c":"pl-k"},{"s":13,"e":17,"c":"pl-smi"},{"s":18,"e":27,"c":"pl-s1"}],[{"s":8,"e":11,"c":"pl-smi"},{"s":12,"e":13,"c":"pl-s1"},{"s":16,"e":30,"c":"pl-s1"},{"s":31,"e":40,"c":"pl-en"},{"s":41,"e":56,"c":"pl-c1"}],[{"s":8,"e":11,"c":"pl-smi"},{"s":12,"e":17,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-s1"},{"s":26,"e":27,"c":"pl-c1"},{"s":31,"e":32,"c":"pl-c1"},{"s":35,"e":36,"c":"pl-s1"},{"s":38,"e":47,"c":"pl-c"}],[{"s":8,"e":12,"c":"pl-smi"},{"s":13,"e":17,"c":"pl-s1"},{"s":20,"e":25,"c":"pl-en"},{"s":26,"e":32,"c":"pl-s1"},{"s":33,"e":42,"c":"pl-en"},{"s":43,"e":59,"c":"pl-c1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":16,"c":"pl-s1"},{"s":19,"e":25,"c":"pl-smi"},{"s":26,"e":39,"c":"pl-en"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":22,"c":"pl-en"},{"s":23,"e":24,"c":"pl-s1"},{"s":26,"e":30,"c":"pl-c1"},{"s":32,"e":36,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-smi"},{"s":15,"e":21,"c":"pl-en"},{"s":22,"e":23,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-c1"},{"s":32,"e":37,"c":"pl-s1"}],[],[],[{"s":0,"e":19,"c":"pl-c"}],[{"s":0,"e":6,"c":"pl-k"},{"s":7,"e":10,"c":"pl-smi"},{"s":11,"e":18,"c":"pl-s1"},{"s":19,"e":22,"c":"pl-smi"},{"s":23,"e":29,"c":"pl-s1"},{"s":31,"e":34,"c":"pl-smi"},{"s":35,"e":40,"c":"pl-s1"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":18,"c":"pl-s1"},{"s":22,"e":27,"c":"pl-s1"}],[{"s":12,"e":17,"c":"pl-k"},{"s":18,"e":21,"c":"pl-k"},{"s":22,"e":46,"c":"pl-smi"},{"s":47,"e":55,"c":"pl-s1"}],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":30,"c":"pl-en"},{"s":31,"e":37,"c":"pl-s1"},{"s":39,"e":44,"c":"pl-s1"}],[],[],[{"s":0,"e":5,"c":"pl-k"},{"s":6,"e":9,"c":"pl-smi"},{"s":10,"e":25,"c":"pl-s1"},{"s":26,"e":29,"c":"pl-smi"},{"s":30,"e":36,"c":"pl-s1"},{"s":38,"e":41,"c":"pl-smi"},{"s":42,"e":47,"c":"pl-s1"}],[{"s":8,"e":11,"c":"pl-smi"},{"s":12,"e":13,"c":"pl-s1"},{"s":16,"e":21,"c":"pl-en"},{"s":22,"e":30,"c":"pl-en"}],[{"s":8,"e":10,"c":"pl-k"},{"s":12,"e":18,"c":"pl-s1"},{"s":21,"e":26,"c":"pl-s1"}],[{"s":12,"e":15,"c":"pl-smi"},{"s":16,"e":17,"c":"pl-s1"},{"s":20,"e":25,"c":"pl-s1"},{"s":28,"e":34,"c":"pl-s1"},{"s":36,"e":37,"c":"pl-s1"},{"s":40,"e":41,"c":"pl-s1"},{"s":44,"e":45,"c":"pl-c1"}],[{"s":12,"e":14,"c":"pl-k"},{"s":17,"e":18,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-s1"},{"s":27,"e":28,"c":"pl-c1"}],[{"s":16,"e":17,"c":"pl-s1"},{"s":21,"e":22,"c":"pl-smi"},{"s":25,"e":26,"c":"pl-smi"},{"s":30,"e":36,"c":"pl-s1"}],[{"s":12,"e":16,"c":"pl-k"},{"s":17,"e":19,"c":"pl-k"},{"s":21,"e":22,"c":"pl-s1"},{"s":25,"e":26,"c":"pl-c1"}],[{"s":16,"e":19,"c":"pl-k"},{"s":21,"e":24,"c":"pl-smi"},{"s":25,"e":26,"c":"pl-s1"},{"s":29,"e":30,"c":"pl-s1"},{"s":35,"e":36,"c":"pl-c1"}],[{"s":21,"e":22,"c":"pl-s1"},{"s":25,"e":26,"c":"pl-s1"},{"s":30,"e":31,"c":"pl-s1"},{"s":34,"e":35,"c":"pl-s1"},{"s":38,"e":39,"c":"pl-s1"},{"s":43,"e":44,"c":"pl-c1"}],[{"s":21,"e":22,"c":"pl-s1"},{"s":25,"e":30,"c":"pl-en"},{"s":31,"e":39,"c":"pl-en"},{"s":47,"e":48,"c":"pl-c1"}],[],[{"s":16,"e":17,"c":"pl-s1"},{"s":21,"e":27,"c":"pl-s1"}],[],[{"s":12,"e":16,"c":"pl-k"}],[{"s":16,"e":21,"c":"pl-k"},{"s":23,"e":24,"c":"pl-s1"},{"s":27,"e":33,"c":"pl-s1"},{"s":37,"e":38,"c":"pl-s1"},{"s":42,"e":47,"c":"pl-s1"}],[{"s":20,"e":21,"c":"pl-s1"},{"s":24,"e":29,"c":"pl-en"},{"s":30,"e":38,"c":"pl-en"}],[],[],[{"s":8,"e":14,"c":"pl-k"},{"s":15,"e":16,"c":"pl-s1"}],[],[],[],[],[],[{"s":12,"e":16,"c":"pl-en"},{"s":23,"e":24,"c":"pl-smi"},{"s":31,"e":32,"c":"pl-s1"},{"s":51,"e":55,"c":"pl-s1"},{"s":60,"e":67,"c":"pl-en"},{"s":99,"e":100,"c":"pl-smi"}],[],[{"s":22,"e":26,"c":"pl-s1"},{"s":44,"e":48,"c":"pl-smi"},{"s":66,"e":67,"c":"pl-s1"},{"s":69,"e":73,"c":"pl-s1"}],[],[],[],[{"s":4,"e":17,"c":"pl-smi"}],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":45,"c":"pl-c"}],[],[],[],[{"s":0,"e":5,"c":"pl-s1"},{"s":6,"e":54,"c":"pl-c"}],[]],"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/NotFound9/interviewGuide/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"JavaMultiThread.md","displayUrl":"https://github.com/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md?raw=true","headerInfo":{"blobSize":"84.3 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"ba3743f","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FNotFound9%2FinterviewGuide%2Fblob%2Fmaster%2Fdocs%2FJavaMultiThread.md","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"1840","truncatedSloc":"1397"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Java","languageID":181,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/NotFound9/interviewGuide/blob/master/docs/JavaMultiThread.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/NotFound9/interviewGuide/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/NotFound9/interviewGuide/raw/refs/heads/master/docs/JavaMultiThread.md","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"多线程专题","kind":"section_1","ident_start":146,"ident_end":161,"extent_start":144,"extent_end":86335,"fully_qualified_name":"多线程专题","ident_utf16":{"start":{"line_number":1,"utf16_col":2},"end":{"line_number":1,"utf16_col":7}},"extent_utf16":{"start":{"line_number":1,"utf16_col":0},"end":{"line_number":1840,"utf16_col":0}}},{"name":"[1.进程与线程的区别是什么?](#进程与线程的区别是什么?)","kind":"section_4","ident_start":168,"ident_end":247,"extent_start":163,"extent_end":248,"fully_qualified_name":"[1.进程与线程的区别是什么?](#进程与线程的区别是什么?)","ident_utf16":{"start":{"line_number":3,"utf16_col":5},"end":{"line_number":3,"utf16_col":36}},"extent_utf16":{"start":{"line_number":3,"utf16_col":0},"end":{"line_number":4,"utf16_col":0}}},{"name":"[2.进程间如何通信?](#进程间如何通信?)","kind":"section_4","ident_start":253,"ident_end":308,"extent_start":248,"extent_end":310,"fully_qualified_name":"[2.进程间如何通信?](#进程间如何通信?)","ident_utf16":{"start":{"line_number":4,"utf16_col":5},"end":{"line_number":4,"utf16_col":28}},"extent_utf16":{"start":{"line_number":4,"utf16_col":0},"end":{"line_number":6,"utf16_col":0}}},{"name":"[3.Java中单例有哪些写法?](#Java中单例有哪些写法?)","kind":"section_4","ident_start":315,"ident_end":384,"extent_start":310,"extent_end":385,"fully_qualified_name":"[3.Java中单例有哪些写法?](#Java中单例有哪些写法?)","ident_utf16":{"start":{"line_number":6,"utf16_col":5},"end":{"line_number":6,"utf16_col":38}},"extent_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":7,"utf16_col":0}}},{"name":"[4.Java中创建线程有哪些方式?](#Java中创建线程有哪些方式?)","kind":"section_4","ident_start":391,"ident_end":468,"extent_start":385,"extent_end":469,"fully_qualified_name":"[4.Java中创建线程有哪些方式?](#Java中创建线程有哪些方式?)","ident_utf16":{"start":{"line_number":7,"utf16_col":6},"end":{"line_number":7,"utf16_col":43}},"extent_utf16":{"start":{"line_number":7,"utf16_col":0},"end":{"line_number":8,"utf16_col":0}}},{"name":"[5.如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)","kind":"section_4","ident_start":474,"ident_end":603,"extent_start":469,"extent_end":604,"fully_qualified_name":"[5.如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)","ident_utf16":{"start":{"line_number":8,"utf16_col":5},"end":{"line_number":8,"utf16_col":54}},"extent_utf16":{"start":{"line_number":8,"utf16_col":0},"end":{"line_number":9,"utf16_col":0}}},{"name":"[6.volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?](#volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?)","kind":"section_4","ident_start":609,"ident_end":800,"extent_start":604,"extent_end":801,"fully_qualified_name":"[6.volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?](#volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?)","ident_utf16":{"start":{"line_number":9,"utf16_col":5},"end":{"line_number":9,"utf16_col":84}},"extent_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":10,"utf16_col":0}}},{"name":"[7.Java中线程的状态是怎么样的?](#Java中线程的状态是怎么样的?)","kind":"section_4","ident_start":806,"ident_end":893,"extent_start":801,"extent_end":894,"fully_qualified_name":"[7.Java中线程的状态是怎么样的?](#Java中线程的状态是怎么样的?)","ident_utf16":{"start":{"line_number":10,"utf16_col":5},"end":{"line_number":10,"utf16_col":44}},"extent_utf16":{"start":{"line_number":10,"utf16_col":0},"end":{"line_number":11,"utf16_col":0}}},{"name":"[8.wait(),join(),sleep()方法有什么作用?](#wait(),join(),sleep()方法有什么作用?)","kind":"section_4","ident_start":899,"ident_end":1004,"extent_start":894,"extent_end":1005,"fully_qualified_name":"[8.wait(),join(),sleep()方法有什么作用?](#wait(),join(),sleep()方法有什么作用?)","ident_utf16":{"start":{"line_number":11,"utf16_col":5},"end":{"line_number":11,"utf16_col":70}},"extent_utf16":{"start":{"line_number":11,"utf16_col":0},"end":{"line_number":12,"utf16_col":0}}},{"name":"[9.Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?](#Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?)","kind":"section_4","ident_start":1010,"ident_end":1147,"extent_start":1005,"extent_end":1148,"fully_qualified_name":"[9.Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?](#Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?)","ident_utf16":{"start":{"line_number":12,"utf16_col":5},"end":{"line_number":12,"utf16_col":118}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":13,"utf16_col":0}}},{"name":"[10.谈一谈你对线程中断的理解?](#谈一谈你对线程中断的理解?)","kind":"section_4","ident_start":1153,"ident_end":1239,"extent_start":1148,"extent_end":1240,"fully_qualified_name":"[10.谈一谈你对线程中断的理解?](#谈一谈你对线程中断的理解?)","ident_utf16":{"start":{"line_number":13,"utf16_col":5},"end":{"line_number":13,"utf16_col":39}},"extent_utf16":{"start":{"line_number":13,"utf16_col":0},"end":{"line_number":14,"utf16_col":0}}},{"name":"[11.线程间怎么通信?](#线程间怎么通信?)","kind":"section_4","ident_start":1245,"ident_end":1301,"extent_start":1240,"extent_end":1302,"fully_qualified_name":"[11.线程间怎么通信?](#线程间怎么通信?)","ident_utf16":{"start":{"line_number":14,"utf16_col":5},"end":{"line_number":14,"utf16_col":29}},"extent_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":15,"utf16_col":0}}},{"name":"[12.怎么实现实现一个生产者消费者?](#怎么实现实现一个生产者消费者?)","kind":"section_4","ident_start":1307,"ident_end":1405,"extent_start":1302,"extent_end":1406,"fully_qualified_name":"[12.怎么实现实现一个生产者消费者?](#怎么实现实现一个生产者消费者?)","ident_utf16":{"start":{"line_number":15,"utf16_col":5},"end":{"line_number":15,"utf16_col":43}},"extent_utf16":{"start":{"line_number":15,"utf16_col":0},"end":{"line_number":16,"utf16_col":0}}},{"name":"[13.谈一谈你对线程池的理解?](#谈一谈你对线程池的理解?)","kind":"section_4","ident_start":1411,"ident_end":1491,"extent_start":1406,"extent_end":1492,"fully_qualified_name":"[13.谈一谈你对线程池的理解?](#谈一谈你对线程池的理解?)","ident_utf16":{"start":{"line_number":16,"utf16_col":5},"end":{"line_number":16,"utf16_col":37}},"extent_utf16":{"start":{"line_number":16,"utf16_col":0},"end":{"line_number":17,"utf16_col":0}}},{"name":"[14.线程池有哪些状态?](#线程池有哪些状态?)","kind":"section_4","ident_start":1497,"ident_end":1559,"extent_start":1492,"extent_end":1561,"fully_qualified_name":"[14.线程池有哪些状态?](#线程池有哪些状态?)","ident_utf16":{"start":{"line_number":17,"utf16_col":5},"end":{"line_number":17,"utf16_col":31}},"extent_utf16":{"start":{"line_number":17,"utf16_col":0},"end":{"line_number":19,"utf16_col":0}}},{"name":"进程与线程的区别是什么?","kind":"section_3","ident_start":1565,"ident_end":1601,"extent_start":1561,"extent_end":6521,"fully_qualified_name":"进程与线程的区别是什么?","ident_utf16":{"start":{"line_number":19,"utf16_col":4},"end":{"line_number":19,"utf16_col":16}},"extent_utf16":{"start":{"line_number":19,"utf16_col":0},"end":{"line_number":80,"utf16_col":0}}},{"name":"批处理操作系统","kind":"section_4","ident_start":1608,"ident_end":1629,"extent_start":1603,"extent_end":2316,"fully_qualified_name":"批处理操作系统","ident_utf16":{"start":{"line_number":21,"utf16_col":5},"end":{"line_number":21,"utf16_col":12}},"extent_utf16":{"start":{"line_number":21,"utf16_col":0},"end":{"line_number":27,"utf16_col":0}}},{"name":"进程的提出","kind":"section_4","ident_start":2321,"ident_end":2336,"extent_start":2316,"extent_end":3041,"fully_qualified_name":"进程的提出","ident_utf16":{"start":{"line_number":27,"utf16_col":5},"end":{"line_number":27,"utf16_col":10}},"extent_utf16":{"start":{"line_number":27,"utf16_col":0},"end":{"line_number":31,"utf16_col":0}}},{"name":"线程的提出","kind":"section_4","ident_start":3046,"ident_end":3061,"extent_start":3041,"extent_end":3514,"fully_qualified_name":"线程的提出","ident_utf16":{"start":{"line_number":31,"utf16_col":5},"end":{"line_number":31,"utf16_col":10}},"extent_utf16":{"start":{"line_number":31,"utf16_col":0},"end":{"line_number":35,"utf16_col":0}}},{"name":"进程和线程的区别","kind":"section_4","ident_start":3519,"ident_end":3543,"extent_start":3514,"extent_end":4772,"fully_qualified_name":"进程和线程的区别","ident_utf16":{"start":{"line_number":35,"utf16_col":5},"end":{"line_number":35,"utf16_col":13}},"extent_utf16":{"start":{"line_number":35,"utf16_col":0},"end":{"line_number":47,"utf16_col":0}}},{"name":"独立性","kind":"section_4","ident_start":4777,"ident_end":4786,"extent_start":4772,"extent_end":5025,"fully_qualified_name":"独立性","ident_utf16":{"start":{"line_number":47,"utf16_col":5},"end":{"line_number":47,"utf16_col":8}},"extent_utf16":{"start":{"line_number":47,"utf16_col":0},"end":{"line_number":51,"utf16_col":0}}},{"name":"动态性","kind":"section_4","ident_start":5030,"ident_end":5039,"extent_start":5025,"extent_end":5554,"fully_qualified_name":"动态性","ident_utf16":{"start":{"line_number":51,"utf16_col":5},"end":{"line_number":51,"utf16_col":8}},"extent_utf16":{"start":{"line_number":51,"utf16_col":0},"end":{"line_number":67,"utf16_col":0}}},{"name":"并发性","kind":"section_4","ident_start":5559,"ident_end":5568,"extent_start":5554,"extent_end":5829,"fully_qualified_name":"并发性","ident_utf16":{"start":{"line_number":67,"utf16_col":5},"end":{"line_number":67,"utf16_col":8}},"extent_utf16":{"start":{"line_number":67,"utf16_col":0},"end":{"line_number":72,"utf16_col":0}}},{"name":"PS:虚拟内存","kind":"section_4","ident_start":5834,"ident_end":5849,"extent_start":5829,"extent_end":6144,"fully_qualified_name":"PS:虚拟内存","ident_utf16":{"start":{"line_number":72,"utf16_col":5},"end":{"line_number":72,"utf16_col":12}},"extent_utf16":{"start":{"line_number":72,"utf16_col":0},"end":{"line_number":76,"utf16_col":0}}},{"name":"PS:虚拟地址空间","kind":"section_4","ident_start":6149,"ident_end":6170,"extent_start":6144,"extent_end":6521,"fully_qualified_name":"PS:虚拟地址空间","ident_utf16":{"start":{"line_number":76,"utf16_col":5},"end":{"line_number":76,"utf16_col":14}},"extent_utf16":{"start":{"line_number":76,"utf16_col":0},"end":{"line_number":80,"utf16_col":0}}},{"name":"进程间如何通信?","kind":"section_3","ident_start":6525,"ident_end":6549,"extent_start":6521,"extent_end":6821,"fully_qualified_name":"进程间如何通信?","ident_utf16":{"start":{"line_number":80,"utf16_col":4},"end":{"line_number":80,"utf16_col":12}},"extent_utf16":{"start":{"line_number":80,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"管道","kind":"section_4","ident_start":6600,"ident_end":6606,"extent_start":6595,"extent_end":6821,"fully_qualified_name":"管道","ident_utf16":{"start":{"line_number":84,"utf16_col":5},"end":{"line_number":84,"utf16_col":7}},"extent_utf16":{"start":{"line_number":84,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"Java中创建线程有哪些方式?","kind":"section_3","ident_start":6825,"ident_end":6860,"extent_start":6821,"extent_end":16185,"fully_qualified_name":"Java中创建线程有哪些方式?","ident_utf16":{"start":{"line_number":93,"utf16_col":4},"end":{"line_number":93,"utf16_col":19}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":330,"utf16_col":0}}},{"name":"第一种 继承Thread类,重写Run方法","kind":"section_4","ident_start":6867,"ident_end":6910,"extent_start":6862,"extent_end":11221,"fully_qualified_name":"第一种 继承Thread类,重写Run方法","ident_utf16":{"start":{"line_number":95,"utf16_col":5},"end":{"line_number":95,"utf16_col":26}},"extent_utf16":{"start":{"line_number":95,"utf16_col":0},"end":{"line_number":183,"utf16_col":0}}},{"name":"执行原理","kind":"section_5","ident_start":8812,"ident_end":8824,"extent_start":8806,"extent_end":10299,"fully_qualified_name":"执行原理","ident_utf16":{"start":{"line_number":138,"utf16_col":6},"end":{"line_number":138,"utf16_col":10}},"extent_utf16":{"start":{"line_number":138,"utf16_col":0},"end":{"line_number":173,"utf16_col":0}}},{"name":"注意事项:","kind":"section_5","ident_start":10305,"ident_end":10320,"extent_start":10299,"extent_end":11013,"fully_qualified_name":"注意事项:","ident_utf16":{"start":{"line_number":173,"utf16_col":6},"end":{"line_number":173,"utf16_col":11}},"extent_utf16":{"start":{"line_number":173,"utf16_col":0},"end":{"line_number":179,"utf16_col":0}}},{"name":"总结","kind":"section_5","ident_start":11019,"ident_end":11025,"extent_start":11013,"extent_end":11221,"fully_qualified_name":"总结","ident_utf16":{"start":{"line_number":179,"utf16_col":6},"end":{"line_number":179,"utf16_col":8}},"extent_utf16":{"start":{"line_number":179,"utf16_col":0},"end":{"line_number":183,"utf16_col":0}}},{"name":"第二种 实现Runnable接口","kind":"section_4","ident_start":11226,"ident_end":11256,"extent_start":11221,"extent_end":13556,"fully_qualified_name":"第二种 实现Runnable接口","ident_utf16":{"start":{"line_number":183,"utf16_col":5},"end":{"line_number":183,"utf16_col":21}},"extent_utf16":{"start":{"line_number":183,"utf16_col":0},"end":{"line_number":259,"utf16_col":0}}},{"name":"原理","kind":"section_5","ident_start":12105,"ident_end":12111,"extent_start":12099,"extent_end":12382,"fully_qualified_name":"原理","ident_utf16":{"start":{"line_number":205,"utf16_col":6},"end":{"line_number":205,"utf16_col":8}},"extent_utf16":{"start":{"line_number":205,"utf16_col":0},"end":{"line_number":218,"utf16_col":0}}},{"name":"另外一种写法","kind":"section_5","ident_start":12388,"ident_end":12406,"extent_start":12382,"extent_end":12479,"fully_qualified_name":"另外一种写法","ident_utf16":{"start":{"line_number":218,"utf16_col":6},"end":{"line_number":218,"utf16_col":12}},"extent_utf16":{"start":{"line_number":218,"utf16_col":0},"end":{"line_number":222,"utf16_col":0}}},{"name":"匿名内部类","kind":"section_5","ident_start":12485,"ident_end":12500,"extent_start":12479,"extent_end":12839,"fully_qualified_name":"匿名内部类","ident_utf16":{"start":{"line_number":222,"utf16_col":6},"end":{"line_number":222,"utf16_col":11}},"extent_utf16":{"start":{"line_number":222,"utf16_col":0},"end":{"line_number":235,"utf16_col":0}}},{"name":"Lamda表达式","kind":"section_5","ident_start":12845,"ident_end":12859,"extent_start":12839,"extent_end":13415,"fully_qualified_name":"Lamda表达式","ident_utf16":{"start":{"line_number":235,"utf16_col":6},"end":{"line_number":235,"utf16_col":14}},"extent_utf16":{"start":{"line_number":235,"utf16_col":0},"end":{"line_number":255,"utf16_col":0}}},{"name":"总结","kind":"section_5","ident_start":13421,"ident_end":13427,"extent_start":13415,"extent_end":13556,"fully_qualified_name":"总结","ident_utf16":{"start":{"line_number":255,"utf16_col":6},"end":{"line_number":255,"utf16_col":8}},"extent_utf16":{"start":{"line_number":255,"utf16_col":0},"end":{"line_number":259,"utf16_col":0}}},{"name":"第三种 实现Callable接口","kind":"section_4","ident_start":13561,"ident_end":13591,"extent_start":13556,"extent_end":16185,"fully_qualified_name":"第三种 实现Callable接口","ident_utf16":{"start":{"line_number":259,"utf16_col":5},"end":{"line_number":259,"utf16_col":21}},"extent_utf16":{"start":{"line_number":259,"utf16_col":0},"end":{"line_number":330,"utf16_col":0}}},{"name":"Java中的Runnable、Callable、Future、FutureTask的区别和联系?","kind":"section_3","ident_start":16189,"ident_end":16261,"extent_start":16185,"extent_end":19239,"fully_qualified_name":"Java中的Runnable、Callable、Future、FutureTask的区别和联系?","ident_utf16":{"start":{"line_number":330,"utf16_col":4},"end":{"line_number":330,"utf16_col":52}},"extent_utf16":{"start":{"line_number":330,"utf16_col":0},"end":{"line_number":419,"utf16_col":0}}},{"name":"Runnable","kind":"section_5","ident_start":16479,"ident_end":16487,"extent_start":16473,"extent_end":16837,"fully_qualified_name":"Runnable","ident_utf16":{"start":{"line_number":333,"utf16_col":6},"end":{"line_number":333,"utf16_col":14}},"extent_utf16":{"start":{"line_number":333,"utf16_col":0},"end":{"line_number":343,"utf16_col":0}}},{"name":"Callable","kind":"section_5","ident_start":16843,"ident_end":16851,"extent_start":16837,"extent_end":17084,"fully_qualified_name":"Callable","ident_utf16":{"start":{"line_number":343,"utf16_col":6},"end":{"line_number":343,"utf16_col":14}},"extent_utf16":{"start":{"line_number":343,"utf16_col":0},"end":{"line_number":353,"utf16_col":0}}},{"name":"Future","kind":"section_5","ident_start":17090,"ident_end":17096,"extent_start":17084,"extent_end":17983,"fully_qualified_name":"Future","ident_utf16":{"start":{"line_number":353,"utf16_col":6},"end":{"line_number":353,"utf16_col":12}},"extent_utf16":{"start":{"line_number":353,"utf16_col":0},"end":{"line_number":371,"utf16_col":0}}},{"name":"FutureTask","kind":"section_5","ident_start":17989,"ident_end":17999,"extent_start":17983,"extent_end":18376,"fully_qualified_name":"FutureTask","ident_utf16":{"start":{"line_number":371,"utf16_col":6},"end":{"line_number":371,"utf16_col":16}},"extent_utf16":{"start":{"line_number":371,"utf16_col":0},"end":{"line_number":385,"utf16_col":0}}},{"name":"使用案例","kind":"section_5","ident_start":18382,"ident_end":18394,"extent_start":18376,"extent_end":19239,"fully_qualified_name":"使用案例","ident_utf16":{"start":{"line_number":385,"utf16_col":6},"end":{"line_number":385,"utf16_col":10}},"extent_utf16":{"start":{"line_number":385,"utf16_col":0},"end":{"line_number":419,"utf16_col":0}}},{"name":"Java中单例有哪些写法?","kind":"section_3","ident_start":19243,"ident_end":19274,"extent_start":19239,"extent_end":25801,"fully_qualified_name":"Java中单例有哪些写法?","ident_utf16":{"start":{"line_number":419,"utf16_col":4},"end":{"line_number":419,"utf16_col":17}},"extent_utf16":{"start":{"line_number":419,"utf16_col":0},"end":{"line_number":559,"utf16_col":0}}},{"name":"第1种 不加锁(裸奔写法)","kind":"section_4","ident_start":19723,"ident_end":19758,"extent_start":19718,"extent_end":20153,"fully_qualified_name":"第1种 不加锁(裸奔写法)","ident_utf16":{"start":{"line_number":429,"utf16_col":5},"end":{"line_number":429,"utf16_col":18}},"extent_utf16":{"start":{"line_number":429,"utf16_col":0},"end":{"line_number":444,"utf16_col":0}}},{"name":"第2种-对方法加sychronize锁(俗称的懒汉模式)","kind":"section_4","ident_start":20158,"ident_end":20214,"extent_start":20153,"extent_end":20562,"fully_qualified_name":"第2种-对方法加sychronize锁(俗称的懒汉模式)","ident_utf16":{"start":{"line_number":444,"utf16_col":5},"end":{"line_number":444,"utf16_col":33}},"extent_utf16":{"start":{"line_number":444,"utf16_col":0},"end":{"line_number":458,"utf16_col":0}}},{"name":"第3种-使用静态变量(俗称的饿汉模式)","kind":"section_4","ident_start":20567,"ident_end":20616,"extent_start":20562,"extent_end":20973,"fully_qualified_name":"第3种-使用静态变量(俗称的饿汉模式)","ident_utf16":{"start":{"line_number":458,"utf16_col":5},"end":{"line_number":458,"utf16_col":24}},"extent_utf16":{"start":{"line_number":458,"utf16_col":0},"end":{"line_number":470,"utf16_col":0}}},{"name":"第4种-使用双重检查锁定","kind":"section_4","ident_start":20978,"ident_end":21010,"extent_start":20973,"extent_end":22695,"fully_qualified_name":"第4种-使用双重检查锁定","ident_utf16":{"start":{"line_number":470,"utf16_col":5},"end":{"line_number":470,"utf16_col":17}},"extent_utf16":{"start":{"line_number":470,"utf16_col":0},"end":{"line_number":502,"utf16_col":0}}},{"name":"第5种 基于 volatile 的双重检查锁定的解决方案","kind":"section_4","ident_start":22700,"ident_end":22760,"extent_start":22695,"extent_end":24360,"fully_qualified_name":"第5种 基于 volatile 的双重检查锁定的解决方案","ident_utf16":{"start":{"line_number":502,"utf16_col":5},"end":{"line_number":502,"utf16_col":33}},"extent_utf16":{"start":{"line_number":502,"utf16_col":0},"end":{"line_number":531,"utf16_col":0}}},{"name":"第6种 - 使用静态内部类来实现","kind":"section_4","ident_start":24365,"ident_end":24405,"extent_start":24360,"extent_end":25153,"fully_qualified_name":"第6种 - 使用静态内部类来实现","ident_utf16":{"start":{"line_number":531,"utf16_col":5},"end":{"line_number":531,"utf16_col":21}},"extent_utf16":{"start":{"line_number":531,"utf16_col":0},"end":{"line_number":547,"utf16_col":0}}},{"name":"7.使用枚举来实现单例","kind":"section_4","ident_start":25158,"ident_end":25187,"extent_start":25153,"extent_end":25801,"fully_qualified_name":"7.使用枚举来实现单例","ident_utf16":{"start":{"line_number":547,"utf16_col":5},"end":{"line_number":547,"utf16_col":16}},"extent_utf16":{"start":{"line_number":547,"utf16_col":0},"end":{"line_number":559,"utf16_col":0}}},{"name":"如何解决序列化时可以创建出单例对象的问题?","kind":"section_3","ident_start":25805,"ident_end":25866,"extent_start":25801,"extent_end":26586,"fully_qualified_name":"如何解决序列化时可以创建出单例对象的问题?","ident_utf16":{"start":{"line_number":559,"utf16_col":4},"end":{"line_number":559,"utf16_col":25}},"extent_utf16":{"start":{"line_number":559,"utf16_col":0},"end":{"line_number":573,"utf16_col":0}}},{"name":"volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?","kind":"section_3","ident_start":26590,"ident_end":26682,"extent_start":26586,"extent_end":29054,"fully_qualified_name":"volatile关键字有什么用?怎么理解可见性,一般什么场景去用可见性?","ident_utf16":{"start":{"line_number":573,"utf16_col":4},"end":{"line_number":573,"utf16_col":40}},"extent_utf16":{"start":{"line_number":573,"utf16_col":0},"end":{"line_number":620,"utf16_col":0}}},{"name":"使用场景","kind":"section_5","ident_start":28265,"ident_end":28277,"extent_start":28259,"extent_end":28279,"fully_qualified_name":"使用场景","ident_utf16":{"start":{"line_number":593,"utf16_col":6},"end":{"line_number":593,"utf16_col":10}},"extent_utf16":{"start":{"line_number":593,"utf16_col":0},"end":{"line_number":595,"utf16_col":0}}},{"name":"读写锁","kind":"section_5","ident_start":28285,"ident_end":28294,"extent_start":28279,"extent_end":28805,"fully_qualified_name":"读写锁","ident_utf16":{"start":{"line_number":595,"utf16_col":6},"end":{"line_number":595,"utf16_col":9}},"extent_utf16":{"start":{"line_number":595,"utf16_col":0},"end":{"line_number":613,"utf16_col":0}}},{"name":"状态位","kind":"section_5","ident_start":28811,"ident_end":28820,"extent_start":28805,"extent_end":29054,"fully_qualified_name":"状态位","ident_utf16":{"start":{"line_number":613,"utf16_col":6},"end":{"line_number":613,"utf16_col":9}},"extent_utf16":{"start":{"line_number":613,"utf16_col":0},"end":{"line_number":620,"utf16_col":0}}},{"name":"Java中线程的状态是怎么样的?","kind":"section_3","ident_start":29058,"ident_end":29098,"extent_start":29054,"extent_end":33504,"fully_qualified_name":"Java中线程的状态是怎么样的?","ident_utf16":{"start":{"line_number":620,"utf16_col":4},"end":{"line_number":620,"utf16_col":20}},"extent_utf16":{"start":{"line_number":620,"utf16_col":0},"end":{"line_number":725,"utf16_col":0}}},{"name":"NEW 新建态","kind":"section_4","ident_start":31097,"ident_end":31110,"extent_start":31092,"extent_end":31202,"fully_qualified_name":"NEW 新建态","ident_utf16":{"start":{"line_number":665,"utf16_col":5},"end":{"line_number":665,"utf16_col":12}},"extent_utf16":{"start":{"line_number":665,"utf16_col":0},"end":{"line_number":669,"utf16_col":0}}},{"name":"RUNNABLE 运行态","kind":"section_4","ident_start":31207,"ident_end":31225,"extent_start":31202,"extent_end":31506,"fully_qualified_name":"RUNNABLE 运行态","ident_utf16":{"start":{"line_number":669,"utf16_col":5},"end":{"line_number":669,"utf16_col":17}},"extent_utf16":{"start":{"line_number":669,"utf16_col":0},"end":{"line_number":675,"utf16_col":0}}},{"name":"BLOCKED 阻塞态","kind":"section_4","ident_start":31511,"ident_end":31528,"extent_start":31506,"extent_end":31657,"fully_qualified_name":"BLOCKED 阻塞态","ident_utf16":{"start":{"line_number":675,"utf16_col":5},"end":{"line_number":675,"utf16_col":16}},"extent_utf16":{"start":{"line_number":675,"utf16_col":0},"end":{"line_number":679,"utf16_col":0}}},{"name":"WAITING 等待态","kind":"section_4","ident_start":31662,"ident_end":31679,"extent_start":31657,"extent_end":32117,"fully_qualified_name":"WAITING 等待态","ident_utf16":{"start":{"line_number":679,"utf16_col":5},"end":{"line_number":679,"utf16_col":16}},"extent_utf16":{"start":{"line_number":679,"utf16_col":0},"end":{"line_number":689,"utf16_col":0}}},{"name":"TIMED_WAITING 超时等待状态","kind":"section_4","ident_start":32123,"ident_end":32155,"extent_start":32117,"extent_end":32826,"fully_qualified_name":"TIMED_WAITING 超时等待状态","ident_utf16":{"start":{"line_number":689,"utf16_col":6},"end":{"line_number":689,"utf16_col":26}},"extent_utf16":{"start":{"line_number":689,"utf16_col":0},"end":{"line_number":705,"utf16_col":0}}},{"name":"TERMINATED 终止态","kind":"section_4","ident_start":32831,"ident_end":32851,"extent_start":32826,"extent_end":32900,"fully_qualified_name":"TERMINATED 终止态","ident_utf16":{"start":{"line_number":705,"utf16_col":5},"end":{"line_number":705,"utf16_col":19}},"extent_utf16":{"start":{"line_number":705,"utf16_col":0},"end":{"line_number":709,"utf16_col":0}}},{"name":"状态转换","kind":"section_4","ident_start":32905,"ident_end":32917,"extent_start":32900,"extent_end":33504,"fully_qualified_name":"状态转换","ident_utf16":{"start":{"line_number":709,"utf16_col":5},"end":{"line_number":709,"utf16_col":9}},"extent_utf16":{"start":{"line_number":709,"utf16_col":0},"end":{"line_number":725,"utf16_col":0}}},{"name":"wait(),join(),sleep()方法有什么作用?","kind":"section_3","ident_start":33508,"ident_end":33557,"extent_start":33504,"extent_end":37054,"fully_qualified_name":"wait(),join(),sleep()方法有什么作用?","ident_utf16":{"start":{"line_number":725,"utf16_col":4},"end":{"line_number":725,"utf16_col":33}},"extent_utf16":{"start":{"line_number":725,"utf16_col":0},"end":{"line_number":820,"utf16_col":0}}},{"name":"Object.wait()方法是什么?","kind":"section_4","ident_start":33627,"ident_end":33658,"extent_start":33622,"extent_end":34282,"fully_qualified_name":"Object.wait()方法是什么?","ident_utf16":{"start":{"line_number":729,"utf16_col":5},"end":{"line_number":729,"utf16_col":24}},"extent_utf16":{"start":{"line_number":729,"utf16_col":0},"end":{"line_number":737,"utf16_col":0}}},{"name":"Thread.join()方法是什么?","kind":"section_4","ident_start":34287,"ident_end":34318,"extent_start":34282,"extent_end":36400,"fully_qualified_name":"Thread.join()方法是什么?","ident_utf16":{"start":{"line_number":737,"utf16_col":5},"end":{"line_number":737,"utf16_col":24}},"extent_utf16":{"start":{"line_number":737,"utf16_col":0},"end":{"line_number":804,"utf16_col":0}}},{"name":"sleep()方法是什么?","kind":"section_4","ident_start":36405,"ident_end":36430,"extent_start":36400,"extent_end":37054,"fully_qualified_name":"sleep()方法是什么?","ident_utf16":{"start":{"line_number":804,"utf16_col":5},"end":{"line_number":804,"utf16_col":18}},"extent_utf16":{"start":{"line_number":804,"utf16_col":0},"end":{"line_number":820,"utf16_col":0}}},{"name":"Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?","kind":"section_3","ident_start":37058,"ident_end":37123,"extent_start":37054,"extent_end":39113,"fully_qualified_name":"Thread.sleep(),Object.wait(),LockSupport.park()有什么区别?","ident_utf16":{"start":{"line_number":820,"utf16_col":4},"end":{"line_number":820,"utf16_col":57}},"extent_utf16":{"start":{"line_number":820,"utf16_col":0},"end":{"line_number":838,"utf16_col":0}}},{"name":"谈一谈你对线程中断的理解?","kind":"section_3","ident_start":39117,"ident_end":39156,"extent_start":39113,"extent_end":40169,"fully_qualified_name":"谈一谈你对线程中断的理解?","ident_utf16":{"start":{"line_number":838,"utf16_col":4},"end":{"line_number":838,"utf16_col":17}},"extent_utf16":{"start":{"line_number":838,"utf16_col":0},"end":{"line_number":855,"utf16_col":0}}},{"name":"线程执行的任务可以终止吗?","kind":"section_3","ident_start":40173,"ident_end":40212,"extent_start":40169,"extent_end":41423,"fully_qualified_name":"线程执行的任务可以终止吗?","ident_utf16":{"start":{"line_number":855,"utf16_col":4},"end":{"line_number":855,"utf16_col":17}},"extent_utf16":{"start":{"line_number":855,"utf16_col":0},"end":{"line_number":869,"utf16_col":0}}},{"name":"1.设置中断","kind":"section_5","ident_start":40220,"ident_end":40234,"extent_start":40214,"extent_end":40821,"fully_qualified_name":"1.设置中断","ident_utf16":{"start":{"line_number":857,"utf16_col":6},"end":{"line_number":857,"utf16_col":12}},"extent_utf16":{"start":{"line_number":857,"utf16_col":0},"end":{"line_number":865,"utf16_col":0}}},{"name":"2.线程的stop方法","kind":"section_5","ident_start":40827,"ident_end":40848,"extent_start":40821,"extent_end":41423,"fully_qualified_name":"2.线程的stop方法","ident_utf16":{"start":{"line_number":865,"utf16_col":6},"end":{"line_number":865,"utf16_col":17}},"extent_utf16":{"start":{"line_number":865,"utf16_col":0},"end":{"line_number":869,"utf16_col":0}}},{"name":"让线程顺序执行有哪些方法?","kind":"section_3","ident_start":41427,"ident_end":41466,"extent_start":41423,"extent_end":45934,"fully_qualified_name":"让线程顺序执行有哪些方法?","ident_utf16":{"start":{"line_number":869,"utf16_col":4},"end":{"line_number":869,"utf16_col":17}},"extent_utf16":{"start":{"line_number":869,"utf16_col":0},"end":{"line_number":1010,"utf16_col":0}}},{"name":"1.主线程Join","kind":"section_5","ident_start":41474,"ident_end":41489,"extent_start":41468,"extent_end":42297,"fully_qualified_name":"1.主线程Join","ident_utf16":{"start":{"line_number":871,"utf16_col":6},"end":{"line_number":871,"utf16_col":15}},"extent_utf16":{"start":{"line_number":871,"utf16_col":0},"end":{"line_number":898,"utf16_col":0}}},{"name":"子线程Join","kind":"section_5","ident_start":42303,"ident_end":42316,"extent_start":42297,"extent_end":42955,"fully_qualified_name":"子线程Join","ident_utf16":{"start":{"line_number":898,"utf16_col":6},"end":{"line_number":898,"utf16_col":13}},"extent_utf16":{"start":{"line_number":898,"utf16_col":0},"end":{"line_number":922,"utf16_col":0}}},{"name":"单线程池法","kind":"section_5","ident_start":42961,"ident_end":42976,"extent_start":42955,"extent_end":43305,"fully_qualified_name":"单线程池法","ident_utf16":{"start":{"line_number":922,"utf16_col":6},"end":{"line_number":922,"utf16_col":11}},"extent_utf16":{"start":{"line_number":922,"utf16_col":0},"end":{"line_number":934,"utf16_col":0}}},{"name":"等待通知法(wait和notify)","kind":"section_5","ident_start":43311,"ident_end":43341,"extent_start":43305,"extent_end":44270,"fully_qualified_name":"等待通知法(wait和notify)","ident_utf16":{"start":{"line_number":934,"utf16_col":6},"end":{"line_number":934,"utf16_col":24}},"extent_utf16":{"start":{"line_number":934,"utf16_col":0},"end":{"line_number":961,"utf16_col":0}}},{"name":"等待通知法(await和singal)","kind":"section_5","ident_start":44276,"ident_end":44307,"extent_start":44270,"extent_end":45934,"fully_qualified_name":"等待通知法(await和singal)","ident_utf16":{"start":{"line_number":961,"utf16_col":6},"end":{"line_number":961,"utf16_col":25}},"extent_utf16":{"start":{"line_number":961,"utf16_col":0},"end":{"line_number":1010,"utf16_col":0}}},{"name":"线程间怎么通信?","kind":"section_3","ident_start":45938,"ident_end":45962,"extent_start":45934,"extent_end":51681,"fully_qualified_name":"线程间怎么通信?","ident_utf16":{"start":{"line_number":1010,"utf16_col":4},"end":{"line_number":1010,"utf16_col":12}},"extent_utf16":{"start":{"line_number":1010,"utf16_col":0},"end":{"line_number":1131,"utf16_col":0}}},{"name":"1.synchronized锁","kind":"section_4","ident_start":45969,"ident_end":45986,"extent_start":45964,"extent_end":46068,"fully_qualified_name":"1.synchronized锁","ident_utf16":{"start":{"line_number":1012,"utf16_col":5},"end":{"line_number":1012,"utf16_col":20}},"extent_utf16":{"start":{"line_number":1012,"utf16_col":0},"end":{"line_number":1016,"utf16_col":0}}},{"name":"2.等待/通知机制","kind":"section_4","ident_start":46073,"ident_end":46094,"extent_start":46068,"extent_end":49913,"fully_qualified_name":"2.等待/通知机制","ident_utf16":{"start":{"line_number":1016,"utf16_col":5},"end":{"line_number":1016,"utf16_col":14}},"extent_utf16":{"start":{"line_number":1016,"utf16_col":0},"end":{"line_number":1099,"utf16_col":0}}},{"name":"3.管道","kind":"section_5","ident_start":47920,"ident_end":47928,"extent_start":47914,"extent_end":49913,"fully_qualified_name":"3.管道","ident_utf16":{"start":{"line_number":1055,"utf16_col":6},"end":{"line_number":1055,"utf16_col":10}},"extent_utf16":{"start":{"line_number":1055,"utf16_col":0},"end":{"line_number":1099,"utf16_col":0}}},{"name":"4.Thread.join","kind":"section_4","ident_start":49918,"ident_end":49931,"extent_start":49913,"extent_end":50242,"fully_qualified_name":"4.Thread.join","ident_utf16":{"start":{"line_number":1099,"utf16_col":5},"end":{"line_number":1099,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1099,"utf16_col":0},"end":{"line_number":1103,"utf16_col":0}}},{"name":"5.ThreadLocal的使用","kind":"section_4","ident_start":50247,"ident_end":50269,"extent_start":50242,"extent_end":51681,"fully_qualified_name":"5.ThreadLocal的使用","ident_utf16":{"start":{"line_number":1103,"utf16_col":5},"end":{"line_number":1103,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1103,"utf16_col":0},"end":{"line_number":1131,"utf16_col":0}}},{"name":"怎么实现实现一个生产者消费者?","kind":"section_3","ident_start":51685,"ident_end":51730,"extent_start":51681,"extent_end":61222,"fully_qualified_name":"怎么实现实现一个生产者消费者?","ident_utf16":{"start":{"line_number":1131,"utf16_col":4},"end":{"line_number":1131,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1131,"utf16_col":0},"end":{"line_number":1421,"utf16_col":0}}},{"name":"1.使用Object.wait()和Object.notify()实现","kind":"section_4","ident_start":51737,"ident_end":51782,"extent_start":51732,"extent_end":55340,"fully_qualified_name":"1.使用Object.wait()和Object.notify()实现","ident_utf16":{"start":{"line_number":1133,"utf16_col":5},"end":{"line_number":1133,"utf16_col":40}},"extent_utf16":{"start":{"line_number":1133,"utf16_col":0},"end":{"line_number":1244,"utf16_col":0}}},{"name":"2.使用Lock和Condition来实现","kind":"section_4","ident_start":55345,"ident_end":55378,"extent_start":55340,"extent_end":60021,"fully_qualified_name":"2.使用Lock和Condition来实现","ident_utf16":{"start":{"line_number":1244,"utf16_col":5},"end":{"line_number":1244,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1244,"utf16_col":0},"end":{"line_number":1381,"utf16_col":0}}},{"name":"3.使用BlockingQueue实现","kind":"section_4","ident_start":60026,"ident_end":60053,"extent_start":60021,"extent_end":61222,"fully_qualified_name":"3.使用BlockingQueue实现","ident_utf16":{"start":{"line_number":1381,"utf16_col":5},"end":{"line_number":1381,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1381,"utf16_col":0},"end":{"line_number":1421,"utf16_col":0}}},{"name":"谈一谈你对线程池的理解?","kind":"section_3","ident_start":61226,"ident_end":61262,"extent_start":61222,"extent_end":73048,"fully_qualified_name":"谈一谈你对线程池的理解?","ident_utf16":{"start":{"line_number":1421,"utf16_col":4},"end":{"line_number":1421,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1421,"utf16_col":0},"end":{"line_number":1594,"utf16_col":0}}},{"name":"首先线程池有什么作用?","kind":"section_4","ident_start":61269,"ident_end":61302,"extent_start":61264,"extent_end":61826,"fully_qualified_name":"首先线程池有什么作用?","ident_utf16":{"start":{"line_number":1423,"utf16_col":5},"end":{"line_number":1423,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1423,"utf16_col":0},"end":{"line_number":1433,"utf16_col":0}}},{"name":"线程池有哪些参数?","kind":"section_4","ident_start":61831,"ident_end":61858,"extent_start":61826,"extent_end":67406,"fully_qualified_name":"线程池有哪些参数?","ident_utf16":{"start":{"line_number":1433,"utf16_col":5},"end":{"line_number":1433,"utf16_col":14}},"extent_utf16":{"start":{"line_number":1433,"utf16_col":0},"end":{"line_number":1500,"utf16_col":0}}},{"name":"1.corePoolSize 核心线程数","kind":"section_5","ident_start":62322,"ident_end":62352,"extent_start":62316,"extent_end":63427,"fully_qualified_name":"1.corePoolSize 核心线程数","ident_utf16":{"start":{"line_number":1447,"utf16_col":6},"end":{"line_number":1447,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1447,"utf16_col":0},"end":{"line_number":1461,"utf16_col":0}}},{"name":"2.maximumPoolSize 最大线程数","kind":"section_5","ident_start":63433,"ident_end":63466,"extent_start":63427,"extent_end":63759,"fully_qualified_name":"2.maximumPoolSize 最大线程数","ident_utf16":{"start":{"line_number":1461,"utf16_col":6},"end":{"line_number":1461,"utf16_col":29}},"extent_utf16":{"start":{"line_number":1461,"utf16_col":0},"end":{"line_number":1465,"utf16_col":0}}},{"name":"**3.workQueue 等待队列**","kind":"section_5","ident_start":63765,"ident_end":63793,"extent_start":63759,"extent_end":66789,"fully_qualified_name":"**3.workQueue 等待队列**","ident_utf16":{"start":{"line_number":1465,"utf16_col":6},"end":{"line_number":1465,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1465,"utf16_col":0},"end":{"line_number":1491,"utf16_col":0}}},{"name":"6.ThreadFactory创建线程的工厂","kind":"section_5","ident_start":66795,"ident_end":66831,"extent_start":66789,"extent_end":67406,"fully_qualified_name":"6.ThreadFactory创建线程的工厂","ident_utf16":{"start":{"line_number":1491,"utf16_col":6},"end":{"line_number":1491,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1491,"utf16_col":0},"end":{"line_number":1500,"utf16_col":0}}},{"name":"线程池执行任务的过程?","kind":"section_4","ident_start":67411,"ident_end":67444,"extent_start":67406,"extent_end":67527,"fully_qualified_name":"线程池执行任务的过程?","ident_utf16":{"start":{"line_number":1500,"utf16_col":5},"end":{"line_number":1500,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1500,"utf16_col":0},"end":{"line_number":1504,"utf16_col":0}}},{"name":"Executors提供的四种线程池的使用场景。","kind":"section_4","ident_start":67532,"ident_end":67583,"extent_start":67527,"extent_end":73048,"fully_qualified_name":"Executors提供的四种线程池的使用场景。","ident_utf16":{"start":{"line_number":1504,"utf16_col":5},"end":{"line_number":1504,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1504,"utf16_col":0},"end":{"line_number":1594,"utf16_col":0}}},{"name":"newFixedThreadPool 定长线程池","kind":"section_5","ident_start":67638,"ident_end":67672,"extent_start":67632,"extent_end":69356,"fully_qualified_name":"newFixedThreadPool 定长线程池","ident_utf16":{"start":{"line_number":1508,"utf16_col":6},"end":{"line_number":1508,"utf16_col":30}},"extent_utf16":{"start":{"line_number":1508,"utf16_col":0},"end":{"line_number":1533,"utf16_col":0}}},{"name":"newSingleThreadExecutor 单线程池","kind":"section_5","ident_start":69362,"ident_end":69398,"extent_start":69356,"extent_end":70015,"fully_qualified_name":"newSingleThreadExecutor 单线程池","ident_utf16":{"start":{"line_number":1533,"utf16_col":6},"end":{"line_number":1533,"utf16_col":34}},"extent_utf16":{"start":{"line_number":1533,"utf16_col":0},"end":{"line_number":1546,"utf16_col":0}}},{"name":"newCachedThreadPool可缓存线程池","kind":"section_5","ident_start":70021,"ident_end":70058,"extent_start":70015,"extent_end":71675,"fully_qualified_name":"newCachedThreadPool可缓存线程池","ident_utf16":{"start":{"line_number":1546,"utf16_col":6},"end":{"line_number":1546,"utf16_col":31}},"extent_utf16":{"start":{"line_number":1546,"utf16_col":0},"end":{"line_number":1570,"utf16_col":0}}},{"name":"newScheduledThreadPool定时执行线程池","kind":"section_5","ident_start":71681,"ident_end":71724,"extent_start":71675,"extent_end":72351,"fully_qualified_name":"newScheduledThreadPool定时执行线程池","ident_utf16":{"start":{"line_number":1570,"utf16_col":6},"end":{"line_number":1570,"utf16_col":35}},"extent_utf16":{"start":{"line_number":1570,"utf16_col":0},"end":{"line_number":1584,"utf16_col":0}}},{"name":"为什么不建议大家使用Executors的四种线程池呢?","kind":"section_5","ident_start":72357,"ident_end":72420,"extent_start":72351,"extent_end":73048,"fully_qualified_name":"为什么不建议大家使用Executors的四种线程池呢?","ident_utf16":{"start":{"line_number":1584,"utf16_col":6},"end":{"line_number":1584,"utf16_col":33}},"extent_utf16":{"start":{"line_number":1584,"utf16_col":0},"end":{"line_number":1594,"utf16_col":0}}},{"name":"线程池有哪些状态?","kind":"section_3","ident_start":73052,"ident_end":73079,"extent_start":73048,"extent_end":73902,"fully_qualified_name":"线程池有哪些状态?","ident_utf16":{"start":{"line_number":1594,"utf16_col":4},"end":{"line_number":1594,"utf16_col":13}},"extent_utf16":{"start":{"line_number":1594,"utf16_col":0},"end":{"line_number":1610,"utf16_col":0}}},{"name":"怎么根据业务场景确定线程池的参数corePoolSize和maximumPoolSize?","kind":"section_3","ident_start":73906,"ident_end":73987,"extent_start":73902,"extent_end":78250,"fully_qualified_name":"怎么根据业务场景确定线程池的参数corePoolSize和maximumPoolSize?","ident_utf16":{"start":{"line_number":1610,"utf16_col":4},"end":{"line_number":1610,"utf16_col":49}},"extent_utf16":{"start":{"line_number":1610,"utf16_col":0},"end":{"line_number":1665,"utf16_col":0}}},{"name":"方法一 计算密集型任务","kind":"section_4","ident_start":73994,"ident_end":74025,"extent_start":73989,"extent_end":74608,"fully_qualified_name":"方法一 计算密集型任务","ident_utf16":{"start":{"line_number":1612,"utf16_col":5},"end":{"line_number":1612,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1612,"utf16_col":0},"end":{"line_number":1617,"utf16_col":0}}},{"name":"方法二 IO密集型任务","kind":"section_4","ident_start":74613,"ident_end":74640,"extent_start":74608,"extent_end":75750,"fully_qualified_name":"方法二 IO密集型任务","ident_utf16":{"start":{"line_number":1617,"utf16_col":5},"end":{"line_number":1617,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1617,"utf16_col":0},"end":{"line_number":1632,"utf16_col":0}}},{"name":"不足","kind":"section_5","ident_start":75502,"ident_end":75508,"extent_start":75496,"extent_end":75750,"fully_qualified_name":"不足","ident_utf16":{"start":{"line_number":1629,"utf16_col":6},"end":{"line_number":1629,"utf16_col":8}},"extent_utf16":{"start":{"line_number":1629,"utf16_col":0},"end":{"line_number":1632,"utf16_col":0}}},{"name":"方法三 动态化线程池","kind":"section_4","ident_start":75755,"ident_end":75783,"extent_start":75750,"extent_end":78250,"fully_qualified_name":"方法三 动态化线程池","ident_utf16":{"start":{"line_number":1632,"utf16_col":5},"end":{"line_number":1632,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1632,"utf16_col":0},"end":{"line_number":1665,"utf16_col":0}}},{"name":"追求响应时间的任务","kind":"section_5","ident_start":75884,"ident_end":75911,"extent_start":75878,"extent_end":76518,"fully_qualified_name":"追求响应时间的任务","ident_utf16":{"start":{"line_number":1634,"utf16_col":6},"end":{"line_number":1634,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1634,"utf16_col":0},"end":{"line_number":1637,"utf16_col":0}}},{"name":"追求高吞吐量的任务","kind":"section_5","ident_start":76524,"ident_end":76551,"extent_start":76518,"extent_end":78250,"fully_qualified_name":"追求高吞吐量的任务","ident_utf16":{"start":{"line_number":1637,"utf16_col":6},"end":{"line_number":1637,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1637,"utf16_col":0},"end":{"line_number":1665,"utf16_col":0}}},{"name":"ThreadLocal是什么?怎么避免内存泄露?","kind":"section_3","ident_start":78254,"ident_end":78304,"extent_start":78250,"extent_end":82265,"fully_qualified_name":"ThreadLocal是什么?怎么避免内存泄露?","ident_utf16":{"start":{"line_number":1665,"utf16_col":4},"end":{"line_number":1665,"utf16_col":28}},"extent_utf16":{"start":{"line_number":1665,"utf16_col":0},"end":{"line_number":1740,"utf16_col":0}}},{"name":"使用场景:","kind":"section_5","ident_start":78519,"ident_end":78534,"extent_start":78513,"extent_end":79380,"fully_qualified_name":"使用场景:","ident_utf16":{"start":{"line_number":1668,"utf16_col":6},"end":{"line_number":1668,"utf16_col":11}},"extent_utf16":{"start":{"line_number":1668,"utf16_col":0},"end":{"line_number":1686,"utf16_col":0}}},{"name":"实现原理","kind":"section_5","ident_start":79386,"ident_end":79398,"extent_start":79380,"extent_end":80529,"fully_qualified_name":"实现原理","ident_utf16":{"start":{"line_number":1686,"utf16_col":6},"end":{"line_number":1686,"utf16_col":10}},"extent_utf16":{"start":{"line_number":1686,"utf16_col":0},"end":{"line_number":1711,"utf16_col":0}}},{"name":"ThreadLocal中的Entry的key使用了弱引用,为什么使用弱引用?","kind":"section_5","ident_start":80535,"ident_end":80611,"extent_start":80529,"extent_end":82265,"fully_qualified_name":"ThreadLocal中的Entry的key使用了弱引用,为什么使用弱引用?","ident_utf16":{"start":{"line_number":1711,"utf16_col":6},"end":{"line_number":1711,"utf16_col":44}},"extent_utf16":{"start":{"line_number":1711,"utf16_col":0},"end":{"line_number":1740,"utf16_col":0}}},{"name":"Random类取随机数的原理是什么?","kind":"section_3","ident_start":82269,"ident_end":82311,"extent_start":82265,"extent_end":85299,"fully_qualified_name":"Random类取随机数的原理是什么?","ident_utf16":{"start":{"line_number":1740,"utf16_col":4},"end":{"line_number":1740,"utf16_col":22}},"extent_utf16":{"start":{"line_number":1740,"utf16_col":0},"end":{"line_number":1824,"utf16_col":0}}},{"name":"僵尸进程,孤儿进程,守护进程是什么?","kind":"section_3","ident_start":85303,"ident_end":85357,"extent_start":85299,"extent_end":86156,"fully_qualified_name":"僵尸进程,孤儿进程,守护进程是什么?","ident_utf16":{"start":{"line_number":1824,"utf16_col":4},"end":{"line_number":1824,"utf16_col":22}},"extent_utf16":{"start":{"line_number":1824,"utf16_col":0},"end":{"line_number":1832,"utf16_col":0}}},{"name":"BlockingQueue的原理是怎么样的?","kind":"section_3","ident_start":86160,"ident_end":86200,"extent_start":86156,"extent_end":86249,"fully_qualified_name":"BlockingQueue的原理是怎么样的?","ident_utf16":{"start":{"line_number":1832,"utf16_col":4},"end":{"line_number":1832,"utf16_col":26}},"extent_utf16":{"start":{"line_number":1832,"utf16_col":0},"end":{"line_number":1836,"utf16_col":0}}},{"name":"进程间通信的方式","kind":"section_3","ident_start":86253,"ident_end":86277,"extent_start":86249,"extent_end":86335,"fully_qualified_name":"进程间通信的方式","ident_utf16":{"start":{"line_number":1836,"utf16_col":4},"end":{"line_number":1836,"utf16_col":12}},"extent_utf16":{"start":{"line_number":1836,"utf16_col":0},"end":{"line_number":1840,"utf16_col":0}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/NotFound9/interviewGuide/branches":{"post":"o15UNBDbd0IpPPWRBc7VpanoB0z3-4dEV5ZXYrZb8Q_gT3zQhsOULMuLaNU_9C7o-XaXXYMoWVHRRMXUFHUvBg"},"/repos/preferences":{"post":"fsG4XHdhwEVCvTVxfENSfx9mBpvl8q5QktdYvnAbmU0C8WLrU7nrpxH6m4NVikWg60N5hIn5-hUjUdPCavy3Nw"}}},"title":"interviewGuide/docs/JavaMultiThread.md at master · NotFound9/interviewGuide","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-1583894afd38.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-67668e8c2caa.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"copilot_conversational_ux_embedding_update":false,"copilot_smell_icebreaker_ux":true,"copilot_workspace":false,"accessible_code_button":true}}}</script> <div data-target="react-app.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.hOfjFo{padding:0;}/*!sc*/ .oDGAe{max-width:100%;margin-left:auto;margin-right:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}/*!sc*/ .kowOcT{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1 1 100%;-ms-flex:1 1 100%;flex:1 1 100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;}/*!sc*/ .gISSDQ{width:100%;}/*!sc*/ @media screen and (min-width:544px){.gISSDQ{width:100%;}}/*!sc*/ @media screen and (min-width:768px){.gISSDQ{width:auto;}}/*!sc*/ .fLEPlD{display:none;-webkit-order:1;-ms-flex-order:1;order:1;width:100%;margin-left:0;margin-right:0;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-bottom:0;min-width:0;}/*!sc*/ @media screen and (min-width:544px){.fLEPlD{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}/*!sc*/ @media screen and (min-width:768px){.fLEPlD{width:auto;margin-top:0 !important;margin-bottom:0 !important;position:-webkit-sticky;position:sticky;top:0px;max-height:100vh !important;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-right:0;height:100vh;}}/*!sc*/ @media print,screen and (max-width:1011px) and (min-width:768px){.fLEPlD{display:none;}}/*!sc*/ .hPvFuC{margin-left:0;margin-right:0;display:none;margin-top:0;}/*!sc*/ @media screen and (min-width:768px){.hPvFuC{margin-left:0 !important;margin-right:0 !important;}}/*!sc*/ .fFSoPl{--pane-min-width:256px;--pane-max-width-diff:511px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));width:100%;padding:0;}/*!sc*/ @media screen and (min-width:544px){}/*!sc*/ @media screen and (min-width:768px){.fFSoPl{width:clamp(var(--pane-min-width),var(--pane-width),var(--pane-max-width));overflow:auto;}}/*!sc*/ @media screen and (min-width:1280px){.fFSoPl{--pane-max-width-diff:959px;}}/*!sc*/ .bTBnTW{height:100%;position:relative;display:none;margin-left:0;}/*!sc*/ .bHLmSv{position:absolute;inset:0 -2px;cursor:col-resize;background-color:transparent;-webkit-transition-delay:0.1s;transition-delay:0.1s;}/*!sc*/ .bHLmSv:hover{background-color:var(--bgColor-neutral-muted,var(--color-neutral-muted,rgba(175,184,193,0.2)));}/*!sc*/ .iKqMNA{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-order:2;-ms-flex-order:2;order:2;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;min-width:1px;margin-right:auto;}/*!sc*/ @media print{.iKqMNA{display:-webkit-box !important;display:-webkit-flex !important;display:-ms-flexbox !important;display:flex !important;}}/*!sc*/ .FxAyp{width:100%;max-width:100%;margin-left:auto;margin-right:auto;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0;}/*!sc*/ .leYMvG{margin-left:auto;margin-right:auto;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-bottom:40px;max-width:100%;margin-top:0;}/*!sc*/ .KMPzq{display:inherit;}/*!sc*/ .hfKjHv{width:100%;}/*!sc*/ .gZWyZE{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;}/*!sc*/ .dwYKDk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;gap:8px;}/*!sc*/ .ibcGmb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;min-width:0;}/*!sc*/ .hKaEJF{display:block;margin-right:8px;}/*!sc*/ @media screen and (min-width:1360px){.hKaEJF{display:block;}}/*!sc*/ .XosP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:14px;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .hzSPyu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;pointer-events:none;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dbrgmi{font-size:14px;min-width:0;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .dHJiml{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;padding-right:8px;min-width:0;}/*!sc*/ .cEytCf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:16px;min-width:0;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .fzFXnm{max-width:100%;}/*!sc*/ .iMnkmv{max-width:100%;list-style:none;display:inline-block;}/*!sc*/ .ghzDag{display:inline-block;max-width:100%;}/*!sc*/ .kHuKdh{font-weight:600;}/*!sc*/ .kgiVEz{font-weight:400;}/*!sc*/ .jGhzSQ{font-weight:600;display:inline-block;max-width:100%;font-size:16px;}/*!sc*/ .faNtbn{min-height:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;}/*!sc*/ .fmQaBv{margin-left:4px;margin-right:4px;}/*!sc*/ .dJxjrT{margin-left:16px;margin-right:16px;}/*!sc*/ .eFxKDQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .ldRxiI{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;}/*!sc*/ .fVkfyA{width:100%;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;min-width:0;margin-right:0;}/*!sc*/ .gNAmSV{height:40px;padding-left:4px;padding-bottom:16px;}/*!sc*/ .jNEwzY{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .bsDwxw{font-size:12px;-webkit-flex:auto;-ms-flex:auto;flex:auto;padding-right:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));min-width:0;}/*!sc*/ .jdLMhu{top:0px;z-index:4;background:var(--bgColor-default,var(--color-canvas-default));position:-webkit-sticky;position:sticky;}/*!sc*/ .tOISc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;position:absolute;}/*!sc*/ .hqwSEx{display:none;min-width:0;padding-top:8px;padding-bottom:8px;}/*!sc*/ .bDVoEr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;overflow:hidden;margin-left:8px;margin-right:8px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:100%;}/*!sc*/ .kYLlPM{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .gYjEmn{margin-left:4px;margin-right:8px;}/*!sc*/ .kGqOLL{text-overflow:ellipsis;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .fHind{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:14px;min-width:0;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .dnZoUW{font-weight:600;display:inline-block;max-width:100%;font-size:14px;}/*!sc*/ .kTvpNk{padding-left:8px;padding-top:8px;padding-bottom:8px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));border:1px solid var(--borderColor-default,var(--color-border-default));border-radius:6px 6px 0px 0px;}/*!sc*/ .iNMjfP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:0;}/*!sc*/ .fefCSX{display:block;position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-top:-1px;margin-bottom:-1px;--separator-color:transparent;}/*!sc*/ .fefCSX:not(:last-child){margin-right:1px;}/*!sc*/ .fefCSX:not(:last-child):after{background-color:var(--separator-color);content:"";position:absolute;right:-2px;top:8px;bottom:8px;width:1px;}/*!sc*/ .fefCSX:focus-within:has(:focus-visible){--separator-color:transparent;}/*!sc*/ .fefCSX:first-child{margin-left:-1px;}/*!sc*/ .fefCSX:last-child{margin-right:-1px;}/*!sc*/ .idgUkN{display:block;position:relative;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-top:-1px;margin-bottom:-1px;--separator-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .idgUkN:not(:last-child){margin-right:1px;}/*!sc*/ .idgUkN:not(:last-child):after{background-color:var(--separator-color);content:"";position:absolute;right:-2px;top:8px;bottom:8px;width:1px;}/*!sc*/ .idgUkN:focus-within:has(:focus-visible){--separator-color:transparent;}/*!sc*/ .idgUkN:first-child{margin-left:-1px;}/*!sc*/ .idgUkN:last-child{margin-right:-1px;}/*!sc*/ .kcLCKF{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;margin-right:8px;}/*!sc*/ .kVWtTz{gap:8px;}/*!sc*/ .hGyMdv{border:1px solid;border-top:none;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:0px 0px 6px 6px;min-width:273px;}/*!sc*/ .dceWRL{background-color:var(--bgColor-default,var(--color-canvas-default));border:0px;border-width:0;border-radius:0px 0px 6px 6px;padding:0;min-width:0;margin-top:46px;}/*!sc*/ .dGXHv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;padding-top:8px;padding-bottom:8px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-width:0;position:relative;}/*!sc*/ .bpDFns{position:relative;}/*!sc*/ .iJOeCH{-webkit-flex:1;-ms-flex:1;flex:1;position:relative;min-width:0;}/*!sc*/ .jewUnv{tab-size:8;isolation:isolate;position:relative;overflow:auto;max-width:unset;}/*!sc*/ .cJGaMs{margin:1px 8px;position:absolute;z-index:1;}/*!sc*/ .iGLarr{position:absolute;}/*!sc*/ .gkZUDI{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .cCoXib{position:fixed;top:0;right:0;height:100%;width:15px;-webkit-transition:-webkit-transform 0.3s;-webkit-transition:transform 0.3s;transition:transform 0.3s;z-index:1;}/*!sc*/ .cCoXib:hover{-webkit-transform:scaleX(1.5);-ms-transform:scaleX(1.5);transform:scaleX(1.5);}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"hOfjFo,oDGAe,kowOcT,gISSDQ,fLEPlD,hPvFuC,fFSoPl,bTBnTW,bHLmSv,iKqMNA,FxAyp,leYMvG,KMPzq,hfKjHv,gZWyZE,dwYKDk,ibcGmb,hKaEJF,XosP,gUkoLg,hzSPyu,bZBlpz,lhTYNA,dbrgmi,dHJiml,cEytCf,fzFXnm,iMnkmv,ghzDag,kHuKdh,kgiVEz,jGhzSQ,faNtbn,fmQaBv,dJxjrT,eFxKDQ,dzCJzi,ldRxiI,fVkfyA,gNAmSV,jNEwzY,bsDwxw,jdLMhu,tOISc,hqwSEx,bDVoEr,kYLlPM,gYjEmn,kGqOLL,fHind,dnZoUW,kTvpNk,iNMjfP,fefCSX,idgUkN,kcLCKF,kVWtTz,hGyMdv,dceWRL,dGXHv,bpDFns,iJOeCH,jewUnv,cJGaMs,iGLarr,gkZUDI,cCoXib,"}/*!sc*/ .eMMFM{min-width:0;}/*!sc*/ .eMMFM:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .eMMFM:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .eMMFM:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .eMMFM:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .eMMFM:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .eMMFM:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .eMMFM:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ .HlHVj{padding-left:4px;padding-right:4px;font-weight:400;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:16px;}/*!sc*/ .HlHVj:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .HlHVj:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .HlHVj:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .HlHVj:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .HlHVj:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .HlHVj:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .HlHVj:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ .lauzFl{padding-left:4px;padding-right:4px;font-weight:400;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:14px;}/*!sc*/ .lauzFl:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .lauzFl:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .lauzFl:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .lauzFl:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .lauzFl:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .lauzFl:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .lauzFl:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ data-styled.g3[id="Text__StyledText-sc-17v1xeu-0"]{content:"eMMFM,HlHVj,lauzFl,"}/*!sc*/ .gwqFqs{font-size:14px;line-height:20px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));vertical-align:middle;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));border:1px solid var(--control-borderColor-rest,var(--borderColor-default,var(--color-border-default,#d0d7de)));border-radius:6px;outline:none;box-shadow:var(--shadow-inset,var(--color-primer-shadow-inset,inset 0 1px 0 rgba(208,215,222,0.2)));display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:32px;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .gwqFqs input,.gwqFqs textarea{cursor:text;}/*!sc*/ .gwqFqs select{cursor:pointer;}/*!sc*/ .gwqFqs input::-webkit-input-placeholder,.gwqFqs textarea::-webkit-input-placeholder,.gwqFqs select::-webkit-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::-moz-placeholder,.gwqFqs textarea::-moz-placeholder,.gwqFqs select::-moz-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input:-ms-input-placeholder,.gwqFqs textarea:-ms-input-placeholder,.gwqFqs select:-ms-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::placeholder,.gwqFqs textarea::placeholder,.gwqFqs select::placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs:focus-within{border-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .gwqFqs > textarea{padding:12px;}/*!sc*/ @media (min-width:768px){.gwqFqs{font-size:14px;}}/*!sc*/ data-styled.g9[id="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0"]{content:"gwqFqs,"}/*!sc*/ .decvaq{background-repeat:no-repeat;background-position:right 8px center;padding-left:12px;padding-right:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .decvaq > :not(:last-child){margin-right:8px;}/*!sc*/ .decvaq .TextInput-icon,.decvaq .TextInput-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}/*!sc*/ .decvaq > input,.decvaq > select{padding-left:0;padding-right:0;}/*!sc*/ data-styled.g10[id="TextInputWrapper-sc-1mqhpbi-1"]{content:"decvaq,"}/*!sc*/ .kBQCgV{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .kBQCgV:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kBQCgV:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .kBQCgV:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .kBQCgV[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .kBQCgV[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .kBQCgV:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .kBQCgV:active{-webkit-transition:none;transition:none;}/*!sc*/ .kBQCgV[data-inactive]{cursor:auto;}/*!sc*/ .kBQCgV:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .kBQCgV:disabled [data-component=ButtonCounter],.kBQCgV:disabled [data-component="leadingVisual"],.kBQCgV:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.kBQCgV:focus{outline:solid 1px transparent;}}/*!sc*/ .kBQCgV [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kBQCgV[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .kBQCgV[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .kBQCgV[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .kBQCgV[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .kBQCgV[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .kBQCgV[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .kBQCgV[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .kBQCgV[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kBQCgV[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .kBQCgV[data-block="block"]{width:100%;}/*!sc*/ .kBQCgV[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .kBQCgV[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .kBQCgV[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .kBQCgV[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .kBQCgV[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .kBQCgV [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .kBQCgV [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .kBQCgV [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .kBQCgV [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .kBQCgV [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .kBQCgV:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .kBQCgV:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .kBQCgV[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .kBQCgV[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .kBQCgV[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kBQCgV:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .kBQCgV:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .kBQCgV:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .kBQCgV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:8px;padding-right:8px;display:none;}/*!sc*/ @media screen and (max-width:768px){.kBQCgV[data-size="medium"]{display:block;}}/*!sc*/ .dPmZyJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .dPmZyJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dPmZyJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dPmZyJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dPmZyJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dPmZyJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .dPmZyJ[data-inactive]{cursor:auto;}/*!sc*/ .dPmZyJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .dPmZyJ:disabled [data-component=ButtonCounter],.dPmZyJ:disabled [data-component="leadingVisual"],.dPmZyJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dPmZyJ:focus{outline:solid 1px transparent;}}/*!sc*/ .dPmZyJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dPmZyJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dPmZyJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dPmZyJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dPmZyJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dPmZyJ[data-block="block"]{width:100%;}/*!sc*/ .dPmZyJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dPmZyJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dPmZyJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dPmZyJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dPmZyJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .dPmZyJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .dPmZyJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .dPmZyJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .iQGjqs{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .iQGjqs:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iQGjqs:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iQGjqs:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iQGjqs[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .iQGjqs[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .iQGjqs:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .iQGjqs:active{-webkit-transition:none;transition:none;}/*!sc*/ .iQGjqs[data-inactive]{cursor:auto;}/*!sc*/ .iQGjqs:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .iQGjqs:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.iQGjqs:focus{outline:solid 1px transparent;}}/*!sc*/ .iQGjqs [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .iQGjqs[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .iQGjqs[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .iQGjqs[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .iQGjqs[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iQGjqs[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .iQGjqs[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .iQGjqs[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .iQGjqs[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iQGjqs[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .iQGjqs[data-block="block"]{width:100%;}/*!sc*/ .iQGjqs[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .iQGjqs[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .iQGjqs[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .iQGjqs[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .iQGjqs[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .iQGjqs [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .iQGjqs [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .iQGjqs [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .iQGjqs [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .iQGjqs [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .iQGjqs [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iQGjqs [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .iQGjqs:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iQGjqs [data-component="leadingVisual"],.iQGjqs [data-component="trailingVisual"],.iQGjqs [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iQGjqs[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ .iQGjqs[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iQGjqs[data-size="medium"] > span{width:inherit;}/*!sc*/ .iLfocZ{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .iLfocZ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iLfocZ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iLfocZ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iLfocZ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .iLfocZ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .iLfocZ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .iLfocZ:active{-webkit-transition:none;transition:none;}/*!sc*/ .iLfocZ[data-inactive]{cursor:auto;}/*!sc*/ .iLfocZ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .iLfocZ:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.iLfocZ:focus{outline:solid 1px transparent;}}/*!sc*/ .iLfocZ [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .iLfocZ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .iLfocZ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .iLfocZ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .iLfocZ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iLfocZ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .iLfocZ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .iLfocZ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .iLfocZ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iLfocZ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .iLfocZ[data-block="block"]{width:100%;}/*!sc*/ .iLfocZ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .iLfocZ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .iLfocZ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .iLfocZ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .iLfocZ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .iLfocZ [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .iLfocZ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .iLfocZ [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .iLfocZ [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .iLfocZ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .iLfocZ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iLfocZ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iLfocZ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .iLfocZ:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .iLfocZ [data-component="leadingVisual"],.iLfocZ [data-component="trailingVisual"],.iLfocZ [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iLfocZ[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iLfocZ[data-size="medium"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;display:none;}/*!sc*/ .JVsBq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .JVsBq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .JVsBq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .JVsBq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .JVsBq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .JVsBq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .JVsBq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .JVsBq:active{-webkit-transition:none;transition:none;}/*!sc*/ .JVsBq[data-inactive]{cursor:auto;}/*!sc*/ .JVsBq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .JVsBq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.JVsBq:focus{outline:solid 1px transparent;}}/*!sc*/ .JVsBq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .JVsBq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .JVsBq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .JVsBq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .JVsBq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .JVsBq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .JVsBq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .JVsBq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .JVsBq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .JVsBq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .JVsBq[data-block="block"]{width:100%;}/*!sc*/ .JVsBq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .JVsBq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .JVsBq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .JVsBq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .JVsBq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .JVsBq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .JVsBq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .JVsBq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .JVsBq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .JVsBq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .JVsBq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .JVsBq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .JVsBq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .JVsBq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .JVsBq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .JVsBq [data-component="leadingVisual"],.JVsBq [data-component="trailingVisual"],.JVsBq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .JVsBq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .JVsBq[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .fwExmK{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .fwExmK:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .fwExmK:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .fwExmK:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .fwExmK[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .fwExmK[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .fwExmK:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .fwExmK:active{-webkit-transition:none;transition:none;}/*!sc*/ .fwExmK[data-inactive]{cursor:auto;}/*!sc*/ .fwExmK:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .fwExmK:disabled [data-component=ButtonCounter],.fwExmK:disabled [data-component="leadingVisual"],.fwExmK:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.fwExmK:focus{outline:solid 1px transparent;}}/*!sc*/ .fwExmK [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .fwExmK[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .fwExmK[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));margin-left:8px;}/*!sc*/ .fwExmK[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .fwExmK[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .fwExmK[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .fwExmK[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .fwExmK[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .fwExmK[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .fwExmK[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .fwExmK[data-block="block"]{width:100%;}/*!sc*/ .fwExmK[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .fwExmK[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .fwExmK[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .fwExmK[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .fwExmK[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .fwExmK[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .fwExmK [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .fwExmK [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .fwExmK [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .fwExmK [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .fwExmK [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .fwExmK:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .fwExmK:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .fwExmK[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .fwExmK[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .fwExmK[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .fwExmK:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .fwExmK:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .fwExmK:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .ifVXZX{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));padding-left:8px;padding-right:8px;}/*!sc*/ .ifVXZX:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ifVXZX:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .ifVXZX:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ifVXZX[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .ifVXZX[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .ifVXZX:active{-webkit-transition:none;transition:none;}/*!sc*/ .ifVXZX[data-inactive]{cursor:auto;}/*!sc*/ .ifVXZX:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .ifVXZX:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.ifVXZX:focus{outline:solid 1px transparent;}}/*!sc*/ .ifVXZX [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .ifVXZX[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .ifVXZX[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .ifVXZX[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .ifVXZX[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ifVXZX[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .ifVXZX[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .ifVXZX[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .ifVXZX[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ifVXZX[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .ifVXZX[data-block="block"]{width:100%;}/*!sc*/ .ifVXZX[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .ifVXZX[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .ifVXZX[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .ifVXZX[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .ifVXZX[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .ifVXZX [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .ifVXZX [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .ifVXZX [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .ifVXZX [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .ifVXZX [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .ifVXZX [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ifVXZX [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ifVXZX [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .ifVXZX:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .ifVXZX [data-component="leadingVisual"],.ifVXZX [data-component="trailingVisual"],.ifVXZX [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ifVXZX[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ifVXZX linkButtonSx:hover:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX linkButtonSx:focus:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ifVXZX linkButtonSx:active:not([disabled]){-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gGdPyq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gGdPyq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gGdPyq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gGdPyq:active{-webkit-transition:none;transition:none;}/*!sc*/ .gGdPyq[data-inactive]{cursor:auto;}/*!sc*/ .gGdPyq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gGdPyq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gGdPyq:focus{outline:solid 1px transparent;}}/*!sc*/ .gGdPyq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gGdPyq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gGdPyq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gGdPyq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gGdPyq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gGdPyq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gGdPyq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gGdPyq[data-block="block"]{width:100%;}/*!sc*/ .gGdPyq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gGdPyq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gGdPyq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gGdPyq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gGdPyq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gGdPyq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gGdPyq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gGdPyq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq [data-component="leadingVisual"],.gGdPyq [data-component="trailingVisual"],.gGdPyq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gGdPyq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .dOuZvu:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dOuZvu:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dOuZvu:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dOuZvu[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dOuZvu[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dOuZvu:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dOuZvu:active{-webkit-transition:none;transition:none;}/*!sc*/ .dOuZvu[data-inactive]{cursor:auto;}/*!sc*/ .dOuZvu:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .dOuZvu:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dOuZvu:focus{outline:solid 1px transparent;}}/*!sc*/ .dOuZvu [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .dOuZvu[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dOuZvu[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dOuZvu[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dOuZvu[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dOuZvu[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dOuZvu[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dOuZvu[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dOuZvu[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dOuZvu[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dOuZvu[data-block="block"]{width:100%;}/*!sc*/ .dOuZvu[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dOuZvu[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dOuZvu[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dOuZvu[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dOuZvu[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dOuZvu [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .dOuZvu [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dOuZvu [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .dOuZvu [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .dOuZvu [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dOuZvu [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dOuZvu [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dOuZvu:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .dOuZvu [data-component="leadingVisual"],.dOuZvu [data-component="trailingVisual"],.dOuZvu [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dOuZvu[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dOuZvu[data-size="small"][data-no-visuals]{border-top-left-radius:0;border-bottom-left-radius:0;}/*!sc*/ .iZkvjn{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .iZkvjn:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iZkvjn:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .iZkvjn:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .iZkvjn[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .iZkvjn[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .iZkvjn:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .iZkvjn:active{-webkit-transition:none;transition:none;}/*!sc*/ .iZkvjn[data-inactive]{cursor:auto;}/*!sc*/ .iZkvjn:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .iZkvjn:disabled [data-component=ButtonCounter],.iZkvjn:disabled [data-component="leadingVisual"],.iZkvjn:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.iZkvjn:focus{outline:solid 1px transparent;}}/*!sc*/ .iZkvjn [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iZkvjn[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .iZkvjn[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .iZkvjn[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .iZkvjn[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .iZkvjn[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .iZkvjn[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .iZkvjn[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .iZkvjn[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iZkvjn[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .iZkvjn[data-block="block"]{width:100%;}/*!sc*/ .iZkvjn[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .iZkvjn[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .iZkvjn[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .iZkvjn[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .iZkvjn[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .iZkvjn[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .iZkvjn[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .iZkvjn[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .iZkvjn[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .iZkvjn [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iZkvjn [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .iZkvjn [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iZkvjn [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iZkvjn [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .iZkvjn [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .iZkvjn [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .iZkvjn [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .iZkvjn:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .iZkvjn:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .iZkvjn[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .iZkvjn[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .iZkvjn[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .iZkvjn:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .iZkvjn:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .iZkvjn:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .iZkvjn[data-size="small"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));position:relative;}/*!sc*/ .ggSvLP{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .ggSvLP:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ggSvLP:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .ggSvLP:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .ggSvLP[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .ggSvLP[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .ggSvLP:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .ggSvLP:active{-webkit-transition:none;transition:none;}/*!sc*/ .ggSvLP[data-inactive]{cursor:auto;}/*!sc*/ .ggSvLP:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .ggSvLP:disabled [data-component=ButtonCounter],.ggSvLP:disabled [data-component="leadingVisual"],.ggSvLP:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.ggSvLP:focus{outline:solid 1px transparent;}}/*!sc*/ .ggSvLP [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ggSvLP[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .ggSvLP[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .ggSvLP[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .ggSvLP[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .ggSvLP[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .ggSvLP[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .ggSvLP[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .ggSvLP[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ggSvLP[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .ggSvLP[data-block="block"]{width:100%;}/*!sc*/ .ggSvLP[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .ggSvLP[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .ggSvLP[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .ggSvLP[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .ggSvLP[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .ggSvLP [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .ggSvLP [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .ggSvLP [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .ggSvLP [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ggSvLP [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .ggSvLP:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .ggSvLP:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .ggSvLP[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .ggSvLP[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .ggSvLP[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .ggSvLP:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .ggSvLP:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .ggSvLP:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .ggSvLP[data-size="small"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ data-styled.g11[id="types__StyledButton-sc-ws60qy-0"]{content:"kBQCgV,dPmZyJ,iQGjqs,iLfocZ,JVsBq,fwExmK,ifVXZX,gGdPyq,dOuZvu,iZkvjn,ggSvLP,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g14[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .kbCLEG{border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;}/*!sc*/ .kbCLEG:focus{outline:0;}/*!sc*/ data-styled.g15[id="UnstyledTextInput-sc-14ypya-0"]{content:"kbCLEG,"}/*!sc*/ .eAtkQz{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;max-width:100%;}/*!sc*/ data-styled.g17[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"eAtkQz,"}/*!sc*/ body[data-page-layout-dragging="true"]{cursor:col-resize;}/*!sc*/ body[data-page-layout-dragging="true"] *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}/*!sc*/ data-styled.g99[id="sc-global-gbKrvU1"]{content:"sc-global-gbKrvU1,"}/*!sc*/ .lirRhW{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;isolation:isolate;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]){margin-inline-end:-1px;position:relative;border-radius:0;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):first-child{border-top-left-radius:6px;border-bottom-left-radius:6px;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):last-child{border-top-right-radius:6px;border-bottom-right-radius:6px;}/*!sc*/ .lirRhW.lirRhW > *:not([data-loading-wrapper]):focus,.lirRhW.lirRhW > *:not([data-loading-wrapper]):active,.lirRhW.lirRhW > *:not([data-loading-wrapper]):hover{z-index:1;}/*!sc*/ .lirRhW [data-loading-wrapper]:first-child button,.lirRhW [data-loading-wrapper]:first-child a{border-top-left-radius:6px;border-bottom-left-radius:6px;}/*!sc*/ .lirRhW [data-loading-wrapper]:last-child button,.lirRhW [data-loading-wrapper]:last-child a{border-top-right-radius:6px;border-bottom-right-radius:6px;}/*!sc*/ .lirRhW [data-loading-wrapper] > *{margin-inline-end:-1px;position:relative;border-radius:0;}/*!sc*/ .lirRhW [data-loading-wrapper] > *:focus,.lirRhW [data-loading-wrapper] > *:active,.lirRhW [data-loading-wrapper] > *:hover{z-index:1;}/*!sc*/ data-styled.g104[id="ButtonGroup__StyledButtonGroup-sc-1gxhls1-0"]{content:"lirRhW,"}/*!sc*/ .dbGjOi{--segmented-control-button-inner-padding:12px;--segmented-control-button-bg-inset:4px;--segmented-control-outer-radius:6px;background-color:transparent;border-color:transparent;border-radius:var(--segmented-control-outer-radius);border-width:0;color:currentColor;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:600;padding:0;height:100%;width:100%;}/*!sc*/ .dbGjOi:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .dbGjOi:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dbGjOi:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .dbGjOi .segmentedControl-content{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--controlKnob-bgColor-rest,var(--color-segmented-control-button-bg,#ffffff));border-color:var(--controlKnob-borderColor-rest,var(--color-segmented-control-button-hover-active-selected-border,#8c959f));border-style:solid;border-width:1px;border-radius:var(--segmented-control-outer-radius);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:var(--segmented-control-button-inner-padding);padding-right:var(--segmented-control-button-inner-padding);}/*!sc*/ .dbGjOi svg{fill:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dbGjOi:focus:focus-visible:not(:last-child):after{width:0;}/*!sc*/ .dbGjOi .segmentedControl-text:after{content:"Code";display:block;font-weight:600;height:0;overflow:hidden;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;}/*!sc*/ @media (pointer:coarse){.dbGjOi:before{content:"";position:absolute;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;min-height:44px;}}/*!sc*/ .bHmvop{--segmented-control-button-inner-padding:12px;--segmented-control-button-bg-inset:4px;--segmented-control-outer-radius:6px;background-color:transparent;border-color:transparent;border-radius:var(--segmented-control-outer-radius);border-width:0;color:currentColor;cursor:pointer;font-family:inherit;font-size:inherit;font-weight:400;padding:var(--segmented-control-button-bg-inset);height:100%;width:100%;}/*!sc*/ .bHmvop:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .bHmvop:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .bHmvop:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .bHmvop .segmentedControl-content{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:transparent;border-color:transparent;border-style:solid;border-width:1px;border-radius:calc(var(--segmented-control-outer-radius) - var(--segmented-control-button-bg-inset) / 2);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));padding-right:calc(var(--segmented-control-button-inner-padding) - var(--segmented-control-button-bg-inset));}/*!sc*/ .bHmvop svg{fill:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bHmvop:hover .segmentedControl-content{background-color:var(--controlTrack-bgColor-hover,var(--color-segmented-control-button-hover-bg,rgba(175,184,193,0.2)));}/*!sc*/ .bHmvop:active .segmentedControl-content{background-color:var(--controlTrack-bgColor-active,var(--color-segmented-control-button-hover-active-bg,rgba(175,184,193,0.4)));}/*!sc*/ .bHmvop:focus:focus-visible:not(:last-child):after{width:0;}/*!sc*/ .bHmvop .segmentedControl-text:after{content:"Blame";display:block;font-weight:600;height:0;overflow:hidden;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;visibility:hidden;}/*!sc*/ @media (pointer:coarse){.bHmvop:before{content:"";position:absolute;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;min-height:44px;}}/*!sc*/ data-styled.g106[id="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0"]{content:"dbGjOi,bHmvop,"}/*!sc*/ .lawgDG{background-color:var(--controlTrack-bgColor-rest,var(--color-segmented-control-bg,#eaeef2));border-radius:6px;border:1px solid;border-color:var(--controlTrack-borderColor-rest,transparent);display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-size:14px;height:28px;margin:0;padding:0;}/*!sc*/ data-styled.g108[id="SegmentedControl__SegmentedControlList-sc-1rzig82-0"]{content:"lawgDG,"}/*!sc*/ </style><meta data-hydrostats="publish"/> <!-- --> <!-- --> <button hidden="" data-testid="header-permalink-button" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div><div style="--sticky-pane-height:100vh" class="Box-sc-g0xbh4-0 hOfjFo"><div class="Box-sc-g0xbh4-0 oDGAe"><div class="Box-sc-g0xbh4-0 kowOcT"><div tabindex="0" class="Box-sc-g0xbh4-0 gISSDQ"><div class="Box-sc-g0xbh4-0 fLEPlD"><div class="Box-sc-g0xbh4-0 hPvFuC"></div><div style="--pane-width:320px" class="Box-sc-g0xbh4-0 fFSoPl"></div><div class="Box-sc-g0xbh4-0 bTBnTW"><div role="slider" aria-label="Draggable pane splitter" aria-valuemin="0" aria-valuemax="0" aria-valuenow="0" aria-valuetext="Pane width 0 pixels" tabindex="0" class="Box-sc-g0xbh4-0 bHLmSv"></div></div></div></div><div class="Box-sc-g0xbh4-0 iKqMNA"><div class="Box-sc-g0xbh4-0"></div><div class="Box-sc-g0xbh4-0 FxAyp"><div data-selector="repos-split-pane-content" tabindex="0" class="Box-sc-g0xbh4-0 leYMvG"><div class="Box-sc-g0xbh4-0 KMPzq"><div class="Box-sc-g0xbh4-0 hfKjHv container"><div class="px-3 pt-3 pb-0" id="StickyHeader"><div class="Box-sc-g0xbh4-0 gZWyZE"><div class="Box-sc-g0xbh4-0 dwYKDk"><div class="Box-sc-g0xbh4-0 ibcGmb react-code-view-header-wrap--narrow"><div class="Box-sc-g0xbh4-0 hKaEJF"><h2 class="Box-sc-g0xbh4-0 XosP prc-Heading-Heading-6CmGO"><button style="--button-color:fg.muted" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="types__StyledButton-sc-ws60qy-0 kBQCgV" data-loading="false" data-size="medium" aria-describedby=":Rld9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text">Files</span></span></button><span role="tooltip" aria-label="Expand file tree" id="expand-button-file-tree-button" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-se"><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="types__StyledButton-sc-ws60qy-0 dPmZyJ position-relative ExpandFileTreeButton-module__expandButton--gL4is ExpandFileTreeButton-module__filesButtonBreakpoint--WfX9t fgColor-muted prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R35d9lab:-loading-announcement" aria-labelledby="expand-button-file-tree-button"><svg aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button></span><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 iQGjqs ref-selector-class" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-wide-loading-announcement" id="branch-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 dbrgmi ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 dHJiml react-code-view-header-mb--narrow"><div class="Box-sc-g0xbh4-0 cEytCf"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Box-sc-g0xbh4-0 fzFXnm"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Box-sc-g0xbh4-0 iMnkmv"><li class="Box-sc-g0xbh4-0 ghzDag"><a class="Box-sc-g0xbh4-0 kHuKdh prc-Link-Link-85e08" sx="[object Object]" data-testid="breadcrumbs-repo-link" href="/NotFound9/interviewGuide/tree/master">interviewGuide</a></li><li class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 HlHVj" aria-hidden="true">/</span><a class="Box-sc-g0xbh4-0 kgiVEz prc-Link-Link-85e08" sx="[object Object]" href="/NotFound9/interviewGuide/tree/master/docs">docs</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 HlHVj" aria-hidden="true">/</span><h1 class="Box-sc-g0xbh4-0 jGhzSQ prc-Heading-Heading-6CmGO" tabindex="-1" id="file-name-id">JavaMultiThread.md</h1></div><div aria-describedby=":R1td9lab:"><button data-component="IconButton" type="button" aria-label="Copy path" tabindex="0" class="types__StyledButton-sc-ws60qy-0 dPmZyJ prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":R7td9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button></div></div></div></div><div class="react-code-view-header-element--wide"><div class="Box-sc-g0xbh4-0 faNtbn"><div class="d-flex gap-2"> <div><div class="Box-sc-g0xbh4-0 fmQaBv"><span class="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0 TextInputWrapper-sc-1mqhpbi-1 gwqFqs decvaq TextInput-wrapper" aria-busy="false"><span class="TextInput-icon" id=":R5j6d9lab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R5j6d9lab: :R5j6d9labH1:" data-component="input" class="UnstyledTextInput-sc-14ypya-0 kbCLEG" value=""/><span class="TextInput-icon" id=":R5j6d9labH1:" aria-hidden="true"></span></span></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><button type="button" class="types__StyledButton-sc-ws60qy-0 iLfocZ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R2l6d9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" aria-label="More file actions" title="More file actions" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 JVsBq js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R156d9lab:-loading-announcement" id=":R156d9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button> </div></div></div><div class="react-code-view-header-element--narrow"><div class="Box-sc-g0xbh4-0 faNtbn"><div class="d-flex gap-2"> <button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><button type="button" class="types__StyledButton-sc-ws60qy-0 iLfocZ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R2l7d9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Blame</span></span></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button data-component="IconButton" type="button" aria-label="More file actions" title="More file actions" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 JVsBq js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R157d9lab:-loading-announcement" id=":R157d9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button> </div></div></div></div></div></div></div></div><div class="Box-sc-g0xbh4-0 dJxjrT react-code-view-bottom-padding"> <div class="Box-sc-g0xbh4-0 eFxKDQ"></div> <!-- --> <!-- --> </div><div class="Box-sc-g0xbh4-0 dJxjrT"> <!-- --> <!-- --> <button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button><div class="d-flex flex-column border rounded-2 mb-3 pl-1"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/NotFound9/interviewGuide/commits/master/docs/JavaMultiThread.md" class="types__StyledButton-sc-ws60qy-0 dPmZyJ d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":R5dlal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="History" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/NotFound9/interviewGuide/commits/master/docs/JavaMultiThread.md" class="types__StyledButton-sc-ws60qy-0 dPmZyJ LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":Rpdlal9lab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></div><div class="Box-sc-g0xbh4-0 ldRxiI"><div class="Box-sc-g0xbh4-0 fVkfyA container"><div class="Box-sc-g0xbh4-0 gNAmSV react-code-size-details-banner"><div class="Box-sc-g0xbh4-0 jNEwzY react-code-size-details-banner"><div class="Box-sc-g0xbh4-0 bsDwxw text-mono"><div title="84.3 KB" data-testid="blob-size" class="Truncate__StyledTruncate-sc-23o1d2-0 eAtkQz"><span>1840 lines (1397 loc) · 84.3 KB</span></div></div></div></div><div class="Box-sc-g0xbh4-0 jdLMhu react-blob-view-header-sticky" id="repos-sticky-header"><div class="Box-sc-g0xbh4-0 tOISc"><div class="react-blob-sticky-header"><div class="Box-sc-g0xbh4-0 hqwSEx"><div class="Box-sc-g0xbh4-0 bDVoEr"><div class="Box-sc-g0xbh4-0 kYLlPM"><div class="Box-sc-g0xbh4-0 gYjEmn"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 iQGjqs ref-selector-class" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 dbrgmi ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 kGqOLL"><div class="Box-sc-g0xbh4-0 fHind"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Box-sc-g0xbh4-0 fzFXnm"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Box-sc-g0xbh4-0 iMnkmv"><li class="Box-sc-g0xbh4-0 ghzDag"><a class="Box-sc-g0xbh4-0 kHuKdh prc-Link-Link-85e08" sx="[object Object]" data-testid="breadcrumbs-repo-link" href="/NotFound9/interviewGuide/tree/master">interviewGuide</a></li><li class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 lauzFl" aria-hidden="true">/</span><a class="Box-sc-g0xbh4-0 kgiVEz prc-Link-Link-85e08" sx="[object Object]" href="/NotFound9/interviewGuide/tree/master/docs">docs</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Box-sc-g0xbh4-0 ghzDag"><span class="Text__StyledText-sc-17v1xeu-0 lauzFl" aria-hidden="true">/</span><h1 class="Box-sc-g0xbh4-0 dnZoUW prc-Heading-Heading-6CmGO" tabindex="-1" id="sticky-file-name-id">JavaMultiThread.md</h1></div></div></div></div><button style="--button-color:fg.default" type="button" class="types__StyledButton-sc-ws60qy-0 fwExmK" data-loading="false" data-size="small" aria-describedby=":Riptal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text">Top</span></span></button></div></div></div><div class="Box-sc-g0xbh4-0 kTvpNk"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">File metadata and controls</h2><div class="Box-sc-g0xbh4-0 iNMjfP"><ul aria-label="File view" class="SegmentedControl__SegmentedControlList-sc-1rzig82-0 lawgDG"><li class="Box-sc-g0xbh4-0 fefCSX"><button aria-current="true" type="button" class="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0 dbGjOi"><span class="segmentedControl-content"><div class="Box-sc-g0xbh4-0 segmentedControl-text">Code</div></span></button></li><li class="Box-sc-g0xbh4-0 idgUkN"><button aria-current="false" type="button" class="SegmentedControlButton__SegmentedControlButtonStyled-sc-8lkgxl-0 bHmvop"><span class="segmentedControl-content"><div class="Box-sc-g0xbh4-0 segmentedControl-text">Blame</div></span></button></li></ul><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><div class="Box-sc-g0xbh4-0 jNEwzY react-code-size-details-in-header"><div class="Box-sc-g0xbh4-0 bsDwxw text-mono"><div title="84.3 KB" data-testid="blob-size" class="Truncate__StyledTruncate-sc-23o1d2-0 eAtkQz"><span>1840 lines (1397 loc) · 84.3 KB</span></div></div></div></div><div class="Box-sc-g0xbh4-0 kcLCKF"><div class="Box-sc-g0xbh4-0 kVWtTz react-blob-header-edit-and-raw-actions"><div class="ButtonGroup__StyledButtonGroup-sc-1gxhls1-0 lirRhW"><a href="https://github.com/NotFound9/interviewGuide/raw/refs/heads/master/docs/JavaMultiThread.md" data-testid="raw-button" class="types__StyledButton-sc-ws60qy-0 ifVXZX" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":R5csptal9lab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Raw</span></span></a><button data-component="IconButton" type="button" aria-label="Copy raw content" data-testid="copy-raw-button" class="types__StyledButton-sc-ws60qy-0 gGdPyq prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rpcsptal9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span role="tooltip" aria-label="Download raw file" id=":Rdcsptal9lab:" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><button data-component="IconButton" type="button" aria-label="Download raw content" data-testid="download-raw-button" class="types__StyledButton-sc-ws60qy-0 dOuZvu prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rtcsptal9lab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button></span></div><button hidden="" data-testid="raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="copy-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden="" data-testid="download-raw-button-shortcut" data-hotkey-scope="read-only-cursor-text-area"></button></div><span role="tooltip" aria-label="Open symbols panel" id=":R5sptal9lab:" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-nw"><button data-component="IconButton" type="button" aria-label="Symbols" aria-pressed="false" aria-expanded="false" aria-controls="symbols-pane" data-testid="symbols-button" class="types__StyledButton-sc-ws60qy-0 iZkvjn prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby="symbols-button-loading-announcement" id="symbols-button"><svg aria-hidden="true" focusable="false" class="octicon octicon-code-square" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></button></span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" aria-label="Edit and raw actions" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 ggSvLP js-blob-dropdown-click prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="small" aria-describedby=":Rnsptal9lab:-loading-announcement" id=":Rnsptal9lab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div></div><div></div></div><div class="Box-sc-g0xbh4-0 hGyMdv"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="Box-sc-g0xbh4-0 dceWRL"><div class="Box-sc-g0xbh4-0 dGXHv"><div id="highlighted-line-menu-positioner" class="position-relative"><div id="copilot-button-positioner" class="Box-sc-g0xbh4-0 bpDFns"><div class="Box-sc-g0xbh4-0 iJOeCH"><div class="Box-sc-g0xbh4-0 jewUnv react-code-file-contents" role="presentation" aria-hidden="true" data-tab-size="8" data-paste-markdown-skip="true" data-hpc="true"><div class="react-line-numbers" style="pointer-events:auto"><div data-line-number="1" class="react-line-number react-code-text" style="padding-right:16px">1</div><div data-line-number="2" class="react-line-number react-code-text" style="padding-right:16px">2<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="3" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">3</div><div data-line-number="4" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">4</div><div data-line-number="5" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">5</div><div data-line-number="6" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">6</div><div data-line-number="7" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">7</div><div data-line-number="8" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">8</div><div data-line-number="9" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">9</div><div data-line-number="10" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">10</div><div data-line-number="11" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">11</div><div data-line-number="12" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">12</div><div data-line-number="13" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">13</div><div data-line-number="14" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">14</div><div data-line-number="15" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">15</div><div data-line-number="16" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">16</div><div data-line-number="17" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">17</div><div data-line-number="18" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">18</div><div data-line-number="19" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">19</div><div data-line-number="20" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">20<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="21" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">21</div><div data-line-number="22" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">22<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="23" class="child-of-line-1 child-of-line-19 child-of-line-21 react-line-number react-code-text" style="padding-right:16px">23</div><div data-line-number="24" class="child-of-line-1 child-of-line-19 child-of-line-21 react-line-number react-code-text" style="padding-right:16px">24</div><div data-line-number="25" class="child-of-line-1 child-of-line-19 child-of-line-21 react-line-number react-code-text" style="padding-right:16px">25</div><div data-line-number="26" class="child-of-line-1 child-of-line-19 child-of-line-21 react-line-number react-code-text" style="padding-right:16px">26</div><div data-line-number="27" class="child-of-line-1 child-of-line-19 child-of-line-21 react-line-number react-code-text" style="padding-right:16px">27</div><div data-line-number="28" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">28<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="29" class="child-of-line-1 child-of-line-19 child-of-line-27 react-line-number react-code-text" style="padding-right:16px">29</div><div data-line-number="30" class="child-of-line-1 child-of-line-19 child-of-line-27 react-line-number react-code-text" style="padding-right:16px">30</div><div data-line-number="31" class="child-of-line-1 child-of-line-19 child-of-line-27 react-line-number react-code-text" style="padding-right:16px">31</div><div data-line-number="32" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">32<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="33" class="child-of-line-1 child-of-line-19 child-of-line-31 react-line-number react-code-text" style="padding-right:16px">33</div><div data-line-number="34" class="child-of-line-1 child-of-line-19 child-of-line-31 react-line-number react-code-text" style="padding-right:16px">34</div><div data-line-number="35" class="child-of-line-1 child-of-line-19 child-of-line-31 react-line-number react-code-text" style="padding-right:16px">35</div><div data-line-number="36" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">36<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="37" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">37</div><div data-line-number="38" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">38</div><div data-line-number="39" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">39</div><div data-line-number="40" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">40</div><div data-line-number="41" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">41</div><div data-line-number="42" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">42</div><div data-line-number="43" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">43</div><div data-line-number="44" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">44</div><div data-line-number="45" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">45</div><div data-line-number="46" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">46</div><div data-line-number="47" class="child-of-line-1 child-of-line-19 child-of-line-35 react-line-number react-code-text" style="padding-right:16px">47</div><div data-line-number="48" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">48<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="49" class="child-of-line-1 child-of-line-19 child-of-line-47 react-line-number react-code-text" style="padding-right:16px">49</div><div data-line-number="50" class="child-of-line-1 child-of-line-19 child-of-line-47 react-line-number react-code-text" style="padding-right:16px">50</div><div data-line-number="51" class="child-of-line-1 child-of-line-19 child-of-line-47 react-line-number react-code-text" style="padding-right:16px">51</div><div data-line-number="52" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">52<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="53" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">53</div><div data-line-number="54" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">54</div><div data-line-number="55" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">55</div><div data-line-number="56" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">56</div><div data-line-number="57" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">57</div><div data-line-number="58" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">58</div><div data-line-number="59" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">59</div><div data-line-number="60" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">60</div><div data-line-number="61" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">61</div><div data-line-number="62" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">62</div><div data-line-number="63" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">63</div><div data-line-number="64" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">64</div><div data-line-number="65" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">65</div><div data-line-number="66" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">66</div><div data-line-number="67" class="child-of-line-1 child-of-line-19 child-of-line-51 react-line-number react-code-text" style="padding-right:16px">67</div><div data-line-number="68" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">68<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="69" class="child-of-line-1 child-of-line-19 child-of-line-67 react-line-number react-code-text" style="padding-right:16px">69</div><div data-line-number="70" class="child-of-line-1 child-of-line-19 child-of-line-67 react-line-number react-code-text" style="padding-right:16px">70</div><div data-line-number="71" class="child-of-line-1 child-of-line-19 child-of-line-67 react-line-number react-code-text" style="padding-right:16px">71</div><div data-line-number="72" class="child-of-line-1 child-of-line-19 child-of-line-67 react-line-number react-code-text" style="padding-right:16px">72</div><div data-line-number="73" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">73<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="74" class="child-of-line-1 child-of-line-19 child-of-line-72 react-line-number react-code-text" style="padding-right:16px">74</div><div data-line-number="75" class="child-of-line-1 child-of-line-19 child-of-line-72 react-line-number react-code-text" style="padding-right:16px">75</div><div data-line-number="76" class="child-of-line-1 child-of-line-19 child-of-line-72 react-line-number react-code-text" style="padding-right:16px">76</div><div data-line-number="77" class="child-of-line-1 child-of-line-19 react-line-number react-code-text" style="padding-right:16px">77<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="78" class="child-of-line-1 child-of-line-19 child-of-line-76 react-line-number react-code-text" style="padding-right:16px">78</div><div data-line-number="79" class="child-of-line-1 child-of-line-19 child-of-line-76 react-line-number react-code-text" style="padding-right:16px">79</div><div data-line-number="80" class="child-of-line-1 child-of-line-19 child-of-line-76 react-line-number react-code-text" style="padding-right:16px">80</div><div data-line-number="81" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">81<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="82" class="child-of-line-1 child-of-line-80 react-line-number react-code-text" style="padding-right:16px">82</div><div data-line-number="83" class="child-of-line-1 child-of-line-80 react-line-number react-code-text" style="padding-right:16px">83</div><div data-line-number="84" class="child-of-line-1 child-of-line-80 react-line-number react-code-text" style="padding-right:16px">84</div><div data-line-number="85" class="child-of-line-1 child-of-line-80 react-line-number react-code-text" style="padding-right:16px">85<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="86" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">86</div><div data-line-number="87" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">87</div><div data-line-number="88" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">88</div><div data-line-number="89" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">89</div><div data-line-number="90" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">90</div><div data-line-number="91" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">91</div><div data-line-number="92" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">92</div><div data-line-number="93" class="child-of-line-1 child-of-line-80 child-of-line-84 react-line-number react-code-text" style="padding-right:16px">93</div><div data-line-number="94" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">94<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="95" class="child-of-line-1 child-of-line-93 react-line-number react-code-text" style="padding-right:16px">95</div><div data-line-number="96" class="child-of-line-1 child-of-line-93 react-line-number react-code-text" style="padding-right:16px">96<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="97" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">97</div><div data-line-number="98" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">98</div><div data-line-number="99" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">99</div><div data-line-number="100" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">100</div><div data-line-number="101" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">101</div><div data-line-number="102" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">102</div><div data-line-number="103" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">103</div><div data-line-number="104" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">104</div><div data-line-number="105" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">105</div><div data-line-number="106" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">106</div><div data-line-number="107" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">107</div><div data-line-number="108" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">108</div><div data-line-number="109" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">109</div><div data-line-number="110" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">110</div><div data-line-number="111" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">111</div><div data-line-number="112" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">112</div><div data-line-number="113" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">113</div><div data-line-number="114" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">114</div><div data-line-number="115" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">115</div><div data-line-number="116" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">116</div><div data-line-number="117" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">117</div><div data-line-number="118" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">118</div><div data-line-number="119" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">119</div><div data-line-number="120" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">120</div><div data-line-number="121" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">121</div><div data-line-number="122" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">122</div><div data-line-number="123" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">123</div><div data-line-number="124" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">124</div><div data-line-number="125" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">125</div><div data-line-number="126" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">126</div><div data-line-number="127" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">127</div><div data-line-number="128" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">128</div><div data-line-number="129" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">129</div><div data-line-number="130" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">130</div><div data-line-number="131" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">131</div><div data-line-number="132" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">132</div><div data-line-number="133" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">133</div><div data-line-number="134" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">134</div><div data-line-number="135" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">135</div><div data-line-number="136" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">136</div><div data-line-number="137" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">137</div><div data-line-number="138" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">138</div><div data-line-number="139" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">139<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="140" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">140</div><div data-line-number="141" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">141</div><div data-line-number="142" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">142</div><div data-line-number="143" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">143</div><div data-line-number="144" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">144</div><div data-line-number="145" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">145</div><div data-line-number="146" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">146</div><div data-line-number="147" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">147</div><div data-line-number="148" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">148</div><div data-line-number="149" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">149</div><div data-line-number="150" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">150</div><div data-line-number="151" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">151</div><div data-line-number="152" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">152</div><div data-line-number="153" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">153</div><div data-line-number="154" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">154</div><div data-line-number="155" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">155</div><div data-line-number="156" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">156</div><div data-line-number="157" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">157</div><div data-line-number="158" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">158</div><div data-line-number="159" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">159</div><div data-line-number="160" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">160</div><div data-line-number="161" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">161</div><div data-line-number="162" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">162</div><div data-line-number="163" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">163</div><div data-line-number="164" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">164</div><div data-line-number="165" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">165</div><div data-line-number="166" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">166</div><div data-line-number="167" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">167</div><div data-line-number="168" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">168</div><div data-line-number="169" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">169</div><div data-line-number="170" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">170</div><div data-line-number="171" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">171</div><div data-line-number="172" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">172</div><div data-line-number="173" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-line-number react-code-text" style="padding-right:16px">173</div><div data-line-number="174" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">174<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="175" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-line-number react-code-text" style="padding-right:16px">175</div><div data-line-number="176" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-line-number react-code-text" style="padding-right:16px">176</div><div data-line-number="177" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-line-number react-code-text" style="padding-right:16px">177</div><div data-line-number="178" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-line-number react-code-text" style="padding-right:16px">178</div><div data-line-number="179" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-line-number react-code-text" style="padding-right:16px">179</div><div data-line-number="180" class="child-of-line-1 child-of-line-93 child-of-line-95 react-line-number react-code-text" style="padding-right:16px">180<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="181" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-line-number react-code-text" style="padding-right:16px">181</div><div data-line-number="182" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-line-number react-code-text" style="padding-right:16px">182</div><div data-line-number="183" class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-line-number react-code-text" style="padding-right:16px">183</div><div data-line-number="184" class="child-of-line-1 child-of-line-93 react-line-number react-code-text" style="padding-right:16px">184<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="185" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">185</div><div data-line-number="186" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">186</div><div data-line-number="187" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">187</div><div data-line-number="188" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">188</div><div data-line-number="189" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">189</div><div data-line-number="190" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">190</div><div data-line-number="191" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">191</div><div data-line-number="192" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">192</div><div data-line-number="193" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">193</div><div data-line-number="194" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">194</div><div data-line-number="195" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">195</div><div data-line-number="196" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">196</div><div data-line-number="197" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">197</div><div data-line-number="198" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">198</div><div data-line-number="199" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">199</div><div data-line-number="200" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">200</div><div data-line-number="201" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">201</div><div data-line-number="202" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">202</div><div data-line-number="203" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">203</div><div data-line-number="204" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">204</div><div data-line-number="205" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">205</div><div data-line-number="206" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">206<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="207" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">207</div><div data-line-number="208" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">208</div><div data-line-number="209" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">209</div><div data-line-number="210" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">210</div><div data-line-number="211" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">211</div><div data-line-number="212" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">212</div><div data-line-number="213" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">213</div><div data-line-number="214" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">214</div><div data-line-number="215" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">215</div><div data-line-number="216" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">216</div><div data-line-number="217" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">217</div><div data-line-number="218" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-line-number react-code-text" style="padding-right:16px">218</div><div data-line-number="219" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">219<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="220" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-line-number react-code-text" style="padding-right:16px">220</div><div data-line-number="221" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-line-number react-code-text" style="padding-right:16px">221</div><div data-line-number="222" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-line-number react-code-text" style="padding-right:16px">222</div><div data-line-number="223" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">223<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="224" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">224</div><div data-line-number="225" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">225</div><div data-line-number="226" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">226</div><div data-line-number="227" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">227</div><div data-line-number="228" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">228</div><div data-line-number="229" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">229</div><div data-line-number="230" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">230</div><div data-line-number="231" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">231</div><div data-line-number="232" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">232</div><div data-line-number="233" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">233</div><div data-line-number="234" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">234</div><div data-line-number="235" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-line-number react-code-text" style="padding-right:16px">235</div><div data-line-number="236" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">236<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="237" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">237</div><div data-line-number="238" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">238</div><div data-line-number="239" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">239</div><div data-line-number="240" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">240</div><div data-line-number="241" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">241</div><div data-line-number="242" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">242</div><div data-line-number="243" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">243</div><div data-line-number="244" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">244</div><div data-line-number="245" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">245</div><div data-line-number="246" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">246</div><div data-line-number="247" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">247</div><div data-line-number="248" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">248</div><div data-line-number="249" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">249</div><div data-line-number="250" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">250</div><div data-line-number="251" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">251</div><div data-line-number="252" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">252</div><div data-line-number="253" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">253</div><div data-line-number="254" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">254</div><div data-line-number="255" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-line-number react-code-text" style="padding-right:16px">255</div><div data-line-number="256" class="child-of-line-1 child-of-line-93 child-of-line-183 react-line-number react-code-text" style="padding-right:16px">256<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="257" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-line-number react-code-text" style="padding-right:16px">257</div><div data-line-number="258" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-line-number react-code-text" style="padding-right:16px">258</div><div data-line-number="259" class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-line-number react-code-text" style="padding-right:16px">259</div><div data-line-number="260" class="child-of-line-1 child-of-line-93 react-line-number react-code-text" style="padding-right:16px">260<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="261" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">261</div><div data-line-number="262" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">262</div><div data-line-number="263" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">263</div><div data-line-number="264" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">264</div><div data-line-number="265" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">265</div><div data-line-number="266" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">266</div><div data-line-number="267" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">267</div><div data-line-number="268" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">268</div><div data-line-number="269" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">269</div><div data-line-number="270" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">270</div><div data-line-number="271" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">271</div><div data-line-number="272" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">272</div><div data-line-number="273" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">273</div><div data-line-number="274" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">274</div><div data-line-number="275" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">275</div><div data-line-number="276" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">276</div><div data-line-number="277" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">277</div><div data-line-number="278" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">278</div><div data-line-number="279" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">279</div><div data-line-number="280" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">280</div><div data-line-number="281" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">281</div><div data-line-number="282" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">282</div><div data-line-number="283" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">283</div><div data-line-number="284" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">284</div><div data-line-number="285" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">285</div><div data-line-number="286" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">286</div><div data-line-number="287" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">287</div><div data-line-number="288" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">288</div><div data-line-number="289" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">289</div><div data-line-number="290" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">290</div><div data-line-number="291" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">291</div><div data-line-number="292" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">292</div><div data-line-number="293" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">293</div><div data-line-number="294" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">294</div><div data-line-number="295" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">295</div><div data-line-number="296" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">296</div><div data-line-number="297" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">297</div><div data-line-number="298" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">298</div><div data-line-number="299" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">299</div><div data-line-number="300" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">300</div><div data-line-number="301" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">301</div><div data-line-number="302" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">302</div><div data-line-number="303" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">303</div><div data-line-number="304" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">304</div><div data-line-number="305" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">305</div><div data-line-number="306" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">306</div><div data-line-number="307" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">307</div><div data-line-number="308" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">308</div><div data-line-number="309" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">309</div><div data-line-number="310" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">310</div><div data-line-number="311" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">311</div><div data-line-number="312" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">312</div><div data-line-number="313" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">313</div><div data-line-number="314" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">314</div><div data-line-number="315" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">315</div><div data-line-number="316" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">316</div><div data-line-number="317" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">317</div><div data-line-number="318" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">318</div><div data-line-number="319" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">319</div><div data-line-number="320" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">320</div><div data-line-number="321" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">321</div><div data-line-number="322" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">322</div><div data-line-number="323" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">323</div><div data-line-number="324" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">324</div><div data-line-number="325" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">325</div><div data-line-number="326" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">326</div><div data-line-number="327" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">327</div><div data-line-number="328" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">328</div><div data-line-number="329" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">329</div><div data-line-number="330" class="child-of-line-1 child-of-line-93 child-of-line-259 react-line-number react-code-text" style="padding-right:16px">330</div><div data-line-number="331" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">331<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="332" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">332</div><div data-line-number="333" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">333</div><div data-line-number="334" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">334<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="335" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">335</div><div data-line-number="336" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">336</div><div data-line-number="337" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">337</div><div data-line-number="338" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">338</div><div data-line-number="339" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">339</div><div data-line-number="340" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">340</div><div data-line-number="341" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">341</div><div data-line-number="342" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">342</div><div data-line-number="343" class="child-of-line-1 child-of-line-330 child-of-line-333 react-line-number react-code-text" style="padding-right:16px">343</div><div data-line-number="344" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">344<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="345" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">345</div><div data-line-number="346" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">346</div><div data-line-number="347" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">347</div><div data-line-number="348" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">348</div><div data-line-number="349" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">349</div><div data-line-number="350" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">350</div><div data-line-number="351" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">351</div><div data-line-number="352" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">352</div><div data-line-number="353" class="child-of-line-1 child-of-line-330 child-of-line-343 react-line-number react-code-text" style="padding-right:16px">353</div><div data-line-number="354" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">354<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="355" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">355</div><div data-line-number="356" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">356</div><div data-line-number="357" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">357</div><div data-line-number="358" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">358</div><div data-line-number="359" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">359</div><div data-line-number="360" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">360</div><div data-line-number="361" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">361</div><div data-line-number="362" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">362</div><div data-line-number="363" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">363</div><div data-line-number="364" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">364</div><div data-line-number="365" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">365</div><div data-line-number="366" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">366</div><div data-line-number="367" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">367</div><div data-line-number="368" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">368</div><div data-line-number="369" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">369</div><div data-line-number="370" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">370</div><div data-line-number="371" class="child-of-line-1 child-of-line-330 child-of-line-353 react-line-number react-code-text" style="padding-right:16px">371</div><div data-line-number="372" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">372<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="373" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">373</div><div data-line-number="374" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">374</div><div data-line-number="375" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">375</div><div data-line-number="376" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">376</div><div data-line-number="377" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">377</div><div data-line-number="378" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">378</div><div data-line-number="379" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">379</div><div data-line-number="380" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">380</div><div data-line-number="381" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">381</div><div data-line-number="382" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">382</div><div data-line-number="383" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">383</div><div data-line-number="384" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">384</div><div data-line-number="385" class="child-of-line-1 child-of-line-330 child-of-line-371 react-line-number react-code-text" style="padding-right:16px">385</div><div data-line-number="386" class="child-of-line-1 child-of-line-330 react-line-number react-code-text" style="padding-right:16px">386<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="387" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">387</div><div data-line-number="388" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">388</div><div data-line-number="389" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">389</div><div data-line-number="390" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">390</div><div data-line-number="391" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">391</div><div data-line-number="392" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">392</div><div data-line-number="393" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">393</div><div data-line-number="394" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">394</div><div data-line-number="395" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">395</div><div data-line-number="396" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">396</div><div data-line-number="397" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">397</div><div data-line-number="398" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">398</div><div data-line-number="399" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">399</div><div data-line-number="400" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">400</div><div data-line-number="401" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">401</div><div data-line-number="402" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">402</div><div data-line-number="403" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">403</div><div data-line-number="404" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">404</div><div data-line-number="405" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">405</div><div data-line-number="406" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">406</div><div data-line-number="407" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">407</div><div data-line-number="408" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">408</div><div data-line-number="409" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">409</div><div data-line-number="410" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">410</div><div data-line-number="411" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">411</div><div data-line-number="412" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">412</div><div data-line-number="413" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">413</div><div data-line-number="414" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">414</div><div data-line-number="415" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">415</div><div data-line-number="416" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">416</div><div data-line-number="417" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">417</div><div data-line-number="418" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">418</div><div data-line-number="419" class="child-of-line-1 child-of-line-330 child-of-line-385 react-line-number react-code-text" style="padding-right:16px">419</div><div data-line-number="420" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">420<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="421" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">421</div><div data-line-number="422" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">422</div><div data-line-number="423" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">423</div><div data-line-number="424" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">424</div><div data-line-number="425" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">425</div><div data-line-number="426" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">426</div><div data-line-number="427" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">427</div><div data-line-number="428" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">428</div><div data-line-number="429" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">429</div><div data-line-number="430" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">430<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="431" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">431</div><div data-line-number="432" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">432</div><div data-line-number="433" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">433</div><div data-line-number="434" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">434</div><div data-line-number="435" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">435</div><div data-line-number="436" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">436</div><div data-line-number="437" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">437</div><div data-line-number="438" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">438</div><div data-line-number="439" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">439</div><div data-line-number="440" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">440</div><div data-line-number="441" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">441</div><div data-line-number="442" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">442</div><div data-line-number="443" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">443</div><div data-line-number="444" class="child-of-line-1 child-of-line-419 child-of-line-429 react-line-number react-code-text" style="padding-right:16px">444</div><div data-line-number="445" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">445<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="446" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">446</div><div data-line-number="447" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">447</div><div data-line-number="448" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">448</div><div data-line-number="449" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">449</div><div data-line-number="450" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">450</div><div data-line-number="451" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">451</div><div data-line-number="452" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">452</div><div data-line-number="453" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">453</div><div data-line-number="454" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">454</div><div data-line-number="455" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">455</div><div data-line-number="456" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">456</div><div data-line-number="457" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">457</div><div data-line-number="458" class="child-of-line-1 child-of-line-419 child-of-line-444 react-line-number react-code-text" style="padding-right:16px">458</div><div data-line-number="459" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">459<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="460" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">460</div><div data-line-number="461" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">461</div><div data-line-number="462" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">462</div><div data-line-number="463" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">463</div><div data-line-number="464" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">464</div><div data-line-number="465" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">465</div><div data-line-number="466" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">466</div><div data-line-number="467" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">467</div><div data-line-number="468" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">468</div><div data-line-number="469" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">469</div><div data-line-number="470" class="child-of-line-1 child-of-line-419 child-of-line-458 react-line-number react-code-text" style="padding-right:16px">470</div><div data-line-number="471" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">471<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="472" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">472</div><div data-line-number="473" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">473</div><div data-line-number="474" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">474</div><div data-line-number="475" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">475</div><div data-line-number="476" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">476</div><div data-line-number="477" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">477</div><div data-line-number="478" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">478</div><div data-line-number="479" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">479</div><div data-line-number="480" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">480</div><div data-line-number="481" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">481</div><div data-line-number="482" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">482</div><div data-line-number="483" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">483</div><div data-line-number="484" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">484</div><div data-line-number="485" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">485</div><div data-line-number="486" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">486</div><div data-line-number="487" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">487</div><div data-line-number="488" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">488</div><div data-line-number="489" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">489</div><div data-line-number="490" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">490</div><div data-line-number="491" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">491</div><div data-line-number="492" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">492</div><div data-line-number="493" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">493</div><div data-line-number="494" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">494</div><div data-line-number="495" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">495</div><div data-line-number="496" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">496</div><div data-line-number="497" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">497</div><div data-line-number="498" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">498</div><div data-line-number="499" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">499</div><div data-line-number="500" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">500</div><div data-line-number="501" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">501</div><div data-line-number="502" class="child-of-line-1 child-of-line-419 child-of-line-470 react-line-number react-code-text" style="padding-right:16px">502</div><div data-line-number="503" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">503<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="504" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">504</div><div data-line-number="505" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">505</div><div data-line-number="506" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">506</div><div data-line-number="507" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">507</div><div data-line-number="508" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">508</div><div data-line-number="509" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">509</div><div data-line-number="510" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">510</div><div data-line-number="511" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">511</div><div data-line-number="512" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">512</div><div data-line-number="513" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">513</div><div data-line-number="514" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">514</div><div data-line-number="515" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">515</div><div data-line-number="516" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">516</div><div data-line-number="517" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">517</div><div data-line-number="518" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">518</div><div data-line-number="519" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">519</div><div data-line-number="520" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">520</div><div data-line-number="521" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">521</div><div data-line-number="522" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">522</div><div data-line-number="523" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">523</div><div data-line-number="524" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">524</div><div data-line-number="525" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">525</div><div data-line-number="526" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">526</div><div data-line-number="527" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">527</div><div data-line-number="528" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">528</div><div data-line-number="529" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">529</div><div data-line-number="530" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">530</div><div data-line-number="531" class="child-of-line-1 child-of-line-419 child-of-line-502 react-line-number react-code-text" style="padding-right:16px">531</div><div data-line-number="532" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">532<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="533" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">533</div><div data-line-number="534" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">534</div><div data-line-number="535" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">535</div><div data-line-number="536" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">536</div><div data-line-number="537" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">537</div><div data-line-number="538" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">538</div><div data-line-number="539" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">539</div><div data-line-number="540" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">540</div><div data-line-number="541" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">541</div><div data-line-number="542" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">542</div><div data-line-number="543" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">543</div><div data-line-number="544" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">544</div><div data-line-number="545" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">545</div><div data-line-number="546" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">546</div><div data-line-number="547" class="child-of-line-1 child-of-line-419 child-of-line-531 react-line-number react-code-text" style="padding-right:16px">547</div><div data-line-number="548" class="child-of-line-1 child-of-line-419 react-line-number react-code-text" style="padding-right:16px">548<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="549" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">549</div><div data-line-number="550" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">550</div><div data-line-number="551" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">551</div><div data-line-number="552" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">552</div><div data-line-number="553" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">553</div><div data-line-number="554" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">554</div><div data-line-number="555" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">555</div><div data-line-number="556" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">556</div><div data-line-number="557" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">557</div><div data-line-number="558" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">558</div><div data-line-number="559" class="child-of-line-1 child-of-line-419 child-of-line-547 react-line-number react-code-text" style="padding-right:16px">559</div><div data-line-number="560" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">560<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="561" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">561</div><div data-line-number="562" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">562</div><div data-line-number="563" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">563</div><div data-line-number="564" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">564</div><div data-line-number="565" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">565</div><div data-line-number="566" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">566</div><div data-line-number="567" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">567</div><div data-line-number="568" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">568</div><div data-line-number="569" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">569</div><div data-line-number="570" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">570</div><div data-line-number="571" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">571</div><div data-line-number="572" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">572</div><div data-line-number="573" class="child-of-line-1 child-of-line-559 react-line-number react-code-text" style="padding-right:16px">573</div><div data-line-number="574" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">574<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="575" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">575</div><div data-line-number="576" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">576</div><div data-line-number="577" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">577</div><div data-line-number="578" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">578</div><div data-line-number="579" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">579</div><div data-line-number="580" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">580</div><div data-line-number="581" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">581</div><div data-line-number="582" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">582</div><div data-line-number="583" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">583</div><div data-line-number="584" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">584</div><div data-line-number="585" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">585</div><div data-line-number="586" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">586</div><div data-line-number="587" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">587</div><div data-line-number="588" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">588</div><div data-line-number="589" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">589</div><div data-line-number="590" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">590</div><div data-line-number="591" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">591</div><div data-line-number="592" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">592</div><div data-line-number="593" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">593</div><div data-line-number="594" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">594</div><div data-line-number="595" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">595</div><div data-line-number="596" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">596<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="597" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">597</div><div data-line-number="598" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">598</div><div data-line-number="599" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">599</div><div data-line-number="600" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">600</div><div data-line-number="601" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">601</div><div data-line-number="602" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">602</div><div data-line-number="603" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">603</div><div data-line-number="604" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">604</div><div data-line-number="605" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">605</div><div data-line-number="606" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">606</div><div data-line-number="607" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">607</div><div data-line-number="608" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">608</div><div data-line-number="609" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">609</div><div data-line-number="610" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">610</div><div data-line-number="611" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">611</div><div data-line-number="612" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">612</div><div data-line-number="613" class="child-of-line-1 child-of-line-573 child-of-line-595 react-line-number react-code-text" style="padding-right:16px">613</div><div data-line-number="614" class="child-of-line-1 child-of-line-573 react-line-number react-code-text" style="padding-right:16px">614<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="615" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">615</div><div data-line-number="616" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">616</div><div data-line-number="617" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">617</div><div data-line-number="618" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">618</div><div data-line-number="619" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">619</div><div data-line-number="620" class="child-of-line-1 child-of-line-573 child-of-line-613 react-line-number react-code-text" style="padding-right:16px">620</div><div data-line-number="621" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">621<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="622" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">622</div><div data-line-number="623" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">623</div><div data-line-number="624" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">624</div><div data-line-number="625" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">625</div><div data-line-number="626" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">626</div><div data-line-number="627" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">627</div><div data-line-number="628" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">628</div><div data-line-number="629" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">629</div><div data-line-number="630" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">630</div><div data-line-number="631" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">631</div><div data-line-number="632" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">632</div><div data-line-number="633" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">633</div><div data-line-number="634" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">634</div><div data-line-number="635" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">635</div><div data-line-number="636" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">636</div><div data-line-number="637" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">637</div><div data-line-number="638" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">638</div><div data-line-number="639" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">639</div><div data-line-number="640" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">640</div><div data-line-number="641" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">641</div><div data-line-number="642" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">642</div><div data-line-number="643" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">643</div><div data-line-number="644" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">644</div><div data-line-number="645" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">645</div><div data-line-number="646" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">646</div><div data-line-number="647" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">647</div><div data-line-number="648" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">648</div><div data-line-number="649" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">649</div><div data-line-number="650" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">650</div><div data-line-number="651" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">651</div><div data-line-number="652" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">652</div><div data-line-number="653" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">653</div><div data-line-number="654" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">654</div><div data-line-number="655" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">655</div><div data-line-number="656" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">656</div><div data-line-number="657" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">657</div><div data-line-number="658" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">658</div><div data-line-number="659" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">659</div><div data-line-number="660" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">660</div><div data-line-number="661" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">661</div><div data-line-number="662" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">662</div><div data-line-number="663" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">663</div><div data-line-number="664" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">664</div><div data-line-number="665" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">665</div><div data-line-number="666" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">666<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="667" class="child-of-line-1 child-of-line-620 child-of-line-665 react-line-number react-code-text" style="padding-right:16px">667</div><div data-line-number="668" class="child-of-line-1 child-of-line-620 child-of-line-665 react-line-number react-code-text" style="padding-right:16px">668</div><div data-line-number="669" class="child-of-line-1 child-of-line-620 child-of-line-665 react-line-number react-code-text" style="padding-right:16px">669</div><div data-line-number="670" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">670<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="671" class="child-of-line-1 child-of-line-620 child-of-line-669 react-line-number react-code-text" style="padding-right:16px">671</div><div data-line-number="672" class="child-of-line-1 child-of-line-620 child-of-line-669 react-line-number react-code-text" style="padding-right:16px">672</div><div data-line-number="673" class="child-of-line-1 child-of-line-620 child-of-line-669 react-line-number react-code-text" style="padding-right:16px">673</div><div data-line-number="674" class="child-of-line-1 child-of-line-620 child-of-line-669 react-line-number react-code-text" style="padding-right:16px">674</div><div data-line-number="675" class="child-of-line-1 child-of-line-620 child-of-line-669 react-line-number react-code-text" style="padding-right:16px">675</div><div data-line-number="676" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">676<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="677" class="child-of-line-1 child-of-line-620 child-of-line-675 react-line-number react-code-text" style="padding-right:16px">677</div><div data-line-number="678" class="child-of-line-1 child-of-line-620 child-of-line-675 react-line-number react-code-text" style="padding-right:16px">678</div><div data-line-number="679" class="child-of-line-1 child-of-line-620 child-of-line-675 react-line-number react-code-text" style="padding-right:16px">679</div><div data-line-number="680" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">680<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="681" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">681</div><div data-line-number="682" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">682</div><div data-line-number="683" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">683</div><div data-line-number="684" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">684</div><div data-line-number="685" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">685</div><div data-line-number="686" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">686</div><div data-line-number="687" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">687</div><div data-line-number="688" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">688</div><div data-line-number="689" class="child-of-line-1 child-of-line-620 child-of-line-679 react-line-number react-code-text" style="padding-right:16px">689</div><div data-line-number="690" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">690<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="691" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">691</div><div data-line-number="692" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">692</div><div data-line-number="693" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">693</div><div data-line-number="694" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">694</div><div data-line-number="695" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">695</div><div data-line-number="696" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">696</div><div data-line-number="697" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">697</div><div data-line-number="698" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">698</div><div data-line-number="699" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">699</div><div data-line-number="700" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">700</div><div data-line-number="701" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">701</div><div data-line-number="702" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">702</div><div data-line-number="703" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">703</div><div data-line-number="704" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">704</div><div data-line-number="705" class="child-of-line-1 child-of-line-620 child-of-line-689 react-line-number react-code-text" style="padding-right:16px">705</div><div data-line-number="706" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">706<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="707" class="child-of-line-1 child-of-line-620 child-of-line-705 react-line-number react-code-text" style="padding-right:16px">707</div><div data-line-number="708" class="child-of-line-1 child-of-line-620 child-of-line-705 react-line-number react-code-text" style="padding-right:16px">708</div><div data-line-number="709" class="child-of-line-1 child-of-line-620 child-of-line-705 react-line-number react-code-text" style="padding-right:16px">709</div><div data-line-number="710" class="child-of-line-1 child-of-line-620 react-line-number react-code-text" style="padding-right:16px">710<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="711" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">711</div><div data-line-number="712" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">712</div><div data-line-number="713" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">713</div><div data-line-number="714" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">714</div><div data-line-number="715" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">715</div><div data-line-number="716" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">716</div><div data-line-number="717" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">717</div><div data-line-number="718" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">718</div><div data-line-number="719" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">719</div><div data-line-number="720" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">720</div><div data-line-number="721" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">721</div><div data-line-number="722" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">722</div><div data-line-number="723" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">723</div><div data-line-number="724" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">724</div><div data-line-number="725" class="child-of-line-1 child-of-line-620 child-of-line-709 react-line-number react-code-text" style="padding-right:16px">725</div><div data-line-number="726" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">726<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="727" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">727</div><div data-line-number="728" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">728</div><div data-line-number="729" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">729</div><div data-line-number="730" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">730<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="731" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">731</div><div data-line-number="732" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">732</div><div data-line-number="733" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">733</div><div data-line-number="734" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">734</div><div data-line-number="735" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">735</div><div data-line-number="736" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">736</div><div data-line-number="737" class="child-of-line-1 child-of-line-725 child-of-line-729 react-line-number react-code-text" style="padding-right:16px">737</div><div data-line-number="738" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">738<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="739" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">739</div><div data-line-number="740" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">740</div><div data-line-number="741" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">741</div><div data-line-number="742" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">742</div><div data-line-number="743" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">743</div><div data-line-number="744" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">744</div><div data-line-number="745" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">745</div><div data-line-number="746" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">746</div><div data-line-number="747" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">747</div><div data-line-number="748" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">748</div><div data-line-number="749" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">749</div><div data-line-number="750" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">750</div><div data-line-number="751" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">751</div><div data-line-number="752" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">752</div><div data-line-number="753" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">753</div><div data-line-number="754" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">754</div><div data-line-number="755" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">755</div><div data-line-number="756" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">756</div><div data-line-number="757" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">757</div><div data-line-number="758" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">758</div><div data-line-number="759" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">759</div><div data-line-number="760" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">760</div><div data-line-number="761" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">761</div><div data-line-number="762" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">762</div><div data-line-number="763" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">763</div><div data-line-number="764" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">764</div><div data-line-number="765" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">765</div><div data-line-number="766" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">766</div><div data-line-number="767" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">767</div><div data-line-number="768" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">768</div><div data-line-number="769" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">769</div><div data-line-number="770" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">770</div><div data-line-number="771" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">771</div><div data-line-number="772" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">772</div><div data-line-number="773" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">773</div><div data-line-number="774" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">774</div><div data-line-number="775" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">775</div><div data-line-number="776" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">776</div><div data-line-number="777" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">777</div><div data-line-number="778" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">778</div><div data-line-number="779" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">779</div><div data-line-number="780" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">780</div><div data-line-number="781" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">781</div><div data-line-number="782" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">782</div><div data-line-number="783" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">783</div><div data-line-number="784" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">784</div><div data-line-number="785" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">785</div><div data-line-number="786" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">786</div><div data-line-number="787" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">787</div><div data-line-number="788" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">788</div><div data-line-number="789" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">789</div><div data-line-number="790" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">790</div><div data-line-number="791" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">791</div><div data-line-number="792" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">792</div><div data-line-number="793" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">793</div><div data-line-number="794" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">794</div><div data-line-number="795" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">795</div><div data-line-number="796" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">796</div><div data-line-number="797" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">797</div><div data-line-number="798" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">798</div><div data-line-number="799" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">799</div><div data-line-number="800" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">800</div><div data-line-number="801" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">801</div><div data-line-number="802" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">802</div><div data-line-number="803" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">803</div><div data-line-number="804" class="child-of-line-1 child-of-line-725 child-of-line-737 react-line-number react-code-text" style="padding-right:16px">804</div><div data-line-number="805" class="child-of-line-1 child-of-line-725 react-line-number react-code-text" style="padding-right:16px">805<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="806" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">806</div><div data-line-number="807" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">807</div><div data-line-number="808" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">808</div><div data-line-number="809" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">809</div><div data-line-number="810" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">810</div><div data-line-number="811" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">811</div><div data-line-number="812" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">812</div><div data-line-number="813" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">813</div><div data-line-number="814" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">814</div><div data-line-number="815" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">815</div><div data-line-number="816" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">816</div><div data-line-number="817" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">817</div><div data-line-number="818" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">818</div><div data-line-number="819" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">819</div><div data-line-number="820" class="child-of-line-1 child-of-line-725 child-of-line-804 react-line-number react-code-text" style="padding-right:16px">820</div><div data-line-number="821" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">821<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="822" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">822</div><div data-line-number="823" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">823</div><div data-line-number="824" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">824</div><div data-line-number="825" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">825</div><div data-line-number="826" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">826</div><div data-line-number="827" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">827</div><div data-line-number="828" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">828</div><div data-line-number="829" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">829</div><div data-line-number="830" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">830</div><div data-line-number="831" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">831</div><div data-line-number="832" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">832</div><div data-line-number="833" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">833</div><div data-line-number="834" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">834</div><div data-line-number="835" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">835</div><div data-line-number="836" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">836</div><div data-line-number="837" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">837</div><div data-line-number="838" class="child-of-line-1 child-of-line-820 react-line-number react-code-text" style="padding-right:16px">838</div><div data-line-number="839" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">839<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="840" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">840</div><div data-line-number="841" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">841</div><div data-line-number="842" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">842</div><div data-line-number="843" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">843</div><div data-line-number="844" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">844</div><div data-line-number="845" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">845</div><div data-line-number="846" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">846</div><div data-line-number="847" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">847</div><div data-line-number="848" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">848</div><div data-line-number="849" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">849</div><div data-line-number="850" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">850</div><div data-line-number="851" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">851</div><div data-line-number="852" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">852</div><div data-line-number="853" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">853</div><div data-line-number="854" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">854</div><div data-line-number="855" class="child-of-line-1 child-of-line-838 react-line-number react-code-text" style="padding-right:16px">855</div><div data-line-number="856" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">856<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="857" class="child-of-line-1 child-of-line-855 react-line-number react-code-text" style="padding-right:16px">857</div><div data-line-number="858" class="child-of-line-1 child-of-line-855 react-line-number react-code-text" style="padding-right:16px">858<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="859" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">859</div><div data-line-number="860" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">860</div><div data-line-number="861" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">861</div><div data-line-number="862" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">862</div><div data-line-number="863" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">863</div><div data-line-number="864" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">864</div><div data-line-number="865" class="child-of-line-1 child-of-line-855 child-of-line-857 react-line-number react-code-text" style="padding-right:16px">865</div><div data-line-number="866" class="child-of-line-1 child-of-line-855 react-line-number react-code-text" style="padding-right:16px">866<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="867" class="child-of-line-1 child-of-line-855 child-of-line-865 react-line-number react-code-text" style="padding-right:16px">867</div><div data-line-number="868" class="child-of-line-1 child-of-line-855 child-of-line-865 react-line-number react-code-text" style="padding-right:16px">868</div><div data-line-number="869" class="child-of-line-1 child-of-line-855 child-of-line-865 react-line-number react-code-text" style="padding-right:16px">869</div><div data-line-number="870" class="child-of-line-1 react-line-number react-code-text" style="padding-right:16px">870<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="871" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">871</div><div data-line-number="872" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">872<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="873" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">873</div><div data-line-number="874" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">874</div><div data-line-number="875" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">875</div><div data-line-number="876" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">876</div><div data-line-number="877" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">877</div><div data-line-number="878" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">878</div><div data-line-number="879" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">879</div><div data-line-number="880" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">880</div><div data-line-number="881" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">881</div><div data-line-number="882" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">882</div><div data-line-number="883" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">883</div><div data-line-number="884" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">884</div><div data-line-number="885" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">885</div><div data-line-number="886" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">886</div><div data-line-number="887" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">887</div><div data-line-number="888" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">888</div><div data-line-number="889" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">889</div><div data-line-number="890" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">890</div><div data-line-number="891" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">891</div><div data-line-number="892" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">892</div><div data-line-number="893" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">893</div><div data-line-number="894" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">894</div><div data-line-number="895" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">895</div><div data-line-number="896" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">896</div><div data-line-number="897" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">897</div><div data-line-number="898" class="child-of-line-1 child-of-line-869 child-of-line-871 react-line-number react-code-text" style="padding-right:16px">898</div><div data-line-number="899" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">899<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="900" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">900</div><div data-line-number="901" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">901</div><div data-line-number="902" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">902</div><div data-line-number="903" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">903</div><div data-line-number="904" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">904</div><div data-line-number="905" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">905</div><div data-line-number="906" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">906</div><div data-line-number="907" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">907</div><div data-line-number="908" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">908</div><div data-line-number="909" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">909</div><div data-line-number="910" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">910</div><div data-line-number="911" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">911</div><div data-line-number="912" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">912</div><div data-line-number="913" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">913</div><div data-line-number="914" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">914</div><div data-line-number="915" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">915</div><div data-line-number="916" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">916</div><div data-line-number="917" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">917</div><div data-line-number="918" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">918</div><div data-line-number="919" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">919</div><div data-line-number="920" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">920</div><div data-line-number="921" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">921</div><div data-line-number="922" class="child-of-line-1 child-of-line-869 child-of-line-898 react-line-number react-code-text" style="padding-right:16px">922</div><div data-line-number="923" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">923<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="924" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">924</div><div data-line-number="925" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">925</div><div data-line-number="926" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">926</div><div data-line-number="927" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">927</div><div data-line-number="928" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">928</div><div data-line-number="929" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">929</div><div data-line-number="930" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">930</div><div data-line-number="931" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">931</div><div data-line-number="932" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">932</div><div data-line-number="933" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">933</div><div data-line-number="934" class="child-of-line-1 child-of-line-869 child-of-line-922 react-line-number react-code-text" style="padding-right:16px">934</div><div data-line-number="935" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">935<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="936" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">936</div><div data-line-number="937" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">937</div><div data-line-number="938" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">938</div><div data-line-number="939" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">939</div><div data-line-number="940" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">940</div><div data-line-number="941" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">941</div><div data-line-number="942" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">942</div><div data-line-number="943" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">943</div><div data-line-number="944" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">944</div><div data-line-number="945" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">945</div><div data-line-number="946" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">946</div><div data-line-number="947" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">947</div><div data-line-number="948" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">948</div><div data-line-number="949" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">949</div><div data-line-number="950" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">950</div><div data-line-number="951" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">951</div><div data-line-number="952" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">952</div><div data-line-number="953" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">953</div><div data-line-number="954" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">954</div><div data-line-number="955" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">955</div><div data-line-number="956" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">956</div><div data-line-number="957" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">957</div><div data-line-number="958" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">958</div><div data-line-number="959" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">959</div><div data-line-number="960" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">960</div><div data-line-number="961" class="child-of-line-1 child-of-line-869 child-of-line-934 react-line-number react-code-text" style="padding-right:16px">961</div><div data-line-number="962" class="child-of-line-1 child-of-line-869 react-line-number react-code-text" style="padding-right:16px">962<span class="Box-sc-g0xbh4-0 cJGaMs"><div aria-label="Collapse code section" role="button" class="Box-sc-g0xbh4-0 iGLarr"><svg aria-hidden="true" focusable="false" class="Octicon-sc-9kayk9-0" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></div></span></div><div data-line-number="963" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">963</div><div data-line-number="964" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">964</div><div data-line-number="965" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">965</div><div data-line-number="966" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">966</div><div data-line-number="967" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">967</div><div data-line-number="968" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">968</div><div data-line-number="969" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">969</div><div data-line-number="970" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">970</div><div data-line-number="971" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">971</div><div data-line-number="972" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">972</div><div data-line-number="973" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">973</div><div data-line-number="974" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">974</div><div data-line-number="975" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">975</div><div data-line-number="976" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">976</div><div data-line-number="977" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">977</div><div data-line-number="978" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">978</div><div data-line-number="979" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">979</div><div data-line-number="980" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">980</div><div data-line-number="981" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">981</div><div data-line-number="982" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">982</div><div data-line-number="983" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">983</div><div data-line-number="984" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">984</div><div data-line-number="985" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">985</div><div data-line-number="986" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">986</div><div data-line-number="987" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">987</div><div data-line-number="988" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">988</div><div data-line-number="989" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">989</div><div data-line-number="990" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">990</div><div data-line-number="991" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">991</div><div data-line-number="992" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">992</div><div data-line-number="993" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">993</div><div data-line-number="994" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">994</div><div data-line-number="995" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">995</div><div data-line-number="996" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">996</div><div data-line-number="997" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">997</div><div data-line-number="998" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">998</div><div data-line-number="999" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">999</div><div data-line-number="1000" class="child-of-line-1 child-of-line-869 child-of-line-961 react-line-number react-code-text" style="padding-right:16px">1000</div></div><div class="react-code-lines"><div class="react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC1" class="react-file-line html-div" data-testid="code-cell" data-line-number="1" style="position:relative">(<span class="pl-smi">PS</span>:扫描[首页里面的二维码](<span class="pl-smi">README</span>.<span class="pl-smi">md</span>)进群,分享我自己在看的技术资料给大家,希望和大家<span class="pl-s1">一</span>起学习进步!)</div></div></div><div class="react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC2" class="react-file-line html-div" data-testid="code-cell" data-line-number="2" style="position:relative"># 多线程专题</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC3" class="react-file-line html-div" data-testid="code-cell" data-line-number="3" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC4" class="react-file-line html-div" data-testid="code-cell" data-line-number="4" style="position:relative">#### [<span class="pl-c1">1.</span>进程与线程的区别是什么?](#进程与线程的区别是什么?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC5" class="react-file-line html-div" data-testid="code-cell" data-line-number="5" style="position:relative">#### [<span class="pl-c1">2.</span>进程间如何通信?](#进程间如何通信?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC6" class="react-file-line html-div" data-testid="code-cell" data-line-number="6" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC7" class="react-file-line html-div" data-testid="code-cell" data-line-number="7" style="position:relative">#### [<span class="pl-c1">3.</span><span class="pl-s1">Java</span>中单例有哪些写法?](#<span class="pl-s1">Java</span>中单例有哪些写法?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC8" class="react-file-line html-div" data-testid="code-cell" data-line-number="8" style="position:relative">#### [<span class="pl-c1">4.</span><span class="pl-s1">Java</span>中创建线程有哪些方式?](#<span class="pl-s1">Java</span>中创建线程有哪些方式?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC9" class="react-file-line html-div" data-testid="code-cell" data-line-number="9" style="position:relative">#### [<span class="pl-c1">5.</span>如何解决序列化时可以创建出单例对象的问题?](#如何解决序列化时可以创建出单例对象的问题?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC10" class="react-file-line html-div" data-testid="code-cell" data-line-number="10" style="position:relative">#### [<span class="pl-c1">6.</span><span class="pl-s1">volatile</span>关键字有什么用?怎么理解可见性,<span class="pl-s1">一</span>般什么场景去用可见性?](#<span class="pl-k">volatile</span>关键字有什么用?怎么理解可见性,<span class="pl-s1">一</span>般什么场景去用可见性?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC11" class="react-file-line html-div" data-testid="code-cell" data-line-number="11" style="position:relative">#### [<span class="pl-c1">7.</span><span class="pl-s1">Java</span>中线程的状态是怎么样的?](#<span class="pl-s1">Java</span>中线程的状态是怎么样的?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC12" class="react-file-line html-div" data-testid="code-cell" data-line-number="12" style="position:relative">#### [<span class="pl-c1">8.</span><span class="pl-en">wait</span>(),<span class="pl-en">join</span>(),<span class="pl-en">sleep</span>()方法有什么作用?](#<span class="pl-en">wait</span>(),<span class="pl-en">join</span>(),<span class="pl-en">sleep</span>()方法有什么作用?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC13" class="react-file-line html-div" data-testid="code-cell" data-line-number="13" style="position:relative">#### [<span class="pl-c1">9.</span><span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(),<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()有什么区别?](#<span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(),<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()有什么区别?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC14" class="react-file-line html-div" data-testid="code-cell" data-line-number="14" style="position:relative">#### [<span class="pl-c1">10.</span>谈<span class="pl-s1">一</span>谈你对线程中断的理解?](#谈<span class="pl-s1">一</span>谈你对线程中断的理解?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC15" class="react-file-line html-div" data-testid="code-cell" data-line-number="15" style="position:relative">#### [<span class="pl-c1">11.</span>线程间怎么通信?](#线程间怎么通信?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC16" class="react-file-line html-div" data-testid="code-cell" data-line-number="16" style="position:relative">#### [<span class="pl-c1">12.</span>怎么实现实现<span class="pl-s1">一</span>个生产者消费者?](#怎么实现实现<span class="pl-s1">一</span>个生产者消费者?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC17" class="react-file-line html-div" data-testid="code-cell" data-line-number="17" style="position:relative">#### [<span class="pl-c1">13.</span>谈<span class="pl-s1">一</span>谈你对线程池的理解?](#谈<span class="pl-s1">一</span>谈你对线程池的理解?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC18" class="react-file-line html-div" data-testid="code-cell" data-line-number="18" style="position:relative">#### [<span class="pl-c1">14.</span>线程池有哪些状态?](#线程池有哪些状态?)</div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC19" class="react-file-line html-div" data-testid="code-cell" data-line-number="19" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC20" class="react-file-line html-div" data-testid="code-cell" data-line-number="20" style="position:relative">### 进程与线程的区别是什么?</div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC21" class="react-file-line html-div" data-testid="code-cell" data-line-number="21" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC22" class="react-file-line html-div" data-testid="code-cell" data-line-number="22" style="position:relative">#### 批处理操作系统</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-21 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC23" class="react-file-line html-div" data-testid="code-cell" data-line-number="23" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-21 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC24" class="react-file-line html-div" data-testid="code-cell" data-line-number="24" style="position:relative">**批处理操作系统**就是把<span class="pl-smi">一</span>系列需要操作的指令写下来,形成<span class="pl-s1">一</span>个清单,<span class="pl-s1">一</span>次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另<span class="pl-s1">一</span>个磁带上。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-21 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC25" class="react-file-line html-div" data-testid="code-cell" data-line-number="25" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-21 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC26" class="react-file-line html-div" data-testid="code-cell" data-line-number="26" style="position:relative">批处理操作系统在<span class="pl-s1">一</span>定程度上提高了计算机的效率,但是由于**批处理操作系统的指令运行方式仍然是串行的,内存中始终只有<span class="pl-s1">一</span>个程序在运行**,后面的程序需要等待前面的程序执行完成后才能开始执行,而前面的程序有时会由于<span class="pl-s1">I</span>/<span class="pl-s1">O</span>操作、网络等原因阻塞,导致<span class="pl-c1">CPU</span>闲置所以**批处理操作效率也不高**。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-21 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC27" class="react-file-line html-div" data-testid="code-cell" data-line-number="27" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC28" class="react-file-line html-div" data-testid="code-cell" data-line-number="28" style="position:relative">#### 进程的提出</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-27 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC29" class="react-file-line html-div" data-testid="code-cell" data-line-number="29" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-27 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC30" class="react-file-line html-div" data-testid="code-cell" data-line-number="30" style="position:relative">批处理操作系统的瓶颈在于内存中只存在<span class="pl-smi">一</span>个程序,进程的提出,可以让内存中存在多个程序,每个程序对应<span class="pl-s1">一</span>个进程,进程是操作系统资源分配的最小单位。<span class="pl-c1">CPU</span>采用时间片轮转的方式运行进程:<span class="pl-c1">CPU</span>为每个进程分配<span class="pl-s1">一</span>个时间段,称作它的时间片。如果在时间片结束时进程还在运行,则暂停这个进程的运行,并且<span class="pl-smi">CPU</span>分配给另<span class="pl-s1">一</span>个进程(这个过程叫做上下文切换)。如果进程在时间片结束前阻塞或结束,则<span class="pl-c1">CPU</span>立即进行切换,不用等待时间片用完。多进程的好处在于<span class="pl-s1">一</span>个在进行<span class="pl-c1">IO</span>操作时可以让出<span class="pl-smi">CPU</span>时间片,让<span class="pl-c1">CPU</span>执行其他进程的任务。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-27 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC31" class="react-file-line html-div" data-testid="code-cell" data-line-number="31" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC32" class="react-file-line html-div" data-testid="code-cell" data-line-number="32" style="position:relative">#### 线程的提出</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-31 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC33" class="react-file-line html-div" data-testid="code-cell" data-line-number="33" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-31 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC34" class="react-file-line html-div" data-testid="code-cell" data-line-number="34" style="position:relative">随着计算机的发展,对<span class="pl-c1">CPU</span>的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程序的要求了。于是就发明了线程,线程是程序执行中<span class="pl-s1">一</span>个单<span class="pl-s1">一</span>的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。<span class="pl-en">一</span>个进程可以有<span class="pl-s1">一</span>个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-31 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC35" class="react-file-line html-div" data-testid="code-cell" data-line-number="35" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC36" class="react-file-line html-div" data-testid="code-cell" data-line-number="36" style="position:relative">#### 进程和线程的区别</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC37" class="react-file-line html-div" data-testid="code-cell" data-line-number="37" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC38" class="react-file-line html-div" data-testid="code-cell" data-line-number="38" style="position:relative">进程是计算机中已运行程序的实体,进程是操作系统资源分配的最小单位。而线程是在进程中执行的<span class="pl-s1">一</span>个任务,是<span class="pl-c1">CPU</span>调度和执行的最小单位。他们两个本质的区别是是否**单独占有内存地址空间及其它系统资源(比如<span class="pl-s1">I</span>/<span class="pl-s1">O</span>)**:</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC39" class="react-file-line html-div" data-testid="code-cell" data-line-number="39" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC40" class="react-file-line html-div" data-testid="code-cell" data-line-number="40" style="position:relative">* 进程单独占有<span class="pl-s1">一</span>定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC41" class="react-file-line html-div" data-testid="code-cell" data-line-number="41" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC42" class="react-file-line html-div" data-testid="code-cell" data-line-number="42" style="position:relative">* 进程单独占有<span class="pl-s1">一</span>定的内存地址空间,<span class="pl-s1">一</span>个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高;<span class="pl-s1">一</span>个线程崩溃可能影响整个程序的稳定性,可靠性较低。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC43" class="react-file-line html-div" data-testid="code-cell" data-line-number="43" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC44" class="react-file-line html-div" data-testid="code-cell" data-line-number="44" style="position:relative">* 进程单独占有<span class="pl-smi">一</span>定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较大;线程只需要保存寄存器和栈信息,开销较小。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC45" class="react-file-line html-div" data-testid="code-cell" data-line-number="45" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC46" class="react-file-line html-div" data-testid="code-cell" data-line-number="46" style="position:relative">另外<span class="pl-s1">一</span>个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即<span class="pl-c1">CPU</span>分配时间的单位 。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-35 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC47" class="react-file-line html-div" data-testid="code-cell" data-line-number="47" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC48" class="react-file-line html-div" data-testid="code-cell" data-line-number="48" style="position:relative">#### 独立性</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-47 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC49" class="react-file-line html-div" data-testid="code-cell" data-line-number="49" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-47 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC50" class="react-file-line html-div" data-testid="code-cell" data-line-number="50" style="position:relative"><span class="pl-s1">Linux</span>系统会给每个进程分配<span class="pl-c1">4</span><span class="pl-s1">G</span>的虚拟地址空间(<span class="pl-c1">0</span>到<span class="pl-c1">3</span><span class="pl-s1">G</span>是<span class="pl-s1">User</span>地址空间,<span class="pl-c1">3</span>到<span class="pl-c1">4</span><span class="pl-s1">G</span>部分是<span class="pl-s1">kernel</span>地址空间),进程具备私有的地址空间,未经允许,<span class="pl-s1">一</span>个用户进程不能访问其他进程的地址空间。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-47 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC51" class="react-file-line html-div" data-testid="code-cell" data-line-number="51" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC52" class="react-file-line html-div" data-testid="code-cell" data-line-number="52" style="position:relative">#### 动态性</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC53" class="react-file-line html-div" data-testid="code-cell" data-line-number="53" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC54" class="react-file-line html-div" data-testid="code-cell" data-line-number="54" style="position:relative">程序是<span class="pl-s1">一</span>个静态的指令集合,而进程是正在操作系统中运行的指令集合,进程有自己的生命周期和各种不同的状态。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC55" class="react-file-line html-div" data-testid="code-cell" data-line-number="55" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC56" class="react-file-line html-div" data-testid="code-cell" data-line-number="56" style="position:relative">五态模型<span class="pl-s1">一</span>般指的是:</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC57" class="react-file-line html-div" data-testid="code-cell" data-line-number="57" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC58" class="react-file-line html-div" data-testid="code-cell" data-line-number="58" style="position:relative">**新建态**(创建<span class="pl-s1">一</span>个进程)</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC59" class="react-file-line html-div" data-testid="code-cell" data-line-number="59" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC60" class="react-file-line html-div" data-testid="code-cell" data-line-number="60" style="position:relative">**就绪态**(已经获取到资源,准备好了,进入运行队列,<span class="pl-s1">一</span>旦获得时间片可以立即执行)</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC61" class="react-file-line html-div" data-testid="code-cell" data-line-number="61" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC62" class="react-file-line html-div" data-testid="code-cell" data-line-number="62" style="position:relative">**运行态**(获取到了时间片,执行程序)</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC63" class="react-file-line html-div" data-testid="code-cell" data-line-number="63" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC64" class="react-file-line html-div" data-testid="code-cell" data-line-number="64" style="position:relative">**阻塞态**(运行过程中等待获取其他资源,<span class="pl-s1">I</span>/<span class="pl-s1">O</span>请求等)</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC65" class="react-file-line html-div" data-testid="code-cell" data-line-number="65" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC66" class="react-file-line html-div" data-testid="code-cell" data-line-number="66" style="position:relative">**终止态**(进程被杀死了)</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-51 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC67" class="react-file-line html-div" data-testid="code-cell" data-line-number="67" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC68" class="react-file-line html-div" data-testid="code-cell" data-line-number="68" style="position:relative">#### 并发性</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-67 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC69" class="react-file-line html-div" data-testid="code-cell" data-line-number="69" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-67 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC70" class="react-file-line html-div" data-testid="code-cell" data-line-number="70" style="position:relative">多个进程可以在<span class="pl-c1">CPU</span>上并发执行。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-67 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC71" class="react-file-line html-div" data-testid="code-cell" data-line-number="71" style="position:relative">线程是独立运行和调度的最小单位,线程会共享进程的虚拟空间,<span class="pl-s1">一</span>个进程会对应多个线程。在<span class="pl-s1">Java</span>中,线程拥有自己私有的程序计数器,虚拟机栈,本地方法栈。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-67 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC72" class="react-file-line html-div" data-testid="code-cell" data-line-number="72" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC73" class="react-file-line html-div" data-testid="code-cell" data-line-number="73" style="position:relative">#### <span class="pl-c1">PS</span>:虚拟内存</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-72 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC74" class="react-file-line html-div" data-testid="code-cell" data-line-number="74" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-72 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC75" class="react-file-line html-div" data-testid="code-cell" data-line-number="75" style="position:relative">虚拟内存是<span class="pl-s1">一</span>种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做<span class="pl-s1">一</span>级存储器来用。虚拟内存技术的实现利用了自动覆盖和交换技术。简单的说就是将硬盘的<span class="pl-s1">一</span>部分作为内存来使用。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-72 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC76" class="react-file-line html-div" data-testid="code-cell" data-line-number="76" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC77" class="react-file-line html-div" data-testid="code-cell" data-line-number="77" style="position:relative">#### <span class="pl-c1">PS</span>:虚拟地址空间</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-76 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC78" class="react-file-line html-div" data-testid="code-cell" data-line-number="78" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-76 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC79" class="react-file-line html-div" data-testid="code-cell" data-line-number="79" style="position:relative">每个进程有<span class="pl-c1">4</span><span class="pl-s1">G</span>的地址空间,在运行程序时,只有<span class="pl-smi">一</span>部分数据是真正加载到内存中的,内存管理单元将虚拟地址转换为物理地址,如果内存中不存在这部分数据,那么会使用页面置换方法,将内存页置换出来,然后将外存中的数据加入到内存中,使得程序正常运行。</div></div></div><div class="child-of-line-1 child-of-line-19 child-of-line-76 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC80" class="react-file-line html-div" data-testid="code-cell" data-line-number="80" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC81" class="react-file-line html-div" data-testid="code-cell" data-line-number="81" style="position:relative">### 进程间如何通信?</div></div></div><div class="child-of-line-1 child-of-line-80 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC82" class="react-file-line html-div" data-testid="code-cell" data-line-number="82" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-80 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC83" class="react-file-line html-div" data-testid="code-cell" data-line-number="83" style="position:relative">进程间通信的方式主要有管道,</div></div></div><div class="child-of-line-1 child-of-line-80 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC84" class="react-file-line html-div" data-testid="code-cell" data-line-number="84" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-80 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC85" class="react-file-line html-div" data-testid="code-cell" data-line-number="85" style="position:relative">#### 管道</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC86" class="react-file-line html-div" data-testid="code-cell" data-line-number="86" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC87" class="react-file-line html-div" data-testid="code-cell" data-line-number="87" style="position:relative">调用<span class="pl-s1">pipe</span>函数在内存中开辟<span class="pl-s1">一</span>块缓冲区,管道半双工的(即数据只能在<span class="pl-s1">一</span>个方向上流动),具有固定的读端和写端,调用</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC88" class="react-file-line html-div" data-testid="code-cell" data-line-number="88" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC89" class="react-file-line html-div" data-testid="code-cell" data-line-number="89" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC90" class="react-file-line html-div" data-testid="code-cell" data-line-number="90" style="position:relative">#<span class="pl-s1">include</span> &lt;<span class="pl-s1">unistd</span>.<span class="pl-s1">h</span>&gt;</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC91" class="react-file-line html-div" data-testid="code-cell" data-line-number="91" style="position:relative"><span class="pl-smi">int</span> <span class="pl-s1">pipe</span>(<span class="pl-smi">int</span> <span class="pl-s1">pipefd</span>[<span class="pl-c1">2</span>]);</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC92" class="react-file-line html-div" data-testid="code-cell" data-line-number="92" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-80 child-of-line-84 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC93" class="react-file-line html-div" data-testid="code-cell" data-line-number="93" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC94" class="react-file-line html-div" data-testid="code-cell" data-line-number="94" style="position:relative">### <span class="pl-s1">Java</span>中创建线程有哪些方式?</div></div></div><div class="child-of-line-1 child-of-line-93 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC95" class="react-file-line html-div" data-testid="code-cell" data-line-number="95" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC96" class="react-file-line html-div" data-testid="code-cell" data-line-number="96" style="position:relative">#### 第<span class="pl-smi">一</span>种 继承<span class="pl-s1">Thread</span>类,重写<span class="pl-s1">Run</span>方法</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC97" class="react-file-line html-div" data-testid="code-cell" data-line-number="97" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC98" class="react-file-line html-div" data-testid="code-cell" data-line-number="98" style="position:relative">这种方法就是通过自定义<span class="pl-s1">CustomThread</span>类继承<span class="pl-s1">Thread</span>类,重写<span class="pl-en">run</span>()方法,然后创建<span class="pl-en">CustomThread</span>的对象,然后调用<span class="pl-s1">start</span>()方法,<span class="pl-en">JVM</span>会创建出<span class="pl-s1">一</span>个新线程,并且为线程创建方法调用栈和程序计数器,此时线程处于就绪状态,当线程获取<span class="pl-c1">CPU</span>时间片后,线程会进入到运行状态,会去调用<span class="pl-s1">run</span>()方法。并且创建<span class="pl-en">CustomThread</span>类的对象的线程(这里的例子中是主线程)与调用<span class="pl-en">run</span>()方法的线程之间是并发的,也就是在执行<span class="pl-en">run</span>()方法时,主线程可以去执行其他操作。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC99" class="react-file-line html-div" data-testid="code-cell" data-line-number="99" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC100" class="react-file-line html-div" data-testid="code-cell" data-line-number="100" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC101" class="react-file-line html-div" data-testid="code-cell" data-line-number="101" style="position:relative"><span class="pl-s1">class</span> <span class="pl-smi">CustomThread</span> <span class="pl-s1">extends</span> <span class="pl-s1">Thread</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC102" class="react-file-line html-div" data-testid="code-cell" data-line-number="102" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">void</span> <span class="pl-s1">main</span>(<span class="pl-smi">String</span>[] <span class="pl-s1">args</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC103" class="react-file-line html-div" data-testid="code-cell" data-line-number="103" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程调用了main方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC104" class="react-file-line html-div" data-testid="code-cell" data-line-number="104" style="position:relative"> <span class="pl-k">for</span> (<span class="pl-smi">int</span> <span class="pl-s1">i</span> = <span class="pl-c1">0</span>; <span class="pl-s1">i</span> &lt; <span class="pl-c1">10</span>; <span class="pl-s1">i</span>++) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC105" class="react-file-line html-div" data-testid="code-cell" data-line-number="105" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">i</span> == <span class="pl-c1">1</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC106" class="react-file-line html-div" data-testid="code-cell" data-line-number="106" style="position:relative"> <span class="pl-smi">CustomThread</span> <span class="pl-s1">customThread</span> = <span class="pl-k">new</span> <span class="pl-smi">CustomThread</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC107" class="react-file-line html-div" data-testid="code-cell" data-line-number="107" style="position:relative"> <span class="pl-s1">customThread</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC108" class="react-file-line html-div" data-testid="code-cell" data-line-number="108" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程--i是&quot;</span>+<span class="pl-s1">i</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC109" class="react-file-line html-div" data-testid="code-cell" data-line-number="109" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC110" class="react-file-line html-div" data-testid="code-cell" data-line-number="110" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC111" class="react-file-line html-div" data-testid="code-cell" data-line-number="111" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;main()方法执行完毕!&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC112" class="react-file-line html-div" data-testid="code-cell" data-line-number="112" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC113" class="react-file-line html-div" data-testid="code-cell" data-line-number="113" style="position:relative"> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC114" class="react-file-line html-div" data-testid="code-cell" data-line-number="114" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程调用了run()方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC115" class="react-file-line html-div" data-testid="code-cell" data-line-number="115" style="position:relative"> <span class="pl-k">for</span> (<span class="pl-smi">int</span> <span class="pl-s1">j</span> = <span class="pl-c1">0</span>; <span class="pl-s1">j</span> &lt; <span class="pl-c1">5</span>; <span class="pl-s1">j</span>++) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC116" class="react-file-line html-div" data-testid="code-cell" data-line-number="116" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程--j是&quot;</span>+<span class="pl-s1">j</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC117" class="react-file-line html-div" data-testid="code-cell" data-line-number="117" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC118" class="react-file-line html-div" data-testid="code-cell" data-line-number="118" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;run()方法执行完毕!&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC119" class="react-file-line html-div" data-testid="code-cell" data-line-number="119" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC120" class="react-file-line html-div" data-testid="code-cell" data-line-number="120" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC121" class="react-file-line html-div" data-testid="code-cell" data-line-number="121" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC122" class="react-file-line html-div" data-testid="code-cell" data-line-number="122" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC123" class="react-file-line html-div" data-testid="code-cell" data-line-number="123" style="position:relative">输出结果如下:</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC124" class="react-file-line html-div" data-testid="code-cell" data-line-number="124" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC125" class="react-file-line html-div" data-testid="code-cell" data-line-number="125" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC126" class="react-file-line html-div" data-testid="code-cell" data-line-number="126" style="position:relative"><span class="pl-s1">main</span>线程调用了<span class="pl-s1">main</span>方法</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC127" class="react-file-line html-div" data-testid="code-cell" data-line-number="127" style="position:relative"><span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>线程调用了<span class="pl-en">run</span>()方法</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC128" class="react-file-line html-div" data-testid="code-cell" data-line-number="128" style="position:relative"><span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>线程--<span class="pl-s1">j</span>是<span class="pl-c1">0</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC129" class="react-file-line html-div" data-testid="code-cell" data-line-number="129" style="position:relative"><span class="pl-s1">main</span>线程--<span class="pl-s1">i</span>是<span class="pl-c1">1</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC130" class="react-file-line html-div" data-testid="code-cell" data-line-number="130" style="position:relative"><span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>线程--<span class="pl-s1">j</span>是<span class="pl-c1">2</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC131" class="react-file-line html-div" data-testid="code-cell" data-line-number="131" style="position:relative"><span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>线程--<span class="pl-s1">j</span>是<span class="pl-c1">3</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC132" class="react-file-line html-div" data-testid="code-cell" data-line-number="132" style="position:relative"><span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>线程--<span class="pl-s1">j</span>是<span class="pl-c1">4</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC133" class="react-file-line html-div" data-testid="code-cell" data-line-number="133" style="position:relative"><span class="pl-en">run</span>()方法执行完毕!</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC134" class="react-file-line html-div" data-testid="code-cell" data-line-number="134" style="position:relative"><span class="pl-en">main</span>()方法执行完毕!</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC135" class="react-file-line html-div" data-testid="code-cell" data-line-number="135" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC136" class="react-file-line html-div" data-testid="code-cell" data-line-number="136" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC137" class="react-file-line html-div" data-testid="code-cell" data-line-number="137" style="position:relative">可以看到在创建<span class="pl-en">一</span>个<span class="pl-s1">CustomThread</span>对象,调用<span class="pl-s1">start</span>()方法后,<span class="pl-s1">Thread</span>-<span class="pl-c1">0</span>调用了<span class="pl-smi">run</span>方法,进行<span class="pl-k">for</span>循环,对<span class="pl-s1">j</span>进行打印,与此同时,<span class="pl-s1">main</span>线程并没有被阻塞,而是继续执行<span class="pl-k">for</span>循环,对<span class="pl-s1">i</span>进行打印。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC138" class="react-file-line html-div" data-testid="code-cell" data-line-number="138" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC139" class="react-file-line html-div" data-testid="code-cell" data-line-number="139" style="position:relative">##### 执行原理</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC140" class="react-file-line html-div" data-testid="code-cell" data-line-number="140" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC141" class="react-file-line html-div" data-testid="code-cell" data-line-number="141" style="position:relative">首先我们可以来看看<span class="pl-s1">start</span>的源码,首先会判断<span class="pl-s1">threadStatus</span>是否为<span class="pl-c1">0</span>,如果不为<span class="pl-c1">0</span>会抛出异常。然后会将当前对象添加到线程组,最后调用<span class="pl-smi">start0</span>方法,因为是<span class="pl-k">native</span>方法,看不到源码,根据上面的执行结果来看,<span class="pl-c1">JVM</span>新建了<span class="pl-s1">一</span>个线程调用了<span class="pl-s1">run</span>方法。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC142" class="react-file-line html-div" data-testid="code-cell" data-line-number="142" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC143" class="react-file-line html-div" data-testid="code-cell" data-line-number="143" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC144" class="react-file-line html-div" data-testid="code-cell" data-line-number="144" style="position:relative"><span class="pl-s1">private</span> <span class="pl-k">native</span> <span class="pl-smi">void</span> <span class="pl-en">start0</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC145" class="react-file-line html-div" data-testid="code-cell" data-line-number="145" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC146" class="react-file-line html-div" data-testid="code-cell" data-line-number="146" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">synchronized</span> <span class="pl-smi">void</span> <span class="pl-s1">start</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC147" class="react-file-line html-div" data-testid="code-cell" data-line-number="147" style="position:relative"> <span class="pl-c">//判断当前Thread对象是否是新建态,否则抛出异常</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC148" class="react-file-line html-div" data-testid="code-cell" data-line-number="148" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">threadStatus</span> != <span class="pl-c1">0</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC149" class="react-file-line html-div" data-testid="code-cell" data-line-number="149" style="position:relative"> <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-s1">IllegalThreadStateException</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC150" class="react-file-line html-div" data-testid="code-cell" data-line-number="150" style="position:relative"> <span class="pl-c">//将当前对象添加到线程组</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC151" class="react-file-line html-div" data-testid="code-cell" data-line-number="151" style="position:relative"> <span class="pl-s1">group</span>.<span class="pl-s1">add</span>(<span class="pl-smi">this</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC152" class="react-file-line html-div" data-testid="code-cell" data-line-number="152" style="position:relative"> <span class="pl-smi">boolean</span> <span class="pl-s1">started</span> = <span class="pl-c1">false</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC153" class="react-file-line html-div" data-testid="code-cell" data-line-number="153" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC154" class="react-file-line html-div" data-testid="code-cell" data-line-number="154" style="position:relative"> <span class="pl-s1">start0</span>();<span class="pl-c">//这是一个native方法,调用后JVM会新建一个线程来调用run方法</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC155" class="react-file-line html-div" data-testid="code-cell" data-line-number="155" style="position:relative"> <span class="pl-s1">started</span> = <span class="pl-c1">true</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC156" class="react-file-line html-div" data-testid="code-cell" data-line-number="156" style="position:relative"> } <span class="pl-k">finally</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC157" class="react-file-line html-div" data-testid="code-cell" data-line-number="157" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC158" class="react-file-line html-div" data-testid="code-cell" data-line-number="158" style="position:relative"> <span class="pl-k">if</span> (!<span class="pl-s1">started</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC159" class="react-file-line html-div" data-testid="code-cell" data-line-number="159" style="position:relative"> <span class="pl-s1">group</span>.<span class="pl-s1">threadStartFailed</span>(<span class="pl-smi">this</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC160" class="react-file-line html-div" data-testid="code-cell" data-line-number="160" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC161" class="react-file-line html-div" data-testid="code-cell" data-line-number="161" style="position:relative"> } <span class="pl-k">catch</span> (<span class="pl-s1">Throwable</span> <span class="pl-s1">ignore</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC162" class="react-file-line html-div" data-testid="code-cell" data-line-number="162" style="position:relative"> <span class="pl-c">/* do nothing. If start0 threw a Throwable then</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC163" class="react-file-line html-div" data-testid="code-cell" data-line-number="163" style="position:relative"><span class="pl-c"> it will be passed up the call stack */</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC164" class="react-file-line html-div" data-testid="code-cell" data-line-number="164" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC165" class="react-file-line html-div" data-testid="code-cell" data-line-number="165" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC166" class="react-file-line html-div" data-testid="code-cell" data-line-number="166" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC167" class="react-file-line html-div" data-testid="code-cell" data-line-number="167" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC168" class="react-file-line html-div" data-testid="code-cell" data-line-number="168" style="position:relative">扩展问题:多次调用<span class="pl-s1">Thread</span>对象的<span class="pl-s1">start</span>()方法会怎么样?</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC169" class="react-file-line html-div" data-testid="code-cell" data-line-number="169" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC170" class="react-file-line html-div" data-testid="code-cell" data-line-number="170" style="position:relative">会抛出<span class="pl-s1">IllegalThreadStateException</span>异常。其实在<span class="pl-s1">Thread</span>#<span class="pl-s1">start</span>()方法里面的的注释中有提到,多次调用<span class="pl-s1">start</span>()方法是非法的,所以在上面的<span class="pl-s1">start</span>()方法源码中<span class="pl-s1">一</span>开始就是对<span class="pl-s1">threadStatus</span>进行判断,不为<span class="pl-c1">0</span>就会抛出<span class="pl-s1">IllegalThreadStateException</span>异常。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC171" class="react-file-line html-div" data-testid="code-cell" data-line-number="171" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC172" class="react-file-line html-div" data-testid="code-cell" data-line-number="172" style="position:relative">![<span class="pl-s1">image</span>-<span class="pl-c1">20200105144159345</span>](../<span class="pl-s1">static</span>/<span class="pl-s1">image</span>-<span class="pl-c1">20200105144159345.</span><span class="pl-s1">png</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-138 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC173" class="react-file-line html-div" data-testid="code-cell" data-line-number="173" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC174" class="react-file-line html-div" data-testid="code-cell" data-line-number="174" style="position:relative">##### 注意事项:</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC175" class="react-file-line html-div" data-testid="code-cell" data-line-number="175" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC176" class="react-file-line html-div" data-testid="code-cell" data-line-number="176" style="position:relative"><span class="pl-en">start</span>()方法中判断<span class="pl-s1">threadStatus</span>是否为<span class="pl-c1">0</span>,是判断当前线程是否新建态,<span class="pl-c1">0</span>是代表新建态(上图中的源码注释里面有提到),而不是就绪态,因为<span class="pl-smi">Java</span>的<span class="pl-s1">Thread</span>类中,<span class="pl-s1">Thread</span>的<span class="pl-s1">Runnable</span>状态包括了线程的就绪态和运行态,(<span class="pl-s1">Thread</span>的<span class="pl-en">state</span>为<span class="pl-c1">RUNNABLE</span>时(也就是<span class="pl-s1">threadStatus</span>为<span class="pl-c1">4</span>时),代表线程为就绪态或运行态)。执行<span class="pl-en">start</span>()方法的线程还不是<span class="pl-smi">JVM</span>新建的线程,所以不是就绪态。有<span class="pl-s1">一</span>些技术文章把这里弄错了,例如这<span class="pl-s1">一</span>篇[《深入浅出线程<span class="pl-en">Thread</span>类的<span class="pl-s1">start</span>()方法和<span class="pl-en">run</span>()方法》](<span class="pl-s1">https</span>:<span class="pl-c">//juejin.im/post/5b09274af265da0de25759d5)</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC177" class="react-file-line html-div" data-testid="code-cell" data-line-number="177" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC178" class="react-file-line html-div" data-testid="code-cell" data-line-number="178" style="position:relative">![<span class="pl-s1">image</span>-<span class="pl-c1">20200105144031591</span>](../<span class="pl-s1">static</span>/<span class="pl-s1">image</span>-<span class="pl-c1">20200105144031591.</span><span class="pl-s1">png</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-173 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC179" class="react-file-line html-div" data-testid="code-cell" data-line-number="179" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC180" class="react-file-line html-div" data-testid="code-cell" data-line-number="180" style="position:relative">##### 总结</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC181" class="react-file-line html-div" data-testid="code-cell" data-line-number="181" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC182" class="react-file-line html-div" data-testid="code-cell" data-line-number="182" style="position:relative">这种方式的缺点很明显,就是需要继承<span class="pl-s1">Thread</span>类,而且实际上我们的需求可能仅仅是希望某些操作被<span class="pl-s1">一</span>个其他的线程来执行,所以有了第二种方法。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-95 child-of-line-179 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC183" class="react-file-line html-div" data-testid="code-cell" data-line-number="183" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC184" class="react-file-line html-div" data-testid="code-cell" data-line-number="184" style="position:relative">#### 第二种 实现<span class="pl-s1">Runnable</span>接口</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC185" class="react-file-line html-div" data-testid="code-cell" data-line-number="185" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC186" class="react-file-line html-div" data-testid="code-cell" data-line-number="186" style="position:relative">这种方式就是创建<span class="pl-s1">一</span>个类(例如下面代码中的<span class="pl-s1">Target</span>类),实现<span class="pl-s1">Runnable</span>接口的<span class="pl-s1">Run</span>方法,然后将<span class="pl-s1">Target</span>类的实例对象作为<span class="pl-s1">Thread</span>的构造器入参<span class="pl-s1">target</span>,实际的线程对象还是<span class="pl-s1">Thread</span>实例,只不过线程<span class="pl-s1">Thread</span>与线程执行体(<span class="pl-s1">Target</span>类的<span class="pl-s1">run</span>方法)分离了,耦合度更低<span class="pl-s1">一</span>些。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC187" class="react-file-line html-div" data-testid="code-cell" data-line-number="187" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC188" class="react-file-line html-div" data-testid="code-cell" data-line-number="188" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC189" class="react-file-line html-div" data-testid="code-cell" data-line-number="189" style="position:relative"><span class="pl-k">class</span> <span class="pl-s1">ThreadTarget</span> <span class="pl-k">implements</span> <span class="pl-s1">Runnable</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC190" class="react-file-line html-div" data-testid="code-cell" data-line-number="190" style="position:relative"> <span class="pl-smi">void</span> <span class="pl-s1">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC191" class="react-file-line html-div" data-testid="code-cell" data-line-number="191" style="position:relative"> <span class="pl-s1">System</span>.<span class="pl-s1">out</span>.<span class="pl-s1">println</span>(<span class="pl-s1">Thread</span>.<span class="pl-s1">currentThread</span>().<span class="pl-s1">getName</span>()+<span class="pl-s">&quot;线程执行了run方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC192" class="react-file-line html-div" data-testid="code-cell" data-line-number="192" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC193" class="react-file-line html-div" data-testid="code-cell" data-line-number="193" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">void</span> <span class="pl-s1">main</span>(<span class="pl-smi">String</span>[] <span class="pl-s1">args</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC194" class="react-file-line html-div" data-testid="code-cell" data-line-number="194" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程执行了main方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC195" class="react-file-line html-div" data-testid="code-cell" data-line-number="195" style="position:relative"> <span class="pl-smi">ThreadTarget</span> <span class="pl-s1">target</span> = <span class="pl-k">new</span> <span class="pl-smi">ThreadTarget</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC196" class="react-file-line html-div" data-testid="code-cell" data-line-number="196" style="position:relative"> <span class="pl-smi">Thread</span> <span class="pl-s1">thread</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-s1">target</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC197" class="react-file-line html-div" data-testid="code-cell" data-line-number="197" style="position:relative"> <span class="pl-s1">thread</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC198" class="react-file-line html-div" data-testid="code-cell" data-line-number="198" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC199" class="react-file-line html-div" data-testid="code-cell" data-line-number="199" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC200" class="react-file-line html-div" data-testid="code-cell" data-line-number="200" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC201" class="react-file-line html-div" data-testid="code-cell" data-line-number="201" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC202" class="react-file-line html-div" data-testid="code-cell" data-line-number="202" style="position:relative">输出结果如下:</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC203" class="react-file-line html-div" data-testid="code-cell" data-line-number="203" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC204" class="react-file-line html-div" data-testid="code-cell" data-line-number="204" style="position:relative">![<span class="pl-s1">image</span>-<span class="pl-c1">20200105163553969</span>](../<span class="pl-s1">static</span>/<span class="pl-s1">image</span>-<span class="pl-c1">20200105163553969.</span><span class="pl-s1">png</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC205" class="react-file-line html-div" data-testid="code-cell" data-line-number="205" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC206" class="react-file-line html-div" data-testid="code-cell" data-line-number="206" style="position:relative">##### 原理</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC207" class="react-file-line html-div" data-testid="code-cell" data-line-number="207" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC208" class="react-file-line html-div" data-testid="code-cell" data-line-number="208" style="position:relative">之所以有这种实现方法,是因为<span class="pl-s1">Thread</span>类的<span class="pl-en">run</span>()方法中会判断成员变量<span class="pl-s1">target</span>是否为空,不为空就会调用<span class="pl-s1">target</span>类的<span class="pl-s1">run</span>方法。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC209" class="react-file-line html-div" data-testid="code-cell" data-line-number="209" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC210" class="react-file-line html-div" data-testid="code-cell" data-line-number="210" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC211" class="react-file-line html-div" data-testid="code-cell" data-line-number="211" style="position:relative"><span class="pl-k">private</span> <span class="pl-smi">Runnable</span> <span class="pl-s1">target</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC212" class="react-file-line html-div" data-testid="code-cell" data-line-number="212" style="position:relative"><span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC213" class="react-file-line html-div" data-testid="code-cell" data-line-number="213" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">target</span> != <span class="pl-c1">null</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC214" class="react-file-line html-div" data-testid="code-cell" data-line-number="214" style="position:relative"> <span class="pl-s1">target</span>.<span class="pl-en">run</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC215" class="react-file-line html-div" data-testid="code-cell" data-line-number="215" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC216" class="react-file-line html-div" data-testid="code-cell" data-line-number="216" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC217" class="react-file-line html-div" data-testid="code-cell" data-line-number="217" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-205 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC218" class="react-file-line html-div" data-testid="code-cell" data-line-number="218" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC219" class="react-file-line html-div" data-testid="code-cell" data-line-number="219" style="position:relative">##### 另外<span class="pl-smi">一</span>种写法</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC220" class="react-file-line html-div" data-testid="code-cell" data-line-number="220" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC221" class="react-file-line html-div" data-testid="code-cell" data-line-number="221" style="position:relative">这种实现方式也有其他的写法,可以不创建<span class="pl-s1">Target</span>类。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-218 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC222" class="react-file-line html-div" data-testid="code-cell" data-line-number="222" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC223" class="react-file-line html-div" data-testid="code-cell" data-line-number="223" style="position:relative">##### 匿名内部类</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC224" class="react-file-line html-div" data-testid="code-cell" data-line-number="224" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC225" class="react-file-line html-div" data-testid="code-cell" data-line-number="225" style="position:relative">可以不创建<span class="pl-s1">Target</span>类,可以使用匿名内部类的方式来实现,因此上面的代码也可以按以下方式写:</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC226" class="react-file-line html-div" data-testid="code-cell" data-line-number="226" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC227" class="react-file-line html-div" data-testid="code-cell" data-line-number="227" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC228" class="react-file-line html-div" data-testid="code-cell" data-line-number="228" style="position:relative"><span class="pl-s1">Thread</span> <span class="pl-s1">thread</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC229" class="react-file-line html-div" data-testid="code-cell" data-line-number="229" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC230" class="react-file-line html-div" data-testid="code-cell" data-line-number="230" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC231" class="react-file-line html-div" data-testid="code-cell" data-line-number="231" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程执行了run方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC232" class="react-file-line html-div" data-testid="code-cell" data-line-number="232" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC233" class="react-file-line html-div" data-testid="code-cell" data-line-number="233" style="position:relative">});</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC234" class="react-file-line html-div" data-testid="code-cell" data-line-number="234" style="position:relative"><span class="pl-s1">thread</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-222 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC235" class="react-file-line html-div" data-testid="code-cell" data-line-number="235" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC236" class="react-file-line html-div" data-testid="code-cell" data-line-number="236" style="position:relative">##### <span class="pl-smi">Lamda</span>表达式</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC237" class="react-file-line html-div" data-testid="code-cell" data-line-number="237" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC238" class="react-file-line html-div" data-testid="code-cell" data-line-number="238" style="position:relative">在<span class="pl-s1">Java8</span>之后,使用了<span class="pl-c1">@</span><span class="pl-c1">FunctionalInterface</span>注解来修饰<span class="pl-s1">Runnable</span>接口,表明<span class="pl-s1">Runnable</span>接口是<span class="pl-s1">一</span>个函数式接口,有且只有<span class="pl-s1">一</span>个抽象方法,可以<span class="pl-s1">Lambda</span>方式来创建<span class="pl-s1">Runnable</span>对象,比使用匿名类的方式更加简洁<span class="pl-s1">一</span>些。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC239" class="react-file-line html-div" data-testid="code-cell" data-line-number="239" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC240" class="react-file-line html-div" data-testid="code-cell" data-line-number="240" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC241" class="react-file-line html-div" data-testid="code-cell" data-line-number="241" style="position:relative"><span class="pl-c1">@</span><span class="pl-c1">FunctionalInterface</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC242" class="react-file-line html-div" data-testid="code-cell" data-line-number="242" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">interface</span> <span class="pl-smi">Runnable</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC243" class="react-file-line html-div" data-testid="code-cell" data-line-number="243" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">abstract</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC244" class="react-file-line html-div" data-testid="code-cell" data-line-number="244" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC245" class="react-file-line html-div" data-testid="code-cell" data-line-number="245" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC246" class="react-file-line html-div" data-testid="code-cell" data-line-number="246" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC247" class="react-file-line html-div" data-testid="code-cell" data-line-number="247" style="position:relative">因此上面的代码也可以按以下方式写:</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC248" class="react-file-line html-div" data-testid="code-cell" data-line-number="248" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC249" class="react-file-line html-div" data-testid="code-cell" data-line-number="249" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC250" class="react-file-line html-div" data-testid="code-cell" data-line-number="250" style="position:relative"><span class="pl-s1">Thread</span> <span class="pl-s1">thread</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(()-&gt;{</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC251" class="react-file-line html-div" data-testid="code-cell" data-line-number="251" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程执行了run方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC252" class="react-file-line html-div" data-testid="code-cell" data-line-number="252" style="position:relative">})</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC253" class="react-file-line html-div" data-testid="code-cell" data-line-number="253" style="position:relative"><span class="pl-s1">thread</span>.<span class="pl-en">start</span>() </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC254" class="react-file-line html-div" data-testid="code-cell" data-line-number="254" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-235 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC255" class="react-file-line html-div" data-testid="code-cell" data-line-number="255" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC256" class="react-file-line html-div" data-testid="code-cell" data-line-number="256" style="position:relative">##### 总结</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC257" class="react-file-line html-div" data-testid="code-cell" data-line-number="257" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC258" class="react-file-line html-div" data-testid="code-cell" data-line-number="258" style="position:relative">这种写法不用继承<span class="pl-s1">Thread</span>,但是同样也有缺点,就是线程方法体(也就是<span class="pl-s1">run</span>方法)不能设置返回值。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-183 child-of-line-255 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC259" class="react-file-line html-div" data-testid="code-cell" data-line-number="259" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC260" class="react-file-line html-div" data-testid="code-cell" data-line-number="260" style="position:relative">#### 第三种 实现<span class="pl-s1">Callable</span>接口</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC261" class="react-file-line html-div" data-testid="code-cell" data-line-number="261" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC262" class="react-file-line html-div" data-testid="code-cell" data-line-number="262" style="position:relative"><span class="pl-s1">Runnable</span>接口中的<span class="pl-s1">run</span>()方法是没有返回值,如果我们需要执行的任务带返回值就不能使用<span class="pl-smi">Runnable</span>接口。创建<span class="pl-s1">一</span>个类<span class="pl-s1">CallableTarget</span>,实现<span class="pl-s1">Callable</span>接口,实现带有**返回值的<span class="pl-s1">call</span>()方法**,然后根据<span class="pl-smi">CallableTarget</span>创建<span class="pl-s1">一</span>个任务<span class="pl-s1">FutureTask</span>,然后根据<span class="pl-s1">FutureTask</span>来创建<span class="pl-s1">一</span>个线程<span class="pl-s1">Thread</span>,调用<span class="pl-s1">Thread</span>的<span class="pl-s1">start</span>方法可以执行任务。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC263" class="react-file-line html-div" data-testid="code-cell" data-line-number="263" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC264" class="react-file-line html-div" data-testid="code-cell" data-line-number="264" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC265" class="react-file-line html-div" data-testid="code-cell" data-line-number="265" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-smi">CallableTarget</span> <span class="pl-k">implements</span> <span class="pl-smi">Callable</span>&lt;<span class="pl-smi">Integer</span>&gt; {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC266" class="react-file-line html-div" data-testid="code-cell" data-line-number="266" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">Integer</span> <span class="pl-en">call</span>() <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC267" class="react-file-line html-div" data-testid="code-cell" data-line-number="267" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程执行了call方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC268" class="react-file-line html-div" data-testid="code-cell" data-line-number="268" style="position:relative"> <span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(<span class="pl-c1">5000</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC269" class="react-file-line html-div" data-testid="code-cell" data-line-number="269" style="position:relative"> <span class="pl-k">return</span> <span class="pl-c1">1</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC270" class="react-file-line html-div" data-testid="code-cell" data-line-number="270" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC271" class="react-file-line html-div" data-testid="code-cell" data-line-number="271" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">void</span> <span class="pl-en">main</span>(<span class="pl-smi">String</span>[] <span class="pl-s1">args</span>) <span class="pl-k">throws</span> <span class="pl-smi">ExecutionException</span>, <span class="pl-smi">InterruptedException</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC272" class="react-file-line html-div" data-testid="code-cell" data-line-number="272" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>().<span class="pl-en">getName</span>()+<span class="pl-s">&quot;线程执行了main方法&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC273" class="react-file-line html-div" data-testid="code-cell" data-line-number="273" style="position:relative"> <span class="pl-smi">CallableTarget</span> <span class="pl-s1">callableTarget</span> = <span class="pl-k">new</span> <span class="pl-smi">CallableTarget</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC274" class="react-file-line html-div" data-testid="code-cell" data-line-number="274" style="position:relative"> <span class="pl-smi">FutureTask</span>&lt;<span class="pl-smi">Integer</span>&gt; <span class="pl-s1">task</span> = <span class="pl-k">new</span> <span class="pl-smi">FutureTask</span>&lt;<span class="pl-smi">Integer</span>&gt;(<span class="pl-s1">callableTarget</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC275" class="react-file-line html-div" data-testid="code-cell" data-line-number="275" style="position:relative"> <span class="pl-smi">Thread</span> <span class="pl-s1">thread</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-s1">task</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC276" class="react-file-line html-div" data-testid="code-cell" data-line-number="276" style="position:relative"> <span class="pl-s1">thread</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC277" class="react-file-line html-div" data-testid="code-cell" data-line-number="277" style="position:relative"> <span class="pl-smi">Integer</span> <span class="pl-s1">result</span> = <span class="pl-s1">task</span>.<span class="pl-en">get</span>();<span class="pl-c">//当前线程会阻塞,一直等到结果返回。</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC278" class="react-file-line html-div" data-testid="code-cell" data-line-number="278" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;执行完毕,打印result=&quot;</span>+<span class="pl-s1">result</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC279" class="react-file-line html-div" data-testid="code-cell" data-line-number="279" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;执行完毕&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC280" class="react-file-line html-div" data-testid="code-cell" data-line-number="280" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC281" class="react-file-line html-div" data-testid="code-cell" data-line-number="281" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC282" class="react-file-line html-div" data-testid="code-cell" data-line-number="282" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC283" class="react-file-line html-div" data-testid="code-cell" data-line-number="283" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC284" class="react-file-line html-div" data-testid="code-cell" data-line-number="284" style="position:relative">原理就是<span class="pl-smi">Thread</span>类默认的<span class="pl-s1">run</span>()方法实现是会去调用自身实例变量<span class="pl-smi">target</span>的<span class="pl-s1">run</span>()方法,(<span class="pl-smi">target</span>就是我们构造<span class="pl-s1">Thread</span>传入的<span class="pl-s1">FutureTask</span>),而<span class="pl-smi">FutureTask</span>的<span class="pl-s1">run</span>方法中就会调用<span class="pl-s1">Callable</span>接口的实例的<span class="pl-s1">call</span>()方法。</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC285" class="react-file-line html-div" data-testid="code-cell" data-line-number="285" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC286" class="react-file-line html-div" data-testid="code-cell" data-line-number="286" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC287" class="react-file-line html-div" data-testid="code-cell" data-line-number="287" style="position:relative"><span class="pl-c">//Thread类的run方法实现</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC288" class="react-file-line html-div" data-testid="code-cell" data-line-number="288" style="position:relative"><span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC289" class="react-file-line html-div" data-testid="code-cell" data-line-number="289" style="position:relative"><span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC290" class="react-file-line html-div" data-testid="code-cell" data-line-number="290" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">target</span> != <span class="pl-c1">null</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC291" class="react-file-line html-div" data-testid="code-cell" data-line-number="291" style="position:relative"> <span class="pl-c">//这里target就是我们在创建Thread时传入的FutureTask实例变量</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC292" class="react-file-line html-div" data-testid="code-cell" data-line-number="292" style="position:relative"> <span class="pl-s1">target</span>.<span class="pl-en">run</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC293" class="react-file-line html-div" data-testid="code-cell" data-line-number="293" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC294" class="react-file-line html-div" data-testid="code-cell" data-line-number="294" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC295" class="react-file-line html-div" data-testid="code-cell" data-line-number="295" style="position:relative"><span class="pl-c">//FutureTask类的run方法实现</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC296" class="react-file-line html-div" data-testid="code-cell" data-line-number="296" style="position:relative"><span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-s1">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC297" class="react-file-line html-div" data-testid="code-cell" data-line-number="297" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">state</span> != <span class="pl-c1">NEW</span> ||</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC298" class="react-file-line html-div" data-testid="code-cell" data-line-number="298" style="position:relative"> !<span class="pl-smi">UNSAFE</span>.<span class="pl-en">compareAndSwapObject</span>(<span class="pl-smi">this</span>, <span class="pl-s1">runnerOffset</span>,</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC299" class="react-file-line html-div" data-testid="code-cell" data-line-number="299" style="position:relative"> <span class="pl-c1">null</span>, <span class="pl-smi">Thread</span>.<span class="pl-en">currentThread</span>()))</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC300" class="react-file-line html-div" data-testid="code-cell" data-line-number="300" style="position:relative"> <span class="pl-k">return</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC301" class="react-file-line html-div" data-testid="code-cell" data-line-number="301" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC302" class="react-file-line html-div" data-testid="code-cell" data-line-number="302" style="position:relative"> <span class="pl-smi">Callable</span>&lt;<span class="pl-smi">V</span>&gt; <span class="pl-s1">c</span> = <span class="pl-s1">callable</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC303" class="react-file-line html-div" data-testid="code-cell" data-line-number="303" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">c</span> != <span class="pl-c1">null</span> &amp;&amp; <span class="pl-s1">state</span> == <span class="pl-c1">NEW</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC304" class="react-file-line html-div" data-testid="code-cell" data-line-number="304" style="position:relative"> <span class="pl-smi">V</span> <span class="pl-s1">result</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC305" class="react-file-line html-div" data-testid="code-cell" data-line-number="305" style="position:relative"> <span class="pl-smi">boolean</span> <span class="pl-s1">ran</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC306" class="react-file-line html-div" data-testid="code-cell" data-line-number="306" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC307" class="react-file-line html-div" data-testid="code-cell" data-line-number="307" style="position:relative"> <span class="pl-c">//在这里会调用Callable实例的call方法</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC308" class="react-file-line html-div" data-testid="code-cell" data-line-number="308" style="position:relative"> <span class="pl-s1">result</span> = <span class="pl-s1">c</span>.<span class="pl-en">call</span>();</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC309" class="react-file-line html-div" data-testid="code-cell" data-line-number="309" style="position:relative"> <span class="pl-s1">ran</span> = <span class="pl-c1">true</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC310" class="react-file-line html-div" data-testid="code-cell" data-line-number="310" style="position:relative"> } <span class="pl-k">catch</span> (<span class="pl-smi">Throwable</span> <span class="pl-s1">ex</span>) {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC311" class="react-file-line html-div" data-testid="code-cell" data-line-number="311" style="position:relative"> <span class="pl-s1">result</span> = <span class="pl-c1">null</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC312" class="react-file-line html-div" data-testid="code-cell" data-line-number="312" style="position:relative"> <span class="pl-s1">ran</span> = <span class="pl-c1">false</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC313" class="react-file-line html-div" data-testid="code-cell" data-line-number="313" style="position:relative"> <span class="pl-en">setException</span>(<span class="pl-s1">ex</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC314" class="react-file-line html-div" data-testid="code-cell" data-line-number="314" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC315" class="react-file-line html-div" data-testid="code-cell" data-line-number="315" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">ran</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC316" class="react-file-line html-div" data-testid="code-cell" data-line-number="316" style="position:relative"> <span class="pl-en">set</span>(<span class="pl-s1">result</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC317" class="react-file-line html-div" data-testid="code-cell" data-line-number="317" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC318" class="react-file-line html-div" data-testid="code-cell" data-line-number="318" style="position:relative"> } <span class="pl-k">finally</span> {</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC319" class="react-file-line html-div" data-testid="code-cell" data-line-number="319" style="position:relative"> <span class="pl-c">// runner must be non-null until state is settled to</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC320" class="react-file-line html-div" data-testid="code-cell" data-line-number="320" style="position:relative"> <span class="pl-c">// prevent concurrent calls to run()</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC321" class="react-file-line html-div" data-testid="code-cell" data-line-number="321" style="position:relative"> <span class="pl-s1">runner</span> = <span class="pl-c1">null</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC322" class="react-file-line html-div" data-testid="code-cell" data-line-number="322" style="position:relative"> <span class="pl-c">// state must be re-read after nulling runner to prevent</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC323" class="react-file-line html-div" data-testid="code-cell" data-line-number="323" style="position:relative"> <span class="pl-c">// leaked interrupts</span></div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC324" class="react-file-line html-div" data-testid="code-cell" data-line-number="324" style="position:relative"> <span class="pl-smi">int</span> <span class="pl-s1">s</span> = <span class="pl-s1">state</span>;</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC325" class="react-file-line html-div" data-testid="code-cell" data-line-number="325" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">s</span> &gt;= <span class="pl-c1">INTERRUPTING</span>)</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC326" class="react-file-line html-div" data-testid="code-cell" data-line-number="326" style="position:relative"> <span class="pl-en">handlePossibleCancellationInterrupt</span>(<span class="pl-s1">s</span>);</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC327" class="react-file-line html-div" data-testid="code-cell" data-line-number="327" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC328" class="react-file-line html-div" data-testid="code-cell" data-line-number="328" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC329" class="react-file-line html-div" data-testid="code-cell" data-line-number="329" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-93 child-of-line-259 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC330" class="react-file-line html-div" data-testid="code-cell" data-line-number="330" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC331" class="react-file-line html-div" data-testid="code-cell" data-line-number="331" style="position:relative">### <span class="pl-smi">Java</span>中的<span class="pl-s1">Runnable</span>、<span class="pl-s1">Callable</span>、<span class="pl-s1">Future</span>、<span class="pl-s1">FutureTask</span>的区别和联系?</div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC332" class="react-file-line html-div" data-testid="code-cell" data-line-number="332" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC333" class="react-file-line html-div" data-testid="code-cell" data-line-number="333" style="position:relative">最原始的通过新建线程执行任务的方法就是我们去新建<span class="pl-s1">一</span>个类,继承<span class="pl-s1">Thread</span>,然后去重写<span class="pl-s1">run</span>()方法,但是这样限制太大了,<span class="pl-smi">Java</span>也不支持多继承。所以有了<span class="pl-s1">Runnable</span>。</div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC334" class="react-file-line html-div" data-testid="code-cell" data-line-number="334" style="position:relative">##### <span class="pl-s1">Runnable</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC335" class="react-file-line html-div" data-testid="code-cell" data-line-number="335" style="position:relative"><span class="pl-s1">Runnable</span>是<span class="pl-s1">一</span>个接口,只需要新建<span class="pl-s1">一</span>个类实现这个接口,然后重写<span class="pl-s1">run</span>方法,将该类的实例作为创建<span class="pl-s1">Thread</span>的入参,线程运行时就会调用该实例的<span class="pl-s1">run</span>方法。</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC336" class="react-file-line html-div" data-testid="code-cell" data-line-number="336" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC337" class="react-file-line html-div" data-testid="code-cell" data-line-number="337" style="position:relative"><span class="pl-c1">@</span><span class="pl-c1">FunctionalInterfacepublic</span> <span class="pl-s1">interface</span> <span class="pl-s1">Runnable</span> {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC338" class="react-file-line html-div" data-testid="code-cell" data-line-number="338" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">abstract</span> <span class="pl-smi">void</span> <span class="pl-s1">run</span>();</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC339" class="react-file-line html-div" data-testid="code-cell" data-line-number="339" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC340" class="react-file-line html-div" data-testid="code-cell" data-line-number="340" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC341" class="react-file-line html-div" data-testid="code-cell" data-line-number="341" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC342" class="react-file-line html-div" data-testid="code-cell" data-line-number="342" style="position:relative"><span class="pl-smi">Thread</span>.<span class="pl-en">start</span>()方法-&gt;<span class="pl-smi">Thread</span>.<span class="pl-en">run</span>()方法-&gt;<span class="pl-s1">target</span>.<span class="pl-en">run</span>()方法</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-333 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC343" class="react-file-line html-div" data-testid="code-cell" data-line-number="343" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC344" class="react-file-line html-div" data-testid="code-cell" data-line-number="344" style="position:relative">##### <span class="pl-smi">Callable</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC345" class="react-file-line html-div" data-testid="code-cell" data-line-number="345" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC346" class="react-file-line html-div" data-testid="code-cell" data-line-number="346" style="position:relative"><span class="pl-s1">Callable</span>跟<span class="pl-s1">Runnable</span>类似,也是<span class="pl-s1">一</span>个接口。只不过它的<span class="pl-s1">call</span>方法有返回值,可以供程序接收任务执行的结果。</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC347" class="react-file-line html-div" data-testid="code-cell" data-line-number="347" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC348" class="react-file-line html-div" data-testid="code-cell" data-line-number="348" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC349" class="react-file-line html-div" data-testid="code-cell" data-line-number="349" style="position:relative"><span class="pl-c1">@</span><span class="pl-c1">FunctionalInterfacepublic</span> <span class="pl-s1">interface</span> <span class="pl-s1">Callable</span>&lt;<span class="pl-s1">V</span>&gt; {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC350" class="react-file-line html-div" data-testid="code-cell" data-line-number="350" style="position:relative"> <span class="pl-smi">V</span> <span class="pl-s1">call</span>() <span class="pl-k">throws</span> <span class="pl-s1">Exception</span>;</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC351" class="react-file-line html-div" data-testid="code-cell" data-line-number="351" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC352" class="react-file-line html-div" data-testid="code-cell" data-line-number="352" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-343 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC353" class="react-file-line html-div" data-testid="code-cell" data-line-number="353" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC354" class="react-file-line html-div" data-testid="code-cell" data-line-number="354" style="position:relative">##### <span class="pl-smi">Future</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC355" class="react-file-line html-div" data-testid="code-cell" data-line-number="355" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC356" class="react-file-line html-div" data-testid="code-cell" data-line-number="356" style="position:relative"><span class="pl-s1">Future</span>也是<span class="pl-s1">一</span>个接口,<span class="pl-s1">Future</span>就像是<span class="pl-s1">一</span>个管理的容器<span class="pl-s1">一</span>样,进<span class="pl-s1">一</span>步对<span class="pl-s1">Runable</span>和<span class="pl-s1">Callable</span>的实例进行封装,定义了<span class="pl-s1">一</span>些方法。取消任务的<span class="pl-s1">cancel</span>()方法,查询任务是否完成的<span class="pl-en">isDone</span>()方法,获取执行结果的<span class="pl-en">get</span>()方法,带有超时时间来获取执行结果的<span class="pl-en">get</span>()方法。</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC357" class="react-file-line html-div" data-testid="code-cell" data-line-number="357" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC358" class="react-file-line html-div" data-testid="code-cell" data-line-number="358" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC359" class="react-file-line html-div" data-testid="code-cell" data-line-number="359" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">interface</span> <span class="pl-smi">Future</span>&lt;<span class="pl-smi">V</span>&gt; {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC360" class="react-file-line html-div" data-testid="code-cell" data-line-number="360" style="position:relative"> <span class="pl-c">//mayInterruptIfRunning代表是否强制中断</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC361" class="react-file-line html-div" data-testid="code-cell" data-line-number="361" style="position:relative"> <span class="pl-c">//为true,如果任务已经执行,那么会调用Thread.interrupt()方法设置中断标识</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC362" class="react-file-line html-div" data-testid="code-cell" data-line-number="362" style="position:relative"> <span class="pl-c">//为false,如果任务已经执行,就只会将任务状态标记为取消,而不会去设置中断标识</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC363" class="react-file-line html-div" data-testid="code-cell" data-line-number="363" style="position:relative"> <span class="pl-smi">boolean</span> <span class="pl-en">cancel</span>(<span class="pl-smi">boolean</span> <span class="pl-s1">mayInterruptIfRunning</span>);</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC364" class="react-file-line html-div" data-testid="code-cell" data-line-number="364" style="position:relative"> <span class="pl-smi">boolean</span> <span class="pl-en">isCancelled</span>();</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC365" class="react-file-line html-div" data-testid="code-cell" data-line-number="365" style="position:relative"> <span class="pl-smi">boolean</span> <span class="pl-en">isDone</span>();</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC366" class="react-file-line html-div" data-testid="code-cell" data-line-number="366" style="position:relative"> <span class="pl-smi">V</span> <span class="pl-en">get</span>() <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span>, <span class="pl-smi">ExecutionException</span>;</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC367" class="react-file-line html-div" data-testid="code-cell" data-line-number="367" style="position:relative"> <span class="pl-smi">V</span> <span class="pl-en">get</span>(<span class="pl-smi">long</span> <span class="pl-s1">timeout</span>, <span class="pl-smi">TimeUnit</span> <span class="pl-s1">unit</span>) </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC368" class="react-file-line html-div" data-testid="code-cell" data-line-number="368" style="position:relative"> <span class="pl-k">throws</span> <span class="pl-smi">InterruptedException</span>, <span class="pl-smi">ExecutionException</span>, <span class="pl-smi">TimeoutException</span>;</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC369" class="react-file-line html-div" data-testid="code-cell" data-line-number="369" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC370" class="react-file-line html-div" data-testid="code-cell" data-line-number="370" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-353 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC371" class="react-file-line html-div" data-testid="code-cell" data-line-number="371" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC372" class="react-file-line html-div" data-testid="code-cell" data-line-number="372" style="position:relative">##### <span class="pl-smi">FutureTask</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC373" class="react-file-line html-div" data-testid="code-cell" data-line-number="373" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC374" class="react-file-line html-div" data-testid="code-cell" data-line-number="374" style="position:relative">因为<span class="pl-s1">Future</span>只是<span class="pl-s1">一</span>个接口,并不能实例化,可以认为<span class="pl-s1">FutureTask</span>就是<span class="pl-s1">Future</span>接口的实现类,<span class="pl-s1">FutureTask</span>实现了<span class="pl-s1">RunnableFuture</span>接口,而<span class="pl-s1">RunnableFuture</span>接口继承<span class="pl-s1">Runnable</span>接口和<span class="pl-s1">Future</span>接口。</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC375" class="react-file-line html-div" data-testid="code-cell" data-line-number="375" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC376" class="react-file-line html-div" data-testid="code-cell" data-line-number="376" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC377" class="react-file-line html-div" data-testid="code-cell" data-line-number="377" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">FutureTask</span>&lt;<span class="pl-smi">V</span>&gt; <span class="pl-k">implements</span> <span class="pl-smi">RunnableFuture</span>&lt;<span class="pl-smi">V</span>&gt; {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC378" class="react-file-line html-div" data-testid="code-cell" data-line-number="378" style="position:relative">...</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC379" class="react-file-line html-div" data-testid="code-cell" data-line-number="379" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC380" class="react-file-line html-div" data-testid="code-cell" data-line-number="380" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC381" class="react-file-line html-div" data-testid="code-cell" data-line-number="381" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">interface</span> <span class="pl-smi">RunnableFuture</span>&lt;<span class="pl-smi">V</span>&gt; <span class="pl-k">extends</span> <span class="pl-smi">Runnable</span>, <span class="pl-smi">Future</span>&lt;<span class="pl-smi">V</span>&gt; {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC382" class="react-file-line html-div" data-testid="code-cell" data-line-number="382" style="position:relative"> <span class="pl-smi">void</span> <span class="pl-en">run</span>();</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC383" class="react-file-line html-div" data-testid="code-cell" data-line-number="383" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC384" class="react-file-line html-div" data-testid="code-cell" data-line-number="384" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-371 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC385" class="react-file-line html-div" data-testid="code-cell" data-line-number="385" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC386" class="react-file-line html-div" data-testid="code-cell" data-line-number="386" style="position:relative">##### 使用案例</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC387" class="react-file-line html-div" data-testid="code-cell" data-line-number="387" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC388" class="react-file-line html-div" data-testid="code-cell" data-line-number="388" style="position:relative">使用时,<span class="pl-smi">Runnable</span>实现类的实例可以作为<span class="pl-s1">Thread</span>的入参使用,而<span class="pl-s1">Callable</span>只能使用<span class="pl-s1">FutureTask</span>进行封装使用。</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC389" class="react-file-line html-div" data-testid="code-cell" data-line-number="389" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC390" class="react-file-line html-div" data-testid="code-cell" data-line-number="390" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC391" class="react-file-line html-div" data-testid="code-cell" data-line-number="391" style="position:relative"><span class="pl-c">//Runnable配合Thread进行使用</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC392" class="react-file-line html-div" data-testid="code-cell" data-line-number="392" style="position:relative"><span class="pl-s1">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC393" class="react-file-line html-div" data-testid="code-cell" data-line-number="393" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC394" class="react-file-line html-div" data-testid="code-cell" data-line-number="394" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() { </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC395" class="react-file-line html-div" data-testid="code-cell" data-line-number="395" style="position:relative"> <span class="pl-c">//任务的代码</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC396" class="react-file-line html-div" data-testid="code-cell" data-line-number="396" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC397" class="react-file-line html-div" data-testid="code-cell" data-line-number="397" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC398" class="react-file-line html-div" data-testid="code-cell" data-line-number="398" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC399" class="react-file-line html-div" data-testid="code-cell" data-line-number="399" style="position:relative"><span class="pl-c">//Callable使用FutureTask封装后,配合线程池进行使用</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC400" class="react-file-line html-div" data-testid="code-cell" data-line-number="400" style="position:relative"><span class="pl-smi">ExecutorService</span> <span class="pl-s1">pool</span> = <span class="pl-smi">Executors</span>.<span class="pl-en">newSingleThreadExecutor</span>();</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC401" class="react-file-line html-div" data-testid="code-cell" data-line-number="401" style="position:relative"><span class="pl-smi">FutureTask</span> <span class="pl-s1">task</span> = <span class="pl-k">new</span> <span class="pl-smi">FutureTask</span>(<span class="pl-k">new</span> <span class="pl-smi">Callable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC402" class="react-file-line html-div" data-testid="code-cell" data-line-number="402" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC403" class="react-file-line html-div" data-testid="code-cell" data-line-number="403" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">Object</span> <span class="pl-en">call</span>() <span class="pl-k">throws</span> <span class="pl-smi">Exception</span> {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC404" class="react-file-line html-div" data-testid="code-cell" data-line-number="404" style="position:relative"> <span class="pl-c">//任务的代码</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC405" class="react-file-line html-div" data-testid="code-cell" data-line-number="405" style="position:relative"> <span class="pl-k">return</span> <span class="pl-c1">null</span>;</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC406" class="react-file-line html-div" data-testid="code-cell" data-line-number="406" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC407" class="react-file-line html-div" data-testid="code-cell" data-line-number="407" style="position:relative">});</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC408" class="react-file-line html-div" data-testid="code-cell" data-line-number="408" style="position:relative"><span class="pl-s1">pool</span>.<span class="pl-en">submit</span>(<span class="pl-s1">task</span>);</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC409" class="react-file-line html-div" data-testid="code-cell" data-line-number="409" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC410" class="react-file-line html-div" data-testid="code-cell" data-line-number="410" style="position:relative"><span class="pl-c">//Runnable使用FutureTask封装后,配合线程池进行使用</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC411" class="react-file-line html-div" data-testid="code-cell" data-line-number="411" style="position:relative"><span class="pl-smi">FutureTask</span> <span class="pl-s1">task1</span> = <span class="pl-k">new</span> <span class="pl-smi">FutureTask</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC412" class="react-file-line html-div" data-testid="code-cell" data-line-number="412" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC413" class="react-file-line html-div" data-testid="code-cell" data-line-number="413" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC414" class="react-file-line html-div" data-testid="code-cell" data-line-number="414" style="position:relative"> <span class="pl-c">//任务的代码</span></div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC415" class="react-file-line html-div" data-testid="code-cell" data-line-number="415" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC416" class="react-file-line html-div" data-testid="code-cell" data-line-number="416" style="position:relative">});</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC417" class="react-file-line html-div" data-testid="code-cell" data-line-number="417" style="position:relative"><span class="pl-s1">pool</span>.<span class="pl-en">submit</span>(<span class="pl-s1">task1</span>);</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC418" class="react-file-line html-div" data-testid="code-cell" data-line-number="418" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-330 child-of-line-385 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC419" class="react-file-line html-div" data-testid="code-cell" data-line-number="419" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC420" class="react-file-line html-div" data-testid="code-cell" data-line-number="420" style="position:relative">### <span class="pl-s1">Java</span>中单例有哪些写法?</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC421" class="react-file-line html-div" data-testid="code-cell" data-line-number="421" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC422" class="react-file-line html-div" data-testid="code-cell" data-line-number="422" style="position:relative">正确并且可以做到延迟加载的写法其实就是三种:</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC423" class="react-file-line html-div" data-testid="code-cell" data-line-number="423" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC424" class="react-file-line html-div" data-testid="code-cell" data-line-number="424" style="position:relative"><span class="pl-c1">1.</span>使用<span class="pl-k">volatile</span>修饰变量并且双重校验的写法来实现。</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC425" class="react-file-line html-div" data-testid="code-cell" data-line-number="425" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC426" class="react-file-line html-div" data-testid="code-cell" data-line-number="426" style="position:relative"><span class="pl-c1">2.</span>使用静态内部类来实现(类<span class="pl-smi">A</span>有<span class="pl-s1">一</span>个静态内部类<span class="pl-s1">B</span>,类<span class="pl-s1">B</span>有<span class="pl-s1">一</span>个静态变量<span class="pl-s1">instance</span>,类<span class="pl-s1">A</span>的<span class="pl-s1">getInstance</span>()方法会返回类<span class="pl-s1">B</span>的静态变量<span class="pl-smi">instance</span>,因为只有调用<span class="pl-s1">getInstance</span>()方法时才会加载静态内部类<span class="pl-s1">B</span>,这种写法缺点是不能传参。)</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC427" class="react-file-line html-div" data-testid="code-cell" data-line-number="427" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC428" class="react-file-line html-div" data-testid="code-cell" data-line-number="428" style="position:relative"><span class="pl-c1">3.</span>使用枚举来实现</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC429" class="react-file-line html-div" data-testid="code-cell" data-line-number="429" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC430" class="react-file-line html-div" data-testid="code-cell" data-line-number="430" style="position:relative">#### 第<span class="pl-c1">1</span>种 不加锁(裸奔写法)</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC431" class="react-file-line html-div" data-testid="code-cell" data-line-number="431" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC432" class="react-file-line html-div" data-testid="code-cell" data-line-number="432" style="position:relative">多线程执行时,可能会在<span class="pl-smi">instance</span>完成初始化之前,其他线性线程判断<span class="pl-s1">instance</span>为<span class="pl-c1">null</span>,从而也执行第二步的代码,导致初始化覆盖。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC433" class="react-file-line html-div" data-testid="code-cell" data-line-number="433" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC434" class="react-file-line html-div" data-testid="code-cell" data-line-number="434" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC435" class="react-file-line html-div" data-testid="code-cell" data-line-number="435" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-smi">UnsafeLazyInitialization</span> {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC436" class="react-file-line html-div" data-testid="code-cell" data-line-number="436" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-smi">Instance</span> <span class="pl-s1">instance</span>;</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC437" class="react-file-line html-div" data-testid="code-cell" data-line-number="437" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">Instance</span> <span class="pl-en">getInstance</span>() {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC438" class="react-file-line html-div" data-testid="code-cell" data-line-number="438" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>) <span class="pl-c">//1</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC439" class="react-file-line html-div" data-testid="code-cell" data-line-number="439" style="position:relative"> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Instance</span>(); <span class="pl-c">//2</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC440" class="react-file-line html-div" data-testid="code-cell" data-line-number="440" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC441" class="react-file-line html-div" data-testid="code-cell" data-line-number="441" style="position:relative"> <span class="pl-smi">return</span> <span class="pl-s1">instance</span>;</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC442" class="react-file-line html-div" data-testid="code-cell" data-line-number="442" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC443" class="react-file-line html-div" data-testid="code-cell" data-line-number="443" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-429 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC444" class="react-file-line html-div" data-testid="code-cell" data-line-number="444" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC445" class="react-file-line html-div" data-testid="code-cell" data-line-number="445" style="position:relative">#### 第<span class="pl-c1">2</span>种-对方法加<span class="pl-en">sychronize</span>锁(俗称的懒汉模式)</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC446" class="react-file-line html-div" data-testid="code-cell" data-line-number="446" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC447" class="react-file-line html-div" data-testid="code-cell" data-line-number="447" style="position:relative">初始化完成以后,每次调用<span class="pl-en">getInstance</span>()方法都需要获取同步锁,导致不必要的开销。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC448" class="react-file-line html-div" data-testid="code-cell" data-line-number="448" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC449" class="react-file-line html-div" data-testid="code-cell" data-line-number="449" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC450" class="react-file-line html-div" data-testid="code-cell" data-line-number="450" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-s1">Singleton</span> {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC451" class="react-file-line html-div" data-testid="code-cell" data-line-number="451" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-s1">instance</span>;</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC452" class="react-file-line html-div" data-testid="code-cell" data-line-number="452" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">synchronized</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-s1">getInstance</span>() {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC453" class="react-file-line html-div" data-testid="code-cell" data-line-number="453" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>)</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC454" class="react-file-line html-div" data-testid="code-cell" data-line-number="454" style="position:relative"> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Instance</span>();</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC455" class="react-file-line html-div" data-testid="code-cell" data-line-number="455" style="position:relative"> <span class="pl-k">return</span> <span class="pl-s1">instance</span>;</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC456" class="react-file-line html-div" data-testid="code-cell" data-line-number="456" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC457" class="react-file-line html-div" data-testid="code-cell" data-line-number="457" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-444 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC458" class="react-file-line html-div" data-testid="code-cell" data-line-number="458" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC459" class="react-file-line html-div" data-testid="code-cell" data-line-number="459" style="position:relative">#### 第<span class="pl-c1">3</span>种-使用静态变量(俗称的饿汉模式)</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC460" class="react-file-line html-div" data-testid="code-cell" data-line-number="460" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC461" class="react-file-line html-div" data-testid="code-cell" data-line-number="461" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC462" class="react-file-line html-div" data-testid="code-cell" data-line-number="462" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">Singleton</span> { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC463" class="react-file-line html-div" data-testid="code-cell" data-line-number="463" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Singleton</span>(); </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC464" class="react-file-line html-div" data-testid="code-cell" data-line-number="464" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-en">getInstance</span>() { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC465" class="react-file-line html-div" data-testid="code-cell" data-line-number="465" style="position:relative"> <span class="pl-k">return</span> <span class="pl-s1">instance</span>; </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC466" class="react-file-line html-div" data-testid="code-cell" data-line-number="466" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC467" class="react-file-line html-div" data-testid="code-cell" data-line-number="467" style="position:relative">} </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC468" class="react-file-line html-div" data-testid="code-cell" data-line-number="468" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC469" class="react-file-line html-div" data-testid="code-cell" data-line-number="469" style="position:relative">这种方法是缺点在于不能做到延时加载,在第<span class="pl-smi">一</span>次调用<span class="pl-s1">getInstance</span>()方法之前,如果<span class="pl-smi">Singleton</span>类被使用到,那么就会对<span class="pl-s1">instance</span>变量初始化。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-458 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC470" class="react-file-line html-div" data-testid="code-cell" data-line-number="470" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC471" class="react-file-line html-div" data-testid="code-cell" data-line-number="471" style="position:relative">#### 第<span class="pl-c1">4</span>种-使用双重检查锁定</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC472" class="react-file-line html-div" data-testid="code-cell" data-line-number="472" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC473" class="react-file-line html-div" data-testid="code-cell" data-line-number="473" style="position:relative">代码如下:</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC474" class="react-file-line html-div" data-testid="code-cell" data-line-number="474" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC475" class="react-file-line html-div" data-testid="code-cell" data-line-number="475" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC476" class="react-file-line html-div" data-testid="code-cell" data-line-number="476" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-smi">Singleton</span> { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC477" class="react-file-line html-div" data-testid="code-cell" data-line-number="477" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-s1">instance</span>; </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC478" class="react-file-line html-div" data-testid="code-cell" data-line-number="478" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-en">getInstance</span>() { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC479" class="react-file-line html-div" data-testid="code-cell" data-line-number="479" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>) { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC480" class="react-file-line html-div" data-testid="code-cell" data-line-number="480" style="position:relative"> <span class="pl-k">synchronized</span> (<span class="pl-smi">Singleton</span>.<span class="pl-k">class</span>) { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC481" class="react-file-line html-div" data-testid="code-cell" data-line-number="481" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>) { <span class="pl-c">//双重检查存在的意义在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。 </span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC482" class="react-file-line html-div" data-testid="code-cell" data-line-number="482" style="position:relative"> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Singleton</span>(); </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC483" class="react-file-line html-div" data-testid="code-cell" data-line-number="483" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC484" class="react-file-line html-div" data-testid="code-cell" data-line-number="484" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC485" class="react-file-line html-div" data-testid="code-cell" data-line-number="485" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC486" class="react-file-line html-div" data-testid="code-cell" data-line-number="486" style="position:relative"> <span class="pl-k">return</span> <span class="pl-s1">instance</span>; </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC487" class="react-file-line html-div" data-testid="code-cell" data-line-number="487" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC488" class="react-file-line html-div" data-testid="code-cell" data-line-number="488" style="position:relative">} </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC489" class="react-file-line html-div" data-testid="code-cell" data-line-number="489" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC490" class="react-file-line html-div" data-testid="code-cell" data-line-number="490" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC491" class="react-file-line html-div" data-testid="code-cell" data-line-number="491" style="position:relative"><span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Singleton</span>(); </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC492" class="react-file-line html-div" data-testid="code-cell" data-line-number="492" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC493" class="react-file-line html-div" data-testid="code-cell" data-line-number="493" style="position:relative">这句代码在执行时会分解为三个步骤:</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC494" class="react-file-line html-div" data-testid="code-cell" data-line-number="494" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC495" class="react-file-line html-div" data-testid="code-cell" data-line-number="495" style="position:relative"><span class="pl-c1">1.</span>为对象分配内存空间。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC496" class="react-file-line html-div" data-testid="code-cell" data-line-number="496" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC497" class="react-file-line html-div" data-testid="code-cell" data-line-number="497" style="position:relative"><span class="pl-c1">2.</span>执行初始化的代码。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC498" class="react-file-line html-div" data-testid="code-cell" data-line-number="498" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC499" class="react-file-line html-div" data-testid="code-cell" data-line-number="499" style="position:relative"><span class="pl-c1">3.</span>将分配好的内存地址设置给<span class="pl-s1">instance</span>引用。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC500" class="react-file-line html-div" data-testid="code-cell" data-line-number="500" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC501" class="react-file-line html-div" data-testid="code-cell" data-line-number="501" style="position:relative">但是编译器会对指令进行重排序,只能保证单线程执行时结果不会变化,也就是可能第<span class="pl-c1">3</span>步会在第<span class="pl-c1">2</span>步之前执行,某个线程<span class="pl-s1">A</span>刚好执行完第<span class="pl-c1">3</span>步,正在执行第<span class="pl-c1">2</span>步时,此时如果有其他线程<span class="pl-s1">B</span>进入<span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>)判断,会发现<span class="pl-s1">instance</span>不为<span class="pl-c1">null</span>,然后将<span class="pl-smi">instance</span>返回,但是实际上<span class="pl-s1">instance</span>还没有完成初始化,线程<span class="pl-s1">B</span>会访问到<span class="pl-s1">一</span>个未初始化完成的<span class="pl-s1">instance</span>对象。所以需要像第<span class="pl-c1">5</span>种解法<span class="pl-s1">一</span>样使用<span class="pl-k">volatile</span>来修饰变量,防止重排序。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-470 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC502" class="react-file-line html-div" data-testid="code-cell" data-line-number="502" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC503" class="react-file-line html-div" data-testid="code-cell" data-line-number="503" style="position:relative">#### 第<span class="pl-c1">5</span>种 基于 <span class="pl-k">volatile</span> 的双重检查锁定的解决方案</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC504" class="react-file-line html-div" data-testid="code-cell" data-line-number="504" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC505" class="react-file-line html-div" data-testid="code-cell" data-line-number="505" style="position:relative">代码如下:</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC506" class="react-file-line html-div" data-testid="code-cell" data-line-number="506" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC507" class="react-file-line html-div" data-testid="code-cell" data-line-number="507" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC508" class="react-file-line html-div" data-testid="code-cell" data-line-number="508" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-smi">Singleton</span> { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC509" class="react-file-line html-div" data-testid="code-cell" data-line-number="509" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">volatile</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-s1">instance</span>; </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC510" class="react-file-line html-div" data-testid="code-cell" data-line-number="510" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">Singleton</span> <span class="pl-en">getInstance</span>() { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC511" class="react-file-line html-div" data-testid="code-cell" data-line-number="511" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>) { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC512" class="react-file-line html-div" data-testid="code-cell" data-line-number="512" style="position:relative"> <span class="pl-k">synchronized</span> (<span class="pl-smi">Singleton</span>.<span class="pl-k">class</span>) { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC513" class="react-file-line html-div" data-testid="code-cell" data-line-number="513" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">instance</span> == <span class="pl-c1">null</span>)<span class="pl-c">//双重检查存在的意义在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC514" class="react-file-line html-div" data-testid="code-cell" data-line-number="514" style="position:relative"> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Singleton</span>(); </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC515" class="react-file-line html-div" data-testid="code-cell" data-line-number="515" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC516" class="react-file-line html-div" data-testid="code-cell" data-line-number="516" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC517" class="react-file-line html-div" data-testid="code-cell" data-line-number="517" style="position:relative"> <span class="pl-k">return</span> <span class="pl-s1">instance</span>; </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC518" class="react-file-line html-div" data-testid="code-cell" data-line-number="518" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC519" class="react-file-line html-div" data-testid="code-cell" data-line-number="519" style="position:relative">} </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC520" class="react-file-line html-div" data-testid="code-cell" data-line-number="520" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC521" class="react-file-line html-div" data-testid="code-cell" data-line-number="521" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC522" class="react-file-line html-div" data-testid="code-cell" data-line-number="522" style="position:relative"><span class="pl-k">volatile</span>可以保证变量的内存可见性及防止指令重排。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC523" class="react-file-line html-div" data-testid="code-cell" data-line-number="523" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC524" class="react-file-line html-div" data-testid="code-cell" data-line-number="524" style="position:relative"><span class="pl-k">volatile</span>修饰的变量在编译后,会多出<span class="pl-smi">一</span>个<span class="pl-s1">lock</span>前缀指令,<span class="pl-s1">lock</span>前缀指令相当于<span class="pl-s1">一</span>个内存屏障(内存栅栏),有三个作用:</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC525" class="react-file-line html-div" data-testid="code-cell" data-line-number="525" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC526" class="react-file-line html-div" data-testid="code-cell" data-line-number="526" style="position:relative">* 确保指令重排序时,内存屏障前的指令不会排到后面去,内存屏障后的指令不会排到前面去。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC527" class="react-file-line html-div" data-testid="code-cell" data-line-number="527" style="position:relative">* 强制对变量在线程工作内存中的修改操作立即写入到物理内存。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC528" class="react-file-line html-div" data-testid="code-cell" data-line-number="528" style="position:relative">* 如果是写操作,会导致其他<span class="pl-c1">CPU</span>中对这个变量的缓存失效,强制其他<span class="pl-c1">CPU</span>中的线程在获取变量时从物理内存中获取更新后的值。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC529" class="react-file-line html-div" data-testid="code-cell" data-line-number="529" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC530" class="react-file-line html-div" data-testid="code-cell" data-line-number="530" style="position:relative">所以使用<span class="pl-k">volatile</span>修饰后不会出现第<span class="pl-c1">3</span>种写法中由于指令重排序导致的问题。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-502 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC531" class="react-file-line html-div" data-testid="code-cell" data-line-number="531" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC532" class="react-file-line html-div" data-testid="code-cell" data-line-number="532" style="position:relative">#### 第<span class="pl-c1">6</span>种 - 使用静态内部类来实现</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC533" class="react-file-line html-div" data-testid="code-cell" data-line-number="533" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC534" class="react-file-line html-div" data-testid="code-cell" data-line-number="534" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC535" class="react-file-line html-div" data-testid="code-cell" data-line-number="535" style="position:relative"><span class="pl-k">class</span> <span class="pl-smi">Test</span> { </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC536" class="react-file-line html-div" data-testid="code-cell" data-line-number="536" style="position:relative"> <span class="pl-k">public</span> <span class="pl-k">static</span> <span class="pl-smi">Signleton</span> <span class="pl-en">getInstance</span>() {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC537" class="react-file-line html-div" data-testid="code-cell" data-line-number="537" style="position:relative"> <span class="pl-k">return</span> <span class="pl-smi">Signleton</span>.<span class="pl-s1">instance</span> ; <span class="pl-c">// 只有调用getInstance()方法时,才会引用到静态内部类Signleton,从而会触发Signleton类的instance变量的初始化,以此实现懒加载的目的。</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC538" class="react-file-line html-div" data-testid="code-cell" data-line-number="538" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC539" class="react-file-line html-div" data-testid="code-cell" data-line-number="539" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC540" class="react-file-line html-div" data-testid="code-cell" data-line-number="540" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-k">class</span> <span class="pl-smi">Signleton</span> {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC541" class="react-file-line html-div" data-testid="code-cell" data-line-number="541" style="position:relative"> <span class="pl-k">private</span> <span class="pl-k">static</span> <span class="pl-smi">Signleton</span> <span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Signleton</span>();</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC542" class="react-file-line html-div" data-testid="code-cell" data-line-number="542" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC543" class="react-file-line html-div" data-testid="code-cell" data-line-number="543" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC544" class="react-file-line html-div" data-testid="code-cell" data-line-number="544" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC545" class="react-file-line html-div" data-testid="code-cell" data-line-number="545" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC546" class="react-file-line html-div" data-testid="code-cell" data-line-number="546" style="position:relative">因为<span class="pl-smi">JVM</span>底层通过加锁实现,保证<span class="pl-s1">一</span>个类只会被加载<span class="pl-s1">一</span>次,多个线程在对类进行初始化时,只有<span class="pl-s1">一</span>个线程会获得锁,然后对类进行初始化,其他线程会阻塞等待。所以可以使用上面的代码来保证<span class="pl-s1">instance</span>只会被初始化<span class="pl-s1">一</span>次,这种写法的问题在于创建单例时不能传参。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-531 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC547" class="react-file-line html-div" data-testid="code-cell" data-line-number="547" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC548" class="react-file-line html-div" data-testid="code-cell" data-line-number="548" style="position:relative">#### <span class="pl-c1">7.</span>使用枚举来实现单例</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC549" class="react-file-line html-div" data-testid="code-cell" data-line-number="549" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC550" class="react-file-line html-div" data-testid="code-cell" data-line-number="550" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC551" class="react-file-line html-div" data-testid="code-cell" data-line-number="551" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">enum</span> <span class="pl-smi">Singleton</span> {</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC552" class="react-file-line html-div" data-testid="code-cell" data-line-number="552" style="position:relative"> <span class="pl-c">//每个元素就是一个单例</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC553" class="react-file-line html-div" data-testid="code-cell" data-line-number="553" style="position:relative"> <span class="pl-c1">INSTANCE</span>;</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC554" class="react-file-line html-div" data-testid="code-cell" data-line-number="554" style="position:relative"> <span class="pl-c">//自定义的一些方法</span></div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC555" class="react-file-line html-div" data-testid="code-cell" data-line-number="555" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">method</span>(){}</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC556" class="react-file-line html-div" data-testid="code-cell" data-line-number="556" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC557" class="react-file-line html-div" data-testid="code-cell" data-line-number="557" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC558" class="react-file-line html-div" data-testid="code-cell" data-line-number="558" style="position:relative">这种写法比较简洁,但是不太便于阅读和理解,所以实际开发中应用得比较少,而且由于枚举类是不能通过反射来创建实例的(反射方法<span class="pl-smi">newInstance</span>中判断是枚举类型,会抛出<span class="pl-s1">IllegalArgumentException</span>异常),所以可以防止反射。而且由于枚举类型的反序列化是通过<span class="pl-smi">java</span>.<span class="pl-smi">lang</span>.<span class="pl-smi">Enum</span>的<span class="pl-s1">valueOf</span>方法来实现的,不能自定义序列化方法,可以防止通过序列化来创建多个单例。</div></div></div><div class="child-of-line-1 child-of-line-419 child-of-line-547 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC559" class="react-file-line html-div" data-testid="code-cell" data-line-number="559" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC560" class="react-file-line html-div" data-testid="code-cell" data-line-number="560" style="position:relative">### 如何解决序列化时可以创建出单例对象的问题?</div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC561" class="react-file-line html-div" data-testid="code-cell" data-line-number="561" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC562" class="react-file-line html-div" data-testid="code-cell" data-line-number="562" style="position:relative">如果将单例对象序列化成字节序列后,然后再反序列成对象,那么就可以创建出<span class="pl-s1">一</span>个新的单例对象,从而导致单例不唯<span class="pl-s1">一</span>,避免发生这种情况的解决方案是在单例类中实现<span class="pl-s1">readResolve</span>()方法。</div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC563" class="react-file-line html-div" data-testid="code-cell" data-line-number="563" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC564" class="react-file-line html-div" data-testid="code-cell" data-line-number="564" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC565" class="react-file-line html-div" data-testid="code-cell" data-line-number="565" style="position:relative"><span class="pl-s1">public</span> <span class="pl-k">class</span> <span class="pl-smi">Singleton</span> <span class="pl-k">implements</span> <span class="pl-smi">java</span>.<span class="pl-smi">io</span>.<span class="pl-smi">Serializable</span> { </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC566" class="react-file-line html-div" data-testid="code-cell" data-line-number="566" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC567" class="react-file-line html-div" data-testid="code-cell" data-line-number="567" style="position:relative"> <span class="pl-k">private</span> <span class="pl-smi">Object</span> <span class="pl-en">readResolve</span>() { </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC568" class="react-file-line html-div" data-testid="code-cell" data-line-number="568" style="position:relative"> <span class="pl-k">return</span> <span class="pl-c1">INSTANCE</span>; </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC569" class="react-file-line html-div" data-testid="code-cell" data-line-number="569" style="position:relative"> } </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC570" class="react-file-line html-div" data-testid="code-cell" data-line-number="570" style="position:relative">} </div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC571" class="react-file-line html-div" data-testid="code-cell" data-line-number="571" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC572" class="react-file-line html-div" data-testid="code-cell" data-line-number="572" style="position:relative">通过实现<span class="pl-smi">readResolve</span>方法,<span class="pl-s1">ObjectInputStream</span>实例对象在调用<span class="pl-s1">readObject</span>()方法进行反序列化时,就会判断相应的类是否实现了<span class="pl-en">readResolve</span>()方法,如果实现了,就会调用<span class="pl-en">readResolve</span>()方法返回<span class="pl-smi">一</span>个对象作为反序列化的结果,而不是去创建<span class="pl-s1">一</span>个新的对象。</div></div></div><div class="child-of-line-1 child-of-line-559 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC573" class="react-file-line html-div" data-testid="code-cell" data-line-number="573" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC574" class="react-file-line html-div" data-testid="code-cell" data-line-number="574" style="position:relative">### <span class="pl-k">volatile</span>关键字有什么用?怎么理解可见性,<span class="pl-smi">一</span>般什么场景去用可见性?</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC575" class="react-file-line html-div" data-testid="code-cell" data-line-number="575" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC576" class="react-file-line html-div" data-testid="code-cell" data-line-number="576" style="position:relative">当线程进行<span class="pl-s1">一</span>个<span class="pl-k">volatile</span>变量的写操作时,<span class="pl-smi">JIT</span>编译器生成的汇编指令会在写操作的指令后面加上<span class="pl-s1">一</span>个“<span class="pl-s1">lock</span>”指令。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC577" class="react-file-line html-div" data-testid="code-cell" data-line-number="577" style="position:relative"><span class="pl-s1">Java</span>代码如下:</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC578" class="react-file-line html-div" data-testid="code-cell" data-line-number="578" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC579" class="react-file-line html-div" data-testid="code-cell" data-line-number="579" style="position:relative"><span class="pl-s1">instance</span> = <span class="pl-k">new</span> <span class="pl-smi">Singleton</span>(); <span class="pl-c">// instance是volatile变量</span></div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC580" class="react-file-line html-div" data-testid="code-cell" data-line-number="580" style="position:relative">转变成汇编代码,如下。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC581" class="react-file-line html-div" data-testid="code-cell" data-line-number="581" style="position:relative"><span class="pl-c1">0x01a3de1d</span>: <span class="pl-smi">movb</span> <span class="pl-s1">$0</span>×<span class="pl-c1">0</span>,<span class="pl-c1">0</span>×<span class="pl-c1">1104800</span>(%<span class="pl-s1">esi</span>);<span class="pl-c1">0x01a3de24</span>: <span class="pl-s1">lock</span> <span class="pl-smi">addl</span> <span class="pl-s1">$0</span>×<span class="pl-c1">0</span>,(%<span class="pl-s1">esp</span>);</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC582" class="react-file-line html-div" data-testid="code-cell" data-line-number="582" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC583" class="react-file-line html-div" data-testid="code-cell" data-line-number="583" style="position:relative">“<span class="pl-s1">lock</span>”有三个作用:</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC584" class="react-file-line html-div" data-testid="code-cell" data-line-number="584" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC585" class="react-file-line html-div" data-testid="code-cell" data-line-number="585" style="position:relative"><span class="pl-c1">1.</span>将当前<span class="pl-c1">CPU</span>缓存行的数据会写回到系统内存。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC586" class="react-file-line html-div" data-testid="code-cell" data-line-number="586" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC587" class="react-file-line html-div" data-testid="code-cell" data-line-number="587" style="position:relative"><span class="pl-c1">2.</span>这个写回内存的操作会使得其他<span class="pl-c1">CPU</span>里缓存了该内存地址的数据无效。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC588" class="react-file-line html-div" data-testid="code-cell" data-line-number="588" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC589" class="react-file-line html-div" data-testid="code-cell" data-line-number="589" style="position:relative"><span class="pl-c1">3.</span>确保指令重排序时,内存屏障前的指令不会排到后面去,内存屏障后的指令不会排到前面去。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC590" class="react-file-line html-div" data-testid="code-cell" data-line-number="590" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC591" class="react-file-line html-div" data-testid="code-cell" data-line-number="591" style="position:relative">可见性可以理解为<span class="pl-smi">一</span>个线程的写操作可以立即被其他线程得知。为了提高<span class="pl-c1">CPU</span>处理速度,<span class="pl-s1">CPU一</span>般不直接与内存进行通信,而是将系统内存的数据读到内部缓存,再进行操作。对于普通的变量,修改完不知道何时会更新到系统内存。但是如果是对<span class="pl-k">volatile</span>修饰的变量进行写操作,<span class="pl-smi">JVM</span>就会向处理器发送<span class="pl-s1">一</span>条<span class="pl-s1">Lock</span>前缀的指令,将这个变量所在的缓存行的数据立即写回到系统内存。但是即便写回到系统内存,其他<span class="pl-c1">CPU</span>中的缓存行数据还是旧的,为了保证数据<span class="pl-s1">一</span>致性,其他<span class="pl-c1">CPU</span>会嗅探在总线上传播的数据来检查自己的缓存行的值是否过期,当<span class="pl-c1">CPU</span>发现缓存行对应的内存地址被修改,那么就会将当前缓存行设置为无效,下次当<span class="pl-c1">CPU</span>对这个缓存行上的数据进行修改时,会重新从系统内存中把数据读到处理器缓存里。</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC592" class="react-file-line html-div" data-testid="code-cell" data-line-number="592" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC593" class="react-file-line html-div" data-testid="code-cell" data-line-number="593" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC594" class="react-file-line html-div" data-testid="code-cell" data-line-number="594" style="position:relative">##### 使用场景</div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC595" class="react-file-line html-div" data-testid="code-cell" data-line-number="595" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC596" class="react-file-line html-div" data-testid="code-cell" data-line-number="596" style="position:relative">##### 读写锁</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC597" class="react-file-line html-div" data-testid="code-cell" data-line-number="597" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC598" class="react-file-line html-div" data-testid="code-cell" data-line-number="598" style="position:relative">如果需要实现<span class="pl-s1">一</span>个读写锁,每次只能<span class="pl-s1">一</span>个线程去写数据,但是有多个线程来读数据,就<span class="pl-k">synchronized</span>同步锁来对<span class="pl-s1">set</span>方法加锁,<span class="pl-s1">get</span>方法不加锁, 使用<span class="pl-k">volatile</span>来修饰变量,保证内存可见性,不然多个线程可能会在变量修改后还读到<span class="pl-s1">一</span>个旧值。</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC599" class="react-file-line html-div" data-testid="code-cell" data-line-number="599" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC600" class="react-file-line html-div" data-testid="code-cell" data-line-number="600" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC601" class="react-file-line html-div" data-testid="code-cell" data-line-number="601" style="position:relative"><span class="pl-k">volatile</span> <span class="pl-smi">Integer</span> <span class="pl-s1">a</span>;</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC602" class="react-file-line html-div" data-testid="code-cell" data-line-number="602" style="position:relative"><span class="pl-c">//可以实现一写多读的场景,保证并发修改数据时的正确。</span></div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC603" class="react-file-line html-div" data-testid="code-cell" data-line-number="603" style="position:relative"><span class="pl-en">set</span>(<span class="pl-smi">Integer</span> <span class="pl-s1">c</span>) {</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC604" class="react-file-line html-div" data-testid="code-cell" data-line-number="604" style="position:relative"> <span class="pl-k">synchronized</span>(<span class="pl-smi">this</span>.<span class="pl-s1">a</span>) {</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC605" class="react-file-line html-div" data-testid="code-cell" data-line-number="605" style="position:relative"> <span class="pl-smi">this</span>.<span class="pl-s1">a</span> = <span class="pl-s1">c</span>;</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC606" class="react-file-line html-div" data-testid="code-cell" data-line-number="606" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC607" class="react-file-line html-div" data-testid="code-cell" data-line-number="607" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC608" class="react-file-line html-div" data-testid="code-cell" data-line-number="608" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC609" class="react-file-line html-div" data-testid="code-cell" data-line-number="609" style="position:relative"><span class="pl-en">get</span>() {</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC610" class="react-file-line html-div" data-testid="code-cell" data-line-number="610" style="position:relative"> <span class="pl-k">return</span> <span class="pl-s1">a</span>;</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC611" class="react-file-line html-div" data-testid="code-cell" data-line-number="611" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC612" class="react-file-line html-div" data-testid="code-cell" data-line-number="612" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-595 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC613" class="react-file-line html-div" data-testid="code-cell" data-line-number="613" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC614" class="react-file-line html-div" data-testid="code-cell" data-line-number="614" style="position:relative">##### 状态位</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC615" class="react-file-line html-div" data-testid="code-cell" data-line-number="615" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC616" class="react-file-line html-div" data-testid="code-cell" data-line-number="616" style="position:relative">用于做状态位标志,如果多个线程去需要根据<span class="pl-smi">一</span>个状态位来执行<span class="pl-s1">一</span>些操作,使用<span class="pl-k">volatile</span>修饰可以保证内存可见性。</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC617" class="react-file-line html-div" data-testid="code-cell" data-line-number="617" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC618" class="react-file-line html-div" data-testid="code-cell" data-line-number="618" style="position:relative">用于单例模式用于保证内存可见性,以及防止指令重排序。</div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC619" class="react-file-line html-div" data-testid="code-cell" data-line-number="619" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-573 child-of-line-613 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC620" class="react-file-line html-div" data-testid="code-cell" data-line-number="620" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC621" class="react-file-line html-div" data-testid="code-cell" data-line-number="621" style="position:relative">### <span class="pl-s1">Java</span>中线程的状态是怎么样的?</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC622" class="react-file-line html-div" data-testid="code-cell" data-line-number="622" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC623" class="react-file-line html-div" data-testid="code-cell" data-line-number="623" style="position:relative">在操作系统中,线程等同于轻量级的进程。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC624" class="react-file-line html-div" data-testid="code-cell" data-line-number="624" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC625" class="react-file-line html-div" data-testid="code-cell" data-line-number="625" style="position:relative">![<span class="pl-s1">img</span>](../<span class="pl-s1">static</span>/<span class="pl-c1">4621.</span><span class="pl-s1">png</span>)</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC626" class="react-file-line html-div" data-testid="code-cell" data-line-number="626" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC627" class="react-file-line html-div" data-testid="code-cell" data-line-number="627" style="position:relative">所以传统的操作系统线程<span class="pl-s1">一</span>般有以下状态</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC628" class="react-file-line html-div" data-testid="code-cell" data-line-number="628" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC629" class="react-file-line html-div" data-testid="code-cell" data-line-number="629" style="position:relative"><span class="pl-c1">1.</span> **新建状态**:</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC630" class="react-file-line html-div" data-testid="code-cell" data-line-number="630" style="position:relative"> 使用 <span class="pl-k">new</span> 关键字和 <span class="pl-s1">Thread</span> 类或其子类建立<span class="pl-s1">一</span>个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 <span class="pl-smi">start</span>() 这个线程。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC631" class="react-file-line html-div" data-testid="code-cell" data-line-number="631" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC632" class="react-file-line html-div" data-testid="code-cell" data-line-number="632" style="position:relative"><span class="pl-c1">2.</span> **就绪状态**:</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC633" class="react-file-line html-div" data-testid="code-cell" data-line-number="633" style="position:relative"> 当线程对象调用了<span class="pl-en">start</span>()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待<span class="pl-c1">JVM</span>里线程调度器的调度。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC634" class="react-file-line html-div" data-testid="code-cell" data-line-number="634" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC635" class="react-file-line html-div" data-testid="code-cell" data-line-number="635" style="position:relative"><span class="pl-c1">3.</span> **运行状态:**</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC636" class="react-file-line html-div" data-testid="code-cell" data-line-number="636" style="position:relative"> 如果就绪状态的线程获取 <span class="pl-en">CPU</span> 资源,就可以执行 <span class="pl-s1">run</span>(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC637" class="react-file-line html-div" data-testid="code-cell" data-line-number="637" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC638" class="react-file-line html-div" data-testid="code-cell" data-line-number="638" style="position:relative"><span class="pl-c1">4.</span> **阻塞状态:**</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC639" class="react-file-line html-div" data-testid="code-cell" data-line-number="639" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC640" class="react-file-line html-div" data-testid="code-cell" data-line-number="640" style="position:relative"> 如果<span class="pl-s1">一</span>个线程执行了<span class="pl-s1">sleep</span>(睡眠)、<span class="pl-s1">suspend</span>(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC641" class="react-file-line html-div" data-testid="code-cell" data-line-number="641" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC642" class="react-file-line html-div" data-testid="code-cell" data-line-number="642" style="position:relative"> - 等待阻塞:运行状态中的线程执行 <span class="pl-en">wait</span>() 方法,使线程进入到等待阻塞状态。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC643" class="react-file-line html-div" data-testid="code-cell" data-line-number="643" style="position:relative"> - 同步阻塞:线程在获取 <span class="pl-k">synchronized</span>同步锁失败(因为同步锁被其他线程占用)。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC644" class="react-file-line html-div" data-testid="code-cell" data-line-number="644" style="position:relative"> - 其他阻塞:通过调用线程的 <span class="pl-en">sleep</span>() 或 <span class="pl-en">join</span>() 发出了 <span class="pl-s1">I</span>/<span class="pl-en">O</span>请求时,线程就会进入到阻塞状态。当<span class="pl-s1">sleep</span>() 状态超时,<span class="pl-en">join</span>() 等待线程终止或超时,或者 <span class="pl-s1">I</span>/<span class="pl-s1">O</span> 处理完毕,线程重新转入就绪状态。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC645" class="react-file-line html-div" data-testid="code-cell" data-line-number="645" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC646" class="react-file-line html-div" data-testid="code-cell" data-line-number="646" style="position:relative"><span class="pl-c1">5.</span> **死亡状态:**</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC647" class="react-file-line html-div" data-testid="code-cell" data-line-number="647" style="position:relative"> <span class="pl-smi">一</span>个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC648" class="react-file-line html-div" data-testid="code-cell" data-line-number="648" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC649" class="react-file-line html-div" data-testid="code-cell" data-line-number="649" style="position:relative">但是<span class="pl-s1">Java</span>中<span class="pl-s1">Thread</span>对象的状态划分跟传统的操作系统线程状态有<span class="pl-s1">一</span>些区别。</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC650" class="react-file-line html-div" data-testid="code-cell" data-line-number="650" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC651" class="react-file-line html-div" data-testid="code-cell" data-line-number="651" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC652" class="react-file-line html-div" data-testid="code-cell" data-line-number="652" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">enum</span> <span class="pl-s1">State</span> {</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC653" class="react-file-line html-div" data-testid="code-cell" data-line-number="653" style="position:relative"> <span class="pl-c1">NEW</span>,<span class="pl-c">//新建态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC654" class="react-file-line html-div" data-testid="code-cell" data-line-number="654" style="position:relative"> <span class="pl-c1">RUNNABLE</span>,<span class="pl-c">//运行态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC655" class="react-file-line html-div" data-testid="code-cell" data-line-number="655" style="position:relative"> <span class="pl-c1">BLOCKED</span>,<span class="pl-c">//阻塞态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC656" class="react-file-line html-div" data-testid="code-cell" data-line-number="656" style="position:relative"> <span class="pl-c1">WAITING</span>,<span class="pl-c">//等待态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC657" class="react-file-line html-div" data-testid="code-cell" data-line-number="657" style="position:relative"> <span class="pl-c1">TIMED_WAITING</span>,<span class="pl-c">//有时间限制的等待态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC658" class="react-file-line html-div" data-testid="code-cell" data-line-number="658" style="position:relative"> <span class="pl-c1">TERMINATED</span>;<span class="pl-c">//死亡态</span></div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC659" class="react-file-line html-div" data-testid="code-cell" data-line-number="659" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC660" class="react-file-line html-div" data-testid="code-cell" data-line-number="660" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC661" class="react-file-line html-div" data-testid="code-cell" data-line-number="661" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC662" class="react-file-line html-div" data-testid="code-cell" data-line-number="662" style="position:relative">![线程状态图](../<span class="pl-k">static</span>/<span class="pl-smi">watermark</span>.<span class="pl-smi">jpeg</span>)</div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC663" class="react-file-line html-div" data-testid="code-cell" data-line-number="663" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC664" class="react-file-line html-div" data-testid="code-cell" data-line-number="664" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC665" class="react-file-line html-div" data-testid="code-cell" data-line-number="665" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC666" class="react-file-line html-div" data-testid="code-cell" data-line-number="666" style="position:relative">#### <span class="pl-en">NEW</span> 新建态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-665 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC667" class="react-file-line html-div" data-testid="code-cell" data-line-number="667" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-665 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC668" class="react-file-line html-div" data-testid="code-cell" data-line-number="668" style="position:relative">处于<span class="pl-c1">NEW</span>状态的线程此时尚未启动,还没调用<span class="pl-s1">Thread</span>实例的<span class="pl-s1">start</span>()方法。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-665 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC669" class="react-file-line html-div" data-testid="code-cell" data-line-number="669" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC670" class="react-file-line html-div" data-testid="code-cell" data-line-number="670" style="position:relative">#### <span class="pl-c1">RUNNABLE</span> 运行态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-669 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC671" class="react-file-line html-div" data-testid="code-cell" data-line-number="671" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-669 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC672" class="react-file-line html-div" data-testid="code-cell" data-line-number="672" style="position:relative">表示当前线程正在运行中。处于<span class="pl-c1">RUNNABLE</span>状态的线程可能在<span class="pl-s1">Java</span>虚拟机中运行,也有可能在等待其他系统资源(比如<span class="pl-s1">I</span>/<span class="pl-s1">O</span>)。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-669 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC673" class="react-file-line html-div" data-testid="code-cell" data-line-number="673" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-669 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC674" class="react-file-line html-div" data-testid="code-cell" data-line-number="674" style="position:relative">&gt; <span class="pl-s1">Java</span>线程的**<span class="pl-c1">RUNNABLE</span>**状态其实是包括了传统操作系统线程的**<span class="pl-s1">ready</span>**和**<span class="pl-s1">running</span>**两个状态的。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-669 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC675" class="react-file-line html-div" data-testid="code-cell" data-line-number="675" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC676" class="react-file-line html-div" data-testid="code-cell" data-line-number="676" style="position:relative">#### <span class="pl-c1">BLOCKED</span> 阻塞态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-675 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC677" class="react-file-line html-div" data-testid="code-cell" data-line-number="677" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-675 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC678" class="react-file-line html-div" data-testid="code-cell" data-line-number="678" style="position:relative">阻塞状态。线程没有申请到<span class="pl-s1">synchronize</span>同步锁,就会处于阻塞状态,等待锁的释放以进入同步区。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-675 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC679" class="react-file-line html-div" data-testid="code-cell" data-line-number="679" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC680" class="react-file-line html-div" data-testid="code-cell" data-line-number="680" style="position:relative">#### <span class="pl-c1">WAITING</span> 等待态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC681" class="react-file-line html-div" data-testid="code-cell" data-line-number="681" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC682" class="react-file-line html-div" data-testid="code-cell" data-line-number="682" style="position:relative">等待状态。处于等待状态的线程变成<span class="pl-c1">RUNNABLE</span>状态需要其他线程唤醒。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC683" class="react-file-line html-div" data-testid="code-cell" data-line-number="683" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC684" class="react-file-line html-div" data-testid="code-cell" data-line-number="684" style="position:relative">调用如下<span class="pl-c1">3</span>个方法会使线程进入等待状态:</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC685" class="react-file-line html-div" data-testid="code-cell" data-line-number="685" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC686" class="react-file-line html-div" data-testid="code-cell" data-line-number="686" style="position:relative">- <span class="pl-smi">Object</span>.<span class="pl-en">wait</span>():使当前线程处于等待状态直到另<span class="pl-s1">一</span>个线程调用<span class="pl-s1">notify</span>唤醒它;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC687" class="react-file-line html-div" data-testid="code-cell" data-line-number="687" style="position:relative">- <span class="pl-smi">Thread</span>.<span class="pl-en">join</span>():等待线程执行完毕,底层调用的是<span class="pl-s1">Object</span>实例的<span class="pl-en">wait</span>()方法;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC688" class="react-file-line html-div" data-testid="code-cell" data-line-number="688" style="position:relative">- <span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>():除非获得调用许可,否则禁用当前线程进行线程调度。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-679 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC689" class="react-file-line html-div" data-testid="code-cell" data-line-number="689" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC690" class="react-file-line html-div" data-testid="code-cell" data-line-number="690" style="position:relative">#### <span class="pl-c1">TIMED_WAITING</span> 超时等待状态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC691" class="react-file-line html-div" data-testid="code-cell" data-line-number="691" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC692" class="react-file-line html-div" data-testid="code-cell" data-line-number="692" style="position:relative">超时等待状态。线程等待<span class="pl-s1">一</span>个具体的时间,时间到后会被自动唤醒。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC693" class="react-file-line html-div" data-testid="code-cell" data-line-number="693" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC694" class="react-file-line html-div" data-testid="code-cell" data-line-number="694" style="position:relative">调用如下方法会使线程进入超时等待状态:</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC695" class="react-file-line html-div" data-testid="code-cell" data-line-number="695" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC696" class="react-file-line html-div" data-testid="code-cell" data-line-number="696" style="position:relative">- <span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(<span class="pl-smi">long</span> <span class="pl-s1">millis</span>):使当前线程睡眠指定时间;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC697" class="react-file-line html-div" data-testid="code-cell" data-line-number="697" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC698" class="react-file-line html-div" data-testid="code-cell" data-line-number="698" style="position:relative">- <span class="pl-smi">Object</span>.<span class="pl-en">wait</span>(<span class="pl-smi">long</span> <span class="pl-s1">timeout</span>):线程休眠指定时间,等待期间可以通过<span class="pl-en">notify</span>()/<span class="pl-en">notifyAll</span>()唤醒;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC699" class="react-file-line html-div" data-testid="code-cell" data-line-number="699" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC700" class="react-file-line html-div" data-testid="code-cell" data-line-number="700" style="position:relative">- <span class="pl-smi">Thread</span>.<span class="pl-en">join</span>(<span class="pl-smi">long</span> <span class="pl-s1">millis</span>):等待当前线程最多执行<span class="pl-s1">millis</span>毫秒,如果<span class="pl-s1">millis</span>为<span class="pl-c1">0</span>,则会<span class="pl-s1">一</span>直执行;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC701" class="react-file-line html-div" data-testid="code-cell" data-line-number="701" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC702" class="react-file-line html-div" data-testid="code-cell" data-line-number="702" style="position:relative">- <span class="pl-smi">LockSupport</span>.<span class="pl-en">parkNanos</span>(<span class="pl-smi">long</span> <span class="pl-s1">nanos</span>): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC703" class="react-file-line html-div" data-testid="code-cell" data-line-number="703" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC704" class="react-file-line html-div" data-testid="code-cell" data-line-number="704" style="position:relative">- <span class="pl-smi">LockSupport</span>.<span class="pl-en">parkUntil</span>(<span class="pl-smi">long</span> <span class="pl-s1">deadline</span>):同上,也是禁止线程进行调度指定时间;</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-689 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC705" class="react-file-line html-div" data-testid="code-cell" data-line-number="705" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC706" class="react-file-line html-div" data-testid="code-cell" data-line-number="706" style="position:relative">#### <span class="pl-c1">TERMINATED</span> 终止态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-705 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC707" class="react-file-line html-div" data-testid="code-cell" data-line-number="707" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-705 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC708" class="react-file-line html-div" data-testid="code-cell" data-line-number="708" style="position:relative">终止状态。此时线程已执行完毕。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-705 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC709" class="react-file-line html-div" data-testid="code-cell" data-line-number="709" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC710" class="react-file-line html-div" data-testid="code-cell" data-line-number="710" style="position:relative">#### 状态转换</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC711" class="react-file-line html-div" data-testid="code-cell" data-line-number="711" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC712" class="react-file-line html-div" data-testid="code-cell" data-line-number="712" style="position:relative"><span class="pl-c1">1.</span><span class="pl-c1">BLOCKED</span>与<span class="pl-c1">RUNNABLE</span>状态的转换</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC713" class="react-file-line html-div" data-testid="code-cell" data-line-number="713" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC714" class="react-file-line html-div" data-testid="code-cell" data-line-number="714" style="position:relative">处于<span class="pl-c1">BLOCKED</span>状态的线程是因为在等待锁的释放,当获得锁之后就转换为<span class="pl-c1">RUNNABLE</span>状态。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC715" class="react-file-line html-div" data-testid="code-cell" data-line-number="715" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC716" class="react-file-line html-div" data-testid="code-cell" data-line-number="716" style="position:relative"><span class="pl-c1">2.</span><span class="pl-c1">WAITING</span>状态与<span class="pl-c1">RUNNABLE</span>状态的转换</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC717" class="react-file-line html-div" data-testid="code-cell" data-line-number="717" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC718" class="react-file-line html-div" data-testid="code-cell" data-line-number="718" style="position:relative">**<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>()**,**<span class="pl-smi">Thread</span>.<span class="pl-en">join</span>()**和**<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()**这<span class="pl-c1">3</span>个方法可以使线程从<span class="pl-c1">RUNNABLE</span>状态转为<span class="pl-c1">WAITING</span>状态。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC719" class="react-file-line html-div" data-testid="code-cell" data-line-number="719" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC720" class="react-file-line html-div" data-testid="code-cell" data-line-number="720" style="position:relative"><span class="pl-c1">3.</span><span class="pl-c1">TIMED_WAITING</span>与<span class="pl-c1">RUNNABLE</span>状态转换</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC721" class="react-file-line html-div" data-testid="code-cell" data-line-number="721" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC722" class="react-file-line html-div" data-testid="code-cell" data-line-number="722" style="position:relative"><span class="pl-c1">TIMED_WAITING</span>与<span class="pl-c1">WAITING</span>状态类似,只是<span class="pl-c1">TIMED_WAITING</span>状态等待的时间是指定的。</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC723" class="react-file-line html-div" data-testid="code-cell" data-line-number="723" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC724" class="react-file-line html-div" data-testid="code-cell" data-line-number="724" style="position:relative">调用**<span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(<span class="pl-smi">long</span>)**,**<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>(<span class="pl-smi">long</span>)**,**<span class="pl-smi">Thread</span>.<span class="pl-en">join</span>(<span class="pl-smi">long</span>)**会使得<span class="pl-en">RUNNABLE</span>状态转换为<span class="pl-c1">TIMED_WAITING</span>状态</div></div></div><div class="child-of-line-1 child-of-line-620 child-of-line-709 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC725" class="react-file-line html-div" data-testid="code-cell" data-line-number="725" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC726" class="react-file-line html-div" data-testid="code-cell" data-line-number="726" style="position:relative">### <span class="pl-s1">wait</span>(),<span class="pl-en">join</span>(),<span class="pl-en">sleep</span>()方法有什么作用?</div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC727" class="react-file-line html-div" data-testid="code-cell" data-line-number="727" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC728" class="react-file-line html-div" data-testid="code-cell" data-line-number="728" style="position:relative">首先需要对<span class="pl-en">wait</span>(),<span class="pl-en">join</span>(),<span class="pl-en">sleep</span>()方法进行介绍。</div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC729" class="react-file-line html-div" data-testid="code-cell" data-line-number="729" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC730" class="react-file-line html-div" data-testid="code-cell" data-line-number="730" style="position:relative">#### <span class="pl-smi">Object</span>.<span class="pl-en">wait</span>()方法是什么?</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC731" class="react-file-line html-div" data-testid="code-cell" data-line-number="731" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC732" class="react-file-line html-div" data-testid="code-cell" data-line-number="732" style="position:relative">调用<span class="pl-en">wait</span>()方法前线程必须持有对象<span class="pl-en">Object</span>的锁。线程调用<span class="pl-s1">wait</span>()方法后,会释放当前的<span class="pl-en">Object</span>锁,进入锁的<span class="pl-s1">monitor</span>对象的等待队列,直到有其他线程调用<span class="pl-s1">notify</span>()/<span class="pl-en">notifyAll</span>()方法唤醒等待锁的线程。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC733" class="react-file-line html-div" data-testid="code-cell" data-line-number="733" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC734" class="react-file-line html-div" data-testid="code-cell" data-line-number="734" style="position:relative">需要注意的是,其他线程调用<span class="pl-en">notify</span>()方法只会唤醒单个等待锁的线程,如果有多个线程都在等待这个锁的话,不<span class="pl-en">一</span>定会唤醒到之前调用<span class="pl-s1">wait</span>()方法的线程。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC735" class="react-file-line html-div" data-testid="code-cell" data-line-number="735" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC736" class="react-file-line html-div" data-testid="code-cell" data-line-number="736" style="position:relative">同样,调用<span class="pl-en">notifyAll</span>()方法唤醒所有等待锁的线程之后,也不<span class="pl-s1">一</span>定会马上把时间片分给刚才放弃锁的那个线程,具体要看系统的调度。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-729 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC737" class="react-file-line html-div" data-testid="code-cell" data-line-number="737" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC738" class="react-file-line html-div" data-testid="code-cell" data-line-number="738" style="position:relative">#### <span class="pl-s1">Thread</span>.<span class="pl-en">join</span>()方法是什么?</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC739" class="react-file-line html-div" data-testid="code-cell" data-line-number="739" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC740" class="react-file-line html-div" data-testid="code-cell" data-line-number="740" style="position:relative"><span class="pl-en">join</span>()方法是<span class="pl-en">Thread</span>类的<span class="pl-s1">一</span>个实例方法。它的作用是让当前线程陷入“等待”状态,等<span class="pl-s1">join</span>的这个线程<span class="pl-s1">threadA</span>执行完成后,再继续执行当前线程。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC741" class="react-file-line html-div" data-testid="code-cell" data-line-number="741" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC742" class="react-file-line html-div" data-testid="code-cell" data-line-number="742" style="position:relative">实现原理是<span class="pl-s1">join</span>()方法本身是<span class="pl-en">一</span>个<span class="pl-s1">sychronized</span>修饰的方法,也就是调用<span class="pl-s1">join</span>()这个方法需要先获取<span class="pl-en">threadA</span>的锁,获得锁之后再调用<span class="pl-s1">wait</span>()方法来进行等待,<span class="pl-en">一</span>直到<span class="pl-s1">threadA</span>执行完成后,<span class="pl-s1">threadA</span>会调用<span class="pl-s1">notify_all</span>()方法,唤醒所有等待的线程,当前线程才会结束等待。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC743" class="react-file-line html-div" data-testid="code-cell" data-line-number="743" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC744" class="react-file-line html-div" data-testid="code-cell" data-line-number="744" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC745" class="react-file-line html-div" data-testid="code-cell" data-line-number="745" style="position:relative"><span class="pl-s1">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>();</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC746" class="react-file-line html-div" data-testid="code-cell" data-line-number="746" style="position:relative"><span class="pl-s1">threadA</span>.<span class="pl-en">join</span>();</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC747" class="react-file-line html-div" data-testid="code-cell" data-line-number="747" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC748" class="react-file-line html-div" data-testid="code-cell" data-line-number="748" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC749" class="react-file-line html-div" data-testid="code-cell" data-line-number="749" style="position:relative"><span class="pl-en">join</span>()方法的源码:</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC750" class="react-file-line html-div" data-testid="code-cell" data-line-number="750" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC751" class="react-file-line html-div" data-testid="code-cell" data-line-number="751" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC752" class="react-file-line html-div" data-testid="code-cell" data-line-number="752" style="position:relative"><span class="pl-s1">public</span> <span class="pl-s1">final</span> <span class="pl-smi">void</span> <span class="pl-s1">join</span>() <span class="pl-k">throws</span> <span class="pl-s1">InterruptedException</span> {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC753" class="react-file-line html-div" data-testid="code-cell" data-line-number="753" style="position:relative"> <span class="pl-en">join</span>(<span class="pl-c1">0</span>);<span class="pl-c">//0的话代表没有超时时间一直等下去</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC754" class="react-file-line html-div" data-testid="code-cell" data-line-number="754" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC755" class="react-file-line html-div" data-testid="code-cell" data-line-number="755" style="position:relative"><span class="pl-k">public</span> <span class="pl-k">final</span> <span class="pl-k">synchronized</span> <span class="pl-smi">void</span> <span class="pl-s1">join</span>(<span class="pl-smi">long</span> <span class="pl-s1">millis</span>)</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC756" class="react-file-line html-div" data-testid="code-cell" data-line-number="756" style="position:relative"><span class="pl-k">throws</span> <span class="pl-s1">InterruptedException</span> {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC757" class="react-file-line html-div" data-testid="code-cell" data-line-number="757" style="position:relative"> <span class="pl-smi">long</span> <span class="pl-s1">base</span> = <span class="pl-smi">System</span>.<span class="pl-en">currentTimeMillis</span>();</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC758" class="react-file-line html-div" data-testid="code-cell" data-line-number="758" style="position:relative"> <span class="pl-smi">long</span> <span class="pl-s1">now</span> = <span class="pl-c1">0</span>;</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC759" class="react-file-line html-div" data-testid="code-cell" data-line-number="759" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC760" class="react-file-line html-div" data-testid="code-cell" data-line-number="760" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">millis</span> &lt; <span class="pl-c1">0</span>) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC761" class="react-file-line html-div" data-testid="code-cell" data-line-number="761" style="position:relative"> <span class="pl-k">throw</span> <span class="pl-k">new</span> <span class="pl-smi">IllegalArgumentException</span>(<span class="pl-s">&quot;timeout value is negative&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC762" class="react-file-line html-div" data-testid="code-cell" data-line-number="762" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC763" class="react-file-line html-div" data-testid="code-cell" data-line-number="763" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC764" class="react-file-line html-div" data-testid="code-cell" data-line-number="764" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">millis</span> == <span class="pl-c1">0</span>) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC765" class="react-file-line html-div" data-testid="code-cell" data-line-number="765" style="position:relative"> <span class="pl-k">while</span> (<span class="pl-en">isAlive</span>()) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC766" class="react-file-line html-div" data-testid="code-cell" data-line-number="766" style="position:relative"> <span class="pl-en">wait</span>(<span class="pl-c1">0</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC767" class="react-file-line html-div" data-testid="code-cell" data-line-number="767" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC768" class="react-file-line html-div" data-testid="code-cell" data-line-number="768" style="position:relative"> } <span class="pl-k">else</span> {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC769" class="react-file-line html-div" data-testid="code-cell" data-line-number="769" style="position:relative"> <span class="pl-k">while</span> (<span class="pl-en">isAlive</span>()) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC770" class="react-file-line html-div" data-testid="code-cell" data-line-number="770" style="position:relative"> <span class="pl-smi">long</span> <span class="pl-s1">delay</span> = <span class="pl-s1">millis</span> - <span class="pl-s1">now</span>;</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC771" class="react-file-line html-div" data-testid="code-cell" data-line-number="771" style="position:relative"> <span class="pl-k">if</span> (<span class="pl-s1">delay</span> &lt;= <span class="pl-c1">0</span>) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC772" class="react-file-line html-div" data-testid="code-cell" data-line-number="772" style="position:relative"> <span class="pl-k">break</span>;</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC773" class="react-file-line html-div" data-testid="code-cell" data-line-number="773" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC774" class="react-file-line html-div" data-testid="code-cell" data-line-number="774" style="position:relative"> <span class="pl-en">wait</span>(<span class="pl-s1">delay</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC775" class="react-file-line html-div" data-testid="code-cell" data-line-number="775" style="position:relative"> <span class="pl-s1">now</span> = <span class="pl-smi">System</span>.<span class="pl-en">currentTimeMillis</span>() - <span class="pl-s1">base</span>;</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC776" class="react-file-line html-div" data-testid="code-cell" data-line-number="776" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC777" class="react-file-line html-div" data-testid="code-cell" data-line-number="777" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC778" class="react-file-line html-div" data-testid="code-cell" data-line-number="778" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC779" class="react-file-line html-div" data-testid="code-cell" data-line-number="779" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC780" class="react-file-line html-div" data-testid="code-cell" data-line-number="780" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC781" class="react-file-line html-div" data-testid="code-cell" data-line-number="781" style="position:relative">这是<span class="pl-smi">jvm</span>中<span class="pl-s1">Thead</span>的源码,在线程执行结束后会调用<span class="pl-s1">notify_all</span>来唤醒等待的线程。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC782" class="react-file-line html-div" data-testid="code-cell" data-line-number="782" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC783" class="react-file-line html-div" data-testid="code-cell" data-line-number="783" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC784" class="react-file-line html-div" data-testid="code-cell" data-line-number="784" style="position:relative"><span class="pl-c">//一个c++函数:</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC785" class="react-file-line html-div" data-testid="code-cell" data-line-number="785" style="position:relative"><span class="pl-s1">void</span> <span class="pl-s1">JavaThread</span>::<span class="pl-s1">exit</span>(<span class="pl-smi">bool</span> <span class="pl-s1">destroy_vm</span>, <span class="pl-smi">ExitType</span> <span class="pl-s1">exit_type</span>) ;</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC786" class="react-file-line html-div" data-testid="code-cell" data-line-number="786" style="position:relative"><span class="pl-c">//里面有一个贼不起眼的一行代码</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC787" class="react-file-line html-div" data-testid="code-cell" data-line-number="787" style="position:relative"><span class="pl-en">ensure_join</span>(<span class="pl-smi">this</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC788" class="react-file-line html-div" data-testid="code-cell" data-line-number="788" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC789" class="react-file-line html-div" data-testid="code-cell" data-line-number="789" style="position:relative"><span class="pl-k">static</span> <span class="pl-smi">void</span> <span class="pl-s1">ensure_join</span>(<span class="pl-s1">JavaThread</span>* <span class="pl-s1">thread</span>) {</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC790" class="react-file-line html-div" data-testid="code-cell" data-line-number="790" style="position:relative"> <span class="pl-smi">Handle</span> <span class="pl-s1">threadObj</span>(<span class="pl-s1">thread</span>, <span class="pl-s1">thread</span>-&gt;<span class="pl-en">threadObj</span>());</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC791" class="react-file-line html-div" data-testid="code-cell" data-line-number="791" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC792" class="react-file-line html-div" data-testid="code-cell" data-line-number="792" style="position:relative"> <span class="pl-smi">ObjectLocker</span> <span class="pl-s1">lock</span>(<span class="pl-s1">threadObj</span>, <span class="pl-s1">thread</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC793" class="react-file-line html-div" data-testid="code-cell" data-line-number="793" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC794" class="react-file-line html-div" data-testid="code-cell" data-line-number="794" style="position:relative"> <span class="pl-s1">thread</span>-&gt;<span class="pl-en">clear_pending_exception</span>();</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC795" class="react-file-line html-div" data-testid="code-cell" data-line-number="795" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC796" class="react-file-line html-div" data-testid="code-cell" data-line-number="796" style="position:relative"> <span class="pl-s1">java_lang_Thread</span>::<span class="pl-s1">set_thread_status</span>(<span class="pl-en">threadObj</span>(), <span class="pl-s1">java_lang_Thread</span>::<span class="pl-c1">TERMINATED</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC797" class="react-file-line html-div" data-testid="code-cell" data-line-number="797" style="position:relative"> <span class="pl-s1">java_lang_Thread</span>::<span class="pl-s1">set_thread</span>(<span class="pl-en">threadObj</span>(), <span class="pl-c1">NULL</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC798" class="react-file-line html-div" data-testid="code-cell" data-line-number="798" style="position:relative"> <span class="pl-c">//同志们看到了没,别的不用看,就看这一句</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC799" class="react-file-line html-div" data-testid="code-cell" data-line-number="799" style="position:relative"> <span class="pl-c">//thread就是当前线程,是啥?就是刚才例子中说的threadA线程</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC800" class="react-file-line html-div" data-testid="code-cell" data-line-number="800" style="position:relative"> <span class="pl-s1">lock</span>.<span class="pl-en">notify_all</span>(<span class="pl-s1">thread</span>);</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC801" class="react-file-line html-div" data-testid="code-cell" data-line-number="801" style="position:relative"> <span class="pl-s1">thread</span>-&gt;<span class="pl-en">clear_pending_exception</span>();</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC802" class="react-file-line html-div" data-testid="code-cell" data-line-number="802" style="position:relative">}</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC803" class="react-file-line html-div" data-testid="code-cell" data-line-number="803" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-737 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC804" class="react-file-line html-div" data-testid="code-cell" data-line-number="804" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC805" class="react-file-line html-div" data-testid="code-cell" data-line-number="805" style="position:relative">#### <span class="pl-en">sleep</span>()方法是什么?</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC806" class="react-file-line html-div" data-testid="code-cell" data-line-number="806" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC807" class="react-file-line html-div" data-testid="code-cell" data-line-number="807" style="position:relative"><span class="pl-smi">sleep</span>方法是<span class="pl-s1">Thread</span>类的<span class="pl-s1">一</span>个静态方法。它的作用是让当前线程睡眠<span class="pl-s1">一</span>段时间。:**<span class="pl-s1">sleep</span>方法是不会释放当前线程持有的锁,而<span class="pl-s1">wait</span>方法会。**</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC808" class="react-file-line html-div" data-testid="code-cell" data-line-number="808" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC809" class="react-file-line html-div" data-testid="code-cell" data-line-number="809" style="position:relative"><span class="pl-s1">sleep</span>与<span class="pl-s1">wait</span>方法的区别:</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC810" class="react-file-line html-div" data-testid="code-cell" data-line-number="810" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC811" class="react-file-line html-div" data-testid="code-cell" data-line-number="811" style="position:relative">- <span class="pl-s1">wait</span>可以指定时间,也可以不指定;而<span class="pl-s1">sleep</span>必须指定时间。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC812" class="react-file-line html-div" data-testid="code-cell" data-line-number="812" style="position:relative">- <span class="pl-smi">wait</span>释放<span class="pl-s1">cpu</span>资源,同时释放锁;<span class="pl-s1">sleep</span>释放<span class="pl-s1">cpu</span>资源,但是不释放锁,所以易死锁。(调用<span class="pl-en">join</span>()方法也不会释放锁)</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC813" class="react-file-line html-div" data-testid="code-cell" data-line-number="813" style="position:relative">- <span class="pl-smi">wait</span>必须放在同步块或同步方法中,而<span class="pl-s1">sleep</span>可以再任意位置。</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC814" class="react-file-line html-div" data-testid="code-cell" data-line-number="814" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC815" class="react-file-line html-div" data-testid="code-cell" data-line-number="815" style="position:relative">参考文章:</div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC816" class="react-file-line html-div" data-testid="code-cell" data-line-number="816" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC817" class="react-file-line html-div" data-testid="code-cell" data-line-number="817" style="position:relative"><span class="pl-s1">http</span>:<span class="pl-c">//redspider.group:4000/article/01/4.html</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC818" class="react-file-line html-div" data-testid="code-cell" data-line-number="818" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC819" class="react-file-line html-div" data-testid="code-cell" data-line-number="819" style="position:relative"><span class="pl-s1">https</span>:<span class="pl-c">//www.jianshu.com/p/5d88b122a050</span></div></div></div><div class="child-of-line-1 child-of-line-725 child-of-line-804 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC820" class="react-file-line html-div" data-testid="code-cell" data-line-number="820" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC821" class="react-file-line html-div" data-testid="code-cell" data-line-number="821" style="position:relative">### <span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(),<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()有什么区别?</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC822" class="react-file-line html-div" data-testid="code-cell" data-line-number="822" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC823" class="react-file-line html-div" data-testid="code-cell" data-line-number="823" style="position:relative"><span class="pl-c1">1.</span>这三个方法都会让线程挂起,释放<span class="pl-smi">CPU</span>时间片,进入到阻塞态。但是<span class="pl-s1">Object</span>.<span class="pl-s1">wait</span>()需要释放锁,所以必须在<span class="pl-k">synchronized</span>同步锁中使用,同理配套的<span class="pl-smi">Object</span>.<span class="pl-smi">notify</span>()也是。而<span class="pl-smi">Thead</span>.<span class="pl-en">sleep</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()不需要在<span class="pl-k">synchronized</span>同步锁中使用,并且在调用时也不会释放锁。</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC824" class="react-file-line html-div" data-testid="code-cell" data-line-number="824" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC825" class="react-file-line html-div" data-testid="code-cell" data-line-number="825" style="position:relative"><span class="pl-c1">2.</span>由于<span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>()没有对应的唤醒线程的方法,所以必须指定超时时间,超过时间后,线程恢复。所以调用<span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>()后的线程<span class="pl-smi">一</span>般是出于<span class="pl-c1">TIME_WAITING</span>状态,而调用了<span class="pl-s1">Object</span>.<span class="pl-s1">wait</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()的方法是进入到<span class="pl-c1">WAITING</span>状态。</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC826" class="react-file-line html-div" data-testid="code-cell" data-line-number="826" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC827" class="react-file-line html-div" data-testid="code-cell" data-line-number="827" style="position:relative"><span class="pl-c1">3.</span><span class="pl-s1">Object</span>.<span class="pl-en">wait</span>()对应的唤醒方法为<span class="pl-smi">Object</span>.<span class="pl-en">notify</span>(),<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()对应的唤醒方法为<span class="pl-smi">LockSupport</span>.<span class="pl-en">unpark</span>()。</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC828" class="react-file-line html-div" data-testid="code-cell" data-line-number="828" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC829" class="react-file-line html-div" data-testid="code-cell" data-line-number="829" style="position:relative"><span class="pl-c1">4.</span>在代码中必须能保证<span class="pl-smi">wait</span>方法比<span class="pl-s1">notify</span>方法先执行,如果<span class="pl-s1">notify</span>方法比<span class="pl-s1">wait</span>方法早执行的话,就会导致因<span class="pl-s1">wait</span>方法进入休眠的线程接收不到唤醒通知的问题。而<span class="pl-s1">park</span>、<span class="pl-s1">unpark</span>则不会有这个问题,我们可以先调用<span class="pl-s1">unpark</span>方法释放<span class="pl-s1">一</span>个许可证,这样后面线程调用<span class="pl-s1">park</span>方法时,发现已经许可证了,就可以直接获取许可证而不用进入休眠状态了。(**<span class="pl-s1">LockSupport</span>.<span class="pl-s1">park</span>() 的实现原理是通过二元信号量做的阻塞,要注意的是,这个信号量最多只能加到<span class="pl-c1">1</span>,也就是无论执行多少次<span class="pl-en">unpark</span>()方法,也最多只会有<span class="pl-s1">一</span>个许可证。**)</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC830" class="react-file-line html-div" data-testid="code-cell" data-line-number="830" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC831" class="react-file-line html-div" data-testid="code-cell" data-line-number="831" style="position:relative"><span class="pl-c1">5.</span>三种方法让线程进入阻塞态后,都可以响应中断,也就是调用<span class="pl-smi">Thread</span>.<span class="pl-en">interrupt</span>()方法会设置中断标志位,之前执行<span class="pl-smi">Thread</span>.<span class="pl-en">sleep</span>(),<span class="pl-smi">Object</span>.<span class="pl-en">wait</span>()了的线程会抛出<span class="pl-smi">InterruptedException</span>异常,然后需要代码进行处理。而调用了<span class="pl-s1">park</span>()方法的线程在响应中断只会相当于<span class="pl-smi">一</span>次正常的唤醒操作(等价于调用<span class="pl-s1">unpark</span>()方法),让线程唤醒,继续执行后面的代码,不会抛出<span class="pl-s1">InterruptedException</span>异常。</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC832" class="react-file-line html-div" data-testid="code-cell" data-line-number="832" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC833" class="react-file-line html-div" data-testid="code-cell" data-line-number="833" style="position:relative">![<span class="pl-s1">img</span>](../<span class="pl-s1">static</span>/<span class="pl-c1">5</span><span class="pl-smi">bff9535e4b04dd2799a6ae8</span>.<span class="pl-smi">png</span>)</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC834" class="react-file-line html-div" data-testid="code-cell" data-line-number="834" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC835" class="react-file-line html-div" data-testid="code-cell" data-line-number="835" style="position:relative">参考链接:</div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC836" class="react-file-line html-div" data-testid="code-cell" data-line-number="836" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC837" class="react-file-line html-div" data-testid="code-cell" data-line-number="837" style="position:relative"><span class="pl-s1">https</span>:<span class="pl-c">//blog.csdn.net/u013332124/article/details/84647915</span></div></div></div><div class="child-of-line-1 child-of-line-820 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC838" class="react-file-line html-div" data-testid="code-cell" data-line-number="838" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC839" class="react-file-line html-div" data-testid="code-cell" data-line-number="839" style="position:relative">### 谈<span class="pl-smi">一</span>谈你对线程中断的理解?</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC840" class="react-file-line html-div" data-testid="code-cell" data-line-number="840" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC841" class="react-file-line html-div" data-testid="code-cell" data-line-number="841" style="position:relative">在<span class="pl-s1">Java</span>中认为,<span class="pl-s1">一</span>个线程不应该由其他线程来强制中断或者停止,所以<span class="pl-s1">一</span>些会强制中断线程的方法<span class="pl-s1">Thread</span>.<span class="pl-s1">stop</span>(), <span class="pl-smi">Thread</span>.<span class="pl-en">suspend</span>()方法都已经废弃了。所以<span class="pl-smi">一</span>般是通过调用<span class="pl-s1">thread</span>.<span class="pl-s1">interrupt</span>();方法来设置线程的中断标识,</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC842" class="react-file-line html-div" data-testid="code-cell" data-line-number="842" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC843" class="react-file-line html-div" data-testid="code-cell" data-line-number="843" style="position:relative"><span class="pl-c1">1.</span>这样如果线程是处于阻塞状态,会抛出<span class="pl-smi">InterruptedException</span>异常,代码可以进行捕获,进行<span class="pl-s1">一</span>些处理。(例如<span class="pl-s1">Object</span>#<span class="pl-s1">wait</span>、<span class="pl-s1">Thread</span>#<span class="pl-s1">sleep</span>、<span class="pl-s1">BlockingQueue</span>#<span class="pl-s1">put</span>、<span class="pl-s1">BlockingQueue</span>#<span class="pl-s1">take</span>。其中<span class="pl-s1">BlockingQueue</span>主要调用<span class="pl-s1">conditon</span>.<span class="pl-s1">await</span>()方法进行等待,底层通过<span class="pl-smi">LockSupport</span>.<span class="pl-en">park</span>()实现)</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC844" class="react-file-line html-div" data-testid="code-cell" data-line-number="844" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC845" class="react-file-line html-div" data-testid="code-cell" data-line-number="845" style="position:relative"><span class="pl-c1">2.</span>如果线程是处于<span class="pl-smi">RUNNABLE</span>状态,也就是正常运行,调用<span class="pl-s1">thread</span>.<span class="pl-s1">interrupt</span>();只是会设置中断标志位,不会有什么其他操作。</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC846" class="react-file-line html-div" data-testid="code-cell" data-line-number="846" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC847" class="react-file-line html-div" data-testid="code-cell" data-line-number="847" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC848" class="react-file-line html-div" data-testid="code-cell" data-line-number="848" style="position:relative"><span class="pl-c">//将线程的中断标识设置为true</span></div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC849" class="react-file-line html-div" data-testid="code-cell" data-line-number="849" style="position:relative"><span class="pl-s1">thread</span>.<span class="pl-s1">interrupt</span>();</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC850" class="react-file-line html-div" data-testid="code-cell" data-line-number="850" style="position:relative"><span class="pl-c">//判断线程的中断标识是否为true</span></div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC851" class="react-file-line html-div" data-testid="code-cell" data-line-number="851" style="position:relative"><span class="pl-s1">thread</span>.<span class="pl-en">isInterrupted</span>()</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC852" class="react-file-line html-div" data-testid="code-cell" data-line-number="852" style="position:relative"><span class="pl-c">//会返回当前的线程中断状态,并且重置线程的中断标识,将中断标识设置为false</span></div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC853" class="react-file-line html-div" data-testid="code-cell" data-line-number="853" style="position:relative"><span class="pl-s1">thread</span>.<span class="pl-en">interrupted</span>()</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC854" class="react-file-line html-div" data-testid="code-cell" data-line-number="854" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-838 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC855" class="react-file-line html-div" data-testid="code-cell" data-line-number="855" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC856" class="react-file-line html-div" data-testid="code-cell" data-line-number="856" style="position:relative">### 线程执行的任务可以终止吗?</div></div></div><div class="child-of-line-1 child-of-line-855 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC857" class="react-file-line html-div" data-testid="code-cell" data-line-number="857" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC858" class="react-file-line html-div" data-testid="code-cell" data-line-number="858" style="position:relative">##### <span class="pl-c1">1.</span>设置中断</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC859" class="react-file-line html-div" data-testid="code-cell" data-line-number="859" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC860" class="react-file-line html-div" data-testid="code-cell" data-line-number="860" style="position:relative"><span class="pl-s1">FutureTask</span>提供了<span class="pl-s1">cancel</span>(<span class="pl-smi">boolean</span> <span class="pl-s1">mayInterruptIfRunning</span>)方法来取消任务,并且</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC861" class="react-file-line html-div" data-testid="code-cell" data-line-number="861" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC862" class="react-file-line html-div" data-testid="code-cell" data-line-number="862" style="position:relative">如果入参为<span class="pl-c1">false</span>,如果任务已经在执行,那么任务就不会被取消。</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC863" class="react-file-line html-div" data-testid="code-cell" data-line-number="863" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC864" class="react-file-line html-div" data-testid="code-cell" data-line-number="864" style="position:relative">如果入参为<span class="pl-c1">true</span>,如果任务已经在执行,那么会调用<span class="pl-s1">Thread</span>的<span class="pl-s1">interrupt</span>()方法来设置线程的中断标识,如果线程处于阻塞状态,会抛出<span class="pl-s1">InterruptedException</span>异常,如果正常状态只是设置标志位,修改<span class="pl-s1">interrupted</span>变量的值。所以如果要取消任务只能在任务内部中调用<span class="pl-s1">thread</span>.<span class="pl-s1">isInterrupted</span>()方法获取当前线程的中断状态,自行取消。</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-857 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC865" class="react-file-line html-div" data-testid="code-cell" data-line-number="865" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC866" class="react-file-line html-div" data-testid="code-cell" data-line-number="866" style="position:relative">##### <span class="pl-c1">2.</span>线程的<span class="pl-s1">stop</span>方法</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-865 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC867" class="react-file-line html-div" data-testid="code-cell" data-line-number="867" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-865 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC868" class="react-file-line html-div" data-testid="code-cell" data-line-number="868" style="position:relative">线程的<span class="pl-s1">stop</span>()方法可以让线程停止执行,释放所有的锁,抛出<span class="pl-s1">ThreadDeath</span>这种<span class="pl-s1">Error</span>。但是在释放锁之后,没有办法让受这些锁保护的资源,对象处于<span class="pl-s1">一</span>个安全,<span class="pl-s1">一</span>致的状态。(例如有<span class="pl-s1">一</span>个变量<span class="pl-s1">a</span>,本来的值是<span class="pl-c1">0</span>,你的线程任务是将<span class="pl-s1">a</span>++后然后再进行<span class="pl-s1">a</span>--。正常情况下任务执行完之后,其他线程取到这个变量<span class="pl-s1">a</span>的值应该是<span class="pl-c1">0</span>,但是如果之前调用了<span class="pl-s1">Thread</span>.<span class="pl-s1">stop</span>方法时,正好是在<span class="pl-s1">a</span>++之后,那么变量<span class="pl-s1">a</span>就会是<span class="pl-c1">1</span>,这样其他线程取到的<span class="pl-s1">a</span>就是出于不<span class="pl-s1">一</span>致的状态。)</div></div></div><div class="child-of-line-1 child-of-line-855 child-of-line-865 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC869" class="react-file-line html-div" data-testid="code-cell" data-line-number="869" style="position:relative"> </div></div></div><div class="child-of-line-1 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC870" class="react-file-line html-div" data-testid="code-cell" data-line-number="870" style="position:relative">### 让线程顺序执行有哪些方法?</div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC871" class="react-file-line html-div" data-testid="code-cell" data-line-number="871" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC872" class="react-file-line html-div" data-testid="code-cell" data-line-number="872" style="position:relative">##### <span class="pl-c1">1.</span>主线程<span class="pl-s1">Join</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC873" class="react-file-line html-div" data-testid="code-cell" data-line-number="873" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC874" class="react-file-line html-div" data-testid="code-cell" data-line-number="874" style="position:relative">就是调用<span class="pl-s1">threadA</span>.<span class="pl-s1">start</span>()方法让线程<span class="pl-s1">A</span>先执行,然后主线程调用<span class="pl-s1">threadA</span>.<span class="pl-s1">join</span>()方法,然后主线程进入<span class="pl-c1">TIME_WAITING</span>状态,直到<span class="pl-s1">threadA</span>执行结束后,主线程才能继续往下执行,执行线程<span class="pl-s1">B</span>的任务。(<span class="pl-s1">join</span>方法的底层实现其实是调用了<span class="pl-s1">threadA</span>的<span class="pl-s1">wait</span>()方法,当线程<span class="pl-s1">A</span>执行完毕后,会自动调用<span class="pl-s1">notifyAll</span>()方法唤醒所有线程。)</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC875" class="react-file-line html-div" data-testid="code-cell" data-line-number="875" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC876" class="react-file-line html-div" data-testid="code-cell" data-line-number="876" style="position:relative">示例代码如下:</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC877" class="react-file-line html-div" data-testid="code-cell" data-line-number="877" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC878" class="react-file-line html-div" data-testid="code-cell" data-line-number="878" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC879" class="react-file-line html-div" data-testid="code-cell" data-line-number="879" style="position:relative"><span class="pl-s1">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC880" class="react-file-line html-div" data-testid="code-cell" data-line-number="880" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC881" class="react-file-line html-div" data-testid="code-cell" data-line-number="881" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC882" class="react-file-line html-div" data-testid="code-cell" data-line-number="882" style="position:relative"> <span class="pl-c">//执行threadA的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC883" class="react-file-line html-div" data-testid="code-cell" data-line-number="883" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC884" class="react-file-line html-div" data-testid="code-cell" data-line-number="884" style="position:relative">});</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC885" class="react-file-line html-div" data-testid="code-cell" data-line-number="885" style="position:relative"><span class="pl-smi">Thread</span> <span class="pl-s1">threadB</span>= <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC886" class="react-file-line html-div" data-testid="code-cell" data-line-number="886" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC887" class="react-file-line html-div" data-testid="code-cell" data-line-number="887" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC888" class="react-file-line html-div" data-testid="code-cell" data-line-number="888" style="position:relative"> <span class="pl-c">//执行threadB的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC889" class="react-file-line html-div" data-testid="code-cell" data-line-number="889" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC890" class="react-file-line html-div" data-testid="code-cell" data-line-number="890" style="position:relative">});</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC891" class="react-file-line html-div" data-testid="code-cell" data-line-number="891" style="position:relative"><span class="pl-c">//执行线程A任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC892" class="react-file-line html-div" data-testid="code-cell" data-line-number="892" style="position:relative"><span class="pl-s1">threadA</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC893" class="react-file-line html-div" data-testid="code-cell" data-line-number="893" style="position:relative"><span class="pl-c">//主线程进行等待</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC894" class="react-file-line html-div" data-testid="code-cell" data-line-number="894" style="position:relative"><span class="pl-s1">threadA</span>.<span class="pl-en">join</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC895" class="react-file-line html-div" data-testid="code-cell" data-line-number="895" style="position:relative"><span class="pl-c">//执行线程B的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC896" class="react-file-line html-div" data-testid="code-cell" data-line-number="896" style="position:relative"><span class="pl-s1">threadB</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC897" class="react-file-line html-div" data-testid="code-cell" data-line-number="897" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-871 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC898" class="react-file-line html-div" data-testid="code-cell" data-line-number="898" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC899" class="react-file-line html-div" data-testid="code-cell" data-line-number="899" style="position:relative">##### 子线程<span class="pl-smi">Join</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC900" class="react-file-line html-div" data-testid="code-cell" data-line-number="900" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC901" class="react-file-line html-div" data-testid="code-cell" data-line-number="901" style="position:relative">就是让线程<span class="pl-s1">B</span>的任务在执行时,调用<span class="pl-s1">threadA</span>.<span class="pl-s1">join</span>()方法,这样就只有等线程<span class="pl-s1">A</span>的任务执行完成后,才会执行线程<span class="pl-s1">B</span>。</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC902" class="react-file-line html-div" data-testid="code-cell" data-line-number="902" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC903" class="react-file-line html-div" data-testid="code-cell" data-line-number="903" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC904" class="react-file-line html-div" data-testid="code-cell" data-line-number="904" style="position:relative"> <span class="pl-s1">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC905" class="react-file-line html-div" data-testid="code-cell" data-line-number="905" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC906" class="react-file-line html-div" data-testid="code-cell" data-line-number="906" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC907" class="react-file-line html-div" data-testid="code-cell" data-line-number="907" style="position:relative"> <span class="pl-c">//执行threadA的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC908" class="react-file-line html-div" data-testid="code-cell" data-line-number="908" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC909" class="react-file-line html-div" data-testid="code-cell" data-line-number="909" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC910" class="react-file-line html-div" data-testid="code-cell" data-line-number="910" style="position:relative"> <span class="pl-smi">Thread</span> <span class="pl-s1">threadB</span>= <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC911" class="react-file-line html-div" data-testid="code-cell" data-line-number="911" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC912" class="react-file-line html-div" data-testid="code-cell" data-line-number="912" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC913" class="react-file-line html-div" data-testid="code-cell" data-line-number="913" style="position:relative"> <span class="pl-c">//子线程进行等待,知道threadA任务执行完毕</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC914" class="react-file-line html-div" data-testid="code-cell" data-line-number="914" style="position:relative"> <span class="pl-s1">threadA</span>.<span class="pl-en">join</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC915" class="react-file-line html-div" data-testid="code-cell" data-line-number="915" style="position:relative"> <span class="pl-c">//执行threadB的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC916" class="react-file-line html-div" data-testid="code-cell" data-line-number="916" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC917" class="react-file-line html-div" data-testid="code-cell" data-line-number="917" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC918" class="react-file-line html-div" data-testid="code-cell" data-line-number="918" style="position:relative"> <span class="pl-c">//执行线程A任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC919" class="react-file-line html-div" data-testid="code-cell" data-line-number="919" style="position:relative"> <span class="pl-s1">threadA</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC920" class="react-file-line html-div" data-testid="code-cell" data-line-number="920" style="position:relative"> <span class="pl-c">//执行线程B的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC921" class="react-file-line html-div" data-testid="code-cell" data-line-number="921" style="position:relative"> <span class="pl-s1">threadB</span>.<span class="pl-en">start</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-898 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC922" class="react-file-line html-div" data-testid="code-cell" data-line-number="922" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC923" class="react-file-line html-div" data-testid="code-cell" data-line-number="923" style="position:relative">##### 单线程池法</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC924" class="react-file-line html-div" data-testid="code-cell" data-line-number="924" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC925" class="react-file-line html-div" data-testid="code-cell" data-line-number="925" style="position:relative">就是使用<span class="pl-smi">Executors</span>.<span class="pl-en">newSingleThreadExecutor</span>()这个线程池,这个线程池的特点就是只有<span class="pl-smi">一</span>个执行线程,可以保证任务按顺序执行。</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC926" class="react-file-line html-div" data-testid="code-cell" data-line-number="926" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC927" class="react-file-line html-div" data-testid="code-cell" data-line-number="927" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC928" class="react-file-line html-div" data-testid="code-cell" data-line-number="928" style="position:relative"><span class="pl-s1">ExecutorService</span> <span class="pl-s1">pool</span> = <span class="pl-smi">Executors</span>.<span class="pl-en">newSingleThreadExecutor</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC929" class="react-file-line html-div" data-testid="code-cell" data-line-number="929" style="position:relative"><span class="pl-c">//提交任务A</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC930" class="react-file-line html-div" data-testid="code-cell" data-line-number="930" style="position:relative"><span class="pl-s1">executorService</span>.<span class="pl-en">submit</span>(<span class="pl-s1">taskA</span>);</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC931" class="react-file-line html-div" data-testid="code-cell" data-line-number="931" style="position:relative"><span class="pl-c">//提交任务B</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC932" class="react-file-line html-div" data-testid="code-cell" data-line-number="932" style="position:relative"><span class="pl-s1">executorService</span>.<span class="pl-en">submit</span>(<span class="pl-s1">taskB</span>);</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC933" class="react-file-line html-div" data-testid="code-cell" data-line-number="933" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-922 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC934" class="react-file-line html-div" data-testid="code-cell" data-line-number="934" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC935" class="react-file-line html-div" data-testid="code-cell" data-line-number="935" style="position:relative">##### 等待通知法(<span class="pl-smi">wait</span>和<span class="pl-s1">notify</span>)</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC936" class="react-file-line html-div" data-testid="code-cell" data-line-number="936" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC937" class="react-file-line html-div" data-testid="code-cell" data-line-number="937" style="position:relative">就是在线程<span class="pl-smi">B</span>中调用<span class="pl-s1">Object</span>.<span class="pl-s1">waiting</span>()方法进行等待,线程<span class="pl-s1">A</span>执行完毕后调用<span class="pl-smi">Object</span>.<span class="pl-en">notify</span>()方法进行唤醒。(这种方法有两个缺点,<span class="pl-smi">一</span>个是<span class="pl-s1">Object</span>.<span class="pl-s1">waiting</span>()和<span class="pl-en">notify</span>()方法必须在同步代码块中调用,第二个是如果线程<span class="pl-smi">A</span>执行过快,先调用了<span class="pl-s1">object</span>.<span class="pl-s1">notify</span>()方法,就会导致线程<span class="pl-smi">B</span>后面<span class="pl-s1">一</span>直得不到唤醒。)</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC938" class="react-file-line html-div" data-testid="code-cell" data-line-number="938" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC939" class="react-file-line html-div" data-testid="code-cell" data-line-number="939" style="position:relative">```<span class="pl-smi">java</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC940" class="react-file-line html-div" data-testid="code-cell" data-line-number="940" style="position:relative"> <span class="pl-s1">final</span> <span class="pl-smi">Object</span> <span class="pl-s1">object</span> = <span class="pl-k">new</span> <span class="pl-smi">Object</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC941" class="react-file-line html-div" data-testid="code-cell" data-line-number="941" style="position:relative"> <span class="pl-smi">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC942" class="react-file-line html-div" data-testid="code-cell" data-line-number="942" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC943" class="react-file-line html-div" data-testid="code-cell" data-line-number="943" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC944" class="react-file-line html-div" data-testid="code-cell" data-line-number="944" style="position:relative"> <span class="pl-c">//执行threadA的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC945" class="react-file-line html-div" data-testid="code-cell" data-line-number="945" style="position:relative"> <span class="pl-k">synchronized</span>(<span class="pl-s1">object</span>) {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC946" class="react-file-line html-div" data-testid="code-cell" data-line-number="946" style="position:relative"> <span class="pl-s1">object</span>.<span class="pl-en">notify</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC947" class="react-file-line html-div" data-testid="code-cell" data-line-number="947" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC948" class="react-file-line html-div" data-testid="code-cell" data-line-number="948" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC949" class="react-file-line html-div" data-testid="code-cell" data-line-number="949" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC950" class="react-file-line html-div" data-testid="code-cell" data-line-number="950" style="position:relative"> <span class="pl-smi">Thread</span> <span class="pl-s1">threadB</span>= <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC951" class="react-file-line html-div" data-testid="code-cell" data-line-number="951" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC952" class="react-file-line html-div" data-testid="code-cell" data-line-number="952" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC953" class="react-file-line html-div" data-testid="code-cell" data-line-number="953" style="position:relative"> <span class="pl-k">synchronized</span>(<span class="pl-s1">object</span>) {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC954" class="react-file-line html-div" data-testid="code-cell" data-line-number="954" style="position:relative"> <span class="pl-c">//子线程进行等待,知道threadA任务执行完毕</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC955" class="react-file-line html-div" data-testid="code-cell" data-line-number="955" style="position:relative"> <span class="pl-s1">object</span>.<span class="pl-en">wait</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC956" class="react-file-line html-div" data-testid="code-cell" data-line-number="956" style="position:relative"> <span class="pl-c">//执行threadB的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC957" class="react-file-line html-div" data-testid="code-cell" data-line-number="957" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC958" class="react-file-line html-div" data-testid="code-cell" data-line-number="958" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC959" class="react-file-line html-div" data-testid="code-cell" data-line-number="959" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC960" class="react-file-line html-div" data-testid="code-cell" data-line-number="960" style="position:relative">```</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-934 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC961" class="react-file-line html-div" data-testid="code-cell" data-line-number="961" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC962" class="react-file-line html-div" data-testid="code-cell" data-line-number="962" style="position:relative">##### 等待通知法(<span class="pl-smi">await</span>和<span class="pl-s1">singal</span>)</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC963" class="react-file-line html-div" data-testid="code-cell" data-line-number="963" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC964" class="react-file-line html-div" data-testid="code-cell" data-line-number="964" style="position:relative">具体实现就是<span class="pl-smi">Reentrantlock</span>可以创建出<span class="pl-s1">一</span>个<span class="pl-s1">Condition</span>实例<span class="pl-s1">queue</span>,可以认为是<span class="pl-s1">一</span>个等待队列,线程<span class="pl-s1">B</span>调用<span class="pl-s1">queue</span>.<span class="pl-s1">await</span>()就会进行等待,直到线程<span class="pl-s1">A</span>执行完毕调用<span class="pl-s1">queue</span>.<span class="pl-en">signal</span>()来唤醒线程<span class="pl-smi">B</span>。</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC965" class="react-file-line html-div" data-testid="code-cell" data-line-number="965" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC966" class="react-file-line html-div" data-testid="code-cell" data-line-number="966" style="position:relative">```<span class="pl-s1">java</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC967" class="react-file-line html-div" data-testid="code-cell" data-line-number="967" style="position:relative"> <span class="pl-k">final</span> <span class="pl-smi">ReentrantLock</span> <span class="pl-s1">lock</span> = <span class="pl-k">new</span> <span class="pl-smi">ReentrantLock</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC968" class="react-file-line html-div" data-testid="code-cell" data-line-number="968" style="position:relative"> <span class="pl-k">final</span> <span class="pl-smi">Condition</span> <span class="pl-s1">queue1</span> = <span class="pl-s1">lock</span>.<span class="pl-en">newCondition</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC969" class="react-file-line html-div" data-testid="code-cell" data-line-number="969" style="position:relative"> <span class="pl-k">final</span> <span class="pl-smi">Object</span> <span class="pl-s1">object</span> = <span class="pl-k">new</span> <span class="pl-smi">Object</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC970" class="react-file-line html-div" data-testid="code-cell" data-line-number="970" style="position:relative"> <span class="pl-k">final</span> <span class="pl-smi">Thread</span> <span class="pl-s1">threadA</span> = <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC971" class="react-file-line html-div" data-testid="code-cell" data-line-number="971" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC972" class="react-file-line html-div" data-testid="code-cell" data-line-number="972" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC973" class="react-file-line html-div" data-testid="code-cell" data-line-number="973" style="position:relative"> <span class="pl-c">//执行threadA的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC974" class="react-file-line html-div" data-testid="code-cell" data-line-number="974" style="position:relative"> <span class="pl-s1">lock</span>.<span class="pl-en">lock</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC975" class="react-file-line html-div" data-testid="code-cell" data-line-number="975" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC976" class="react-file-line html-div" data-testid="code-cell" data-line-number="976" style="position:relative"> <span class="pl-c">//唤醒线程B的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC977" class="react-file-line html-div" data-testid="code-cell" data-line-number="977" style="position:relative"> <span class="pl-s1">queue1</span>.<span class="pl-en">signal</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC978" class="react-file-line html-div" data-testid="code-cell" data-line-number="978" style="position:relative"> } <span class="pl-k">catch</span> (<span class="pl-smi">InterruptedException</span> <span class="pl-s1">e</span>) {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC979" class="react-file-line html-div" data-testid="code-cell" data-line-number="979" style="position:relative"> <span class="pl-s1">e</span>.<span class="pl-en">printStackTrace</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC980" class="react-file-line html-div" data-testid="code-cell" data-line-number="980" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC981" class="react-file-line html-div" data-testid="code-cell" data-line-number="981" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;执行了任务A2&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC982" class="react-file-line html-div" data-testid="code-cell" data-line-number="982" style="position:relative"> <span class="pl-s1">lock</span>.<span class="pl-en">unlock</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC983" class="react-file-line html-div" data-testid="code-cell" data-line-number="983" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC984" class="react-file-line html-div" data-testid="code-cell" data-line-number="984" style="position:relative"> });</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC985" class="react-file-line html-div" data-testid="code-cell" data-line-number="985" style="position:relative"> <span class="pl-k">final</span> <span class="pl-smi">Thread</span> <span class="pl-s1">threadB</span>= <span class="pl-k">new</span> <span class="pl-smi">Thread</span>(<span class="pl-k">new</span> <span class="pl-smi">Runnable</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC986" class="react-file-line html-div" data-testid="code-cell" data-line-number="986" style="position:relative"> <span class="pl-c1">@</span><span class="pl-c1">Override</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC987" class="react-file-line html-div" data-testid="code-cell" data-line-number="987" style="position:relative"> <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">run</span>() {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC988" class="react-file-line html-div" data-testid="code-cell" data-line-number="988" style="position:relative"> <span class="pl-s1">lock</span>.<span class="pl-en">lock</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC989" class="react-file-line html-div" data-testid="code-cell" data-line-number="989" style="position:relative"> <span class="pl-c">//子线程进行等待,知道threadA任务执行完毕</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC990" class="react-file-line html-div" data-testid="code-cell" data-line-number="990" style="position:relative"> <span class="pl-k">try</span> {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC991" class="react-file-line html-div" data-testid="code-cell" data-line-number="991" style="position:relative"> <span class="pl-s1">queue1</span>.<span class="pl-en">await</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC992" class="react-file-line html-div" data-testid="code-cell" data-line-number="992" style="position:relative"> <span class="pl-smi">System</span>.<span class="pl-s1">out</span>.<span class="pl-en">println</span>(<span class="pl-s">&quot;执行了任务B2&quot;</span>);</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC993" class="react-file-line html-div" data-testid="code-cell" data-line-number="993" style="position:relative"> </div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC994" class="react-file-line html-div" data-testid="code-cell" data-line-number="994" style="position:relative"> } <span class="pl-k">catch</span> (<span class="pl-smi">InterruptedException</span> <span class="pl-s1">e</span>) {</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC995" class="react-file-line html-div" data-testid="code-cell" data-line-number="995" style="position:relative"> <span class="pl-s1">e</span>.<span class="pl-en">printStackTrace</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC996" class="react-file-line html-div" data-testid="code-cell" data-line-number="996" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC997" class="react-file-line html-div" data-testid="code-cell" data-line-number="997" style="position:relative"> <span class="pl-c">//执行threadB的任务</span></div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC998" class="react-file-line html-div" data-testid="code-cell" data-line-number="998" style="position:relative"> <span class="pl-s1">lock</span>.<span class="pl-en">unlock</span>();</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC999" class="react-file-line html-div" data-testid="code-cell" data-line-number="999" style="position:relative"> }</div></div></div><div class="child-of-line-1 child-of-line-869 child-of-line-961 react-code-text react-code-line-contents" style="min-height:auto"><div><div id="LC1000" class="react-file-line html-div" data-testid="code-cell" data-line-number="1000" style="position:relative"> });</div></div></div></div></div><div class="Box-sc-g0xbh4-0 gkZUDI"><a class="prc-Link-Link-85e08" href="https://github.com/NotFound9/interviewGuide/raw/refs/heads/master/docs/JavaMultiThread.md">View remainder of file in raw view</a></div></div><div id="copilot-button-container"></div></div><div id="highlighted-line-menu-container"></div></div></div><button hidden="" data-testid="hotkey-button" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></section></div></div></div> <!-- --> <!-- --> </div></div></div><div class="Box-sc-g0xbh4-0"></div></div></div></div></div><div id="find-result-marks-container" class="Box-sc-g0xbh4-0 cCoXib"></div><button hidden="" data-testid="" data-hotkey-scope="read-only-cursor-text-area"></button><button hidden=""></button></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-app> </turbo-frame> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <span> &copy; 2024 GitHub,&nbsp;Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10